@fieldia/map 0.14.1 → 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 (108) hide show
  1. package/README.md +103 -10
  2. package/package.json +5 -4
  3. package/src/index.d.mts +5 -1
  4. package/src/index.d.ts +5 -1
  5. package/src/index.js +7 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +3 -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/area.js +29 -246
  16. package/src/lib/area.js.map +1 -1
  17. package/src/lib/area.mjs +29 -246
  18. package/src/lib/area.mjs.map +1 -1
  19. package/src/lib/card.d.mts +53 -0
  20. package/src/lib/card.d.ts +53 -0
  21. package/src/lib/card.js +98 -0
  22. package/src/lib/card.js.map +1 -0
  23. package/src/lib/card.mjs +94 -0
  24. package/src/lib/card.mjs.map +1 -0
  25. package/src/lib/cluster.d.mts +12 -0
  26. package/src/lib/cluster.d.ts +12 -0
  27. package/src/lib/cluster.js +60 -0
  28. package/src/lib/cluster.js.map +1 -0
  29. package/src/lib/cluster.mjs +57 -0
  30. package/src/lib/cluster.mjs.map +1 -0
  31. package/src/lib/drawing.d.mts +36 -0
  32. package/src/lib/drawing.d.ts +36 -0
  33. package/src/lib/drawing.js +267 -0
  34. package/src/lib/drawing.js.map +1 -0
  35. package/src/lib/drawing.mjs +263 -0
  36. package/src/lib/drawing.mjs.map +1 -0
  37. package/src/lib/form-map.d.mts +16 -0
  38. package/src/lib/form-map.d.ts +16 -0
  39. package/src/lib/form-map.js +525 -0
  40. package/src/lib/form-map.js.map +1 -0
  41. package/src/lib/form-map.mjs +522 -0
  42. package/src/lib/form-map.mjs.map +1 -0
  43. package/src/lib/kinds.js +9 -2
  44. package/src/lib/kinds.js.map +1 -1
  45. package/src/lib/kinds.mjs +9 -2
  46. package/src/lib/kinds.mjs.map +1 -1
  47. package/src/lib/labels.d.mts +41 -0
  48. package/src/lib/labels.d.ts +41 -0
  49. package/src/lib/labels.js +87 -1
  50. package/src/lib/labels.js.map +1 -1
  51. package/src/lib/labels.mjs +84 -0
  52. package/src/lib/labels.mjs.map +1 -1
  53. package/src/lib/list-view.d.mts +13 -0
  54. package/src/lib/list-view.d.ts +13 -0
  55. package/src/lib/list-view.js +464 -0
  56. package/src/lib/list-view.js.map +1 -0
  57. package/src/lib/list-view.mjs +461 -0
  58. package/src/lib/list-view.mjs.map +1 -0
  59. package/src/lib/map-core.d.mts +2 -2
  60. package/src/lib/map-core.d.ts +2 -2
  61. package/src/lib/map-core.js +23 -3
  62. package/src/lib/map-core.js.map +1 -1
  63. package/src/lib/map-core.mjs +23 -3
  64. package/src/lib/map-core.mjs.map +1 -1
  65. package/src/lib/map-icons.d.mts +8 -0
  66. package/src/lib/map-icons.d.ts +8 -0
  67. package/src/lib/map-icons.js +21 -0
  68. package/src/lib/map-icons.js.map +1 -0
  69. package/src/lib/map-icons.mjs +18 -0
  70. package/src/lib/map-icons.mjs.map +1 -0
  71. package/src/lib/marks.d.mts +34 -0
  72. package/src/lib/marks.d.ts +34 -0
  73. package/src/lib/marks.js +56 -0
  74. package/src/lib/marks.js.map +1 -0
  75. package/src/lib/marks.mjs +49 -0
  76. package/src/lib/marks.mjs.map +1 -0
  77. package/src/lib/pins.d.mts +58 -0
  78. package/src/lib/pins.d.ts +58 -0
  79. package/src/lib/pins.js +165 -0
  80. package/src/lib/pins.js.map +1 -0
  81. package/src/lib/pins.mjs +156 -0
  82. package/src/lib/pins.mjs.map +1 -0
  83. package/src/lib/providers.d.mts +27 -3
  84. package/src/lib/providers.d.ts +27 -3
  85. package/src/lib/providers.js +69 -67
  86. package/src/lib/providers.js.map +1 -1
  87. package/src/lib/providers.mjs +17 -15
  88. package/src/lib/providers.mjs.map +1 -1
  89. package/src/lib/route-line.d.mts +34 -0
  90. package/src/lib/route-line.d.ts +34 -0
  91. package/src/lib/route-line.js +53 -0
  92. package/src/lib/route-line.js.map +1 -0
  93. package/src/lib/route-line.mjs +47 -0
  94. package/src/lib/route-line.mjs.map +1 -0
  95. package/src/lib/routes.d.mts +28 -0
  96. package/src/lib/routes.d.ts +28 -0
  97. package/src/lib/routes.js +112 -0
  98. package/src/lib/routes.js.map +1 -0
  99. package/src/lib/routes.mjs +105 -0
  100. package/src/lib/routes.mjs.map +1 -0
  101. package/src/lib/settings.d.mts +8 -3
  102. package/src/lib/settings.d.ts +8 -3
  103. package/src/lib/styles.d.mts +16 -0
  104. package/src/lib/styles.d.ts +16 -0
  105. package/src/lib/styles.js +181 -1
  106. package/src/lib/styles.js.map +1 -1
  107. package/src/lib/styles.mjs +178 -0
  108. package/src/lib/styles.mjs.map +1 -1
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SHAPE_ICONS = void 0;
4
+ exports.shapeDrawing = shapeDrawing;
5
+ const geo_1 = require("./geo");
6
+ const labels_1 = require("./labels");
7
+ /**
8
+ * A shape drawn on a map: a polygon point by point, a box or a circle by a
9
+ * drag, by a mouse, a finger, a pen or the keys. A bar over the map says what
10
+ * to do, with Finish and Cancel. While a tool is in hand the ground holds
11
+ * still: a press is a point, never a pan. Shared by the area field and a
12
+ * list's map, which hand it what is drawn.
13
+ */
14
+ /** Each tool's drawing, for its button. */
15
+ exports.SHAPE_ICONS = {
16
+ polygon: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 8l7-5 7 6-3 11H7z"/></svg>',
17
+ box: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="4" y="6" width="16" height="12" rx="1"/></svg>',
18
+ circle: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="8"/></svg>',
19
+ };
20
+ /** How near the first point a press closes the ring: a fingertip's width, not the mark's. */
21
+ const CLOSE_PX = 22;
22
+ /** A press that moves less than this is a press, not a drag: no box, no circle. */
23
+ const DRAG_PX = 4;
24
+ function shapeDrawing(options) {
25
+ const { box, labels, announce } = options;
26
+ const doc = box.element.ownerDocument;
27
+ const over = ['.fd-map-hint', '.fd-map-zoom', '.fd-map-credits', '.fd-map-logo', options.over].filter(Boolean).join(', ');
28
+ let mode = null;
29
+ /** A polygon's points so far. */
30
+ let points = [];
31
+ /** Where a box or a circle began, by a press or by Space. */
32
+ let anchor = null;
33
+ let map = null;
34
+ let L = null;
35
+ /** The outline reaching for the pointer. */
36
+ let trace = null;
37
+ /** A polygon's points while it is drawn. */
38
+ const marks = [];
39
+ // The bar over the map while a tool is in hand: what to do, and the ways out.
40
+ const hint = doc.createElement('div');
41
+ hint.className = 'fd-map-hint';
42
+ hint.hidden = true;
43
+ const hintWords = doc.createElement('p');
44
+ const finishButton = doc.createElement('button');
45
+ finishButton.type = 'button';
46
+ finishButton.className = 'fd-button fd-button-primary';
47
+ finishButton.textContent = labels.finish;
48
+ finishButton.addEventListener('click', () => finish());
49
+ const cancelButton = doc.createElement('button');
50
+ cancelButton.type = 'button';
51
+ cancelButton.className = 'fd-button';
52
+ cancelButton.textContent = labels.cancel;
53
+ cancelButton.addEventListener('click', () => arm(null));
54
+ hint.append(hintWords, finishButton, cancelButton);
55
+ box.element.append(hint);
56
+ box.shield(hint);
57
+ box.follow(hint);
58
+ function sayStep() {
59
+ if (!mode)
60
+ return;
61
+ const words = mode === 'polygon' ? labels.drawPolygon : mode === 'box' ? labels.drawBox : labels.drawCircle;
62
+ hintWords.textContent = mode === 'polygon' && points.length ? `${words} ${(0, labels_1.fill)(labels.points, { n: points.length })}.` : words;
63
+ finishButton.hidden = mode !== 'polygon' || points.length < 3;
64
+ }
65
+ function arm(next) {
66
+ mode = next;
67
+ points = [];
68
+ anchor = null;
69
+ trace?.remove();
70
+ trace = null;
71
+ remark();
72
+ hint.hidden = !mode;
73
+ // Every tool holds the ground still: a press is a point, never a pan.
74
+ box.setPannable(!mode);
75
+ box.ready((m) => (mode ? m.doubleClickZoom.disable() : m.doubleClickZoom.enable()));
76
+ if (mode)
77
+ box.element.dataset['drawing'] = mode;
78
+ else
79
+ delete box.element.dataset['drawing'];
80
+ sayStep();
81
+ options.armed(mode);
82
+ if (mode)
83
+ announce(hintWords.textContent ?? '');
84
+ }
85
+ function gripIcon() {
86
+ return L.divIcon({ className: 'fd-map-grip', iconSize: [24, 24], iconAnchor: [12, 12] });
87
+ }
88
+ /** The marks of a polygon's points: made again only when the points change, never as the pointer moves. */
89
+ function remark() {
90
+ for (const m of marks.splice(0))
91
+ m.remove();
92
+ if (!map || !L || mode !== 'polygon')
93
+ return;
94
+ points.forEach((p, i) => {
95
+ const mark = L.marker([p.lat, p.lng], { icon: gripIcon(), interactive: i === 0, keyboard: false }).addTo(map);
96
+ // Back on the first point closes the ring.
97
+ if (i === 0)
98
+ mark.on('click', () => points.length >= 3 && finish());
99
+ marks.push(mark);
100
+ });
101
+ }
102
+ /** The outline being drawn, toward the pointer: changed in place as it moves. */
103
+ function retrace(toward) {
104
+ if (!map || !L)
105
+ return;
106
+ let ring = null;
107
+ let circle = null;
108
+ if (mode === 'polygon') {
109
+ ring = [...points, ...(toward ? [toward] : [])];
110
+ if (ring.length < 2)
111
+ ring = null;
112
+ marks[0]?.getElement()?.toggleAttribute('data-closes', nearFirst(toward));
113
+ }
114
+ else if (anchor && toward) {
115
+ if (mode === 'box')
116
+ ring = (0, geo_1.boxFrom)(anchor, toward);
117
+ else
118
+ circle = { center: anchor, radius: (0, geo_1.metresBetween)(anchor, toward) };
119
+ }
120
+ const latLngs = ring?.map((p) => [p.lat, p.lng]);
121
+ if (trace && latLngs && trace instanceof L.Polygon && !(trace instanceof L.Rectangle)) {
122
+ trace.setLatLngs(latLngs);
123
+ return;
124
+ }
125
+ if (trace && circle && trace instanceof L.Circle) {
126
+ trace.setLatLng([circle.center.lat, circle.center.lng]);
127
+ trace.setRadius(circle.radius);
128
+ return;
129
+ }
130
+ trace?.remove();
131
+ trace = null;
132
+ if (latLngs)
133
+ trace = L.polygon(latLngs, { className: 'fd-map-trace', interactive: false }).addTo(map);
134
+ else if (circle)
135
+ trace = L.circle([circle.center.lat, circle.center.lng], { radius: circle.radius, className: 'fd-map-trace', interactive: false }).addTo(map);
136
+ }
137
+ function nearFirst(at) {
138
+ if (!map || !at || points.length < 3)
139
+ return false;
140
+ return map.latLngToContainerPoint([points[0].lat, points[0].lng]).distanceTo(map.latLngToContainerPoint([at.lat, at.lng])) <= CLOSE_PX;
141
+ }
142
+ function addPoint(at) {
143
+ if (mode === 'polygon') {
144
+ if (nearFirst(at))
145
+ return finish();
146
+ points.push(at);
147
+ sayStep();
148
+ remark();
149
+ retrace();
150
+ announce((0, labels_1.fill)(labels.points, { n: points.length }));
151
+ return;
152
+ }
153
+ if (!anchor) {
154
+ anchor = at;
155
+ retrace(at);
156
+ return;
157
+ }
158
+ const start = anchor;
159
+ if (mode === 'box')
160
+ complete({ shape: 'box', points: (0, geo_1.boxFrom)(start, at) });
161
+ else if (mode === 'circle')
162
+ complete({ shape: 'circle', center: start, radius: Math.max(1, (0, geo_1.metresBetween)(start, at)) });
163
+ }
164
+ function finish() {
165
+ if (mode !== 'polygon' || points.length < 3)
166
+ return;
167
+ complete({ shape: 'polygon', points: [...points] });
168
+ }
169
+ function complete(drawn) {
170
+ arm(null);
171
+ options.done(drawn);
172
+ }
173
+ box.ready((m, leaflet) => {
174
+ map = m;
175
+ L = leaflet;
176
+ m.on('click', (event) => {
177
+ if (mode === 'polygon')
178
+ addPoint({ lat: event.latlng.lat, lng: event.latlng.lng });
179
+ });
180
+ m.on('dblclick', () => {
181
+ if (mode !== 'polygon')
182
+ return;
183
+ // The two clicks of a double-click have each placed a point, on top of each other: one is enough.
184
+ const [a, b] = points.slice(-2);
185
+ if (a && b && m.latLngToContainerPoint([a.lat, a.lng]).distanceTo(m.latLngToContainerPoint([b.lat, b.lng])) < 6) {
186
+ points.pop();
187
+ remark();
188
+ }
189
+ finish();
190
+ });
191
+ m.on('mousemove', (event) => {
192
+ if (mode === 'polygon' && points.length)
193
+ retrace({ lat: event.latlng.lat, lng: event.latlng.lng });
194
+ });
195
+ // A box and a circle are drawn by dragging: pointer events, which a mouse, a finger and a pen all raise.
196
+ let pressed = null;
197
+ box.element.addEventListener('pointerdown', (event) => {
198
+ if ((mode !== 'box' && mode !== 'circle') || event.button !== 0)
199
+ return;
200
+ if (event.target.closest(over))
201
+ return;
202
+ const at = m.mouseEventToLatLng(event);
203
+ pressed = { x: event.clientX, y: event.clientY, id: event.pointerId };
204
+ anchor = { lat: at.lat, lng: at.lng };
205
+ box.element.setPointerCapture?.(event.pointerId);
206
+ });
207
+ box.element.addEventListener('pointermove', (event) => {
208
+ if (!pressed || event.pointerId !== pressed.id)
209
+ return;
210
+ const at = m.mouseEventToLatLng(event);
211
+ retrace({ lat: at.lat, lng: at.lng });
212
+ });
213
+ const release = (event) => {
214
+ if (!pressed || event.pointerId !== pressed.id)
215
+ return;
216
+ const moved = Math.hypot(event.clientX - pressed.x, event.clientY - pressed.y);
217
+ const at = m.mouseEventToLatLng(event);
218
+ pressed = null;
219
+ // A press with no drag is no shape: the tool stays in hand.
220
+ if (event.type === 'pointercancel' || moved < DRAG_PX) {
221
+ anchor = null;
222
+ retrace();
223
+ return;
224
+ }
225
+ addPoint({ lat: at.lat, lng: at.lng });
226
+ };
227
+ box.element.addEventListener('pointerup', release);
228
+ box.element.addEventListener('pointercancel', release);
229
+ });
230
+ // The keys of drawing, wherever in the part the focus is.
231
+ options.keys.addEventListener('keydown', (event) => {
232
+ if (!mode)
233
+ return;
234
+ const onMap = event.target === box.element;
235
+ if (event.key === 'Escape') {
236
+ event.preventDefault();
237
+ // The list's own card and search take no Escape meant for the drawing.
238
+ event.stopPropagation();
239
+ arm(null);
240
+ options.escaped();
241
+ }
242
+ else if (event.key === 'Enter' && mode === 'polygon' && points.length >= 3 && (onMap || event.target === finishButton || !!options.finishesOn?.(event.target))) {
243
+ event.preventDefault();
244
+ finish();
245
+ }
246
+ else if (event.key === 'Backspace' && mode === 'polygon' && points.length && onMap) {
247
+ event.preventDefault();
248
+ points.pop();
249
+ sayStep();
250
+ remark();
251
+ retrace();
252
+ announce((0, labels_1.fill)(labels.points, { n: points.length }));
253
+ }
254
+ else if (event.key === ' ' && onMap && map) {
255
+ event.preventDefault();
256
+ const c = map.getCenter();
257
+ addPoint({ lat: c.lat, lng: c.lng });
258
+ }
259
+ });
260
+ return {
261
+ get mode() {
262
+ return mode;
263
+ },
264
+ arm,
265
+ };
266
+ }
267
+ //# sourceMappingURL=drawing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawing.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/drawing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,263 @@
1
+ import { boxFrom, metresBetween } from './geo.mjs';
2
+ import { fill } from './labels.mjs';
3
+ /**
4
+ * A shape drawn on a map: a polygon point by point, a box or a circle by a
5
+ * drag, by a mouse, a finger, a pen or the keys. A bar over the map says what
6
+ * to do, with Finish and Cancel. While a tool is in hand the ground holds
7
+ * still: a press is a point, never a pan. Shared by the area field and a
8
+ * list's map, which hand it what is drawn.
9
+ */
10
+ /** Each tool's drawing, for its button. */
11
+ export const SHAPE_ICONS = {
12
+ polygon: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 8l7-5 7 6-3 11H7z"/></svg>',
13
+ box: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="4" y="6" width="16" height="12" rx="1"/></svg>',
14
+ circle: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="8"/></svg>',
15
+ };
16
+ /** How near the first point a press closes the ring: a fingertip's width, not the mark's. */
17
+ const CLOSE_PX = 22;
18
+ /** A press that moves less than this is a press, not a drag: no box, no circle. */
19
+ const DRAG_PX = 4;
20
+ export function shapeDrawing(options) {
21
+ const { box, labels, announce } = options;
22
+ const doc = box.element.ownerDocument;
23
+ const over = ['.fd-map-hint', '.fd-map-zoom', '.fd-map-credits', '.fd-map-logo', options.over].filter(Boolean).join(', ');
24
+ let mode = null;
25
+ /** A polygon's points so far. */
26
+ let points = [];
27
+ /** Where a box or a circle began, by a press or by Space. */
28
+ let anchor = null;
29
+ let map = null;
30
+ let L = null;
31
+ /** The outline reaching for the pointer. */
32
+ let trace = null;
33
+ /** A polygon's points while it is drawn. */
34
+ const marks = [];
35
+ // The bar over the map while a tool is in hand: what to do, and the ways out.
36
+ const hint = doc.createElement('div');
37
+ hint.className = 'fd-map-hint';
38
+ hint.hidden = true;
39
+ const hintWords = doc.createElement('p');
40
+ const finishButton = doc.createElement('button');
41
+ finishButton.type = 'button';
42
+ finishButton.className = 'fd-button fd-button-primary';
43
+ finishButton.textContent = labels.finish;
44
+ finishButton.addEventListener('click', () => finish());
45
+ const cancelButton = doc.createElement('button');
46
+ cancelButton.type = 'button';
47
+ cancelButton.className = 'fd-button';
48
+ cancelButton.textContent = labels.cancel;
49
+ cancelButton.addEventListener('click', () => arm(null));
50
+ hint.append(hintWords, finishButton, cancelButton);
51
+ box.element.append(hint);
52
+ box.shield(hint);
53
+ box.follow(hint);
54
+ function sayStep() {
55
+ if (!mode)
56
+ return;
57
+ const words = mode === 'polygon' ? labels.drawPolygon : mode === 'box' ? labels.drawBox : labels.drawCircle;
58
+ hintWords.textContent = mode === 'polygon' && points.length ? `${words} ${fill(labels.points, { n: points.length })}.` : words;
59
+ finishButton.hidden = mode !== 'polygon' || points.length < 3;
60
+ }
61
+ function arm(next) {
62
+ mode = next;
63
+ points = [];
64
+ anchor = null;
65
+ trace?.remove();
66
+ trace = null;
67
+ remark();
68
+ hint.hidden = !mode;
69
+ // Every tool holds the ground still: a press is a point, never a pan.
70
+ box.setPannable(!mode);
71
+ box.ready((m) => (mode ? m.doubleClickZoom.disable() : m.doubleClickZoom.enable()));
72
+ if (mode)
73
+ box.element.dataset['drawing'] = mode;
74
+ else
75
+ delete box.element.dataset['drawing'];
76
+ sayStep();
77
+ options.armed(mode);
78
+ if (mode)
79
+ announce(hintWords.textContent ?? '');
80
+ }
81
+ function gripIcon() {
82
+ return L.divIcon({ className: 'fd-map-grip', iconSize: [24, 24], iconAnchor: [12, 12] });
83
+ }
84
+ /** The marks of a polygon's points: made again only when the points change, never as the pointer moves. */
85
+ function remark() {
86
+ for (const m of marks.splice(0))
87
+ m.remove();
88
+ if (!map || !L || mode !== 'polygon')
89
+ return;
90
+ points.forEach((p, i) => {
91
+ const mark = L.marker([p.lat, p.lng], { icon: gripIcon(), interactive: i === 0, keyboard: false }).addTo(map);
92
+ // Back on the first point closes the ring.
93
+ if (i === 0)
94
+ mark.on('click', () => points.length >= 3 && finish());
95
+ marks.push(mark);
96
+ });
97
+ }
98
+ /** The outline being drawn, toward the pointer: changed in place as it moves. */
99
+ function retrace(toward) {
100
+ if (!map || !L)
101
+ return;
102
+ let ring = null;
103
+ let circle = null;
104
+ if (mode === 'polygon') {
105
+ ring = [...points, ...(toward ? [toward] : [])];
106
+ if (ring.length < 2)
107
+ ring = null;
108
+ marks[0]?.getElement()?.toggleAttribute('data-closes', nearFirst(toward));
109
+ }
110
+ else if (anchor && toward) {
111
+ if (mode === 'box')
112
+ ring = boxFrom(anchor, toward);
113
+ else
114
+ circle = { center: anchor, radius: metresBetween(anchor, toward) };
115
+ }
116
+ const latLngs = ring?.map((p) => [p.lat, p.lng]);
117
+ if (trace && latLngs && trace instanceof L.Polygon && !(trace instanceof L.Rectangle)) {
118
+ trace.setLatLngs(latLngs);
119
+ return;
120
+ }
121
+ if (trace && circle && trace instanceof L.Circle) {
122
+ trace.setLatLng([circle.center.lat, circle.center.lng]);
123
+ trace.setRadius(circle.radius);
124
+ return;
125
+ }
126
+ trace?.remove();
127
+ trace = null;
128
+ if (latLngs)
129
+ trace = L.polygon(latLngs, { className: 'fd-map-trace', interactive: false }).addTo(map);
130
+ else if (circle)
131
+ trace = L.circle([circle.center.lat, circle.center.lng], { radius: circle.radius, className: 'fd-map-trace', interactive: false }).addTo(map);
132
+ }
133
+ function nearFirst(at) {
134
+ if (!map || !at || points.length < 3)
135
+ return false;
136
+ return map.latLngToContainerPoint([points[0].lat, points[0].lng]).distanceTo(map.latLngToContainerPoint([at.lat, at.lng])) <= CLOSE_PX;
137
+ }
138
+ function addPoint(at) {
139
+ if (mode === 'polygon') {
140
+ if (nearFirst(at))
141
+ return finish();
142
+ points.push(at);
143
+ sayStep();
144
+ remark();
145
+ retrace();
146
+ announce(fill(labels.points, { n: points.length }));
147
+ return;
148
+ }
149
+ if (!anchor) {
150
+ anchor = at;
151
+ retrace(at);
152
+ return;
153
+ }
154
+ const start = anchor;
155
+ if (mode === 'box')
156
+ complete({ shape: 'box', points: boxFrom(start, at) });
157
+ else if (mode === 'circle')
158
+ complete({ shape: 'circle', center: start, radius: Math.max(1, metresBetween(start, at)) });
159
+ }
160
+ function finish() {
161
+ if (mode !== 'polygon' || points.length < 3)
162
+ return;
163
+ complete({ shape: 'polygon', points: [...points] });
164
+ }
165
+ function complete(drawn) {
166
+ arm(null);
167
+ options.done(drawn);
168
+ }
169
+ box.ready((m, leaflet) => {
170
+ map = m;
171
+ L = leaflet;
172
+ m.on('click', (event) => {
173
+ if (mode === 'polygon')
174
+ addPoint({ lat: event.latlng.lat, lng: event.latlng.lng });
175
+ });
176
+ m.on('dblclick', () => {
177
+ if (mode !== 'polygon')
178
+ return;
179
+ // The two clicks of a double-click have each placed a point, on top of each other: one is enough.
180
+ const [a, b] = points.slice(-2);
181
+ if (a && b && m.latLngToContainerPoint([a.lat, a.lng]).distanceTo(m.latLngToContainerPoint([b.lat, b.lng])) < 6) {
182
+ points.pop();
183
+ remark();
184
+ }
185
+ finish();
186
+ });
187
+ m.on('mousemove', (event) => {
188
+ if (mode === 'polygon' && points.length)
189
+ retrace({ lat: event.latlng.lat, lng: event.latlng.lng });
190
+ });
191
+ // A box and a circle are drawn by dragging: pointer events, which a mouse, a finger and a pen all raise.
192
+ let pressed = null;
193
+ box.element.addEventListener('pointerdown', (event) => {
194
+ if ((mode !== 'box' && mode !== 'circle') || event.button !== 0)
195
+ return;
196
+ if (event.target.closest(over))
197
+ return;
198
+ const at = m.mouseEventToLatLng(event);
199
+ pressed = { x: event.clientX, y: event.clientY, id: event.pointerId };
200
+ anchor = { lat: at.lat, lng: at.lng };
201
+ box.element.setPointerCapture?.(event.pointerId);
202
+ });
203
+ box.element.addEventListener('pointermove', (event) => {
204
+ if (!pressed || event.pointerId !== pressed.id)
205
+ return;
206
+ const at = m.mouseEventToLatLng(event);
207
+ retrace({ lat: at.lat, lng: at.lng });
208
+ });
209
+ const release = (event) => {
210
+ if (!pressed || event.pointerId !== pressed.id)
211
+ return;
212
+ const moved = Math.hypot(event.clientX - pressed.x, event.clientY - pressed.y);
213
+ const at = m.mouseEventToLatLng(event);
214
+ pressed = null;
215
+ // A press with no drag is no shape: the tool stays in hand.
216
+ if (event.type === 'pointercancel' || moved < DRAG_PX) {
217
+ anchor = null;
218
+ retrace();
219
+ return;
220
+ }
221
+ addPoint({ lat: at.lat, lng: at.lng });
222
+ };
223
+ box.element.addEventListener('pointerup', release);
224
+ box.element.addEventListener('pointercancel', release);
225
+ });
226
+ // The keys of drawing, wherever in the part the focus is.
227
+ options.keys.addEventListener('keydown', (event) => {
228
+ if (!mode)
229
+ return;
230
+ const onMap = event.target === box.element;
231
+ if (event.key === 'Escape') {
232
+ event.preventDefault();
233
+ // The list's own card and search take no Escape meant for the drawing.
234
+ event.stopPropagation();
235
+ arm(null);
236
+ options.escaped();
237
+ }
238
+ else if (event.key === 'Enter' && mode === 'polygon' && points.length >= 3 && (onMap || event.target === finishButton || !!options.finishesOn?.(event.target))) {
239
+ event.preventDefault();
240
+ finish();
241
+ }
242
+ else if (event.key === 'Backspace' && mode === 'polygon' && points.length && onMap) {
243
+ event.preventDefault();
244
+ points.pop();
245
+ sayStep();
246
+ remark();
247
+ retrace();
248
+ announce(fill(labels.points, { n: points.length }));
249
+ }
250
+ else if (event.key === ' ' && onMap && map) {
251
+ event.preventDefault();
252
+ const c = map.getCenter();
253
+ addPoint({ lat: c.lat, lng: c.lng });
254
+ }
255
+ });
256
+ return {
257
+ get mode() {
258
+ return mode;
259
+ },
260
+ arm,
261
+ };
262
+ }
263
+ //# sourceMappingURL=drawing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawing.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/drawing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { MapPartFactory } from '@fieldia/viewer';
2
+ import type { MapSettings } from './settings.mjs';
3
+ /**
4
+ * A map on a form (`type: "map"`), for the viewer's `maps`: the record's
5
+ * places as layers. A layer is the record's own place (a kitchen, a door, a
6
+ * courier), a place for each of its lines (a round's stops), a route along
7
+ * the roads between them, or the reader's own place. Pins are drawn as a
8
+ * list's map draws them. A place that moves glides to each new position —
9
+ * along its route when it is on one — says when it was last seen once its
10
+ * news is old, and is followed until the person moves the map. A route's
11
+ * part already travelled fades, and its time and distance left are written
12
+ * into the record's fields the page names.
13
+ *
14
+ * mountViewer(host, { page, maps: mapParts({ provider }) })
15
+ */
16
+ export declare function mapParts(settings: MapSettings): MapPartFactory;
@@ -0,0 +1,16 @@
1
+ import type { MapPartFactory } from '@fieldia/viewer';
2
+ import type { MapSettings } from './settings';
3
+ /**
4
+ * A map on a form (`type: "map"`), for the viewer's `maps`: the record's
5
+ * places as layers. A layer is the record's own place (a kitchen, a door, a
6
+ * courier), a place for each of its lines (a round's stops), a route along
7
+ * the roads between them, or the reader's own place. Pins are drawn as a
8
+ * list's map draws them. A place that moves glides to each new position —
9
+ * along its route when it is on one — says when it was last seen once its
10
+ * news is old, and is followed until the person moves the map. A route's
11
+ * part already travelled fades, and its time and distance left are written
12
+ * into the record's fields the page names.
13
+ *
14
+ * mountViewer(host, { page, maps: mapParts({ provider }) })
15
+ */
16
+ export declare function mapParts(settings: MapSettings): MapPartFactory;