@fieldia/map 0.15.0 → 0.16.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 (78) hide show
  1. package/README.md +44 -11
  2. package/package.json +4 -4
  3. package/src/index.d.mts +2 -1
  4. package/src/index.d.ts +2 -1
  5. package/src/index.js +3 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +1 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/answers.d.mts +17 -0
  10. package/src/lib/answers.d.ts +17 -0
  11. package/src/lib/answers.js +27 -0
  12. package/src/lib/answers.js.map +1 -0
  13. package/src/lib/answers.mjs +21 -0
  14. package/src/lib/answers.mjs.map +1 -0
  15. package/src/lib/card.d.mts +10 -2
  16. package/src/lib/card.d.ts +10 -2
  17. package/src/lib/card.js +13 -4
  18. package/src/lib/card.js.map +1 -1
  19. package/src/lib/card.mjs +13 -4
  20. package/src/lib/card.mjs.map +1 -1
  21. package/src/lib/form-map.d.mts +16 -0
  22. package/src/lib/form-map.d.ts +16 -0
  23. package/src/lib/form-map.js +525 -0
  24. package/src/lib/form-map.js.map +1 -0
  25. package/src/lib/form-map.mjs +522 -0
  26. package/src/lib/form-map.mjs.map +1 -0
  27. package/src/lib/labels.d.mts +13 -0
  28. package/src/lib/labels.d.ts +13 -0
  29. package/src/lib/labels.js +12 -1
  30. package/src/lib/labels.js.map +1 -1
  31. package/src/lib/labels.mjs +10 -0
  32. package/src/lib/labels.mjs.map +1 -1
  33. package/src/lib/list-view.js +48 -65
  34. package/src/lib/list-view.js.map +1 -1
  35. package/src/lib/list-view.mjs +42 -59
  36. package/src/lib/list-view.mjs.map +1 -1
  37. package/src/lib/map-core.js +22 -2
  38. package/src/lib/map-core.js.map +1 -1
  39. package/src/lib/map-core.mjs +22 -2
  40. package/src/lib/map-core.mjs.map +1 -1
  41. package/src/lib/marks.d.mts +34 -0
  42. package/src/lib/marks.d.ts +34 -0
  43. package/src/lib/marks.js +56 -0
  44. package/src/lib/marks.js.map +1 -0
  45. package/src/lib/marks.mjs +49 -0
  46. package/src/lib/marks.mjs.map +1 -0
  47. package/src/lib/pins.d.mts +2 -0
  48. package/src/lib/pins.d.ts +2 -0
  49. package/src/lib/pins.js +5 -1
  50. package/src/lib/pins.js.map +1 -1
  51. package/src/lib/pins.mjs +3 -1
  52. package/src/lib/pins.mjs.map +1 -1
  53. package/src/lib/providers.d.mts +27 -3
  54. package/src/lib/providers.d.ts +27 -3
  55. package/src/lib/providers.js +69 -67
  56. package/src/lib/providers.js.map +1 -1
  57. package/src/lib/providers.mjs +17 -15
  58. package/src/lib/providers.mjs.map +1 -1
  59. package/src/lib/route-line.d.mts +34 -0
  60. package/src/lib/route-line.d.ts +34 -0
  61. package/src/lib/route-line.js +53 -0
  62. package/src/lib/route-line.js.map +1 -0
  63. package/src/lib/route-line.mjs +47 -0
  64. package/src/lib/route-line.mjs.map +1 -0
  65. package/src/lib/routes.d.mts +28 -0
  66. package/src/lib/routes.d.ts +28 -0
  67. package/src/lib/routes.js +112 -0
  68. package/src/lib/routes.js.map +1 -0
  69. package/src/lib/routes.mjs +105 -0
  70. package/src/lib/routes.mjs.map +1 -0
  71. package/src/lib/settings.d.mts +5 -3
  72. package/src/lib/settings.d.ts +5 -3
  73. package/src/lib/styles.d.mts +9 -1
  74. package/src/lib/styles.d.ts +9 -1
  75. package/src/lib/styles.js +42 -3
  76. package/src/lib/styles.js.map +1 -1
  77. package/src/lib/styles.mjs +40 -2
  78. package/src/lib/styles.mjs.map +1 -1
