@fieldia/map 0.0.0-stage → 0.14.0

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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -2
  3. package/package.json +37 -3
  4. package/src/index.d.mts +6 -0
  5. package/src/index.d.ts +6 -0
  6. package/src/index.js +22 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +6 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/area.d.mts +3 -0
  11. package/src/lib/area.d.ts +3 -0
  12. package/src/lib/area.js +591 -0
  13. package/src/lib/area.js.map +1 -0
  14. package/src/lib/area.mjs +588 -0
  15. package/src/lib/area.mjs.map +1 -0
  16. package/src/lib/geo.d.mts +72 -0
  17. package/src/lib/geo.d.ts +72 -0
  18. package/src/lib/geo.js +149 -0
  19. package/src/lib/geo.js.map +1 -0
  20. package/src/lib/geo.mjs +134 -0
  21. package/src/lib/geo.mjs.map +1 -0
  22. package/src/lib/kinds.d.mts +35 -0
  23. package/src/lib/kinds.d.ts +35 -0
  24. package/src/lib/kinds.js +127 -0
  25. package/src/lib/kinds.js.map +1 -0
  26. package/src/lib/kinds.mjs +124 -0
  27. package/src/lib/kinds.mjs.map +1 -0
  28. package/src/lib/labels.d.mts +58 -0
  29. package/src/lib/labels.d.ts +58 -0
  30. package/src/lib/labels.js +214 -0
  31. package/src/lib/labels.js.map +1 -0
  32. package/src/lib/labels.mjs +209 -0
  33. package/src/lib/labels.mjs.map +1 -0
  34. package/src/lib/leaflet-css.d.mts +2 -0
  35. package/src/lib/leaflet-css.d.ts +2 -0
  36. package/src/lib/leaflet-css.js +34 -0
  37. package/src/lib/leaflet-css.js.map +1 -0
  38. package/src/lib/leaflet-css.mjs +31 -0
  39. package/src/lib/leaflet-css.mjs.map +1 -0
  40. package/src/lib/leaflet.d.mts +15 -0
  41. package/src/lib/leaflet.d.ts +15 -0
  42. package/src/lib/leaflet.js +76 -0
  43. package/src/lib/leaflet.js.map +1 -0
  44. package/src/lib/leaflet.mjs +72 -0
  45. package/src/lib/leaflet.mjs.map +1 -0
  46. package/src/lib/map-core.d.mts +47 -0
  47. package/src/lib/map-core.d.ts +47 -0
  48. package/src/lib/map-core.js +300 -0
  49. package/src/lib/map-core.js.map +1 -0
  50. package/src/lib/map-core.mjs +297 -0
  51. package/src/lib/map-core.mjs.map +1 -0
  52. package/src/lib/place.d.mts +3 -0
  53. package/src/lib/place.d.ts +3 -0
  54. package/src/lib/place.js +323 -0
  55. package/src/lib/place.js.map +1 -0
  56. package/src/lib/place.mjs +320 -0
  57. package/src/lib/place.mjs.map +1 -0
  58. package/src/lib/providers.d.mts +131 -0
  59. package/src/lib/providers.d.ts +131 -0
  60. package/src/lib/providers.js +224 -0
  61. package/src/lib/providers.js.map +1 -0
  62. package/src/lib/providers.mjs +217 -0
  63. package/src/lib/providers.mjs.map +1 -0
  64. package/src/lib/search-box.d.mts +28 -0
  65. package/src/lib/search-box.d.ts +28 -0
  66. package/src/lib/search-box.js +141 -0
  67. package/src/lib/search-box.js.map +1 -0
  68. package/src/lib/search-box.mjs +138 -0
  69. package/src/lib/search-box.mjs.map +1 -0
  70. package/src/lib/settings.d.mts +19 -0
  71. package/src/lib/settings.d.ts +19 -0
  72. package/src/lib/settings.js +3 -0
  73. package/src/lib/settings.js.map +1 -0
  74. package/src/lib/settings.mjs +2 -0
  75. package/src/lib/settings.mjs.map +1 -0
  76. package/src/lib/styles.d.mts +11 -0
  77. package/src/lib/styles.d.ts +11 -0
  78. package/src/lib/styles.js +127 -0
  79. package/src/lib/styles.js.map +1 -0
  80. package/src/lib/styles.mjs +122 -0
  81. package/src/lib/styles.mjs.map +1 -0
  82. package/src/lib/widgets.d.mts +14 -0
  83. package/src/lib/widgets.d.ts +14 -0
  84. package/src/lib/widgets.js +21 -0
  85. package/src/lib/widgets.js.map +1 -0
  86. package/src/lib/widgets.mjs +18 -0
  87. 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,47 @@
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
+ export declare function createMapBox(options: MapBoxOptions): MapBox;
@@ -0,0 +1,47 @@
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
+ export declare function createMapBox(options: MapBoxOptions): MapBox;
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMapBox = createMapBox;
4
+ const labels_1 = require("./labels");
5
+ const leaflet_1 = require("./leaflet");
6
+ const styles_1 = require("./styles");
7
+ const warned = new Set();
8
+ const isMac = (doc) => /Mac|iPhone|iPad/.test(doc.defaultView?.navigator.platform ?? '');
9
+ function createMapBox(options) {
10
+ const { document: doc, provider, locale, labels } = options;
11
+ (0, styles_1.installMapStyles)(doc);
12
+ const element = doc.createElement('div');
13
+ element.className = 'fd-map-box';
14
+ // The map's own layout is left to right in every language; the controls over it follow the page.
15
+ element.dir = 'ltr';
16
+ element.style.setProperty('--fd-map-height', `${options.height ?? 280}px`);
17
+ element.setAttribute('role', 'region');
18
+ element.setAttribute('aria-label', (0, labels_1.fill)(labels.mapOf, { label: options.name }));
19
+ const keysId = `fd-map-keys-${Math.random().toString(36).slice(2, 9)}`;
20
+ const keys = doc.createElement('span');
21
+ keys.id = keysId;
22
+ keys.className = 'fd-sr-only';
23
+ keys.textContent = [labels.mapKeys, options.keys].filter(Boolean).join(' ');
24
+ element.setAttribute('aria-describedby', keysId);
25
+ const zoom = doc.createElement('div');
26
+ zoom.className = 'fd-map-zoom';
27
+ zoom.dataset['side'] = 'right';
28
+ const zoomButton = (words, sign) => {
29
+ const button = doc.createElement('button');
30
+ button.type = 'button';
31
+ button.setAttribute('aria-label', words);
32
+ button.title = words;
33
+ button.textContent = sign;
34
+ return button;
35
+ };
36
+ const zoomIn = zoomButton(labels.zoomIn, '+');
37
+ const zoomOut = zoomButton(labels.zoomOut, '−');
38
+ zoom.append(zoomIn, zoomOut);
39
+ const credits = doc.createElement('div');
40
+ credits.className = 'fd-map-credits';
41
+ const veilElement = doc.createElement('div');
42
+ veilElement.className = 'fd-map-veil';
43
+ veilElement.setAttribute('aria-hidden', 'true');
44
+ const crosshair = doc.createElement('div');
45
+ crosshair.className = 'fd-map-crosshair';
46
+ element.append(keys, veilElement, crosshair);
47
+ // 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.
48
+ const overlays = [zoom, credits];
49
+ if (provider.logo) {
50
+ const mark = doc.createElement(provider.logo.href ? 'a' : 'span');
51
+ mark.className = 'fd-map-logo';
52
+ if (mark instanceof HTMLAnchorElement && provider.logo.href) {
53
+ mark.href = provider.logo.href;
54
+ mark.target = '_blank';
55
+ mark.rel = 'noopener';
56
+ }
57
+ if (provider.logo.image) {
58
+ const img = doc.createElement('img');
59
+ img.src = provider.logo.image;
60
+ img.alt = provider.logo.text;
61
+ mark.append(img);
62
+ }
63
+ else {
64
+ const words = doc.createElement('span');
65
+ words.textContent = provider.logo.text;
66
+ mark.append(words);
67
+ }
68
+ overlays.push(mark);
69
+ }
70
+ if (provider.demoOnly && !warned.has(provider.id)) {
71
+ warned.add(provider.id);
72
+ console.warn(`[Fieldia] The "${provider.id}" map provider is for demos and development only: choose a provider (azureMaps, googleMaps, mapbox, or tiles) for an app in use.`);
73
+ }
74
+ let map = null;
75
+ let L = null;
76
+ let destroyed = false;
77
+ let pannable = true;
78
+ let baseMap = null;
79
+ let baseLayer = null;
80
+ let creditsAsked = 0;
81
+ let creditsTimer;
82
+ let veilTimer;
83
+ const waiting = [];
84
+ const following = [veilElement];
85
+ const cleanups = [];
86
+ function veil(words) {
87
+ veilElement.textContent = words;
88
+ veilElement.dataset['show'] = '';
89
+ clearTimeout(veilTimer);
90
+ veilTimer = setTimeout(() => delete veilElement.dataset['show'], 1400);
91
+ }
92
+ function shield(over) {
93
+ if (!L) {
94
+ waiting.push(() => shield(over));
95
+ return;
96
+ }
97
+ L.DomEvent.disableClickPropagation(over);
98
+ L.DomEvent.disableScrollPropagation(over);
99
+ }
100
+ /** Dark when the form is: its own scheme, or the reader's when it follows theirs. */
101
+ function dark() {
102
+ const view = doc.defaultView;
103
+ const scheme = view?.getComputedStyle(element).colorScheme ?? '';
104
+ if (!scheme.includes('dark'))
105
+ return false;
106
+ if (!scheme.includes('light'))
107
+ return true;
108
+ return !!view?.matchMedia?.('(prefers-color-scheme: dark)').matches;
109
+ }
110
+ function showCredits(list) {
111
+ credits.replaceChildren();
112
+ list.forEach((credit, i) => {
113
+ if (i)
114
+ credits.append(' · ');
115
+ if (credit.href) {
116
+ const link = doc.createElement('a');
117
+ link.href = credit.href;
118
+ link.target = '_blank';
119
+ link.rel = 'noopener';
120
+ link.textContent = credit.text;
121
+ credits.append(link);
122
+ }
123
+ else
124
+ credits.append(credit.text);
125
+ });
126
+ }
127
+ function askCredits() {
128
+ clearTimeout(creditsTimer);
129
+ creditsTimer = setTimeout(() => {
130
+ if (!map || !baseMap)
131
+ return;
132
+ const asked = ++creditsAsked;
133
+ const b = map.getBounds();
134
+ provider
135
+ .credits(baseMap, { zoom: map.getZoom(), bounds: { south: b.getSouth(), west: b.getWest(), north: b.getNorth(), east: b.getEast() } }, locale)
136
+ .then((list) => asked === creditsAsked && showCredits(list))
137
+ .catch(() => undefined);
138
+ }, 300);
139
+ }
140
+ async function setBaseMap(kind) {
141
+ if (!map || !L || kind === baseMap)
142
+ return;
143
+ let spec = await provider.tiles(kind, locale).catch(() => null);
144
+ let drawn = kind;
145
+ if (!spec && kind !== 'road') {
146
+ spec = await provider.tiles('road', locale).catch(() => null);
147
+ drawn = 'road';
148
+ }
149
+ if (!spec || destroyed || !map)
150
+ return;
151
+ if (drawn === baseMap) {
152
+ baseMap = kind;
153
+ return;
154
+ }
155
+ const layer = (0, leaflet_1.tileLayer)(L, spec).addTo(map);
156
+ baseLayer?.remove();
157
+ baseLayer = layer;
158
+ baseMap = drawn;
159
+ element.dataset['baseMap'] = drawn;
160
+ askCredits();
161
+ }
162
+ function refresh() {
163
+ const page = element.parentElement ? doc.defaultView?.getComputedStyle(element.parentElement).direction : 'ltr';
164
+ zoom.dataset['side'] = page === 'rtl' ? 'left' : 'right';
165
+ element.dataset['side'] = zoom.dataset['side'];
166
+ for (const words of following)
167
+ words.dir = page === 'rtl' ? 'rtl' : 'ltr';
168
+ if (map)
169
+ void setBaseMap(dark() ? 'dark' : 'road');
170
+ }
171
+ function setPannable(on) {
172
+ pannable = on;
173
+ if (!map)
174
+ return;
175
+ if (on)
176
+ map.dragging.enable();
177
+ else
178
+ map.dragging.disable();
179
+ }
180
+ // A scroll passes to the page; Ctrl or ⌘ with it zooms. Caught on the way down, before Leaflet's own.
181
+ const wheel = (event) => {
182
+ if (event.ctrlKey || event.metaKey)
183
+ return;
184
+ event.stopPropagation();
185
+ veil(isMac(doc) ? labels.cmdZoom : labels.ctrlZoom);
186
+ };
187
+ element.addEventListener('wheel', wheel, { capture: true, passive: true });
188
+ // 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.
189
+ // (Leaflet focuses the map in code on every press, which a browser may show as keyboard focus.)
190
+ // Focus that no press brought (Tab, a shortcut) is the keyboard's too.
191
+ let pressing = false;
192
+ const byKeys = (event) => event.target === element && element.setAttribute('data-keys', '');
193
+ const byPointer = () => {
194
+ element.removeAttribute('data-keys');
195
+ pressing = true;
196
+ setTimeout(() => (pressing = false), 0);
197
+ };
198
+ const byFocus = () => !pressing && element.setAttribute('data-keys', '');
199
+ element.addEventListener('keydown', byKeys);
200
+ element.addEventListener('pointerdown', byPointer, { capture: true });
201
+ element.addEventListener('focus', byFocus);
202
+ cleanups.push(() => {
203
+ element.removeEventListener('keydown', byKeys);
204
+ element.removeEventListener('pointerdown', byPointer, { capture: true });
205
+ element.removeEventListener('focus', byFocus);
206
+ });
207
+ // One finger scrolls the page; two move the map.
208
+ let touchStart = null;
209
+ const touchstart = (event) => {
210
+ if (!map)
211
+ return;
212
+ const one = event.touches.length === 1;
213
+ touchStart = one ? { x: event.touches[0].clientX, y: event.touches[0].clientY } : null;
214
+ if (one || !pannable)
215
+ map.dragging.disable();
216
+ else
217
+ map.dragging.enable();
218
+ };
219
+ const touchmove = (event) => {
220
+ if (!touchStart || event.touches.length !== 1 || !pannable)
221
+ return;
222
+ const moved = Math.hypot(event.touches[0].clientX - touchStart.x, event.touches[0].clientY - touchStart.y);
223
+ if (moved > 12)
224
+ veil(labels.twoFingers);
225
+ };
226
+ const touchend = (event) => {
227
+ if (event.touches.length === 0 && map && pannable)
228
+ map.dragging.enable();
229
+ };
230
+ element.addEventListener('touchstart', touchstart, { capture: true, passive: true });
231
+ element.addEventListener('touchmove', touchmove, { capture: true, passive: true });
232
+ element.addEventListener('touchend', touchend, { capture: true, passive: true });
233
+ cleanups.push(() => {
234
+ element.removeEventListener('wheel', wheel, { capture: true });
235
+ element.removeEventListener('touchstart', touchstart, { capture: true });
236
+ element.removeEventListener('touchmove', touchmove, { capture: true });
237
+ element.removeEventListener('touchend', touchend, { capture: true });
238
+ });
239
+ void (0, leaflet_1.loadLeaflet)().then(({ L: leaflet, css }) => {
240
+ if (destroyed)
241
+ return;
242
+ (0, styles_1.installLeafletStyles)(doc, css);
243
+ L = leaflet;
244
+ map = leaflet.map(element, {
245
+ zoomControl: false,
246
+ attributionControl: false,
247
+ keyboard: true,
248
+ keyboardPanDelta: 80,
249
+ worldCopyJump: true,
250
+ dragging: pannable,
251
+ });
252
+ if (options.center)
253
+ map.setView([options.center.lat, options.center.lng], options.zoom ?? 15);
254
+ else
255
+ map.setView([20, 0], options.zoom ?? 2);
256
+ element.append(...overlays);
257
+ for (const over of overlays)
258
+ shield(over);
259
+ zoomIn.addEventListener('click', () => map?.zoomIn());
260
+ zoomOut.addEventListener('click', () => map?.zoomOut());
261
+ map.on('moveend', askCredits);
262
+ // Shown at last in a tab or a dialog: the map measures itself again.
263
+ const ResizeWatch = doc.defaultView?.ResizeObserver;
264
+ if (ResizeWatch) {
265
+ const watch = new ResizeWatch(() => map?.invalidateSize({ pan: false }));
266
+ watch.observe(element);
267
+ cleanups.push(() => watch.disconnect());
268
+ }
269
+ refresh();
270
+ for (const use of waiting.splice(0))
271
+ use(map, leaflet);
272
+ });
273
+ return {
274
+ element,
275
+ ready(use) {
276
+ if (map && L)
277
+ use(map, L);
278
+ else
279
+ waiting.push(use);
280
+ },
281
+ veil,
282
+ setPannable,
283
+ refresh,
284
+ shield,
285
+ follow(words) {
286
+ following.push(words);
287
+ refresh();
288
+ },
289
+ destroy() {
290
+ destroyed = true;
291
+ clearTimeout(creditsTimer);
292
+ clearTimeout(veilTimer);
293
+ for (const cleanup of cleanups.splice(0))
294
+ cleanup();
295
+ map?.remove();
296
+ map = null;
297
+ },
298
+ };
299
+ }
300
+ //# 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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"}