@sjvair/monitor-map 4.2.0 → 5.0.0-beta.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 (265) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -126
  3. package/dist/lib/MonitorDetailPanel.svelte +23 -20
  4. package/dist/lib/MonitorMapLayout.svelte +147 -77
  5. package/dist/lib/abort.d.ts +16 -0
  6. package/dist/lib/abort.js +51 -0
  7. package/dist/lib/components/DataBox.svelte +4 -1
  8. package/dist/lib/components/ui/range-calendar/range-calendar.svelte.d.ts +1 -1
  9. package/dist/lib/config.svelte.d.ts +7 -0
  10. package/dist/lib/config.svelte.js +10 -0
  11. package/dist/lib/core.d.ts +2 -2
  12. package/dist/lib/core.js +2 -1
  13. package/dist/lib/data-chart/DataChart.svelte +54 -24
  14. package/dist/lib/data-chart/DateRange.d.ts +13 -4
  15. package/dist/lib/data-chart/DateRange.js +50 -14
  16. package/dist/lib/data-chart/chart-utils.js +5 -7
  17. package/dist/lib/data-chart/level-colors.d.ts +3 -4
  18. package/dist/lib/data-chart/level-colors.js +7 -4
  19. package/dist/lib/data-chart/pacific-time.d.ts +9 -0
  20. package/dist/lib/data-chart/pacific-time.js +25 -0
  21. package/dist/lib/data-chart/requests.d.ts +2 -1
  22. package/dist/lib/data-chart/requests.js +5 -2
  23. package/dist/lib/data-chart/tooltip.js +2 -2
  24. package/{src/lib/ev-stations/components/EvStationTooltip.svelte → dist/lib/ev-stations/EvPopup.svelte} +6 -5
  25. package/dist/lib/ev-stations/EvPopup.svelte.d.ts +7 -0
  26. package/dist/lib/ev-stations/ev-plugin.svelte.d.ts +14 -0
  27. package/dist/lib/ev-stations/ev-plugin.svelte.js +71 -0
  28. package/dist/lib/ev-stations/ev-station-icons.d.ts +1 -4
  29. package/dist/lib/ev-stations/ev-station-icons.js +1 -13
  30. package/dist/lib/ev-stations/ev-stations.d.ts +7 -0
  31. package/dist/lib/ev-stations/ev-stations.js +53 -0
  32. package/dist/lib/ev-stations/ev-store.svelte.d.ts +21 -0
  33. package/dist/lib/ev-stations/ev-store.svelte.js +83 -0
  34. package/dist/lib/ev-stations/station-popup.svelte.d.ts +14 -0
  35. package/dist/lib/ev-stations/station-popup.svelte.js +54 -0
  36. package/dist/lib/ev-stations/types.d.ts +0 -29
  37. package/dist/lib/ev-stations/zip-codes.d.ts +11 -0
  38. package/dist/lib/ev-stations/zip-codes.js +28 -16
  39. package/dist/lib/index.d.ts +8 -56
  40. package/dist/lib/index.js +7 -46
  41. package/dist/lib/legend/Legend.svelte +18 -19
  42. package/dist/lib/legend/Legend.svelte.d.ts +2 -2
  43. package/dist/lib/levels.d.ts +7 -0
  44. package/dist/lib/levels.js +19 -0
  45. package/dist/lib/map/MapShell.svelte +17 -24
  46. package/dist/lib/map/MapShell.svelte.d.ts +4 -4
  47. package/dist/lib/map/basemaps.d.ts +25 -0
  48. package/dist/lib/map/basemaps.js +66 -0
  49. package/dist/lib/map/live-map.svelte.d.ts +3 -0
  50. package/dist/lib/map/live-map.svelte.js +22 -0
  51. package/dist/lib/map/sync-plugins.svelte.d.ts +19 -0
  52. package/dist/lib/map/sync-plugins.svelte.js +52 -0
  53. package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte +82 -82
  54. package/dist/lib/monitors/filtered-source.svelte.d.ts +9 -0
  55. package/dist/lib/monitors/filtered-source.svelte.js +28 -0
  56. package/dist/lib/monitors/monitor-details.svelte.js +11 -3
  57. package/dist/lib/monitors/monitors.svelte.d.ts +29 -26
  58. package/dist/lib/monitors/monitors.svelte.js +35 -126
  59. package/dist/lib/monitors/retry-load.d.ts +8 -0
  60. package/dist/lib/monitors/retry-load.js +11 -0
  61. package/dist/lib/monitors/subscriptions.d.ts +3 -0
  62. package/dist/lib/monitors/subscriptions.js +9 -0
  63. package/dist/lib/monitors/types.d.ts +1 -41
  64. package/dist/lib/options/map-option-defaults.d.ts +25 -36
  65. package/dist/lib/options/map-option-defaults.js +12 -30
  66. package/dist/lib/options/map-options.svelte.d.ts +13 -0
  67. package/dist/lib/options/map-options.svelte.js +26 -0
  68. package/dist/lib/options/menus/LayersMenu.svelte +8 -20
  69. package/dist/lib/options/menus/LayersMenu.svelte.d.ts +17 -2
  70. package/dist/lib/options/menus/MonitorsMenu.svelte +34 -18
  71. package/dist/lib/options/menus/OverlaysMenu.svelte +2 -2
  72. package/dist/lib/options/menus/PollutantMenu.svelte +4 -9
  73. package/dist/lib/options/menus/SettingsMenu.svelte +32 -25
  74. package/dist/lib/options/menus/SettingsMenu.svelte.d.ts +5 -16
  75. package/dist/lib/options/plugin-order.d.ts +8 -0
  76. package/dist/lib/options/plugin-order.js +36 -0
  77. package/dist/lib/options/pollutant-param.d.ts +7 -5
  78. package/dist/lib/options/pollutant-param.js +9 -5
  79. package/dist/lib/options/row-icons.d.ts +8 -0
  80. package/dist/lib/options/row-icons.js +15 -0
  81. package/dist/lib/options/rows/MarkerIcon.svelte +5 -5
  82. package/dist/lib/options/rows/MarkerIcon.svelte.d.ts +1 -2
  83. package/dist/lib/search/Search.svelte +20 -33
  84. package/dist/lib/search/Search.svelte.d.ts +5 -1
  85. package/dist/lib/search/search-pin.svelte.d.ts +11 -0
  86. package/dist/lib/search/search-pin.svelte.js +28 -0
  87. package/dist/lib/search/service.d.ts +7 -2
  88. package/dist/lib/search/service.js +17 -10
  89. package/dist/lib/stores.svelte.d.ts +8 -0
  90. package/dist/lib/stores.svelte.js +9 -0
  91. package/dist/lib/wind/wind-plugin.d.ts +11 -0
  92. package/dist/lib/wind/wind-plugin.js +25 -0
  93. package/package.json +12 -10
  94. package/src/lib/MonitorDetailPanel.svelte +23 -20
  95. package/src/lib/MonitorMapLayout.svelte +147 -77
  96. package/src/lib/abort.ts +59 -0
  97. package/src/lib/components/DataBox.svelte +4 -1
  98. package/src/lib/config.svelte.ts +16 -0
  99. package/src/lib/core.ts +2 -2
  100. package/src/lib/data-chart/DataChart.svelte +54 -24
  101. package/src/lib/data-chart/DateRange.ts +58 -15
  102. package/src/lib/data-chart/chart-utils.ts +6 -7
  103. package/src/lib/data-chart/level-colors.ts +8 -9
  104. package/src/lib/data-chart/pacific-time.ts +31 -0
  105. package/src/lib/data-chart/requests.ts +14 -7
  106. package/src/lib/data-chart/tooltip.ts +2 -2
  107. package/{dist/lib/ev-stations/components/EvStationTooltip.svelte → src/lib/ev-stations/EvPopup.svelte} +6 -5
  108. package/src/lib/ev-stations/ev-plugin.svelte.ts +86 -0
  109. package/src/lib/ev-stations/ev-station-icons.ts +1 -17
  110. package/src/lib/ev-stations/ev-stations.ts +72 -0
  111. package/src/lib/ev-stations/ev-store.svelte.ts +117 -0
  112. package/src/lib/ev-stations/station-popup.svelte.ts +64 -0
  113. package/src/lib/ev-stations/types.ts +0 -34
  114. package/src/lib/ev-stations/zip-codes.ts +29 -16
  115. package/src/lib/index.ts +8 -99
  116. package/src/lib/legend/Legend.svelte +18 -19
  117. package/src/lib/levels.ts +24 -0
  118. package/src/lib/map/MapShell.svelte +17 -24
  119. package/src/lib/map/basemaps.ts +76 -0
  120. package/src/lib/map/live-map.svelte.ts +24 -0
  121. package/src/lib/map/sync-plugins.svelte.ts +69 -0
  122. package/src/lib/monitors/components/MonitorSubscriptionManager.svelte +82 -82
  123. package/src/lib/monitors/filtered-source.svelte.ts +38 -0
  124. package/src/lib/monitors/monitor-details.svelte.ts +12 -3
  125. package/src/lib/monitors/monitors.svelte.ts +62 -153
  126. package/src/lib/monitors/retry-load.ts +14 -0
  127. package/src/lib/monitors/subscriptions.ts +17 -0
  128. package/src/lib/monitors/types.ts +1 -47
  129. package/src/lib/options/map-option-defaults.ts +30 -53
  130. package/src/lib/options/map-options.svelte.ts +30 -0
  131. package/src/lib/options/menus/LayersMenu.svelte +8 -20
  132. package/src/lib/options/menus/MonitorsMenu.svelte +34 -18
  133. package/src/lib/options/menus/OverlaysMenu.svelte +2 -2
  134. package/src/lib/options/menus/PollutantMenu.svelte +4 -9
  135. package/src/lib/options/menus/SettingsMenu.svelte +32 -25
  136. package/src/lib/options/plugin-order.ts +38 -0
  137. package/src/lib/options/pollutant-param.ts +14 -9
  138. package/src/lib/options/row-icons.ts +17 -0
  139. package/src/lib/options/rows/MarkerIcon.svelte +5 -5
  140. package/src/lib/search/Search.svelte +20 -33
  141. package/src/lib/search/search-pin.svelte.ts +35 -0
  142. package/src/lib/search/service.ts +34 -15
  143. package/src/lib/stores.svelte.ts +15 -0
  144. package/src/lib/wind/wind-plugin.ts +33 -0
  145. package/dist/lib/collocation-sites/CollocationTooltip.svelte +0 -98
  146. package/dist/lib/collocation-sites/CollocationTooltip.svelte.d.ts +0 -7
  147. package/dist/lib/collocation-sites/collocations-icon-manager.svelte.d.ts +0 -7
  148. package/dist/lib/collocation-sites/collocations-icon-manager.svelte.js +0 -18
  149. package/dist/lib/collocation-sites/collocations-map-integration.svelte.d.ts +0 -21
  150. package/dist/lib/collocation-sites/collocations-map-integration.svelte.js +0 -113
  151. package/dist/lib/collocation-sites/collocations.svelte.d.ts +0 -9
  152. package/dist/lib/collocation-sites/collocations.svelte.js +0 -17
  153. package/dist/lib/collocation-sites/types.d.ts +0 -8
  154. package/dist/lib/collocation-sites/types.js +0 -1
  155. package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte +0 -16
  156. package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte.d.ts +0 -7
  157. package/dist/lib/ev-stations/components/EvStationTooltip.svelte.d.ts +0 -7
  158. package/dist/lib/ev-stations/ev-stations-cluster-renderer.d.ts +0 -19
  159. package/dist/lib/ev-stations/ev-stations-cluster-renderer.js +0 -131
  160. package/dist/lib/ev-stations/ev-stations-map-integration.svelte.d.ts +0 -31
  161. package/dist/lib/ev-stations/ev-stations-map-integration.svelte.js +0 -226
  162. package/dist/lib/ev-stations/ev-stations.svelte.d.ts +0 -9
  163. package/dist/lib/ev-stations/ev-stations.svelte.js +0 -55
  164. package/dist/lib/hms/hms-fire-icon-manager.d.ts +0 -13
  165. package/dist/lib/hms/hms-fire-icon-manager.js +0 -39
  166. package/dist/lib/hms/hms-fire-map-integration.svelte.d.ts +0 -23
  167. package/dist/lib/hms/hms-fire-map-integration.svelte.js +0 -94
  168. package/dist/lib/hms/hms-smoke-map-integration.svelte.d.ts +0 -39
  169. package/dist/lib/hms/hms-smoke-map-integration.svelte.js +0 -87
  170. package/dist/lib/hms/hms.svelte.d.ts +0 -19
  171. package/dist/lib/hms/hms.svelte.js +0 -227
  172. package/dist/lib/legend/LegendBar.svelte +0 -45
  173. package/dist/lib/legend/LegendBar.svelte.d.ts +0 -7
  174. package/dist/lib/legend/legend-data.d.ts +0 -40
  175. package/dist/lib/legend/legend-data.js +0 -65
  176. package/dist/lib/map/Map.svelte +0 -13
  177. package/dist/lib/map/Map.svelte.d.ts +0 -8
  178. package/dist/lib/map/basemap.d.ts +0 -14
  179. package/dist/lib/map/basemap.js +0 -10
  180. package/dist/lib/map/icons.d.ts +0 -7
  181. package/dist/lib/map/icons.js +0 -33
  182. package/dist/lib/map/integrations/base-layer-seperator.d.ts +0 -9
  183. package/dist/lib/map/integrations/base-layer-seperator.js +0 -11
  184. package/dist/lib/map/integrations/click-manager.d.ts +0 -14
  185. package/dist/lib/map/integrations/click-manager.js +0 -52
  186. package/dist/lib/map/integrations/integrations-manager.d.ts +0 -8
  187. package/dist/lib/map/integrations/integrations-manager.js +0 -20
  188. package/dist/lib/map/integrations/map-display-option.svelte.d.ts +0 -7
  189. package/dist/lib/map/integrations/map-display-option.svelte.js +0 -10
  190. package/dist/lib/map/integrations/map-geojson-integration.svelte.d.ts +0 -32
  191. package/dist/lib/map/integrations/map-geojson-integration.svelte.js +0 -60
  192. package/dist/lib/map/integrations/map-icon-manager.d.ts +0 -15
  193. package/dist/lib/map/integrations/map-icon-manager.js +0 -52
  194. package/dist/lib/map/integrations/map-integration.svelte.d.ts +0 -6
  195. package/dist/lib/map/integrations/map-integration.svelte.js +0 -2
  196. package/dist/lib/map/integrations/map-layer-integration.svelte.d.ts +0 -11
  197. package/dist/lib/map/integrations/map-layer-integration.svelte.js +0 -40
  198. package/dist/lib/map/integrations/tooltip.svelte.d.ts +0 -36
  199. package/dist/lib/map/integrations/tooltip.svelte.js +0 -131
  200. package/dist/lib/map/integrations/types.d.ts +0 -14
  201. package/dist/lib/map/integrations/types.js +0 -1
  202. package/dist/lib/map/map-manager.svelte.d.ts +0 -20
  203. package/dist/lib/map/map-manager.svelte.js +0 -63
  204. package/dist/lib/map/map-style-state.svelte.d.ts +0 -23
  205. package/dist/lib/map/map-style-state.svelte.js +0 -86
  206. package/dist/lib/map/utils.d.ts +0 -7
  207. package/dist/lib/map/utils.js +0 -36
  208. package/dist/lib/monitors/components/MonitorClusterTooltip.svelte +0 -112
  209. package/dist/lib/monitors/components/MonitorClusterTooltip.svelte.d.ts +0 -7
  210. package/dist/lib/monitors/components/MonitorTooltip.svelte +0 -61
  211. package/dist/lib/monitors/components/MonitorTooltip.svelte.d.ts +0 -7
  212. package/dist/lib/monitors/monitor-utils.d.ts +0 -4
  213. package/dist/lib/monitors/monitor-utils.js +0 -41
  214. package/dist/lib/monitors/monitors-cluster-renderer.d.ts +0 -33
  215. package/dist/lib/monitors/monitors-cluster-renderer.js +0 -221
  216. package/dist/lib/monitors/monitors-icon-manager.svelte.d.ts +0 -15
  217. package/dist/lib/monitors/monitors-icon-manager.svelte.js +0 -78
  218. package/dist/lib/monitors/monitors-map-integration.svelte.d.ts +0 -43
  219. package/dist/lib/monitors/monitors-map-integration.svelte.js +0 -301
  220. package/dist/lib/options/reset-map-options.d.ts +0 -2
  221. package/dist/lib/options/reset-map-options.js +0 -24
  222. package/dist/lib/reactivity.svelte.d.ts +0 -0
  223. package/dist/lib/reactivity.svelte.js +0 -83
  224. package/dist/lib/wind/wind.svelte.d.ts +0 -10
  225. package/dist/lib/wind/wind.svelte.js +0 -13
  226. package/src/lib/collocation-sites/CollocationTooltip.svelte +0 -98
  227. package/src/lib/collocation-sites/collocations-icon-manager.svelte.ts +0 -21
  228. package/src/lib/collocation-sites/collocations-map-integration.svelte.ts +0 -136
  229. package/src/lib/collocation-sites/collocations.svelte.ts +0 -24
  230. package/src/lib/collocation-sites/types.ts +0 -10
  231. package/src/lib/ev-stations/components/EvStationClusterTooltip.svelte +0 -16
  232. package/src/lib/ev-stations/ev-stations-cluster-renderer.ts +0 -162
  233. package/src/lib/ev-stations/ev-stations-map-integration.svelte.ts +0 -248
  234. package/src/lib/ev-stations/ev-stations.svelte.ts +0 -79
  235. package/src/lib/hms/hms-fire-icon-manager.ts +0 -48
  236. package/src/lib/hms/hms-fire-map-integration.svelte.ts +0 -109
  237. package/src/lib/hms/hms-smoke-map-integration.svelte.ts +0 -105
  238. package/src/lib/hms/hms.svelte.ts +0 -264
  239. package/src/lib/legend/LegendBar.svelte +0 -45
  240. package/src/lib/legend/legend-data.ts +0 -101
  241. package/src/lib/map/Map.svelte +0 -13
  242. package/src/lib/map/basemap.ts +0 -24
  243. package/src/lib/map/icons.ts +0 -42
  244. package/src/lib/map/integrations/base-layer-seperator.ts +0 -17
  245. package/src/lib/map/integrations/click-manager.ts +0 -64
  246. package/src/lib/map/integrations/integrations-manager.ts +0 -25
  247. package/src/lib/map/integrations/map-display-option.svelte.ts +0 -13
  248. package/src/lib/map/integrations/map-geojson-integration.svelte.ts +0 -77
  249. package/src/lib/map/integrations/map-icon-manager.ts +0 -67
  250. package/src/lib/map/integrations/map-integration.svelte.ts +0 -8
  251. package/src/lib/map/integrations/map-layer-integration.svelte.ts +0 -49
  252. package/src/lib/map/integrations/tooltip.svelte.ts +0 -153
  253. package/src/lib/map/integrations/types.ts +0 -24
  254. package/src/lib/map/map-manager.svelte.ts +0 -83
  255. package/src/lib/map/map-style-state.svelte.ts +0 -94
  256. package/src/lib/map/utils.ts +0 -53
  257. package/src/lib/monitors/components/MonitorClusterTooltip.svelte +0 -112
  258. package/src/lib/monitors/components/MonitorTooltip.svelte +0 -61
  259. package/src/lib/monitors/monitor-utils.ts +0 -57
  260. package/src/lib/monitors/monitors-cluster-renderer.ts +0 -285
  261. package/src/lib/monitors/monitors-icon-manager.svelte.ts +0 -98
  262. package/src/lib/monitors/monitors-map-integration.svelte.ts +0 -318
  263. package/src/lib/options/reset-map-options.ts +0 -28
  264. package/src/lib/reactivity.svelte.ts +0 -82
  265. package/src/lib/wind/wind.svelte.ts +0 -20