@@ -0,0 +1,522 @@
1
+ import { compileModifier, expressionContext } from '@fieldia/core';
2
+ import { drawCard } from './card.mjs';
3
+ import { readPoint } from './geo.mjs';
4
+ import { fill, formMapLabels } from './labels.mjs';
5
+ import { createMapBox, warnOnce } from './map-core.mjs';
6
+ import { anchor, byKeys, MOVE_KEYS, onPress, popCard, SIZED_BY_FACE } from './marks.mjs';
7
+ import { comma, makePins, shown } from './pins.mjs';
8
+ import { nearestOnLine, pointAlong, routeLine, splitLine } from './route-line.mjs';
9
+ import { installFormMapStyles } from './styles.mjs';
10
+ /**
11
+ * A map on a form (`type: "map"`), for the viewer's `maps`: the record's
12
+ * places as layers. A layer is the record's own place (a kitchen, a door, a
13
+ * courier), a place for each of its lines (a round's stops), a route along
14
+ * the roads between them, or the reader's own place. Pins are drawn as a
15
+ * list's map draws them. A place that moves glides to each new position —
16
+ * along its route when it is on one — says when it was last seen once its
17
+ * news is old, and is followed until the person moves the map. A route's
18
+ * part already travelled fades, and its time and distance left are written
19
+ * into the record's fields the page names.
20
+ *
21
+ * mountViewer(host, { page, maps: mapParts({ provider }) })
22
+ */
23
+ export function mapParts(settings) {
24
+ return (context) => formMap(settings, context);
25
+ }
26
+ /** How long a pin takes to glide to its new place, in milliseconds. */
27
+ const GLIDE_MS = 900;
28
+ /** A traveller this far from their route, in metres, has left it: a new one is asked for. */
29
+ const OFF_ROUTE_M = 60;
30
+ /** A route is asked for again at most this often, in milliseconds, however its traveller wanders. */
31
+ const ROUTE_EVERY_MS = 10_000;
32
+ /** Room kept round the places when the map fits them, in pixels. */
33
+ const ROOM = 48;
34
+ function formMap(settings, context) {
35
+ const { node, page, form, document: doc, locale } = context;
36
+ installFormMapStyles(doc);
37
+ const labels = formMapLabels(locale, settings.labels?.[locale]);
38
+ const element = doc.createElement('div');
39
+ element.className = 'fd-map-form';
40
+ if (node.label) {
41
+ const heading = doc.createElement('p');
42
+ heading.className = 'fd-map-form-label';
43
+ heading.textContent = node.label;
44
+ element.append(heading);
45
+ }
46
+ const box = createMapBox({
47
+ document: doc,
48
+ provider: settings.provider,
49
+ locale,
50
+ labels,
51
+ name: node.label ?? labels.map,
52
+ keys: labels.pinKeys,
53
+ center: settings.center,
54
+ zoom: settings.zoom,
55
+ height: node.height ?? 360,
56
+ });
57
+ element.append(box.element);
58
+ const note = doc.createElement('p');
59
+ note.className = 'fd-map-list-note';
60
+ note.setAttribute('role', 'status');
61
+ note.hidden = true;
62
+ const followButton = doc.createElement('button');
63
+ followButton.type = 'button';
64
+ followButton.className = 'fd-map-here fd-map-follow';
65
+ followButton.textContent = labels.follow;
66
+ followButton.hidden = true;
67
+ const me = node.layers.find((layer) => layer.myLocation);
68
+ const locate = doc.createElement('button');
69
+ locate.type = 'button';
70
+ locate.className = 'fd-map-locate';
71
+ locate.setAttribute('aria-label', labels.myLocation);
72
+ locate.title = labels.myLocation;
73
+ locate.setAttribute('aria-pressed', 'false');
74
+ locate.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/></svg>';
75
+ const reduced = !!doc.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
76
+ // ---- each layer's pins, from the record's fields or its lines' ---------------------
77
+ const pinsOf = new Map();
78
+ for (const layer of node.layers) {
79
+ if (layer.point === undefined && layer.latitude === undefined)
80
+ continue;
81
+ const lineFields = layer.lines ? page.fields[layer.lines].fields : undefined;
82
+ const scope = lineFields ? { ...page, fields: lineFields } : page;
83
+ pinsOf.set(layer.id, { pins: makePins({ document: doc, page: scope, locale, pin: layer.pin ?? {}, title: layer.card?.title ?? '', icons: context.icons, drawers: settings.pins }), scope });
84
+ }
85
+ const hidden = new Map(node.layers.filter((layer) => typeof layer.invisible === 'string' || layer.invisible === true).map((layer) => [layer.id, compileModifier(layer.invisible)]));
86
+ const placeOf = (layer, values) => {
87
+ if (layer.point)
88
+ return readPoint(values[layer.point]);
89
+ const lat = values[layer.latitude];
90
+ const lng = values[layer.longitude];
91
+ return typeof lat === 'number' && typeof lng === 'number' && Math.abs(lat) <= 90 && Math.abs(lng) <= 180 ? { lat, lng } : null;
92
+ };
93
+ /** Every place on the map now: each layer's own, or each of its lines'. */
94
+ function placesNow(values) {
95
+ const context = expressionContext(values, page.fields);
96
+ return node.layers.flatMap((layer) => {
97
+ if (!pinsOf.has(layer.id) || hidden.get(layer.id)?.evaluate(context))
98
+ return [];
99
+ if (!layer.lines) {
100
+ const at = placeOf(layer, values);
101
+ return at ? [{ key: layer.id, layer, record: { id: layer.id, values }, at }] : [];
102
+ }
103
+ const lines = values[layer.lines] ?? [];
104
+ return lines.flatMap((line) => {
105
+ const at = placeOf(layer, line.values);
106
+ return at ? [{ key: `${layer.id}:${line.key}`, layer, record: { id: line.id ?? line.key, values: line.values }, at }] : [];
107
+ });
108
+ });
109
+ }
110
+ /** A pin's name: its layer's words, then what the pin says ("Courier, 4 min"). */
111
+ function nameOf(place) {
112
+ const scope = pinsOf.get(place.layer.id).scope;
113
+ const title = place.layer.card?.title ? shown(scope, place.layer.card.title, place.record.values, locale) : '';
114
+ const said = place.layer.pin?.label ? shown(scope, place.layer.pin.label, place.record.values, locale) : '';
115
+ return [place.layer.label, title, said].filter(Boolean).join(comma(locale)) || place.layer.id;
116
+ }
117
+ // ---- the person's own moves, after which a followed place is followed no more -------
118
+ let moving = false;
119
+ let userMoved = false;
120
+ const pressed = (event) => {
121
+ if (!event.target?.closest('.leaflet-marker-icon, .leaflet-popup, .fd-map-follow, .fd-map-locate, .fd-map-credits, .fd-map-logo'))
122
+ moving = true;
123
+ };
124
+ const keyed = (event) => {
125
+ if (event.target === box.element && MOVE_KEYS.has(event.key))
126
+ moving = true;
127
+ };
128
+ const wheeled = (event) => {
129
+ if (event.ctrlKey || event.metaKey)
130
+ moving = true;
131
+ };
132
+ box.element.addEventListener('pointerdown', pressed, { capture: true });
133
+ box.element.addEventListener('keydown', keyed, { capture: true });
134
+ box.element.addEventListener('wheel', wheeled, { capture: true, passive: true });
135
+ const following = node.layers.some((layer) => layer.live?.follow);
136
+ // ---- drawing -----------------------------------------------------------------------
137
+ const marks = new Map();
138
+ const routes = new Map();
139
+ let values = {};
140
+ let fitted = false;
141
+ let destroyed = false;
142
+ let openCard = null;
143
+ let mine = null;
144
+ let meMark = null;
145
+ let meCircle = null;
146
+ let watching = null;
147
+ function draw(map, L) {
148
+ const now = placesNow(values);
149
+ const seen = new Set();
150
+ for (const place of now) {
151
+ seen.add(place.key);
152
+ const face = pinsOf.get(place.layer.id).pins.face(place.record);
153
+ const html = face.element.outerHTML;
154
+ const name = nameOf(place);
155
+ const mark = marks.get(place.key);
156
+ if (!mark) {
157
+ const marker = L.marker([place.at.lat, place.at.lng], { icon: L.divIcon({ className: `fd-map-mark ${anchor(face)}`, html: face.element, iconSize: SIZED_BY_FACE }), keyboard: true, riseOnHover: true }).addTo(map);
158
+ const made = { marker, layer: place.layer, at: place.at, html, name, movedAt: Date.now() };
159
+ marks.set(place.key, made);
160
+ marker.getElement()?.setAttribute('aria-label', name);
161
+ const height = face.stands === 'foot' ? face.height : face.height / 2;
162
+ if (place.layer.card)
163
+ onPress(marker, (event) => showCard(map, L, place.key, height, byKeys(event)));
164
+ continue;
165
+ }
166
+ if (html !== mark.html) {
167
+ mark.marker.setIcon(L.divIcon({ className: `fd-map-mark ${anchor(face)}`, html: face.element, iconSize: SIZED_BY_FACE }));
168
+ mark.html = html;
169
+ }
170
+ mark.name = name;
171
+ if (mark.at.lat !== place.at.lat || mark.at.lng !== place.at.lng) {
172
+ mark.at = place.at;
173
+ mark.movedAt = Date.now();
174
+ if (place.layer.live && !reduced)
175
+ glide(map, place.key, mark);
176
+ else {
177
+ mark.marker.setLatLng([place.at.lat, place.at.lng]);
178
+ follow(map, mark);
179
+ }
180
+ }
181
+ }
182
+ for (const [key, mark] of marks) {
183
+ if (seen.has(key))
184
+ continue;
185
+ if (mark.glide)
186
+ cancelAnimationFrame(mark.glide);
187
+ mark.marker.remove();
188
+ marks.delete(key);
189
+ }
190
+ restale();
191
+ drawRoutes(map, L);
192
+ if (!fitted)
193
+ fit(map);
194
+ }
195
+ function fit(map) {
196
+ const points = [...[...marks.values()].map((m) => m.at), ...[...routes.values()].flatMap((r) => r.found?.line ?? []), ...(mine ? [mine.at] : [])];
197
+ if (!points.length)
198
+ return;
199
+ fitted = true;
200
+ if (points.length === 1)
201
+ map.setView([points[0].lat, points[0].lng], Math.max(map.getZoom(), 15), { animate: false });
202
+ else
203
+ map.fitBounds(points.map((p) => [p.lat, p.lng]), { padding: [ROOM, ROOM], maxZoom: 16, animate: false });
204
+ }
205
+ /** A moving place glides to its new spot: along its route when it is on it, else straight. */
206
+ function glide(map, key, mark) {
207
+ if (mark.glide)
208
+ cancelAnimationFrame(mark.glide);
209
+ const from = mark.marker.getLatLng();
210
+ const to = mark.at;
211
+ const path = routes.get(routeLayerFrom(key) ?? '')?.found?.path;
212
+ let at = (t) => ({ lat: from.lat + (to.lat - from.lat) * t, lng: from.lng + (to.lng - from.lng) * t });
213
+ if (path) {
214
+ const a = nearestOnLine(path, from);
215
+ const b = nearestOnLine(path, to);
216
+ if (a.off < OFF_ROUTE_M && b.off < OFF_ROUTE_M && b.along >= a.along)
217
+ at = (t) => pointAlong(path, a.along + (b.along - a.along) * t);
218
+ }
219
+ const start = performance.now();
220
+ const step = (time) => {
221
+ const t = Math.min(1, (time - start) / GLIDE_MS);
222
+ // Eased in and out, as a thing that moves does.
223
+ const eased = t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;
224
+ const place = t < 1 ? at(eased) : to;
225
+ mark.marker.setLatLng([place.lat, place.lng]);
226
+ if (t < 1)
227
+ mark.glide = requestAnimationFrame(step);
228
+ else {
229
+ mark.glide = undefined;
230
+ follow(map, mark);
231
+ }
232
+ };
233
+ mark.glide = requestAnimationFrame(step);
234
+ }
235
+ /** The route that starts at a layer's place: its traveller's. */
236
+ const routeLayerFrom = (key) => node.layers.find((layer) => layer.route?.from === key)?.id;
237
+ /** A followed place kept in view, until the person moves the map. */
238
+ function follow(map, mark) {
239
+ if (!mark.layer.live?.follow || userMoved || destroyed)
240
+ return;
241
+ map.panInside(mark.marker.getLatLng(), { padding: [ROOM, ROOM] });
242
+ }
243
+ /** A place whose news is old says when it was last seen, in the page's language, and greys. */
244
+ function restale() {
245
+ const words = new Intl.RelativeTimeFormat(locale, { numeric: 'always' });
246
+ for (const mark of marks.values()) {
247
+ const after = mark.layer.live?.staleAfter;
248
+ const icon = mark.marker.getElement();
249
+ const face = icon?.querySelector('.fd-map-face');
250
+ if (!after || !icon || !face)
251
+ continue;
252
+ const seconds = (Date.now() - mark.movedAt) / 1000;
253
+ const stale = seconds > after;
254
+ face.toggleAttribute('data-stale', stale);
255
+ let badge = face.querySelector('.fd-map-face-stale');
256
+ if (!stale) {
257
+ badge?.remove();
258
+ icon.setAttribute('aria-label', mark.name);
259
+ continue;
260
+ }
261
+ const minutes = Math.max(1, Math.round(seconds / 60));
262
+ const time = minutes < 90 ? words.format(-minutes, 'minute') : words.format(-Math.round(minutes / 60), 'hour');
263
+ if (!badge) {
264
+ badge = doc.createElement('span');
265
+ badge.className = 'fd-map-face-stale';
266
+ face.append(badge);
267
+ }
268
+ badge.textContent = fill(labels.lastSeen, { time });
269
+ icon.setAttribute('aria-label', `${mark.name}${comma(locale)}${badge.textContent}`);
270
+ }
271
+ }
272
+ const staleTimer = setInterval(restale, 15_000);
273
+ // ---- routes ------------------------------------------------------------------------
274
+ /** Where a layer is now: one place's spot, or the reader's own. */
275
+ const positionOf = (id) => (me?.id === id ? (mine?.at ?? null) : (marks.get(id)?.at ?? null));
276
+ function drawRoutes(map, L) {
277
+ const shownNow = expressionContext(values, page.fields);
278
+ for (const layer of node.layers) {
279
+ const route = layer.route;
280
+ if (!route)
281
+ continue;
282
+ const off = hidden.get(layer.id)?.evaluate(shownNow);
283
+ const from = positionOf(route.from);
284
+ const to = route.to ? positionOf(route.to) : null;
285
+ const via = route.through ? [...marks.entries()].filter(([key]) => key.startsWith(`${route.through}:`)).map(([, mark]) => mark.at) : [];
286
+ let state = routes.get(layer.id);
287
+ if (!state)
288
+ routes.set(layer.id, (state = { layer, asking: 0, ends: '', askedAt: 0 }));
289
+ // Hidden, or with an end missing: off the map, though what was found is kept for when it shows again.
290
+ if (off || !from || (route.to && !to) || via.length + (to ? 1 : 0) < 1) {
291
+ state.done?.remove();
292
+ state.left?.remove();
293
+ state.done = state.left = undefined;
294
+ continue;
295
+ }
296
+ const ends = JSON.stringify([...via, ...(to ? [to] : [])].map((p) => [p.lat.toFixed(5), p.lng.toFixed(5)]));
297
+ const away = state.found ? nearestOnLine(state.found.path, from).off : Infinity;
298
+ const fresh = ends !== state.ends || (away > OFF_ROUTE_M && Date.now() - state.askedAt > ROUTE_EVERY_MS);
299
+ if (fresh)
300
+ ask(state, [from, ...via, ...(to ? [to] : [])], ends);
301
+ if (state.found)
302
+ drawRoute(map, L, state, from);
303
+ }
304
+ }
305
+ function ask(state, points, ends) {
306
+ const finder = settings.route ?? settings.provider.route;
307
+ state.ends = ends;
308
+ state.askedAt = Date.now();
309
+ if (!finder) {
310
+ warnOnce(`This map has a route, and its provider "${settings.provider.id}" finds none: give mapParts a provider with routes, or the app's own route.`);
311
+ return say(labels.routeFailed);
312
+ }
313
+ state.abort?.abort();
314
+ const abort = new AbortController();
315
+ state.abort = abort;
316
+ const asked = ++state.asking;
317
+ finder({ points, mode: state.layer.route?.mode ?? 'car', locale, signal: abort.signal })
318
+ .then((found) => {
319
+ if (asked !== state.asking || destroyed)
320
+ return;
321
+ state.found = { ...found, path: routeLine(found.line) };
322
+ say('');
323
+ box.ready((map, L) => {
324
+ const from = positionOf(state.layer.route.from);
325
+ if (from)
326
+ drawRoute(map, L, state, from);
327
+ // The first route shows whole, unless the person has moved the map.
328
+ if (!userMoved && state.written === undefined) {
329
+ fitted = false;
330
+ fit(map);
331
+ }
332
+ });
333
+ })
334
+ .catch((error) => {
335
+ if (abort.signal.aborted || destroyed)
336
+ return;
337
+ warnOnce(`A route could not be found: ${error.message}`);
338
+ say(labels.routeFailed);
339
+ });
340
+ }
341
+ /** The route as it stands: the part travelled faded, the part left bright; its numbers written where the page says. */
342
+ function drawRoute(map, L, state, from) {
343
+ const found = state.found;
344
+ const route = state.layer.route;
345
+ let left = found.path.line;
346
+ let done = [];
347
+ let seconds = found.seconds;
348
+ let metres = found.metres;
349
+ if (route.progress) {
350
+ const on = nearestOnLine(found.path, from);
351
+ ({ done, left } = splitLine(found.path, on));
352
+ const share = found.path.metres ? on.along / found.path.metres : 0;
353
+ seconds = found.seconds * (1 - share);
354
+ metres = Math.max(0, found.metres * (1 - share));
355
+ }
356
+ const latLngs = (line) => line.map((p) => [p.lat, p.lng]);
357
+ if (done.length > 1) {
358
+ if (state.done)
359
+ state.done.setLatLngs(latLngs(done));
360
+ else
361
+ state.done = L.polyline(latLngs(done), { className: 'fd-map-route-done', interactive: false }).addTo(map);
362
+ }
363
+ else {
364
+ state.done?.remove();
365
+ state.done = undefined;
366
+ }
367
+ if (state.left)
368
+ state.left.setLatLngs(latLngs(left));
369
+ else
370
+ state.left = L.polyline(latLngs(left), { className: 'fd-map-route', interactive: false }).addTo(map);
371
+ write(state, seconds, metres);
372
+ }
373
+ /** The route's numbers into the record's fields the page names, when they change: never in the middle of the form's own update. */
374
+ function write(state, seconds, metres) {
375
+ const into = state.layer.route?.write;
376
+ if (!into)
377
+ return;
378
+ const changes = [];
379
+ if (into.seconds && values[into.seconds] !== Math.round(seconds))
380
+ changes.push([into.seconds, Math.round(seconds)]);
381
+ if (into.metres && values[into.metres] !== Math.round(metres))
382
+ changes.push([into.metres, Math.round(metres)]);
383
+ if (into.line && state.written !== state.asking) {
384
+ const line = state.found.line.map((p) => [Math.round(p.lng * 1e6) / 1e6, Math.round(p.lat * 1e6) / 1e6]);
385
+ changes.push([into.line, { type: 'LineString', coordinates: line }]);
386
+ }
387
+ state.written = state.asking;
388
+ if (!changes.length)
389
+ return;
390
+ // The app's change, not a person's: the page's change steps do not run for it.
391
+ queueMicrotask(() => !destroyed && form.setValues(Object.fromEntries(changes)));
392
+ }
393
+ // ---- a card, the reader's own place, and the words over the map ----------------------
394
+ function showCard(map, L, key, height, focus) {
395
+ const mark = marks.get(key);
396
+ const place = placesNow(values).find((p) => p.key === key);
397
+ if (!mark || !place?.layer.card)
398
+ return;
399
+ closeCard(map, false);
400
+ const scope = pinsOf.get(place.layer.id).scope;
401
+ const card = drawCard({
402
+ document: doc,
403
+ page: scope,
404
+ locale,
405
+ labels,
406
+ dir: doc.defaultView?.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr',
407
+ card: { ...place.layer.card, open: false },
408
+ title: place.layer.card.title ?? '',
409
+ fields: place.layer.card.fields ?? [],
410
+ record: place.record,
411
+ close: () => closeCard(map, true),
412
+ });
413
+ const back = mark.marker.getElement() ?? null;
414
+ openCard = { popup: popCard(map, L, { at: mark.at, height, card, focus, escape: () => closeCard(map, true) }), back };
415
+ }
416
+ function closeCard(map, back) {
417
+ if (!openCard)
418
+ return;
419
+ const { popup, back: to } = openCard;
420
+ openCard = null;
421
+ map.closePopup(popup);
422
+ if (back)
423
+ to?.focus();
424
+ }
425
+ function say(words) {
426
+ note.textContent = words;
427
+ note.hidden = !words;
428
+ }
429
+ /** The reader's own place: asked of the browser only when they press for it, then kept up to date. */
430
+ function locateMe() {
431
+ const geo = doc.defaultView?.navigator.geolocation;
432
+ if (watching !== null) {
433
+ geo?.clearWatch(watching);
434
+ watching = null;
435
+ locate.setAttribute('aria-pressed', 'false');
436
+ return;
437
+ }
438
+ if (!geo)
439
+ return say(labels.locationFailed);
440
+ locate.setAttribute('aria-pressed', 'true');
441
+ say(labels.locating);
442
+ let first = true;
443
+ watching = geo.watchPosition((position) => {
444
+ mine = { at: { lat: position.coords.latitude, lng: position.coords.longitude }, accuracy: position.coords.accuracy };
445
+ say('');
446
+ box.ready((map, L) => {
447
+ const at = [mine.at.lat, mine.at.lng];
448
+ if (!meMark)
449
+ meMark = L.marker(at, { icon: L.divIcon({ className: 'fd-map-me', iconSize: [18, 18] }), keyboard: false, interactive: false }).addTo(map);
450
+ else
451
+ meMark.setLatLng(at);
452
+ if (!meCircle)
453
+ meCircle = L.circle(at, { radius: mine.accuracy, className: 'fd-map-accuracy', interactive: false }).addTo(map);
454
+ else
455
+ meCircle.setLatLng(at).setRadius(mine.accuracy);
456
+ drawRoutes(map, L);
457
+ if (first) {
458
+ first = false;
459
+ fitted = false;
460
+ fit(map);
461
+ }
462
+ });
463
+ }, (error) => {
464
+ say(error.code === error.PERMISSION_DENIED ? labels.locationBlocked : labels.locationFailed);
465
+ locate.setAttribute('aria-pressed', 'false');
466
+ if (watching !== null)
467
+ geo.clearWatch(watching);
468
+ watching = null;
469
+ }, { enableHighAccuracy: true, maximumAge: 10_000 });
470
+ }
471
+ box.ready((map, L) => {
472
+ box.element.append(note, followButton, ...(me ? [locate] : []));
473
+ box.shield(followButton);
474
+ box.shield(locate);
475
+ box.follow(note);
476
+ box.follow(followButton);
477
+ locate.addEventListener('click', locateMe);
478
+ followButton.addEventListener('click', () => {
479
+ userMoved = false;
480
+ followButton.hidden = true;
481
+ const followed = [...marks.values()].find((mark) => mark.layer.live?.follow);
482
+ if (followed)
483
+ map.panTo(followed.marker.getLatLng());
484
+ });
485
+ map.on('moveend', () => {
486
+ if (moving && following) {
487
+ userMoved = true;
488
+ followButton.hidden = false;
489
+ }
490
+ moving = false;
491
+ });
492
+ map.on('popupclose', (event) => {
493
+ if (openCard?.popup === event.popup)
494
+ openCard = null;
495
+ });
496
+ draw(map, L);
497
+ });
498
+ return {
499
+ element,
500
+ update(state) {
501
+ values = state.values;
502
+ box.refresh();
503
+ box.ready((map, L) => draw(map, L));
504
+ },
505
+ destroy() {
506
+ destroyed = true;
507
+ clearInterval(staleTimer);
508
+ if (watching !== null)
509
+ doc.defaultView?.navigator.geolocation.clearWatch(watching);
510
+ for (const mark of marks.values())
511
+ if (mark.glide)
512
+ cancelAnimationFrame(mark.glide);
513
+ for (const route of routes.values())
514
+ route.abort?.abort();
515
+ box.element.removeEventListener('pointerdown', pressed, { capture: true });
516
+ box.element.removeEventListener('keydown', keyed, { capture: true });
517
+ box.element.removeEventListener('wheel', wheeled, { capture: true });
518
+ box.destroy();
519
+ },
520
+ };
521
+ }
522
+ //# sourceMappingURL=form-map.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-map.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/form-map.ts"],"names":[],"mappings":"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"}
@@ -82,9 +82,22 @@ export interface ListMapLabels {
82
82
  inDrawnArea: string;
83
83
  }
