@fieldia/map 0.16.0 → 0.18.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 +56 -9
  2. package/package.json +4 -4
  3. package/src/index.d.mts +1 -1
  4. package/src/index.d.ts +1 -1
  5. package/src/index.js.map +1 -1
  6. package/src/index.mjs.map +1 -1
  7. package/src/lib/area.js +2 -1
  8. package/src/lib/area.js.map +1 -1
  9. package/src/lib/area.mjs +3 -2
  10. package/src/lib/area.mjs.map +1 -1
  11. package/src/lib/card.d.mts +2 -1
  12. package/src/lib/card.d.ts +2 -1
  13. package/src/lib/card.js +5 -3
  14. package/src/lib/card.js.map +1 -1
  15. package/src/lib/card.mjs +5 -3
  16. package/src/lib/card.mjs.map +1 -1
  17. package/src/lib/cluster.d.mts +6 -1
  18. package/src/lib/cluster.d.ts +6 -1
  19. package/src/lib/cluster.js +11 -5
  20. package/src/lib/cluster.js.map +1 -1
  21. package/src/lib/cluster.mjs +11 -5
  22. package/src/lib/cluster.mjs.map +1 -1
  23. package/src/lib/form-map.d.mts +5 -2
  24. package/src/lib/form-map.d.ts +5 -2
  25. package/src/lib/form-map.js +222 -22
  26. package/src/lib/form-map.js.map +1 -1
  27. package/src/lib/form-map.mjs +224 -24
  28. package/src/lib/form-map.mjs.map +1 -1
  29. package/src/lib/heat.d.mts +25 -0
  30. package/src/lib/heat.d.ts +25 -0
  31. package/src/lib/heat.js +111 -0
  32. package/src/lib/heat.js.map +1 -0
  33. package/src/lib/heat.mjs +108 -0
  34. package/src/lib/heat.mjs.map +1 -0
  35. package/src/lib/labels.d.mts +23 -0
  36. package/src/lib/labels.d.ts +23 -0
  37. package/src/lib/labels.js +56 -4
  38. package/src/lib/labels.js.map +1 -1
  39. package/src/lib/labels.mjs +56 -4
  40. package/src/lib/labels.mjs.map +1 -1
  41. package/src/lib/leaflet.js +1 -0
  42. package/src/lib/leaflet.js.map +1 -1
  43. package/src/lib/leaflet.mjs +1 -0
  44. package/src/lib/leaflet.mjs.map +1 -1
  45. package/src/lib/list-view.js +126 -18
  46. package/src/lib/list-view.js.map +1 -1
  47. package/src/lib/list-view.mjs +126 -18
  48. package/src/lib/list-view.mjs.map +1 -1
  49. package/src/lib/map-core.d.mts +8 -0
  50. package/src/lib/map-core.d.ts +8 -0
  51. package/src/lib/map-core.js +41 -5
  52. package/src/lib/map-core.js.map +1 -1
  53. package/src/lib/map-core.mjs +40 -5
  54. package/src/lib/map-core.mjs.map +1 -1
  55. package/src/lib/marks.d.mts +11 -0
  56. package/src/lib/marks.d.ts +11 -0
  57. package/src/lib/marks.js +26 -1
  58. package/src/lib/marks.js.map +1 -1
  59. package/src/lib/marks.mjs +23 -0
  60. package/src/lib/marks.mjs.map +1 -1
  61. package/src/lib/measure.d.mts +15 -0
  62. package/src/lib/measure.d.ts +15 -0
  63. package/src/lib/measure.js +157 -0
  64. package/src/lib/measure.js.map +1 -0
  65. package/src/lib/measure.mjs +153 -0
  66. package/src/lib/measure.mjs.map +1 -0
  67. package/src/lib/place.js +3 -1
  68. package/src/lib/place.js.map +1 -1
  69. package/src/lib/place.mjs +4 -2
  70. package/src/lib/place.mjs.map +1 -1
  71. package/src/lib/providers.d.mts +37 -5
  72. package/src/lib/providers.d.ts +37 -5
  73. package/src/lib/providers.js +37 -18
  74. package/src/lib/providers.js.map +1 -1
  75. package/src/lib/providers.mjs +37 -18
  76. package/src/lib/providers.mjs.map +1 -1
  77. package/src/lib/reach.d.mts +25 -0
  78. package/src/lib/reach.d.ts +25 -0
  79. package/src/lib/reach.js +158 -0
  80. package/src/lib/reach.js.map +1 -0
  81. package/src/lib/reach.mjs +153 -0
  82. package/src/lib/reach.mjs.map +1 -0
  83. package/src/lib/regions.d.mts +137 -0
  84. package/src/lib/regions.d.ts +137 -0
  85. package/src/lib/regions.js +456 -0
  86. package/src/lib/regions.js.map +1 -0
  87. package/src/lib/regions.mjs +445 -0
  88. package/src/lib/regions.mjs.map +1 -0
  89. package/src/lib/routes.d.mts +16 -4
  90. package/src/lib/routes.d.ts +16 -4
  91. package/src/lib/routes.js +40 -3
  92. package/src/lib/routes.js.map +1 -1
  93. package/src/lib/routes.mjs +38 -3
  94. package/src/lib/routes.mjs.map +1 -1
  95. package/src/lib/settings.d.mts +9 -1
  96. package/src/lib/settings.d.ts +9 -1
  97. package/src/lib/styles.d.mts +3 -3
  98. package/src/lib/styles.d.ts +3 -3
  99. package/src/lib/styles.js +18 -1
  100. package/src/lib/styles.js.map +1 -1
  101. package/src/lib/styles.mjs +18 -1
  102. package/src/lib/styles.mjs.map +1 -1
  103. package/src/lib/tools.d.mts +30 -0
  104. package/src/lib/tools.d.ts +30 -0
  105. package/src/lib/tools.js +135 -0
  106. package/src/lib/tools.js.map +1 -0
  107. package/src/lib/tools.mjs +132 -0
  108. package/src/lib/tools.mjs.map +1 -0
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wireTools = wireTools;
4
+ const leaflet_1 = require("./leaflet");
5
+ const map_core_1 = require("./map-core");
6
+ /**
7
+ * The tools under a map's zoom, those its page asks for: the satellite's
8
+ * images (no button where the provider has none), the provider's live
9
+ * traffic over the map (no button where it has none), full screen (filling the
10
+ * window where the browser refuses the screen, as a frame may), and measuring
11
+ * a way (its drawing asked for as the tools come, so a key pressed straight
12
+ * after its press is not lost). Loaded with the first map that has any.
13
+ */
14
+ function wireTools(options) {
15
+ const { tools, box, map, labels, locale, document: doc } = options;
16
+ const element = box.element;
17
+ if (tools.has('satellite')) {
18
+ const button = box.tool(labels.satellite, '<circle cx="12" cy="12" r="3"/><path d="M5 5l3 3M16 16l3 3M19 5l-3 3M8 16l-3 3"/><rect x="3" y="3" width="18" height="18" rx="3" stroke-dasharray="2 3"/>');
19
+ // A provider with no such images: no such button.
20
+ button.hidden = true;
21
+ void options.provider.tiles('satellite', locale).then((spec) => (button.hidden = !spec), () => (button.hidden = true));
22
+ let on = false;
23
+ button.addEventListener('click', () => {
24
+ on = !on;
25
+ button.setAttribute('aria-pressed', String(on));
26
+ options.satellite(on);
27
+ });
28
+ }
29
+ const traffic = options.provider.traffic;
30
+ if (tools.has('traffic') && traffic) {
31
+ const button = box.tool(labels.traffic, '<rect x="7" y="2" width="10" height="20" rx="3"/><circle cx="12" cy="7" r="1.5"/><circle cx="12" cy="12" r="1.5"/><circle cx="12" cy="17" r="1.5"/>');
32
+ // None from the provider: no such button, as with no traffic at all.
33
+ button.hidden = true;
34
+ void traffic('road', locale).then((spec) => (button.hidden = !spec), () => (button.hidden = true));
35
+ let on = false;
36
+ let layer = null;
37
+ let asked = 0;
38
+ let timer;
39
+ /**
40
+ * The traffic for the map images drawn now (Azure's has colours of its own
41
+ * over the dark map): over them, under the routes and pins; drawn again
42
+ * as it goes out of date, the new over the old until it has come.
43
+ */
44
+ const draw = async () => {
45
+ const asking = ++asked;
46
+ clearTimeout(timer);
47
+ const spec = on ? await traffic((element.dataset['baseMap'] ?? 'road'), locale).catch((error) => ((0, map_core_1.warnOnce)(`The ${options.provider.id} traffic could not be drawn: ${error.message}`), null)) : null;
48
+ if (asking !== asked)
49
+ return;
50
+ const last = layer;
51
+ layer = spec && (0, leaflet_1.tileLayer)(options.L, spec.fresh ? { ...spec, url: `${spec.url}&t=${Date.now()}` } : spec);
52
+ if (layer) {
53
+ layer.options.className = 'fd-map-traffic';
54
+ layer.setZIndex(2).addTo(map);
55
+ if (spec?.fresh)
56
+ timer = setTimeout(draw, spec.fresh * 1000);
57
+ }
58
+ const drop = () => last?.remove();
59
+ if (layer && last) {
60
+ layer.once('load', drop);
61
+ setTimeout(drop, 5000);
62
+ }
63
+ else
64
+ drop();
65
+ };
66
+ button.addEventListener('click', () => {
67
+ on = !on;
68
+ button.setAttribute('aria-pressed', String(on));
69
+ options.traffic(on);
70
+ void draw();
71
+ });
72
+ // The map's images change kind (dark for a dark page, the satellite's): the traffic for them.
73
+ const watch = new MutationObserver(() => on && void draw());
74
+ watch.observe(element, { attributes: true, attributeFilter: ['data-base-map'] });
75
+ options.cleanup(() => (watch.disconnect(), clearTimeout(timer)));
76
+ }
77
+ if (tools.has('fullscreen')) {
78
+ const button = box.tool(labels.fullScreen, '<path d="M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5"/>');
79
+ const mark = (on) => {
80
+ element.toggleAttribute('data-full', on);
81
+ button.setAttribute('aria-pressed', String(on));
82
+ button.setAttribute('aria-label', on ? labels.leaveFullScreen : labels.fullScreen);
83
+ button.title = button.getAttribute('aria-label') ?? '';
84
+ setTimeout(() => map.invalidateSize({ pan: false }), 50);
85
+ };
86
+ // Where the browser refuses the screen (a frame that may not), the map fills the window instead.
87
+ const fill = (on) => {
88
+ element.classList.toggle('fd-map-fixed', on);
89
+ mark(on);
90
+ };
91
+ const change = () => mark(doc.fullscreenElement === element);
92
+ doc.addEventListener('fullscreenchange', change);
93
+ options.cleanup(() => doc.removeEventListener('fullscreenchange', change));
94
+ button.addEventListener('click', () => {
95
+ if (element.hasAttribute('data-full')) {
96
+ if (doc.fullscreenElement === element)
97
+ void doc.exitFullscreen();
98
+ else
99
+ fill(false);
100
+ }
101
+ else if (element.requestFullscreen)
102
+ element.requestFullscreen().catch(() => fill(true));
103
+ else
104
+ fill(true);
105
+ });
106
+ element.addEventListener('keydown', (event) => {
107
+ if (event.key === 'Escape' && element.classList.contains('fd-map-fixed'))
108
+ fill(false);
109
+ });
110
+ }
111
+ if (tools.has('measure')) {
112
+ const button = box.tool(labels.measure, '<path d="M3 17L17 3l4 4L7 21z"/><path d="M7 13l2 2M10 10l2 2M13 7l2 2"/>');
113
+ let stop = null;
114
+ const measuring = Promise.resolve().then(() => require('./measure'));
115
+ button.addEventListener('click', async () => {
116
+ if (stop)
117
+ return stop();
118
+ button.setAttribute('aria-pressed', 'true');
119
+ const { measure } = await measuring;
120
+ stop = measure({
121
+ box,
122
+ map,
123
+ L: options.L,
124
+ labels,
125
+ locale,
126
+ stopped: () => {
127
+ stop = null;
128
+ button.setAttribute('aria-pressed', 'false');
129
+ button.focus();
130
+ },
131
+ });
132
+ });
133
+ }
134
+ }
135
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import { tileLayer } from './leaflet.mjs';
2
+ import { warnOnce } from './map-core.mjs';
3
+ /**
4
+ * The tools under a map's zoom, those its page asks for: the satellite's
5
+ * images (no button where the provider has none), the provider's live
6
+ * traffic over the map (no button where it has none), full screen (filling the
7
+ * window where the browser refuses the screen, as a frame may), and measuring
8
+ * a way (its drawing asked for as the tools come, so a key pressed straight
9
+ * after its press is not lost). Loaded with the first map that has any.
10
+ */
11
+ export function wireTools(options) {
12
+ const { tools, box, map, labels, locale, document: doc } = options;
13
+ const element = box.element;
14
+ if (tools.has('satellite')) {
15
+ const button = box.tool(labels.satellite, '<circle cx="12" cy="12" r="3"/><path d="M5 5l3 3M16 16l3 3M19 5l-3 3M8 16l-3 3"/><rect x="3" y="3" width="18" height="18" rx="3" stroke-dasharray="2 3"/>');
16
+ // A provider with no such images: no such button.
17
+ button.hidden = true;
18
+ void options.provider.tiles('satellite', locale).then((spec) => (button.hidden = !spec), () => (button.hidden = true));
19
+ let on = false;
20
+ button.addEventListener('click', () => {
21
+ on = !on;
22
+ button.setAttribute('aria-pressed', String(on));
23
+ options.satellite(on);
24
+ });
25
+ }
26
+ const traffic = options.provider.traffic;
27
+ if (tools.has('traffic') && traffic) {
28
+ const button = box.tool(labels.traffic, '<rect x="7" y="2" width="10" height="20" rx="3"/><circle cx="12" cy="7" r="1.5"/><circle cx="12" cy="12" r="1.5"/><circle cx="12" cy="17" r="1.5"/>');
29
+ // None from the provider: no such button, as with no traffic at all.
30
+ button.hidden = true;
31
+ void traffic('road', locale).then((spec) => (button.hidden = !spec), () => (button.hidden = true));
32
+ let on = false;
33
+ let layer = null;
34
+ let asked = 0;
35
+ let timer;
36
+ /**
37
+ * The traffic for the map images drawn now (Azure's has colours of its own
38
+ * over the dark map): over them, under the routes and pins; drawn again
39
+ * as it goes out of date, the new over the old until it has come.
40
+ */
41
+ const draw = async () => {
42
+ const asking = ++asked;
43
+ clearTimeout(timer);
44
+ const spec = on ? await traffic((element.dataset['baseMap'] ?? 'road'), locale).catch((error) => (warnOnce(`The ${options.provider.id} traffic could not be drawn: ${error.message}`), null)) : null;
45
+ if (asking !== asked)
46
+ return;
47
+ const last = layer;
48
+ layer = spec && tileLayer(options.L, spec.fresh ? { ...spec, url: `${spec.url}&t=${Date.now()}` } : spec);
49
+ if (layer) {
50
+ layer.options.className = 'fd-map-traffic';
51
+ layer.setZIndex(2).addTo(map);
52
+ if (spec?.fresh)
53
+ timer = setTimeout(draw, spec.fresh * 1000);
54
+ }
55
+ const drop = () => last?.remove();
56
+ if (layer && last) {
57
+ layer.once('load', drop);
58
+ setTimeout(drop, 5000);
59
+ }
60
+ else
61
+ drop();
62
+ };
63
+ button.addEventListener('click', () => {
64
+ on = !on;
65
+ button.setAttribute('aria-pressed', String(on));
66
+ options.traffic(on);
67
+ void draw();
68
+ });
69
+ // The map's images change kind (dark for a dark page, the satellite's): the traffic for them.
70
+ const watch = new MutationObserver(() => on && void draw());
71
+ watch.observe(element, { attributes: true, attributeFilter: ['data-base-map'] });
72
+ options.cleanup(() => (watch.disconnect(), clearTimeout(timer)));
73
+ }
74
+ if (tools.has('fullscreen')) {
75
+ const button = box.tool(labels.fullScreen, '<path d="M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5"/>');
76
+ const mark = (on) => {
77
+ element.toggleAttribute('data-full', on);
78
+ button.setAttribute('aria-pressed', String(on));
79
+ button.setAttribute('aria-label', on ? labels.leaveFullScreen : labels.fullScreen);
80
+ button.title = button.getAttribute('aria-label') ?? '';
81
+ setTimeout(() => map.invalidateSize({ pan: false }), 50);
82
+ };
83
+ // Where the browser refuses the screen (a frame that may not), the map fills the window instead.
84
+ const fill = (on) => {
85
+ element.classList.toggle('fd-map-fixed', on);
86
+ mark(on);
87
+ };
88
+ const change = () => mark(doc.fullscreenElement === element);
89
+ doc.addEventListener('fullscreenchange', change);
90
+ options.cleanup(() => doc.removeEventListener('fullscreenchange', change));
91
+ button.addEventListener('click', () => {
92
+ if (element.hasAttribute('data-full')) {
93
+ if (doc.fullscreenElement === element)
94
+ void doc.exitFullscreen();
95
+ else
96
+ fill(false);
97
+ }
98
+ else if (element.requestFullscreen)
99
+ element.requestFullscreen().catch(() => fill(true));
100
+ else
101
+ fill(true);
102
+ });
103
+ element.addEventListener('keydown', (event) => {
104
+ if (event.key === 'Escape' && element.classList.contains('fd-map-fixed'))
105
+ fill(false);
106
+ });
107
+ }
108
+ if (tools.has('measure')) {
109
+ const button = box.tool(labels.measure, '<path d="M3 17L17 3l4 4L7 21z"/><path d="M7 13l2 2M10 10l2 2M13 7l2 2"/>');
110
+ let stop = null;
111
+ const measuring = import('./measure.mjs');
112
+ button.addEventListener('click', async () => {
113
+ if (stop)
114
+ return stop();
115
+ button.setAttribute('aria-pressed', 'true');
116
+ const { measure } = await measuring;
117
+ stop = measure({
118
+ box,
119
+ map,
120
+ L: options.L,
121
+ labels,
122
+ locale,
123
+ stopped: () => {
124
+ stop = null;
125
+ button.setAttribute('aria-pressed', 'false');
126
+ button.focus();
127
+ },
128
+ });
129
+ });
130
+ }
131
+ }
132
+ //# sourceMappingURL=tools.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/tools.ts"],"names":[],"mappings":"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"}