@@ -1,52 +0,0 @@
1
- import { mapManager } from "../map-manager.svelte.js";
2
- class ClickManager {
3
- registrations = [];
4
- isListening = false;
5
- /** Must be called after `mapManager.map` is initialized (i.e. from within `apply()`). */
6
- register(layerIds, handler) {
7
- const incomingSet = new Set(layerIds);
8
- const existing = this.registrations.find((r) => r.layerIds.some((id) => incomingSet.has(id)));
9
- if (existing) {
10
- existing.layerIds = layerIds;
11
- existing.handler = handler;
12
- }
13
- else {
14
- this.registrations.push({ layerIds, handler });
15
- }
16
- this.ensureListener();
17
- }
18
- unregister(layerIds) {
19
- const set = new Set(layerIds);
20
- this.registrations = this.registrations.filter((r) => !r.layerIds.some((id) => set.has(id)));
21
- if (this.registrations.length === 0) {
22
- this.removeListener();
23
- }
24
- }
25
- ensureListener() {
26
- if (this.isListening || !mapManager.map)
27
- return;
28
- mapManager.map.on("click", this.handleClick);
29
- this.isListening = true;
30
- }
31
- removeListener() {
32
- if (!this.isListening)
33
- return;
34
- mapManager.map?.off("click", this.handleClick);
35
- this.isListening = false;
36
- }
37
- handleClick = (evt) => {
38
- if (!mapManager.map)
39
- return;
40
- const allLayerIds = this.registrations.flatMap((r) => r.layerIds);
41
- const features = mapManager.map.queryRenderedFeatures(evt.point, { layers: allLayerIds });
42
- if (!features.length)
43
- return;
44
- const winningLayerId = features[0].layer.id;
45
- const registration = this.registrations.find((r) => r.layerIds.includes(winningLayerId));
46
- if (!registration)
47
- return;
48
- const ownFeatures = features.filter((f) => registration.layerIds.includes(f.layer.id));
49
- registration.handler(ownFeatures, evt);
50
- };
51
- }
52
- export const clickManager = new ClickManager();
@@ -1,8 +0,0 @@
1
- import type { SomeMapIntegration } from "./types";
2
- declare class IntegrationsManager {
3
- private integrations;
4
- register(...integrations: Array<SomeMapIntegration>): void;
5
- refresh(): void;
6
- }
7
- export declare const integrationsManager: IntegrationsManager;
8
- export type { IntegrationsManager };
@@ -1,20 +0,0 @@
1
- import { XMap } from "@tstk/builtin-extensions";
2
- class IntegrationsManager {
3
- integrations = new XMap();
4
- register(...integrations) {
5
- for (const integration of integrations) {
6
- this.integrations.set(integration.referenceId, integration);
7
- }
8
- }
9
- refresh() {
10
- for (const integration of this.integrations.values()) {
11
- if (integration.enabled) {
12
- integration.apply();
13
- }
14
- else if (integration.remove) {
15
- integration.remove();
16
- }
17
- }
18
- }
19
- }
20
- export const integrationsManager = new IntegrationsManager();
@@ -1,7 +0,0 @@
1
- import { MapImageIcon } from "./types";
2
- export declare class MapDisplayOption {
3
- icon?: MapImageIcon;
4
- label: string;
5
- value: boolean;
6
- constructor(label: string, value: boolean, icon?: MapImageIcon);
7
- }
@@ -1,10 +0,0 @@
1
- export class MapDisplayOption {
2
- icon;
3
- label;
4
- value;
5
- constructor(label, value, icon) {
6
- this.icon = icon;
7
- this.label = label;
8
- this.value = $state(value);
9
- }
10
- }
@@ -1,32 +0,0 @@
1
- import type { Map as MaptilerMap } from "@maptiler/sdk";
2
- import type { Feature, Geometry } from "geojson";
3
- import type { MapIconManager } from "./map-icon-manager";
4
- import { MapLayerIntegration } from "./map-layer-integration.svelte";
5
- export declare abstract class MapGeoJSONIntegration<T = Record<string, unknown>> extends MapLayerIntegration {
6
- abstract features: Array<Feature<Geometry, T>>;
7
- abstract mapSource: Parameters<MaptilerMap["addSource"]>[1];
8
- remove(): void;
9
- /**
10
- * Removes only this integration's own layer and source. Non-virtual on purpose: `apply()`
11
- * paths call it to clear stale map state before re-adding, without triggering a subclass's
12
- * `remove()` override (which also tears down tooltips/click handlers that apply just set up).
13
- */
14
- protected removeLayerAndSource(): void;
15
- }
16
- export declare abstract class MapIconLayerIntegration<T = Record<string, unknown>> extends MapGeoJSONIntegration<T> {
17
- abstract icons: MapIconManager;
18
- private generation;
19
- /**
20
- * Drops every callback still waiting on icons. `apply()` and `remove()` call it, so a
21
- * subclass overriding `apply()` without calling `super.apply()` first must call it itself.
22
- */
23
- protected supersedePending(): void;
24
- /**
25
- * Runs `run` once the icons have loaded, unless an `apply()` or `remove()` has happened
26
- * since (the state it was scheduled for is gone) or a basemap change is in flight (the
27
- * refresh on "style.load" re-applies).
28
- */
29
- protected whenIconsLoad(run: () => void): void;
30
- apply(): void;
31
- remove(): void;
32
- }
@@ -1,60 +0,0 @@
1
- import { MapLayerIntegration } from "./map-layer-integration.svelte";
2
- import { mapManager } from "../map-manager.svelte.js";
3
- export class MapGeoJSONIntegration extends MapLayerIntegration {
4
- remove() {
5
- this.removeLayerAndSource();
6
- }
7
- /**
8
- * Removes only this integration's own layer and source. Non-virtual on purpose: `apply()`
9
- * paths call it to clear stale map state before re-adding, without triggering a subclass's
10
- * `remove()` override (which also tears down tooltips/click handlers that apply just set up).
11
- */
12
- removeLayerAndSource() {
13
- if (mapManager.map?.getLayer(this.referenceId)) {
14
- mapManager.map.removeLayer(this.referenceId);
15
- }
16
- if (mapManager.map?.getSource(this.referenceId)) {
17
- mapManager.map.removeSource(this.referenceId);
18
- }
19
- }
20
- }
21
- export class MapIconLayerIntegration extends MapGeoJSONIntegration {
22
- generation = 0;
23
- /**
24
- * Drops every callback still waiting on icons. `apply()` and `remove()` call it, so a
25
- * subclass overriding `apply()` without calling `super.apply()` first must call it itself.
26
- */
27
- supersedePending() {
28
- this.generation++;
29
- }
30
- /**
31
- * Runs `run` once the icons have loaded, unless an `apply()` or `remove()` has happened
32
- * since (the state it was scheduled for is gone) or a basemap change is in flight (the
33
- * refresh on "style.load" re-applies).
34
- */
35
- whenIconsLoad(run) {
36
- const generation = this.generation;
37
- this.icons
38
- .loadIcons()
39
- .then(() => {
40
- if (generation !== this.generation || mapManager.styleLoading)
41
- return;
42
- run();
43
- })
44
- .catch(console.error);
45
- }
46
- apply() {
47
- if (!mapManager.map)
48
- return;
49
- this.supersedePending();
50
- this.whenIconsLoad(() => {
51
- this.removeLayerAndSource();
52
- mapManager.map?.addSource(this.referenceId, this.mapSource);
53
- super.apply();
54
- });
55
- }
56
- remove() {
57
- this.supersedePending();
58
- super.remove();
59
- }
60
- }
@@ -1,15 +0,0 @@
1
- import type { Map as MaptilerMap } from "@maptiler/sdk";
2
- import type { MapImageIcon } from "./types";
3
- import { SvelteMap } from "svelte/reactivity";
4
- export declare class MapIconManager {
5
- protected icons: SvelteMap<string, MapImageIcon>;
6
- constructor(iconMap?: SvelteMap<string, MapImageIcon>);
7
- get iter(): MapIterator<[string, MapImageIcon]>;
8
- get(id: string): MapImageIcon | undefined;
9
- has(id: string): boolean;
10
- loadIcons(): Promise<void>;
11
- register(id: string, icon: HTMLImageElement): void;
12
- protected loadImage(icon: MapImageIcon, map: MaptilerMap): Promise<void>;
13
- protected updateImage(icon: MapImageIcon, map: MaptilerMap): Promise<void>;
14
- private applyImage;
15
- }
@@ -1,52 +0,0 @@
1
- import { mapManager } from "../map-manager.svelte.js";
2
- import { SvelteMap } from "svelte/reactivity";
3
- export class MapIconManager {
4
- icons = new SvelteMap();
5
- constructor(iconMap) {
6
- if (iconMap) {
7
- this.icons = iconMap;
8
- }
9
- }
10
- get iter() {
11
- return this.icons.entries();
12
- }
13
- get(id) {
14
- return this.icons.get(id);
15
- }
16
- has(id) {
17
- return this.icons.has(id);
18
- }
19
- async loadIcons() {
20
- if (!mapManager.map)
21
- return;
22
- await Promise.all(this.icons.values().map((icon) => this.loadImage(icon, mapManager.map)));
23
- }
24
- register(id, icon) {
25
- const imageIcon = { id, image: icon };
26
- this.icons.set(id, imageIcon);
27
- }
28
- loadImage(icon, map) {
29
- return this.applyImage("add", icon, map);
30
- }
31
- updateImage(icon, map) {
32
- return this.applyImage("update", icon, map);
33
- }
34
- applyImage(action, icon, map) {
35
- const apply = () => action === "add" ? map.addImage(icon.id, icon.image) : map.updateImage(icon.id, icon.image);
36
- if (!icon.image.complete) {
37
- return new Promise((resolve, reject) => {
38
- icon.image.onload = () => {
39
- apply();
40
- resolve();
41
- };
42
- icon.image.onerror = (err) => {
43
- reject(new Error(`Failed to load image ${icon.id}: ${err}`, { cause: err }));
44
- };
45
- });
46
- }
47
- else {
48
- apply();
49
- return Promise.resolve();
50
- }
51
- }
52
- }
@@ -1,6 +0,0 @@
1
- export declare abstract class MapIntegration {
2
- abstract referenceId: string;
3
- abstract enabled: boolean;
4
- abstract apply(): void;
5
- remove?(): void;
6
- }
@@ -1,2 +0,0 @@
1
- export class MapIntegration {
2
- }
@@ -1,11 +0,0 @@
1
- import type { Map as MaptilerMap } from "@maptiler/sdk";
2
- import { MapIntegration } from "./map-integration.svelte";
3
- export declare abstract class MapLayerIntegration extends MapIntegration {
4
- abstract referenceId: string;
5
- abstract mapLayer: Parameters<MaptilerMap["addLayer"]>[0];
6
- abstract enabled: boolean;
7
- beforeLayer?: string;
8
- constructor();
9
- apply(): void;
10
- remove(): void;
11
- }
@@ -1,40 +0,0 @@
1
- import { untrack } from "svelte";
2
- import { mapManager } from "../map-manager.svelte.js";
3
- import { MapIntegration } from "./map-integration.svelte";
4
- export class MapLayerIntegration extends MapIntegration {
5
- beforeLayer;
6
- constructor() {
7
- super();
8
- // Each integration manages its own lifecycle. Tracking both mapManager.map and
9
- // this.enabled means apply/remove fire automatically on map load and on enabled
10
- // changes. untrack on the call itself prevents reactive reads inside apply/remove
11
- // from leaking back into this effect's dependency graph. While a new basemap style is
12
- // loading nothing is applied or removed: the refresh on "style.load" does both.
13
- $effect.root(() => {
14
- $effect(() => {
15
- const enabled = this.enabled;
16
- if (!mapManager.map || mapManager.styleLoading)
17
- return;
18
- if (enabled) {
19
- untrack(() => this.apply());
20
- }
21
- else {
22
- untrack(() => this.remove());
23
- }
24
- });
25
- });
26
- }
27
- apply() {
28
- if (!mapManager.map)
29
- return;
30
- if (!mapManager.map.getLayer(this.referenceId)) {
31
- mapManager.map.addLayer(this.mapLayer, this.beforeLayer);
32
- }
33
- mapManager.map.setLayoutProperty(this.referenceId, "visibility", this.enabled ? "visible" : "none");
34
- }
35
- remove() {
36
- if (mapManager.map?.getLayer(this.referenceId)) {
37
- mapManager.map.removeLayer(this.referenceId);
38
- }
39
- }
40
- }
@@ -1,36 +0,0 @@
1
- import type { MapLayerEventType, Popup } from "@maptiler/sdk";
2
- export type TooltipBuilder = (evt: MapLayerEventType["mousemove"] & object) => Popup | void;
3
- export declare class TooltipManager {
4
- static activeHandle: TooltipHandle | null;
5
- /**
6
- * Host-controlled master switch. When false, enable() is a no-op
7
- * regardless of how many times or when internal code (e.g. a map
8
- * integration's apply()) calls it -- unlike isEnabled below, this is
9
- * checked fresh on every enable() call, so it can't be raced by an
10
- * apply() invocation that fires before a host sets this to false.
11
- */
12
- enabled: boolean;
13
- private isEnabled;
14
- private _tooltips;
15
- get tooltips(): MapIterator<TooltipHandle>;
16
- enable(layerId?: string): void;
17
- disable(layerId?: string): void;
18
- get(layerId: string): TooltipHandle | undefined;
19
- has(layerId: string): boolean;
20
- register(layerId: string, builder: TooltipBuilder, priority?: number): TooltipHandle;
21
- with(layerId: string | Array<string>, cb: (tooltip: TooltipHandle) => void): void;
22
- private forEachHandle;
23
- }
24
- declare class TooltipHandle {
25
- layerId: string;
26
- priority: number;
27
- tooltip: Popup | null;
28
- private activeFeatureId;
29
- private isEnabled;
30
- clearTooltip: () => void;
31
- private setTooltip;
32
- constructor(layerId: string, builder: TooltipBuilder, priority?: number);
33
- enable(): void;
34
- disable(): void;
35
- }
36
- export {};
@@ -1,131 +0,0 @@
1
- import { mapManager } from "../map-manager.svelte.js";
2
- import { XMap } from "@tstk/builtin-extensions";
3
- function handleZoom() {
4
- TooltipManager.activeHandle?.clearTooltip();
5
- }
6
- function setCursorPointer() {
7
- mapManager.map.getCanvas().style.cursor = "pointer";
8
- }
9
- function setCursorDefault() {
10
- mapManager.map.getCanvas().style.cursor = "";
11
- }
12
- export class TooltipManager {
13
- static activeHandle = null;
14
- /**
15
- * Host-controlled master switch. When false, enable() is a no-op
16
- * regardless of how many times or when internal code (e.g. a map
17
- * integration's apply()) calls it -- unlike isEnabled below, this is
18
- * checked fresh on every enable() call, so it can't be raced by an
19
- * apply() invocation that fires before a host sets this to false.
20
- */
21
- enabled = true;
22
- isEnabled = false;
23
- _tooltips = new XMap();
24
- get tooltips() {
25
- return this._tooltips.values();
26
- }
27
- enable(layerId) {
28
- if (!this.enabled || !mapManager.map || this.isEnabled)
29
- return;
30
- mapManager.map.on("zoom", handleZoom);
31
- this.forEachHandle(layerId, (h) => h.enable());
32
- this.isEnabled = true;
33
- }
34
- disable(layerId) {
35
- if (!mapManager.map || !this.isEnabled)
36
- return;
37
- mapManager.map.off("zoom", handleZoom);
38
- this.forEachHandle(layerId, (h) => h.disable());
39
- this.isEnabled = false;
40
- }
41
- get(layerId) {
42
- return this._tooltips.get(layerId);
43
- }
44
- has(layerId) {
45
- return this._tooltips.has(layerId);
46
- }
47
- register(layerId, builder, priority = 0) {
48
- const tooltipHandle = new TooltipHandle(layerId, builder, priority);
49
- this._tooltips.set(layerId, tooltipHandle);
50
- return tooltipHandle;
51
- }
52
- with(layerId, cb) {
53
- const ids = Array.isArray(layerId) ? layerId : [layerId];
54
- for (const id of ids) {
55
- const tooltip = this._tooltips.get(id);
56
- if (tooltip)
57
- cb(tooltip);
58
- }
59
- }
60
- forEachHandle(layerId, cb) {
61
- if (layerId !== undefined && this._tooltips.has(layerId)) {
62
- cb(this._tooltips.get(layerId));
63
- }
64
- else {
65
- for (const h of this.tooltips)
66
- cb(h);
67
- }
68
- }
69
- }
70
- class TooltipHandle {
71
- layerId;
72
- priority;
73
- tooltip = null;
74
- activeFeatureId = undefined;
75
- isEnabled = false;
76
- clearTooltip = () => {
77
- if (TooltipManager.activeHandle !== this)
78
- return;
79
- this.tooltip?.remove();
80
- this.tooltip = null;
81
- TooltipManager.activeHandle = null;
82
- this.activeFeatureId = undefined;
83
- };
84
- setTooltip;
85
- constructor(layerId, builder, priority = 0) {
86
- this.layerId = layerId;
87
- this.priority = priority;
88
- this.setTooltip = (evt) => {
89
- if (!mapManager.map || !evt.features)
90
- return;
91
- const featureId = evt.features[0]?.id;
92
- const isOwner = TooltipManager.activeHandle === this;
93
- const sameFeature = featureId === this.activeFeatureId;
94
- if (isOwner && this.tooltip && sameFeature) {
95
- this.tooltip.setLngLat(evt.lngLat);
96
- return;
97
- }
98
- const activeHandle = TooltipManager.activeHandle;
99
- if (activeHandle !== null && activeHandle !== this && activeHandle.priority >= this.priority)
100
- return;
101
- activeHandle?.clearTooltip();
102
- this.activeFeatureId = undefined;
103
- const tooltip = builder(evt);
104
- if (tooltip) {
105
- this.tooltip = tooltip;
106
- TooltipManager.activeHandle = this;
107
- this.activeFeatureId = featureId;
108
- tooltip.addTo(mapManager.map);
109
- }
110
- };
111
- }
112
- enable() {
113
- if (!mapManager.map || this.isEnabled)
114
- return;
115
- mapManager.map.on("mousemove", this.layerId, setCursorPointer);
116
- mapManager.map.on("mouseleave", this.layerId, setCursorDefault);
117
- mapManager.map.on("mousemove", this.layerId, this.setTooltip);
118
- mapManager.map.on("mouseleave", this.layerId, this.clearTooltip);
119
- this.isEnabled = true;
120
- }
121
- disable() {
122
- if (!mapManager.map || !this.isEnabled)
123
- return;
124
- this.clearTooltip();
125
- mapManager.map.off("mousemove", this.layerId, setCursorPointer);
126
- mapManager.map.off("mouseleave", this.layerId, setCursorDefault);
127
- mapManager.map.off("mousemove", this.layerId, this.setTooltip);
128
- mapManager.map.off("mouseleave", this.layerId, this.clearTooltip);
129
- this.isEnabled = false;
130
- }
131
- }
@@ -1,14 +0,0 @@
1
- import type { MapLayerEventType, Map as MaptilerMap, Popup } from "@maptiler/sdk";
2
- import type { MapIntegration } from "./map-integration.svelte";
3
- import type { MapGeoJSONIntegration, MapIconLayerIntegration } from "./map-geojson-integration.svelte";
4
- export type TooltipPopup = <T extends TooltipController>(mapCtrl: T) => (evt: MapLayerEventType["mousemove"] & object) => void;
5
- export type SomeMapIntegration = MapIntegration | MapGeoJSONIntegration<Record<string, unknown>> | MapIconLayerIntegration<Record<string, unknown>>;
6
- interface TooltipController {
7
- tooltip: Popup | null;
8
- map?: MaptilerMap;
9
- }
10
- export interface MapImageIcon {
11
- id: string;
12
- image: HTMLImageElement;
13
- }
14
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,20 +0,0 @@
1
- import { MapStyleVariant, Map as MaptilerMap } from "@maptiler/sdk";
2
- import type { Attachment } from "svelte/attachments";
3
- import type { Feature, GeoJsonProperties, Geometry } from "geojson";
4
- export declare const DefaultMapStyle: MapStyleVariant;
5
- declare class MapManager {
6
- map: MaptilerMap | null;
7
- /**
8
- * True between `setStyle()` and the new style's "style.load". Plain (non-reactive) on purpose:
9
- * integrations skip touching the style while it's set, and the `integrationsManager.refresh()`
10
- * that runs on "style.load" applies/removes every integration afterwards.
11
- */
12
- styleLoading: boolean;
13
- setDataSource(sourceId: string, features: Array<Feature<Geometry, GeoJsonProperties>>): void;
14
- refreshMap(): void;
15
- removeExcludedLayers(): void;
16
- removeMap(): void;
17
- }
18
- export declare const mapManager: MapManager;
19
- export type { MapManager };
20
- export declare const initializeMap: Attachment<HTMLDivElement>;
@@ -1,63 +0,0 @@
1
- import { MapStyle, config as MaptilerConfig, Map as MaptilerMap } from "@maptiler/sdk";
2
- import { isGeoJSONSource } from "./utils";
3
- MaptilerConfig.apiKey = import.meta.env.VITE_MAPTILER_KEY;
4
- export const DefaultMapStyle = MapStyle.STREETS_V4.DEFAULT;
5
- const excludeLayers = ["Sport", "Tourism", "Culture", "Shopping", "Food", "Transport"];
6
- class MapManager {
7
- map = $state(null);
8
- /**
9
- * True between `setStyle()` and the new style's "style.load". Plain (non-reactive) on purpose:
10
- * integrations skip touching the style while it's set, and the `integrationsManager.refresh()`
11
- * that runs on "style.load" applies/removes every integration afterwards.
12
- */
13
- styleLoading = false;
14
- setDataSource(sourceId, features) {
15
- const source = mapManager.map?.getSource(sourceId);
16
- if (isGeoJSONSource(source)) {
17
- source.setData({
18
- type: "FeatureCollection",
19
- features
20
- });
21
- }
22
- }
23
- refreshMap() {
24
- if (mapManager.map) {
25
- this.removeExcludedLayers();
26
- }
27
- }
28
- removeExcludedLayers() {
29
- for (const toExclude of excludeLayers) {
30
- if (mapManager.map?.getLayer(toExclude)) {
31
- mapManager.map.removeLayer(toExclude);
32
- }
33
- }
34
- }
35
- removeMap() {
36
- return mapManager.map?.remove();
37
- }
38
- }
39
- export const mapManager = new MapManager();
40
- export const initializeMap = (container) => {
41
- const map = new MaptilerMap({
42
- container: container,
43
- center: [-119.7987626619462, 36.76272050981146],
44
- zoom: 7,
45
- style: DefaultMapStyle,
46
- projection: "globe",
47
- space: {
48
- preset: "milkyway"
49
- }
50
- });
51
- // "load" fires once the style and initial viewport tiles have loaded --
52
- // in practice this can hang indefinitely (observed: never fires, even
53
- // after 20+s, despite the style/tiles being independently fetchable) for
54
- // reasons that don't affect "idle", which fires once the map has
55
- // finished rendering after becoming idle. MapShell's own effect no
56
- // longer waits for a *second* idle event to hide the load screen (see
57
- // its comment), so listening for "idle" here doesn't reintroduce the
58
- // hang that change was fixing.
59
- map.once("idle", () => {
60
- mapManager.map = map;
61
- });
62
- return () => map.remove();
63
- };
@@ -1,23 +0,0 @@
1
- import type { MapStyleVariant, ReferenceMapStyle } from "@maptiler/sdk";
2
- /** Basemap + theme selection, shared so the Settings menu and Reset Map Options agree. */
3
- declare class MapStyleState {
4
- referenceStyle: ReferenceMapStyle;
5
- variant: MapStyleVariant;
6
- private applied;
7
- private loaded;
8
- private stopWaiting;
9
- selectReferenceStyle(style: ReferenceMapStyle): void;
10
- selectVariant(variant: MapStyleVariant): void;
11
- reset(): void;
12
- private apply;
13
- private load;
14
- /**
15
- * A style that fails to load leaves the map with no style at all, so go back to the last one
16
- * that loaded and make the selection say so. When that one fails too (e.g. offline) there is
17
- * nothing to draw on: `styleLoading` stays set, since integrations cannot add layers to a
18
- * missing style, and the next selection starts a fresh attempt.
19
- */
20
- private recover;
21
- }
22
- export declare const mapStyleState: MapStyleState;
23
- export type { MapStyleState };