84
84
  export declare const LIST_MAP_LABELS: Record<Locale, ListMapLabels>;
85
+ /** The words a form's map shows, besides the maps' own and a list map's: kept apart, as theirs are. */
86
+ export interface FormMapLabels {
87
+ /** A map's name when its page gives none. */
88
+ map: string;
89
+ /** A place whose news is old: `{time}` is how long ago, in the page's language ("3 minutes ago"). */
90
+ lastSeen: string;
91
+ /** Back to following a place that moves, after the person moved the map away. */
92
+ follow: string;
93
+ routeFailed: string;
94
+ }
95
+ export declare const FORM_MAP_LABELS: Record<Locale, FormMapLabels>;
85
96
  /** The words for a page's language, with the app's own over them. */
86
97
  export declare function mapLabels(locale: Locale | undefined, own?: Partial<MapLabels>): MapLabels;
87
98
  /** A list's map's words for a page's language, the maps' own with them, and the app's own over both. */
88
99
  export declare function listMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels>): MapLabels & ListMapLabels;
89
100
  /** A word with its `{name}`s filled in. */
90
101
  export declare const fill: (words: string, values: Record<string, string | number>) => string;
102
+ /** A form's map's words for a page's language: the maps' own, a list map's (its pins and cards), its own, the app's over all. */
103
+ export declare function formMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels & FormMapLabels>): MapLabels & ListMapLabels & FormMapLabels;
@@ -82,9 +82,22 @@ export interface ListMapLabels {
82
82
  inDrawnArea: string;
83
83
  }
