@fieldia/map 0.0.0-stage → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +98 -2
- package/package.json +37 -3
- package/src/index.d.mts +6 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +22 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +6 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/area.d.mts +3 -0
- package/src/lib/area.d.ts +3 -0
- package/src/lib/area.js +591 -0
- package/src/lib/area.js.map +1 -0
- package/src/lib/area.mjs +588 -0
- package/src/lib/area.mjs.map +1 -0
- package/src/lib/geo.d.mts +72 -0
- package/src/lib/geo.d.ts +72 -0
- package/src/lib/geo.js +149 -0
- package/src/lib/geo.js.map +1 -0
- package/src/lib/geo.mjs +134 -0
- package/src/lib/geo.mjs.map +1 -0
- package/src/lib/kinds.d.mts +35 -0
- package/src/lib/kinds.d.ts +35 -0
- package/src/lib/kinds.js +127 -0
- package/src/lib/kinds.js.map +1 -0
- package/src/lib/kinds.mjs +124 -0
- package/src/lib/kinds.mjs.map +1 -0
- package/src/lib/labels.d.mts +62 -0
- package/src/lib/labels.d.ts +62 -0
- package/src/lib/labels.js +226 -0
- package/src/lib/labels.js.map +1 -0
- package/src/lib/labels.mjs +221 -0
- package/src/lib/labels.mjs.map +1 -0
- package/src/lib/leaflet-css.d.mts +2 -0
- package/src/lib/leaflet-css.d.ts +2 -0
- package/src/lib/leaflet-css.js +34 -0
- package/src/lib/leaflet-css.js.map +1 -0
- package/src/lib/leaflet-css.mjs +31 -0
- package/src/lib/leaflet-css.mjs.map +1 -0
- package/src/lib/leaflet.d.mts +15 -0
- package/src/lib/leaflet.d.ts +15 -0
- package/src/lib/leaflet.js +76 -0
- package/src/lib/leaflet.js.map +1 -0
- package/src/lib/leaflet.mjs +72 -0
- package/src/lib/leaflet.mjs.map +1 -0
- package/src/lib/map-core.d.mts +49 -0
- package/src/lib/map-core.d.ts +49 -0
- package/src/lib/map-core.js +312 -0
- package/src/lib/map-core.js.map +1 -0
- package/src/lib/map-core.mjs +308 -0
- package/src/lib/map-core.mjs.map +1 -0
- package/src/lib/place.d.mts +3 -0
- package/src/lib/place.d.ts +3 -0
- package/src/lib/place.js +363 -0
- package/src/lib/place.js.map +1 -0
- package/src/lib/place.mjs +360 -0
- package/src/lib/place.mjs.map +1 -0
- package/src/lib/providers.d.mts +152 -0
- package/src/lib/providers.d.ts +152 -0
- package/src/lib/providers.js +408 -0
- package/src/lib/providers.js.map +1 -0
- package/src/lib/providers.mjs +401 -0
- package/src/lib/providers.mjs.map +1 -0
- package/src/lib/search-box.d.mts +30 -0
- package/src/lib/search-box.d.ts +30 -0
- package/src/lib/search-box.js +155 -0
- package/src/lib/search-box.js.map +1 -0
- package/src/lib/search-box.mjs +152 -0
- package/src/lib/search-box.mjs.map +1 -0
- package/src/lib/settings.d.mts +19 -0
- package/src/lib/settings.d.ts +19 -0
- package/src/lib/settings.js +3 -0
- package/src/lib/settings.js.map +1 -0
- package/src/lib/settings.mjs +2 -0
- package/src/lib/settings.mjs.map +1 -0
- package/src/lib/styles.d.mts +11 -0
- package/src/lib/styles.d.ts +11 -0
- package/src/lib/styles.js +130 -0
- package/src/lib/styles.js.map +1 -0
- package/src/lib/styles.mjs +125 -0
- package/src/lib/styles.mjs.map +1 -0
- package/src/lib/widgets.d.mts +14 -0
- package/src/lib/widgets.d.ts +14 -0
- package/src/lib/widgets.js +21 -0
- package/src/lib/widgets.js.map +1 -0
- package/src/lib/widgets.mjs +18 -0
- package/src/lib/widgets.mjs.map +1 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
let loading;
|
|
2
|
+
/**
|
|
3
|
+
* Leaflet and its stylesheet, loaded the first time a map is shown. Leaflet
|
|
4
|
+
* reads `window` as it loads, so it must never load where there is none (a
|
|
5
|
+
* server, a test in Node, the release check's `require`); and a page
|
|
6
|
+
* without a map never pays for either.
|
|
7
|
+
*/
|
|
8
|
+
export function loadLeaflet() {
|
|
9
|
+
loading ??= Promise.all([import('leaflet'), import('./leaflet-css.mjs')]).then(([module, styles]) => ({
|
|
10
|
+
L: (module.default ?? module),
|
|
11
|
+
css: styles.LEAFLET_CSS,
|
|
12
|
+
}));
|
|
13
|
+
return loading;
|
|
14
|
+
}
|
|
15
|
+
/** A layer of map images: plain addresses, or each fetched with the provider's headers (a token kept out of the address). */
|
|
16
|
+
export function tileLayer(L, spec) {
|
|
17
|
+
return overlapped(makeLayer(L, spec), spec.tileSize ?? 256);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Each image a pixel larger than its place, so it overlaps the next: at a
|
|
21
|
+
* screen scale of 125% or 80% (Windows' settings, a zoomed page) images
|
|
22
|
+
* placed edge to edge leave a hairline between them.
|
|
23
|
+
*/
|
|
24
|
+
function overlapped(layer, size) {
|
|
25
|
+
layer.on('tileloadstart', (event) => {
|
|
26
|
+
event.tile.style.width = `${size + 1}px`;
|
|
27
|
+
event.tile.style.height = `${size + 1}px`;
|
|
28
|
+
});
|
|
29
|
+
return layer;
|
|
30
|
+
}
|
|
31
|
+
function makeLayer(L, spec) {
|
|
32
|
+
const options = {
|
|
33
|
+
maxZoom: spec.maxZoom,
|
|
34
|
+
...(spec.tileSize ? { tileSize: spec.tileSize } : {}),
|
|
35
|
+
...(spec.zoomOffset ? { zoomOffset: spec.zoomOffset } : {}),
|
|
36
|
+
crossOrigin: true,
|
|
37
|
+
};
|
|
38
|
+
if (!spec.headers)
|
|
39
|
+
return L.tileLayer(spec.url, options);
|
|
40
|
+
const headers = spec.headers;
|
|
41
|
+
const WithHeaders = L.TileLayer.extend({
|
|
42
|
+
createTile(coords, done) {
|
|
43
|
+
const img = document.createElement('img');
|
|
44
|
+
img.alt = '';
|
|
45
|
+
img.setAttribute('role', 'presentation');
|
|
46
|
+
const url = this.getTileUrl(coords);
|
|
47
|
+
headers()
|
|
48
|
+
.then((sent) => fetch(url, { headers: sent }))
|
|
49
|
+
.then((response) => {
|
|
50
|
+
if (!response.ok)
|
|
51
|
+
throw new Error(`${response.status}`);
|
|
52
|
+
return response.blob();
|
|
53
|
+
})
|
|
54
|
+
.then((blob) => {
|
|
55
|
+
const src = URL.createObjectURL(blob);
|
|
56
|
+
img.onload = () => {
|
|
57
|
+
URL.revokeObjectURL(src);
|
|
58
|
+
done(undefined, img);
|
|
59
|
+
};
|
|
60
|
+
img.onerror = () => {
|
|
61
|
+
URL.revokeObjectURL(src);
|
|
62
|
+
done(new Error('map image'), img);
|
|
63
|
+
};
|
|
64
|
+
img.src = src;
|
|
65
|
+
})
|
|
66
|
+
.catch((error) => done(error, img));
|
|
67
|
+
return img;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
return new WithHeaders(spec.url, options);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=leaflet.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaflet.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/leaflet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type * as Leaflet from 'leaflet';
|
|
2
|
+
import type { Locale } from '@fieldia/core';
|
|
3
|
+
import type { LatLng } from './geo.mjs';
|
|
4
|
+
import { type MapLabels } from './labels.mjs';
|
|
5
|
+
import { type LeafletModule } from './leaflet.mjs';
|
|
6
|
+
import type { MapProvider } from './providers.mjs';
|
|
7
|
+
/**
|
|
8
|
+
* One map in a box: the provider's map images for the page's scheme, its
|
|
9
|
+
* credits and mark, Fieldia's own zoom buttons at the box's inline end, and
|
|
10
|
+
* the manners a map needs among other fields. A scroll passes over it to the
|
|
11
|
+
* page unless Ctrl (⌘) is held, and one finger scrolls the page while two
|
|
12
|
+
* move the map: a form on a phone is never caught in its map.
|
|
13
|
+
*
|
|
14
|
+
* The box exists at once; the map arrives when Leaflet has loaded, and the
|
|
15
|
+
* widget does its map work in `ready`.
|
|
16
|
+
*/
|
|
17
|
+
export interface MapBoxOptions {
|
|
18
|
+
document: Document;
|
|
19
|
+
provider: MapProvider;
|
|
20
|
+
locale: Locale;
|
|
21
|
+
labels: MapLabels;
|
|
22
|
+
/** The field's label: the map is named after it. */
|
|
23
|
+
name: string;
|
|
24
|
+
/** What else the keys do on this map, said after how they move it. */
|
|
25
|
+
keys?: string;
|
|
26
|
+
center?: LatLng;
|
|
27
|
+
zoom?: number;
|
|
28
|
+
/** Height in pixels; 280 unless said. */
|
|
29
|
+
height?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface MapBox {
|
|
32
|
+
element: HTMLElement;
|
|
33
|
+
/** Runs `use` with the map once it is there: at once if it already is. */
|
|
34
|
+
ready(use: (map: Leaflet.Map, L: LeafletModule) => void): void;
|
|
35
|
+
/** Says something over the map for a moment. */
|
|
36
|
+
veil(words: string): void;
|
|
37
|
+
/** Whether one finger or the mouse may drag the map; off while a shape is drawn. */
|
|
38
|
+
setPannable(pannable: boolean): void;
|
|
39
|
+
/** Looks again at the page's scheme and direction, after a theme or a language changed. */
|
|
40
|
+
refresh(): void;
|
|
41
|
+
/** Elements over the map that clicks must not pass through. */
|
|
42
|
+
shield(element: HTMLElement): void;
|
|
43
|
+
/** Words over the map, written in the page's direction though the map itself is left to right. */
|
|
44
|
+
follow(element: HTMLElement): void;
|
|
45
|
+
destroy(): void;
|
|
46
|
+
}
|
|
47
|
+
/** Says a provider's trouble to the developer once, in the console: a map that stays empty says nothing itself. */
|
|
48
|
+
export declare function warnOnce(words: string): void;
|
|
49
|
+
export declare function createMapBox(options: MapBoxOptions): MapBox;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type * as Leaflet from 'leaflet';
|
|
2
|
+
import type { Locale } from '@fieldia/core';
|
|
3
|
+
import type { LatLng } from './geo';
|
|
4
|
+
import { type MapLabels } from './labels';
|
|
5
|
+
import { type LeafletModule } from './leaflet';
|
|
6
|
+
import type { MapProvider } from './providers';
|
|
7
|
+
/**
|
|
8
|
+
* One map in a box: the provider's map images for the page's scheme, its
|
|
9
|
+
* credits and mark, Fieldia's own zoom buttons at the box's inline end, and
|
|
10
|
+
* the manners a map needs among other fields. A scroll passes over it to the
|
|
11
|
+
* page unless Ctrl (⌘) is held, and one finger scrolls the page while two
|
|
12
|
+
* move the map: a form on a phone is never caught in its map.
|
|
13
|
+
*
|
|
14
|
+
* The box exists at once; the map arrives when Leaflet has loaded, and the
|
|
15
|
+
* widget does its map work in `ready`.
|
|
16
|
+
*/
|
|
17
|
+
export interface MapBoxOptions {
|
|
18
|
+
document: Document;
|
|
19
|
+
provider: MapProvider;
|
|
20
|
+
locale: Locale;
|
|
21
|
+
labels: MapLabels;
|
|
22
|
+
/** The field's label: the map is named after it. */
|
|
23
|
+
name: string;
|
|
24
|
+
/** What else the keys do on this map, said after how they move it. */
|
|
25
|
+
keys?: string;
|
|
26
|
+
center?: LatLng;
|
|
27
|
+
zoom?: number;
|
|
28
|
+
/** Height in pixels; 280 unless said. */
|
|
29
|
+
height?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface MapBox {
|
|
32
|
+
element: HTMLElement;
|
|
33
|
+
/** Runs `use` with the map once it is there: at once if it already is. */
|
|
34
|
+
ready(use: (map: Leaflet.Map, L: LeafletModule) => void): void;
|
|
35
|
+
/** Says something over the map for a moment. */
|
|
36
|
+
veil(words: string): void;
|
|
37
|
+
/** Whether one finger or the mouse may drag the map; off while a shape is drawn. */
|
|
38
|
+
setPannable(pannable: boolean): void;
|
|
39
|
+
/** Looks again at the page's scheme and direction, after a theme or a language changed. */
|
|
40
|
+
refresh(): void;
|
|
41
|
+
/** Elements over the map that clicks must not pass through. */
|
|
42
|
+
shield(element: HTMLElement): void;
|
|
43
|
+
/** Words over the map, written in the page's direction though the map itself is left to right. */
|
|
44
|
+
follow(element: HTMLElement): void;
|
|
45
|
+
destroy(): void;
|
|
46
|
+
}
|
|
47
|
+
/** Says a provider's trouble to the developer once, in the console: a map that stays empty says nothing itself. */
|
|
48
|
+
export declare function warnOnce(words: string): void;
|
|
49
|
+
export declare function createMapBox(options: MapBoxOptions): MapBox;
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.warnOnce = warnOnce;
|
|
4
|
+
exports.createMapBox = createMapBox;
|
|
5
|
+
const labels_1 = require("./labels");
|
|
6
|
+
const leaflet_1 = require("./leaflet");
|
|
7
|
+
const styles_1 = require("./styles");
|
|
8
|
+
const warned = new Set();
|
|
9
|
+
/** Says a provider's trouble to the developer once, in the console: a map that stays empty says nothing itself. */
|
|
10
|
+
function warnOnce(words) {
|
|
11
|
+
if (warned.has(words))
|
|
12
|
+
return;
|
|
13
|
+
warned.add(words);
|
|
14
|
+
console.warn(`[Fieldia] ${words}`);
|
|
15
|
+
}
|
|
16
|
+
const isMac = (doc) => /Mac|iPhone|iPad/.test(doc.defaultView?.navigator.platform ?? '');
|
|
17
|
+
function createMapBox(options) {
|
|
18
|
+
const { document: doc, provider, locale, labels } = options;
|
|
19
|
+
(0, styles_1.installMapStyles)(doc);
|
|
20
|
+
const element = doc.createElement('div');
|
|
21
|
+
element.className = 'fd-map-box';
|
|
22
|
+
// The map's own layout is left to right in every language; the controls over it follow the page.
|
|
23
|
+
element.dir = 'ltr';
|
|
24
|
+
element.style.setProperty('--fd-map-height', `${options.height ?? 280}px`);
|
|
25
|
+
element.setAttribute('role', 'region');
|
|
26
|
+
element.setAttribute('aria-label', (0, labels_1.fill)(labels.mapOf, { label: options.name }));
|
|
27
|
+
const keysId = `fd-map-keys-${Math.random().toString(36).slice(2, 9)}`;
|
|
28
|
+
const keys = doc.createElement('span');
|
|
29
|
+
keys.id = keysId;
|
|
30
|
+
keys.className = 'fd-sr-only';
|
|
31
|
+
keys.textContent = [labels.mapKeys, options.keys].filter(Boolean).join(' ');
|
|
32
|
+
element.setAttribute('aria-describedby', keysId);
|
|
33
|
+
const zoom = doc.createElement('div');
|
|
34
|
+
zoom.className = 'fd-map-zoom';
|
|
35
|
+
zoom.dataset['side'] = 'right';
|
|
36
|
+
const zoomButton = (words, sign) => {
|
|
37
|
+
const button = doc.createElement('button');
|
|
38
|
+
button.type = 'button';
|
|
39
|
+
button.setAttribute('aria-label', words);
|
|
40
|
+
button.title = words;
|
|
41
|
+
button.textContent = sign;
|
|
42
|
+
return button;
|
|
43
|
+
};
|
|
44
|
+
const zoomIn = zoomButton(labels.zoomIn, '+');
|
|
45
|
+
const zoomOut = zoomButton(labels.zoomOut, '−');
|
|
46
|
+
zoom.append(zoomIn, zoomOut);
|
|
47
|
+
const credits = doc.createElement('div');
|
|
48
|
+
credits.className = 'fd-map-credits';
|
|
49
|
+
const veilElement = doc.createElement('div');
|
|
50
|
+
veilElement.className = 'fd-map-veil';
|
|
51
|
+
veilElement.setAttribute('aria-hidden', 'true');
|
|
52
|
+
const crosshair = doc.createElement('div');
|
|
53
|
+
crosshair.className = 'fd-map-crosshair';
|
|
54
|
+
element.append(keys, veilElement, crosshair);
|
|
55
|
+
// The buttons and credits go in after Leaflet's layers, once the map is made: Tab reaches the map's own pins and grips first.
|
|
56
|
+
const overlays = [zoom, credits];
|
|
57
|
+
if (provider.logo) {
|
|
58
|
+
const mark = doc.createElement(provider.logo.href ? 'a' : 'span');
|
|
59
|
+
mark.className = 'fd-map-logo';
|
|
60
|
+
if (mark instanceof HTMLAnchorElement && provider.logo.href) {
|
|
61
|
+
mark.href = provider.logo.href;
|
|
62
|
+
mark.target = '_blank';
|
|
63
|
+
mark.rel = 'noopener';
|
|
64
|
+
}
|
|
65
|
+
if (provider.logo.image) {
|
|
66
|
+
const img = doc.createElement('img');
|
|
67
|
+
img.src = provider.logo.image;
|
|
68
|
+
img.alt = provider.logo.text;
|
|
69
|
+
mark.append(img);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const words = doc.createElement('span');
|
|
73
|
+
words.textContent = provider.logo.text;
|
|
74
|
+
mark.append(words);
|
|
75
|
+
}
|
|
76
|
+
overlays.push(mark);
|
|
77
|
+
}
|
|
78
|
+
if (provider.demoOnly)
|
|
79
|
+
warnOnce(`The "${provider.id}" map provider is for demos and development only: choose a provider (azureMaps, googleMaps, mapbox, or tiles) for an app in use.`);
|
|
80
|
+
let map = null;
|
|
81
|
+
let L = null;
|
|
82
|
+
let destroyed = false;
|
|
83
|
+
let pannable = true;
|
|
84
|
+
let baseMap = null;
|
|
85
|
+
let baseLayer = null;
|
|
86
|
+
let creditsAsked = 0;
|
|
87
|
+
let creditsTimer;
|
|
88
|
+
let veilTimer;
|
|
89
|
+
const waiting = [];
|
|
90
|
+
const following = [veilElement];
|
|
91
|
+
const cleanups = [];
|
|
92
|
+
function veil(words) {
|
|
93
|
+
veilElement.textContent = words;
|
|
94
|
+
veilElement.dataset['show'] = '';
|
|
95
|
+
clearTimeout(veilTimer);
|
|
96
|
+
veilTimer = setTimeout(() => delete veilElement.dataset['show'], 1400);
|
|
97
|
+
}
|
|
98
|
+
function shield(over) {
|
|
99
|
+
if (!L) {
|
|
100
|
+
waiting.push(() => shield(over));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
L.DomEvent.disableClickPropagation(over);
|
|
104
|
+
L.DomEvent.disableScrollPropagation(over);
|
|
105
|
+
}
|
|
106
|
+
/** Dark when the form is: its own scheme, or the reader's when it follows theirs. */
|
|
107
|
+
function dark() {
|
|
108
|
+
const view = doc.defaultView;
|
|
109
|
+
const scheme = view?.getComputedStyle(element).colorScheme ?? '';
|
|
110
|
+
if (!scheme.includes('dark'))
|
|
111
|
+
return false;
|
|
112
|
+
if (!scheme.includes('light'))
|
|
113
|
+
return true;
|
|
114
|
+
return !!view?.matchMedia?.('(prefers-color-scheme: dark)').matches;
|
|
115
|
+
}
|
|
116
|
+
function showCredits(list) {
|
|
117
|
+
credits.replaceChildren();
|
|
118
|
+
list.forEach((credit, i) => {
|
|
119
|
+
if (i)
|
|
120
|
+
credits.append(' · ');
|
|
121
|
+
if (credit.href) {
|
|
122
|
+
const link = doc.createElement('a');
|
|
123
|
+
link.href = credit.href;
|
|
124
|
+
link.target = '_blank';
|
|
125
|
+
link.rel = 'noopener';
|
|
126
|
+
link.textContent = credit.text;
|
|
127
|
+
credits.append(link);
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
credits.append(credit.text);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function askCredits() {
|
|
134
|
+
clearTimeout(creditsTimer);
|
|
135
|
+
creditsTimer = setTimeout(() => {
|
|
136
|
+
if (!map || !baseMap)
|
|
137
|
+
return;
|
|
138
|
+
const asked = ++creditsAsked;
|
|
139
|
+
const b = map.getBounds();
|
|
140
|
+
provider
|
|
141
|
+
.credits(baseMap, { zoom: map.getZoom(), bounds: { south: b.getSouth(), west: b.getWest(), north: b.getNorth(), east: b.getEast() } }, locale)
|
|
142
|
+
.then((list) => asked === creditsAsked && showCredits(list))
|
|
143
|
+
.catch(() => undefined);
|
|
144
|
+
}, 300);
|
|
145
|
+
}
|
|
146
|
+
async function setBaseMap(kind) {
|
|
147
|
+
if (!map || !L || kind === baseMap)
|
|
148
|
+
return;
|
|
149
|
+
const refused = (error) => {
|
|
150
|
+
warnOnce(`The ${provider.id} map images could not be drawn: ${error.message}`);
|
|
151
|
+
return null;
|
|
152
|
+
};
|
|
153
|
+
let spec = await provider.tiles(kind, locale).catch(refused);
|
|
154
|
+
let drawn = kind;
|
|
155
|
+
if (!spec && kind !== 'road') {
|
|
156
|
+
spec = await provider.tiles('road', locale).catch(refused);
|
|
157
|
+
drawn = 'road';
|
|
158
|
+
}
|
|
159
|
+
if (!spec || destroyed || !map)
|
|
160
|
+
return;
|
|
161
|
+
if (drawn === baseMap) {
|
|
162
|
+
baseMap = kind;
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const layer = (0, leaflet_1.tileLayer)(L, spec).addTo(map);
|
|
166
|
+
// An image refused (a key the provider does not take, a network that blocks it): the map shows the ground and nothing else.
|
|
167
|
+
layer.on('tileerror', () => warnOnce(`The ${provider.id} map images failed to load: a key or token the provider refuses, or a network that blocks it, does this. Open one image's address to see the provider's answer.`));
|
|
168
|
+
baseLayer?.remove();
|
|
169
|
+
baseLayer = layer;
|
|
170
|
+
baseMap = drawn;
|
|
171
|
+
element.dataset['baseMap'] = drawn;
|
|
172
|
+
askCredits();
|
|
173
|
+
}
|
|
174
|
+
function refresh() {
|
|
175
|
+
const page = element.parentElement ? doc.defaultView?.getComputedStyle(element.parentElement).direction : 'ltr';
|
|
176
|
+
zoom.dataset['side'] = page === 'rtl' ? 'left' : 'right';
|
|
177
|
+
element.dataset['side'] = zoom.dataset['side'];
|
|
178
|
+
for (const words of following)
|
|
179
|
+
words.dir = page === 'rtl' ? 'rtl' : 'ltr';
|
|
180
|
+
if (map)
|
|
181
|
+
void setBaseMap(dark() ? 'dark' : 'road');
|
|
182
|
+
}
|
|
183
|
+
function setPannable(on) {
|
|
184
|
+
pannable = on;
|
|
185
|
+
if (!map)
|
|
186
|
+
return;
|
|
187
|
+
if (on)
|
|
188
|
+
map.dragging.enable();
|
|
189
|
+
else
|
|
190
|
+
map.dragging.disable();
|
|
191
|
+
}
|
|
192
|
+
// A scroll passes to the page; Ctrl or ⌘ with it zooms. Caught on the way down, before Leaflet's own.
|
|
193
|
+
const wheel = (event) => {
|
|
194
|
+
if (event.ctrlKey || event.metaKey)
|
|
195
|
+
return;
|
|
196
|
+
event.stopPropagation();
|
|
197
|
+
veil(isMac(doc) ? labels.cmdZoom : labels.ctrlZoom);
|
|
198
|
+
};
|
|
199
|
+
element.addEventListener('wheel', wheel, { capture: true, passive: true });
|
|
200
|
+
// The cross at the centre is the keyboard's pointer: shown once a key is pressed on the map, gone at the next press of a pointer.
|
|
201
|
+
// (Leaflet focuses the map in code on every press, which a browser may show as keyboard focus.)
|
|
202
|
+
// Focus that no press brought (Tab, a shortcut) is the keyboard's too.
|
|
203
|
+
let pressing = false;
|
|
204
|
+
const byKeys = (event) => event.target === element && element.setAttribute('data-keys', '');
|
|
205
|
+
const byPointer = () => {
|
|
206
|
+
element.removeAttribute('data-keys');
|
|
207
|
+
pressing = true;
|
|
208
|
+
setTimeout(() => (pressing = false), 0);
|
|
209
|
+
};
|
|
210
|
+
const byFocus = () => !pressing && element.setAttribute('data-keys', '');
|
|
211
|
+
element.addEventListener('keydown', byKeys);
|
|
212
|
+
element.addEventListener('pointerdown', byPointer, { capture: true });
|
|
213
|
+
element.addEventListener('focus', byFocus);
|
|
214
|
+
cleanups.push(() => {
|
|
215
|
+
element.removeEventListener('keydown', byKeys);
|
|
216
|
+
element.removeEventListener('pointerdown', byPointer, { capture: true });
|
|
217
|
+
element.removeEventListener('focus', byFocus);
|
|
218
|
+
});
|
|
219
|
+
// One finger scrolls the page; two move the map.
|
|
220
|
+
let touchStart = null;
|
|
221
|
+
const touchstart = (event) => {
|
|
222
|
+
if (!map)
|
|
223
|
+
return;
|
|
224
|
+
const one = event.touches.length === 1;
|
|
225
|
+
touchStart = one ? { x: event.touches[0].clientX, y: event.touches[0].clientY } : null;
|
|
226
|
+
if (one || !pannable)
|
|
227
|
+
map.dragging.disable();
|
|
228
|
+
else
|
|
229
|
+
map.dragging.enable();
|
|
230
|
+
};
|
|
231
|
+
const touchmove = (event) => {
|
|
232
|
+
if (!touchStart || event.touches.length !== 1 || !pannable)
|
|
233
|
+
return;
|
|
234
|
+
const moved = Math.hypot(event.touches[0].clientX - touchStart.x, event.touches[0].clientY - touchStart.y);
|
|
235
|
+
if (moved > 12)
|
|
236
|
+
veil(labels.twoFingers);
|
|
237
|
+
};
|
|
238
|
+
const touchend = (event) => {
|
|
239
|
+
if (event.touches.length === 0 && map && pannable)
|
|
240
|
+
map.dragging.enable();
|
|
241
|
+
};
|
|
242
|
+
element.addEventListener('touchstart', touchstart, { capture: true, passive: true });
|
|
243
|
+
element.addEventListener('touchmove', touchmove, { capture: true, passive: true });
|
|
244
|
+
element.addEventListener('touchend', touchend, { capture: true, passive: true });
|
|
245
|
+
cleanups.push(() => {
|
|
246
|
+
element.removeEventListener('wheel', wheel, { capture: true });
|
|
247
|
+
element.removeEventListener('touchstart', touchstart, { capture: true });
|
|
248
|
+
element.removeEventListener('touchmove', touchmove, { capture: true });
|
|
249
|
+
element.removeEventListener('touchend', touchend, { capture: true });
|
|
250
|
+
});
|
|
251
|
+
void (0, leaflet_1.loadLeaflet)().then(({ L: leaflet, css }) => {
|
|
252
|
+
if (destroyed)
|
|
253
|
+
return;
|
|
254
|
+
(0, styles_1.installLeafletStyles)(doc, css);
|
|
255
|
+
L = leaflet;
|
|
256
|
+
map = leaflet.map(element, {
|
|
257
|
+
zoomControl: false,
|
|
258
|
+
attributionControl: false,
|
|
259
|
+
keyboard: true,
|
|
260
|
+
keyboardPanDelta: 80,
|
|
261
|
+
worldCopyJump: true,
|
|
262
|
+
dragging: pannable,
|
|
263
|
+
});
|
|
264
|
+
if (options.center)
|
|
265
|
+
map.setView([options.center.lat, options.center.lng], options.zoom ?? 15);
|
|
266
|
+
else
|
|
267
|
+
map.setView([20, 0], options.zoom ?? 2);
|
|
268
|
+
element.append(...overlays);
|
|
269
|
+
for (const over of overlays)
|
|
270
|
+
shield(over);
|
|
271
|
+
zoomIn.addEventListener('click', () => map?.zoomIn());
|
|
272
|
+
zoomOut.addEventListener('click', () => map?.zoomOut());
|
|
273
|
+
map.on('moveend', askCredits);
|
|
274
|
+
// Shown at last in a tab or a dialog: the map measures itself again.
|
|
275
|
+
const ResizeWatch = doc.defaultView?.ResizeObserver;
|
|
276
|
+
if (ResizeWatch) {
|
|
277
|
+
const watch = new ResizeWatch(() => map?.invalidateSize({ pan: false }));
|
|
278
|
+
watch.observe(element);
|
|
279
|
+
cleanups.push(() => watch.disconnect());
|
|
280
|
+
}
|
|
281
|
+
refresh();
|
|
282
|
+
for (const use of waiting.splice(0))
|
|
283
|
+
use(map, leaflet);
|
|
284
|
+
});
|
|
285
|
+
return {
|
|
286
|
+
element,
|
|
287
|
+
ready(use) {
|
|
288
|
+
if (map && L)
|
|
289
|
+
use(map, L);
|
|
290
|
+
else
|
|
291
|
+
waiting.push(use);
|
|
292
|
+
},
|
|
293
|
+
veil,
|
|
294
|
+
setPannable,
|
|
295
|
+
refresh,
|
|
296
|
+
shield,
|
|
297
|
+
follow(words) {
|
|
298
|
+
following.push(words);
|
|
299
|
+
refresh();
|
|
300
|
+
},
|
|
301
|
+
destroy() {
|
|
302
|
+
destroyed = true;
|
|
303
|
+
clearTimeout(creditsTimer);
|
|
304
|
+
clearTimeout(veilTimer);
|
|
305
|
+
for (const cleanup of cleanups.splice(0))
|
|
306
|
+
cleanup();
|
|
307
|
+
map?.remove();
|
|
308
|
+
map = null;
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=map-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-core.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/map-core.ts"],"names":[],"mappings":"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"}
|