84
84
  export declare const LIST_MAP_LABELS: Record<Locale, ListMapLabels>;
85
+ /** The words a form's map shows, besides the maps' own and a list map's: kept apart, as theirs are. */
86
+ export interface FormMapLabels {
87
+ /** A map's name when its page gives none. */
88
+ map: string;
89
+ /** A place whose news is old: `{time}` is how long ago, in the page's language ("3 minutes ago"). */
90
+ lastSeen: string;
91
+ /** Back to following a place that moves, after the person moved the map away. */
92
+ follow: string;
93
+ routeFailed: string;
94
+ }
95
+ export declare const FORM_MAP_LABELS: Record<Locale, FormMapLabels>;
85
96
  /** The words for a page's language, with the app's own over them. */
86
97
  export declare function mapLabels(locale: Locale | undefined, own?: Partial<MapLabels>): MapLabels;
87
98
  /** A list's map's words for a page's language, the maps' own with them, and the app's own over both. */
88
99
  export declare function listMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels>): MapLabels & ListMapLabels;
89
100
  /** A word with its `{name}`s filled in. */
90
101
  export declare const fill: (words: string, values: Record<string, string | number>) => string;
102
+ /** A form's map's words for a page's language: the maps' own, a list map's (its pins and cards), its own, the app's over all. */
103
+ export declare function formMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels & FormMapLabels>): MapLabels & ListMapLabels & FormMapLabels;
package/src/lib/labels.js CHANGED
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fill = exports.LIST_MAP_LABELS = exports.MAP_LABELS = void 0;
3
+ exports.fill = exports.FORM_MAP_LABELS = exports.LIST_MAP_LABELS = exports.MAP_LABELS = void 0;
4
4
  exports.mapLabels = mapLabels;
5
5
  exports.listMapLabels = listMapLabels;
6
+ exports.formMapLabels = formMapLabels;
6
7
  exports.MAP_LABELS = {
7
8
  en: {
8
9
  mapOf: '{label}, map',
@@ -287,6 +288,12 @@ exports.LIST_MAP_LABELS = {
287
288
  inDrawnArea: 'Im gezeichneten Gebiet',
288
289
  },
289
290
  };
291
+ exports.FORM_MAP_LABELS = {
292
+ en: { map: 'Map', lastSeen: 'Last seen {time}', follow: 'Follow', routeFailed: 'The way could not be found.' },
293
+ ar: { map: 'خريطة', lastSeen: 'آخر ظهور {time}', follow: 'تتبّع', routeFailed: 'تعذّر إيجاد الطريق.' },
294
+ fr: { map: 'Carte', lastSeen: 'Vu pour la dernière fois {time}', follow: 'Suivre', routeFailed: 'Le trajet est introuvable.' },
295
+ de: { map: 'Karte', lastSeen: 'Zuletzt gesehen {time}', follow: 'Folgen', routeFailed: 'Der Weg wurde nicht gefunden.' },
296
+ };
290
297
  /** The words for a page's language, with the app's own over them. */
291
298
  function mapLabels(locale, own) {
292
299
  return { ...exports.MAP_LABELS[locale ?? 'en'], ...own };
@@ -298,4 +305,8 @@ function listMapLabels(locale, own) {
298
305
  /** A word with its `{name}`s filled in. */
299
306
  const fill = (words, values) => words.replace(/\{(\w+)\}/g, (all, key) => (key in values ? String(values[key]) : all));
300
307
  exports.fill = fill;
308
+ /** A form's map's words for a page's language: the maps' own, a list map's (its pins and cards), its own, the app's over all. */
309
+ function formMapLabels(locale, own) {
310
+ return { ...exports.MAP_LABELS[locale ?? 'en'], ...exports.LIST_MAP_LABELS[locale ?? 'en'], ...exports.FORM_MAP_LABELS[locale ?? 'en'], ...own };
311
+ }
301
312
  //# sourceMappingURL=labels.js.map