@sjvair/monitor-map 3.0.3 → 3.0.5

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 (279) hide show
  1. package/dist/lib/LoadScreen.svelte +68 -0
  2. package/dist/lib/LoadScreen.svelte.d.ts +25 -0
  3. package/dist/lib/MainMapView.svelte +1 -0
  4. package/dist/lib/MainMapView.svelte.d.ts +26 -0
  5. package/dist/lib/MapLegend.svelte +15 -0
  6. package/dist/lib/MapLegend.svelte.d.ts +18 -0
  7. package/dist/lib/MonitorDetailPanel.svelte +152 -0
  8. package/dist/lib/MonitorDetailPanel.svelte.d.ts +3 -0
  9. package/dist/lib/MonitorMapLayout.svelte +193 -0
  10. package/dist/lib/MonitorMapLayout.svelte.d.ts +7 -0
  11. package/dist/lib/actions.d.ts +3 -0
  12. package/dist/lib/actions.js +12 -8
  13. package/dist/lib/assets/icons/adjustment-horizontal.svg +3 -0
  14. package/dist/lib/assets/logos/airgradient-blue.svg +63 -0
  15. package/dist/lib/assets/logos/airnow-compact.jpg +0 -0
  16. package/dist/lib/assets/logos/carb-compact.jpg +0 -0
  17. package/dist/lib/assets/logos/purpleair-compact.png +0 -0
  18. package/dist/lib/assets/logos/sjvair-parts/sjvair-air.webp +0 -0
  19. package/dist/lib/assets/logos/sjvair-parts/sjvair-icon.webp +0 -0
  20. package/dist/lib/assets/logos/sjvair-parts/sjvair-sjv.webp +0 -0
  21. package/dist/lib/assets/logos/sjvair-white.svg +115 -0
  22. package/dist/lib/assets/logos/sjvair.svg +96 -0
  23. package/dist/lib/collocation-sites/CollocationTooltip.svelte +98 -0
  24. package/dist/lib/collocation-sites/CollocationTooltip.svelte.d.ts +7 -0
  25. package/dist/lib/collocation-sites/collocation-utils.d.ts +3 -0
  26. package/dist/lib/collocation-sites/collocation-utils.js +30 -0
  27. package/dist/lib/collocation-sites/collocations-icon-manager.svelte.d.ts +7 -0
  28. package/dist/lib/collocation-sites/collocations-icon-manager.svelte.js +17 -20
  29. package/dist/lib/collocation-sites/collocations-map-integration.svelte.d.ts +18 -0
  30. package/dist/lib/collocation-sites/collocations-map-integration.svelte.js +98 -83
  31. package/dist/lib/collocation-sites/collocations.svelte.d.ts +9 -0
  32. package/dist/lib/collocation-sites/collocations.svelte.js +17 -26
  33. package/dist/lib/collocation-sites/types.d.ts +8 -0
  34. package/dist/lib/collocation-sites/types.js +1 -0
  35. package/dist/lib/colors.d.ts +17 -0
  36. package/dist/lib/colors.js +29 -23
  37. package/dist/lib/components/DataBox.svelte +29 -0
  38. package/dist/lib/components/DataBox.svelte.d.ts +9 -0
  39. package/dist/lib/components/DisplayOption.svelte +7 -0
  40. package/dist/lib/components/DisplayOption.svelte.d.ts +5 -0
  41. package/dist/lib/components/MapLayersDisplayOptions.svelte +42 -0
  42. package/dist/lib/components/MapLayersDisplayOptions.svelte.d.ts +18 -0
  43. package/dist/lib/components/SegmentedControl.svelte +61 -0
  44. package/dist/lib/components/SegmentedControl.svelte.d.ts +11 -0
  45. package/dist/lib/components/ToggleSwitch.svelte +93 -0
  46. package/dist/lib/components/ToggleSwitch.svelte.d.ts +9 -0
  47. package/dist/lib/components/ui/button/button.svelte +89 -0
  48. package/dist/lib/components/ui/button/button.svelte.d.ts +70 -0
  49. package/dist/lib/components/ui/button/index.d.ts +2 -0
  50. package/dist/lib/components/ui/button/index.js +4 -0
  51. package/dist/lib/components/ui/range-calendar/index.d.ts +19 -0
  52. package/dist/lib/components/ui/range-calendar/index.js +21 -0
  53. package/dist/lib/components/ui/range-calendar/range-calendar-caption.svelte +76 -0
  54. package/dist/lib/components/ui/range-calendar/range-calendar-caption.svelte.d.ts +19 -0
  55. package/dist/lib/components/ui/range-calendar/range-calendar-cell.svelte +19 -0
  56. package/dist/lib/components/ui/range-calendar/range-calendar-cell.svelte.d.ts +4 -0
  57. package/dist/lib/components/ui/range-calendar/range-calendar-day.svelte +36 -0
  58. package/dist/lib/components/ui/range-calendar/range-calendar-day.svelte.d.ts +4 -0
  59. package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.svelte +7 -0
  60. package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.svelte.d.ts +4 -0
  61. package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.svelte +7 -0
  62. package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.svelte.d.ts +4 -0
  63. package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.svelte +12 -0
  64. package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.svelte.d.ts +4 -0
  65. package/dist/lib/components/ui/range-calendar/range-calendar-grid.svelte +16 -0
  66. package/dist/lib/components/ui/range-calendar/range-calendar-grid.svelte.d.ts +4 -0
  67. package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.svelte +19 -0
  68. package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.svelte.d.ts +4 -0
  69. package/dist/lib/components/ui/range-calendar/range-calendar-header.svelte +19 -0
  70. package/dist/lib/components/ui/range-calendar/range-calendar-header.svelte.d.ts +4 -0
  71. package/dist/lib/components/ui/range-calendar/range-calendar-heading.svelte +16 -0
  72. package/dist/lib/components/ui/range-calendar/range-calendar-heading.svelte.d.ts +4 -0
  73. package/dist/lib/components/ui/range-calendar/range-calendar-month-select.svelte +44 -0
  74. package/dist/lib/components/ui/range-calendar/range-calendar-month-select.svelte.d.ts +4 -0
  75. package/dist/lib/components/ui/range-calendar/range-calendar-month.svelte +15 -0
  76. package/dist/lib/components/ui/range-calendar/range-calendar-month.svelte.d.ts +5 -0
  77. package/dist/lib/components/ui/range-calendar/range-calendar-months.svelte +19 -0
  78. package/dist/lib/components/ui/range-calendar/range-calendar-months.svelte.d.ts +5 -0
  79. package/dist/lib/components/ui/range-calendar/range-calendar-nav.svelte +19 -0
  80. package/dist/lib/components/ui/range-calendar/range-calendar-nav.svelte.d.ts +5 -0
  81. package/dist/lib/components/ui/range-calendar/range-calendar-next-button.svelte +36 -0
  82. package/dist/lib/components/ui/range-calendar/range-calendar-next-button.svelte.d.ts +8 -0
  83. package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.svelte +36 -0
  84. package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.svelte.d.ts +8 -0
  85. package/dist/lib/components/ui/range-calendar/range-calendar-year-select.svelte +43 -0
  86. package/dist/lib/components/ui/range-calendar/range-calendar-year-select.svelte.d.ts +4 -0
  87. package/dist/lib/components/ui/range-calendar/range-calendar.svelte +112 -0
  88. package/dist/lib/components/ui/range-calendar/range-calendar.svelte.d.ts +21 -0
  89. package/dist/lib/data-chart/DataChart.svelte +303 -0
  90. package/dist/lib/data-chart/DataChart.svelte.d.ts +7 -0
  91. package/dist/lib/data-chart/DateRange.d.ts +6 -0
  92. package/dist/lib/data-chart/DateRange.js +15 -14
  93. package/dist/lib/data-chart/chart-utils.d.ts +3 -0
  94. package/dist/lib/data-chart/chart-utils.js +157 -93
  95. package/dist/lib/data-chart/data-chart.svelte.d.ts +7 -0
  96. package/dist/lib/data-chart/data-chart.svelte.js +7 -28
  97. package/dist/lib/data-chart/requests.d.ts +3 -0
  98. package/dist/lib/data-chart/requests.js +36 -28
  99. package/dist/lib/data-chart/tooltip.d.ts +10 -0
  100. package/dist/lib/data-chart/tooltip.js +160 -98
  101. package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte +16 -0
  102. package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte.d.ts +7 -0
  103. package/dist/lib/ev-stations/components/EvStationTooltip.svelte +127 -0
  104. package/dist/lib/ev-stations/components/EvStationTooltip.svelte.d.ts +7 -0
  105. package/dist/lib/ev-stations/components/EvStationsDisplayOptions.svelte +46 -0
  106. package/dist/lib/ev-stations/components/EvStationsDisplayOptions.svelte.d.ts +18 -0
  107. package/dist/lib/ev-stations/data-maps.d.ts +5 -0
  108. package/dist/lib/ev-stations/data-maps.js +152 -4
  109. package/dist/lib/ev-stations/ev-station-icons.d.ts +16 -0
  110. package/dist/lib/ev-stations/ev-station-icons.js +21 -27
  111. package/dist/lib/ev-stations/ev-stations-cluster-renderer.d.ts +19 -0
  112. package/dist/lib/ev-stations/ev-stations-cluster-renderer.js +130 -117
  113. package/dist/lib/ev-stations/ev-stations-map-integration.svelte.d.ts +31 -0
  114. package/dist/lib/ev-stations/ev-stations-map-integration.svelte.js +206 -180
  115. package/dist/lib/ev-stations/ev-stations.svelte.d.ts +9 -0
  116. package/dist/lib/ev-stations/ev-stations.svelte.js +54 -32
  117. package/dist/lib/ev-stations/types.d.ts +53 -0
  118. package/dist/lib/ev-stations/types.js +1 -0
  119. package/dist/lib/ev-stations/zip-codes.d.ts +13 -0
  120. package/dist/lib/ev-stations/zip-codes.js +457 -135
  121. package/dist/lib/hms/components/HMSFireLegend.svelte +21 -0
  122. package/dist/lib/hms/components/HMSFireLegend.svelte.d.ts +18 -0
  123. package/dist/lib/hms/hms-fire-icon-manager.d.ts +5 -0
  124. package/dist/lib/hms/hms-fire-icon-manager.js +28 -37
  125. package/dist/lib/hms/hms-fire-map-integration.svelte.d.ts +23 -0
  126. package/dist/lib/hms/hms-fire-map-integration.svelte.js +94 -97
  127. package/dist/lib/hms/hms-smoke-map-integration.svelte.d.ts +19 -0
  128. package/dist/lib/hms/hms-smoke-map-integration.svelte.js +68 -84
  129. package/dist/lib/hms/hms.svelte.d.ts +19 -0
  130. package/dist/lib/hms/hms.svelte.js +225 -76
  131. package/dist/lib/index.d.ts +68 -0
  132. package/dist/lib/index.js +56 -21
  133. package/dist/lib/map/Map.svelte +13 -0
  134. package/dist/lib/map/Map.svelte.d.ts +8 -0
  135. package/dist/lib/map/MapStyleDisplayOptions.svelte +61 -0
  136. package/dist/lib/map/MapStyleDisplayOptions.svelte.d.ts +3 -0
  137. package/dist/lib/map/Menu.svelte +64 -0
  138. package/dist/lib/map/Menu.svelte.d.ts +5 -0
  139. package/dist/lib/map/icons.d.ts +7 -0
  140. package/dist/lib/map/icons.js +24 -22
  141. package/dist/lib/map/integrations/base-layer-seperator.d.ts +9 -0
  142. package/dist/lib/map/integrations/base-layer-seperator.js +11 -12
  143. package/dist/lib/map/integrations/click-manager.d.ts +14 -0
  144. package/dist/lib/map/integrations/click-manager.js +52 -33
  145. package/dist/lib/map/integrations/integrations-manager.d.ts +8 -0
  146. package/dist/lib/map/integrations/integrations-manager.js +20 -12
  147. package/dist/lib/map/integrations/map-display-option.svelte.d.ts +7 -0
  148. package/dist/lib/map/integrations/map-display-option.svelte.js +10 -18
  149. package/dist/lib/map/integrations/map-geojson-integration.svelte.d.ts +13 -0
  150. package/dist/lib/map/integrations/map-geojson-integration.svelte.js +21 -17
  151. package/dist/lib/map/integrations/map-icon-manager.d.ts +15 -0
  152. package/dist/lib/map/integrations/map-icon-manager.js +52 -46
  153. package/dist/lib/map/integrations/map-integration.svelte.d.ts +6 -0
  154. package/dist/lib/map/integrations/map-integration.svelte.js +2 -5
  155. package/dist/lib/map/integrations/map-layer-integration.svelte.d.ts +11 -0
  156. package/dist/lib/map/integrations/map-layer-integration.svelte.js +36 -23
  157. package/dist/lib/map/integrations/tooltip.svelte.d.ts +28 -0
  158. package/dist/lib/map/integrations/tooltip.svelte.js +120 -78
  159. package/dist/lib/map/integrations/types.d.ts +14 -0
  160. package/dist/lib/map/integrations/types.js +1 -0
  161. package/dist/lib/map/map.svelte.d.ts +14 -0
  162. package/dist/lib/map/map.svelte.js +48 -50
  163. package/dist/lib/map/utils.d.ts +7 -0
  164. package/dist/lib/map/utils.js +32 -29
  165. package/dist/lib/monitors/components/MonitorClusterTooltip.svelte +112 -0
  166. package/dist/lib/monitors/components/MonitorClusterTooltip.svelte.d.ts +7 -0
  167. package/dist/lib/monitors/components/MonitorMarkersLegend.svelte +41 -0
  168. package/dist/lib/monitors/components/MonitorMarkersLegend.svelte.d.ts +3 -0
  169. package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte +128 -0
  170. package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte.d.ts +6 -0
  171. package/dist/lib/monitors/components/MonitorTooltip.svelte +61 -0
  172. package/dist/lib/monitors/components/MonitorTooltip.svelte.d.ts +7 -0
  173. package/dist/lib/monitors/components/MonitorWidgetModal.svelte +100 -0
  174. package/dist/lib/monitors/components/MonitorWidgetModal.svelte.d.ts +6 -0
  175. package/dist/lib/monitors/components/MonitorsDisplayOptions.svelte +79 -0
  176. package/dist/lib/monitors/components/MonitorsDisplayOptions.svelte.d.ts +3 -0
  177. package/dist/lib/monitors/monitor-utils.d.ts +4 -0
  178. package/dist/lib/monitors/monitor-utils.js +33 -23
  179. package/dist/lib/monitors/monitors-cluster-renderer.d.ts +33 -0
  180. package/dist/lib/monitors/monitors-cluster-renderer.js +218 -209
  181. package/dist/lib/monitors/monitors-icon-manager.svelte.d.ts +13 -0
  182. package/dist/lib/monitors/monitors-icon-manager.svelte.js +75 -70
  183. package/dist/lib/monitors/monitors-map-integration.svelte.d.ts +40 -0
  184. package/dist/lib/monitors/monitors-map-integration.svelte.js +278 -270
  185. package/dist/lib/monitors/monitors.svelte.d.ts +16 -0
  186. package/dist/lib/monitors/monitors.svelte.js +38 -63
  187. package/dist/lib/monitors/types.d.ts +26 -0
  188. package/dist/lib/monitors/types.js +1 -0
  189. package/dist/lib/reactivity.svelte.d.ts +0 -0
  190. package/dist/lib/reactivity.svelte.js +83 -0
  191. package/dist/lib/router-context.d.ts +27 -0
  192. package/dist/lib/router-context.js +11 -11
  193. package/dist/lib/routes.d.ts +2 -0
  194. package/dist/lib/routes.js +10 -9
  195. package/dist/lib/search/Search.svelte +189 -0
  196. package/dist/lib/search/Search.svelte.d.ts +3 -0
  197. package/dist/lib/search/service.d.ts +17 -0
  198. package/dist/lib/search/service.js +75 -85
  199. package/dist/lib/utils.d.ts +13 -0
  200. package/dist/lib/utils.js +10 -12
  201. package/dist/lib/weather.d.ts +1 -0
  202. package/dist/lib/weather.js +11 -7
  203. package/dist/lib/wind/wind.svelte.d.ts +10 -0
  204. package/dist/lib/wind/wind.svelte.js +13 -21
  205. package/package.json +9 -7
  206. package/src/lib/LoadScreen.svelte +3 -3
  207. package/src/lib/hms/components/HMSFireLegend.svelte +1 -1
  208. package/src/lib/hms/hms.svelte.ts +8 -9
  209. package/src/lib/index.ts +18 -0
  210. package/src/lib/routes.ts +6 -1
  211. package/src/lib/utils.ts +1 -1
  212. package/dist/lib/LoadScreen.js +0 -73
  213. package/dist/lib/MainMapView.js +0 -7
  214. package/dist/lib/MapLegend.js +0 -13
  215. package/dist/lib/MonitorDetailPanel.js +0 -169
  216. package/dist/lib/MonitorMapLayout.js +0 -91
  217. package/dist/lib/_virtual/_rolldown/runtime.js +0 -11
  218. package/dist/lib/assets/logos/airgradient-blue.js +0 -4
  219. package/dist/lib/assets/logos/airnow-compact.js +0 -4
  220. package/dist/lib/assets/logos/carb-compact.js +0 -4
  221. package/dist/lib/assets/logos/purpleair-compact.js +0 -4
  222. package/dist/lib/assets/logos/sjvair.js +0 -4
  223. package/dist/lib/collocation-sites/CollocationTooltip.js +0 -105
  224. package/dist/lib/components/DataBox.js +0 -30
  225. package/dist/lib/components/DisplayOption.js +0 -10
  226. package/dist/lib/components/MapLayersDisplayOptions.js +0 -87
  227. package/dist/lib/components/SegmentedControl.js +0 -37
  228. package/dist/lib/components/ToggleSwitch.js +0 -17
  229. package/dist/lib/components/ui/button/button.js +0 -34
  230. package/dist/lib/components/ui/range-calendar/range-calendar-caption.js +0 -82
  231. package/dist/lib/components/ui/range-calendar/range-calendar-cell.js +0 -35
  232. package/dist/lib/components/ui/range-calendar/range-calendar-day.js +0 -35
  233. package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.js +0 -27
  234. package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.js +0 -27
  235. package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.js +0 -35
  236. package/dist/lib/components/ui/range-calendar/range-calendar-grid.js +0 -35
  237. package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.js +0 -35
  238. package/dist/lib/components/ui/range-calendar/range-calendar-header.js +0 -35
  239. package/dist/lib/components/ui/range-calendar/range-calendar-month-select.js +0 -61
  240. package/dist/lib/components/ui/range-calendar/range-calendar-month.js +0 -25
  241. package/dist/lib/components/ui/range-calendar/range-calendar-months.js +0 -25
  242. package/dist/lib/components/ui/range-calendar/range-calendar-nav.js +0 -25
  243. package/dist/lib/components/ui/range-calendar/range-calendar-next-button.js +0 -58
  244. package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.js +0 -58
  245. package/dist/lib/components/ui/range-calendar/range-calendar-year-select.js +0 -59
  246. package/dist/lib/components/ui/range-calendar/range-calendar.js +0 -272
  247. package/dist/lib/data-chart/DataChart.js +0 -142
  248. package/dist/lib/ev-stations/components/EvStationClusterTooltip.js +0 -16
  249. package/dist/lib/ev-stations/components/EvStationTooltip.js +0 -120
  250. package/dist/lib/ev-stations/components/EvStationsDisplayOptions.js +0 -41
  251. package/dist/lib/hms/components/HMSFireLegend.js +0 -35
  252. package/dist/lib/map/Map.js +0 -14
  253. package/dist/lib/map/MapStyleDisplayOptions.js +0 -43
  254. package/dist/lib/map/Menu.js +0 -44
  255. package/dist/lib/monitors/components/MonitorClusterTooltip.js +0 -83
  256. package/dist/lib/monitors/components/MonitorMarkersLegend.js +0 -35
  257. package/dist/lib/monitors/components/MonitorSubscriptionManager.js +0 -104
  258. package/dist/lib/monitors/components/MonitorTooltip.js +0 -59
  259. package/dist/lib/monitors/components/MonitorWidgetModal.js +0 -40
  260. package/dist/lib/monitors/components/MonitorsDisplayOptions.js +0 -76
  261. package/dist/lib/search/Search.js +0 -124
  262. package/dist/lib/sjvair-air.avif +0 -0
  263. package/dist/lib/sjvair-air.png +0 -0
  264. package/dist/lib/sjvair-air.webp +0 -0
  265. package/dist/lib/sjvair-air2.avif +0 -0
  266. package/dist/lib/sjvair-air2.png +0 -0
  267. package/dist/lib/sjvair-air2.webp +0 -0
  268. package/dist/lib/sjvair-icon.avif +0 -0
  269. package/dist/lib/sjvair-icon.png +0 -0
  270. package/dist/lib/sjvair-icon.webp +0 -0
  271. package/dist/lib/sjvair-icon2.avif +0 -0
  272. package/dist/lib/sjvair-icon2.png +0 -0
  273. package/dist/lib/sjvair-icon2.webp +0 -0
  274. package/dist/lib/sjvair-sjv.avif +0 -0
  275. package/dist/lib/sjvair-sjv.png +0 -0
  276. package/dist/lib/sjvair-sjv.webp +0 -0
  277. package/dist/lib/sjvair-sjv2.avif +0 -0
  278. package/dist/lib/sjvair-sjv2.png +0 -0
  279. package/dist/lib/sjvair-sjv2.webp +0 -0
@@ -1,81 +1,123 @@
1
- import { mapManager as e } from "../map.svelte.js";
2
- import "svelte/internal/client";
3
- import { XMap as t } from "@tstk/builtin-extensions";
4
- //#region src/lib/map/integrations/tooltip.svelte.ts
5
- function n() {
6
- a.activeHandle?.clearTooltip();
1
+ import { mapManager } from "../map.svelte";
2
+ import { XMap } from "@tstk/builtin-extensions";
3
+ function handleZoom() {
4
+ TooltipManager.activeHandle?.clearTooltip();
7
5
  }
8
- function r() {
9
- e.map.getCanvas().style.cursor = "pointer";
6
+ function setCursorPointer() {
7
+ mapManager.map.getCanvas().style.cursor = "pointer";
10
8
  }
11
- function i() {
12
- e.map.getCanvas().style.cursor = "";
9
+ function setCursorDefault() {
10
+ mapManager.map.getCanvas().style.cursor = "";
11
+ }
12
+ export class TooltipManager {
13
+ static activeHandle = null;
14
+ isEnabled = false;
15
+ _tooltips = new XMap();
16
+ get tooltips() {
17
+ return this._tooltips.values();
18
+ }
19
+ enable(layerId) {
20
+ if (!mapManager.map || this.isEnabled)
21
+ return;
22
+ mapManager.map.on("zoom", handleZoom);
23
+ this.forEachHandle(layerId, (h) => h.enable());
24
+ this.isEnabled = true;
25
+ }
26
+ disable(layerId) {
27
+ if (!mapManager.map || !this.isEnabled)
28
+ return;
29
+ mapManager.map.off("zoom", handleZoom);
30
+ this.forEachHandle(layerId, (h) => h.disable());
31
+ this.isEnabled = false;
32
+ }
33
+ get(layerId) {
34
+ return this._tooltips.get(layerId);
35
+ }
36
+ has(layerId) {
37
+ return this._tooltips.has(layerId);
38
+ }
39
+ register(layerId, builder, priority = 0) {
40
+ const tooltipHandle = new TooltipHandle(layerId, builder, priority);
41
+ this._tooltips.set(layerId, tooltipHandle);
42
+ return tooltipHandle;
43
+ }
44
+ with(layerId, cb) {
45
+ const ids = Array.isArray(layerId) ? layerId : [layerId];
46
+ for (const id of ids) {
47
+ const tooltip = this._tooltips.get(id);
48
+ if (tooltip)
49
+ cb(tooltip);
50
+ }
51
+ }
52
+ forEachHandle(layerId, cb) {
53
+ if (layerId !== undefined && this._tooltips.has(layerId)) {
54
+ cb(this._tooltips.get(layerId));
55
+ }
56
+ else {
57
+ for (const h of this.tooltips)
58
+ cb(h);
59
+ }
60
+ }
61
+ }
62
+ class TooltipHandle {
63
+ layerId;
64
+ priority;
65
+ tooltip = null;
66
+ activeFeatureId = undefined;
67
+ isEnabled = false;
68
+ clearTooltip = () => {
69
+ if (TooltipManager.activeHandle !== this)
70
+ return;
71
+ this.tooltip?.remove();
72
+ this.tooltip = null;
73
+ TooltipManager.activeHandle = null;
74
+ this.activeFeatureId = undefined;
75
+ };
76
+ setTooltip;
77
+ constructor(layerId, builder, priority = 0) {
78
+ this.layerId = layerId;
79
+ this.priority = priority;
80
+ this.setTooltip = (evt) => {
81
+ if (!mapManager.map || !evt.features)
82
+ return;
83
+ const featureId = evt.features[0]?.id;
84
+ const isOwner = TooltipManager.activeHandle === this;
85
+ const sameFeature = featureId === this.activeFeatureId;
86
+ if (isOwner && this.tooltip && sameFeature) {
87
+ this.tooltip.setLngLat(evt.lngLat);
88
+ return;
89
+ }
90
+ const activeHandle = TooltipManager.activeHandle;
91
+ if (activeHandle !== null && activeHandle !== this && activeHandle.priority >= this.priority)
92
+ return;
93
+ activeHandle?.clearTooltip();
94
+ this.activeFeatureId = undefined;
95
+ const tooltip = builder(evt);
96
+ if (tooltip) {
97
+ this.tooltip = tooltip;
98
+ TooltipManager.activeHandle = this;
99
+ this.activeFeatureId = featureId;
100
+ tooltip.addTo(mapManager.map);
101
+ }
102
+ };
103
+ }
104
+ enable() {
105
+ if (!mapManager.map || this.isEnabled)
106
+ return;
107
+ mapManager.map.on("mousemove", this.layerId, setCursorPointer);
108
+ mapManager.map.on("mouseleave", this.layerId, setCursorDefault);
109
+ mapManager.map.on("mousemove", this.layerId, this.setTooltip);
110
+ mapManager.map.on("mouseleave", this.layerId, this.clearTooltip);
111
+ this.isEnabled = true;
112
+ }
113
+ disable() {
114
+ if (!mapManager.map || !this.isEnabled)
115
+ return;
116
+ this.clearTooltip();
117
+ mapManager.map.off("mousemove", this.layerId, setCursorPointer);
118
+ mapManager.map.off("mouseleave", this.layerId, setCursorDefault);
119
+ mapManager.map.off("mousemove", this.layerId, this.setTooltip);
120
+ mapManager.map.off("mouseleave", this.layerId, this.clearTooltip);
121
+ this.isEnabled = false;
122
+ }
13
123
  }
14
- var a = class {
15
- static activeHandle = null;
16
- isEnabled = !1;
17
- _tooltips = new t();
18
- get tooltips() {
19
- return this._tooltips.values();
20
- }
21
- enable(t) {
22
- !e.map || this.isEnabled || (e.map.on("zoom", n), this.forEachHandle(t, (e) => e.enable()), this.isEnabled = !0);
23
- }
24
- disable(t) {
25
- !e.map || !this.isEnabled || (e.map.off("zoom", n), this.forEachHandle(t, (e) => e.disable()), this.isEnabled = !1);
26
- }
27
- get(e) {
28
- return this._tooltips.get(e);
29
- }
30
- has(e) {
31
- return this._tooltips.has(e);
32
- }
33
- register(e, t, n = 0) {
34
- let r = new o(e, t, n);
35
- return this._tooltips.set(e, r), r;
36
- }
37
- with(e, t) {
38
- let n = Array.isArray(e) ? e : [e];
39
- for (let e of n) {
40
- let n = this._tooltips.get(e);
41
- n && t(n);
42
- }
43
- }
44
- forEachHandle(e, t) {
45
- if (e !== void 0 && this._tooltips.has(e)) t(this._tooltips.get(e));
46
- else for (let e of this.tooltips) t(e);
47
- }
48
- }, o = class {
49
- layerId;
50
- priority;
51
- tooltip = null;
52
- activeFeatureId = void 0;
53
- isEnabled = !1;
54
- clearTooltip = () => {
55
- a.activeHandle === this && (this.tooltip?.remove(), this.tooltip = null, a.activeHandle = null, this.activeFeatureId = void 0);
56
- };
57
- setTooltip;
58
- constructor(t, n, r = 0) {
59
- this.layerId = t, this.priority = r, this.setTooltip = (t) => {
60
- if (!e.map || !t.features) return;
61
- let r = t.features[0]?.id, i = a.activeHandle === this, o = r === this.activeFeatureId;
62
- if (i && this.tooltip && o) {
63
- this.tooltip.setLngLat(t.lngLat);
64
- return;
65
- }
66
- let s = a.activeHandle;
67
- if (s !== null && s !== this && s.priority >= this.priority) return;
68
- s?.clearTooltip(), this.activeFeatureId = void 0;
69
- let c = n(t);
70
- c && (this.tooltip = c, a.activeHandle = this, this.activeFeatureId = r, c.addTo(e.map));
71
- };
72
- }
73
- enable() {
74
- !e.map || this.isEnabled || (e.map.on("mousemove", this.layerId, r), e.map.on("mouseleave", this.layerId, i), e.map.on("mousemove", this.layerId, this.setTooltip), e.map.on("mouseleave", this.layerId, this.clearTooltip), this.isEnabled = !0);
75
- }
76
- disable() {
77
- !e.map || !this.isEnabled || (this.clearTooltip(), e.map.off("mousemove", this.layerId, r), e.map.off("mouseleave", this.layerId, i), e.map.off("mousemove", this.layerId, this.setTooltip), e.map.off("mouseleave", this.layerId, this.clearTooltip), this.isEnabled = !1);
78
- }
79
- };
80
- //#endregion
81
- export { a as TooltipManager };
@@ -0,0 +1,14 @@
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 {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
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
+ setDataSource(sourceId: string, features: Array<Feature<Geometry, GeoJsonProperties>>): void;
8
+ refreshMap(): void;
9
+ removeExcludedLayers(): void;
10
+ removeMap(): void;
11
+ }
12
+ export declare const mapManager: MapManager;
13
+ export type { MapManager };
14
+ export declare const initializeMap: Attachment<HTMLDivElement>;
@@ -1,51 +1,49 @@
1
- import { isGeoJSONSource as e } from "./utils.js";
2
- import * as t from "svelte/internal/client";
3
- import { Map as n, MapStyle as r, config as i } from "@maptiler/sdk";
4
- //#region src/lib/map/map.svelte.ts
5
- i.apiKey = "1ZwL7YJSSN42A678HHPn";
6
- var a = r.STREETS_V4.DEFAULT, o = [
7
- "Sport",
8
- "Tourism",
9
- "Culture",
10
- "Shopping",
11
- "Food",
12
- "Transport"
13
- ], s = new class {
14
- #e = t.state(null);
15
- get map() {
16
- return t.get(this.#e);
17
- }
18
- set map(e) {
19
- t.set(this.#e, e, !0);
20
- }
21
- setDataSource(t, n) {
22
- let r = s.map?.getSource(t);
23
- e(r) && r.setData({
24
- type: "FeatureCollection",
25
- features: n
26
- });
27
- }
28
- refreshMap() {
29
- s.map && this.removeExcludedLayers();
30
- }
31
- removeExcludedLayers() {
32
- for (let e of o) s.map?.getLayer(e) && s.map.removeLayer(e);
33
- }
34
- removeMap() {
35
- return s.map?.remove();
36
- }
37
- }(), c = (e) => {
38
- let t = new n({
39
- container: e,
40
- center: [-119.7987626619462, 36.76272050981146],
41
- zoom: 7,
42
- style: a,
43
- projection: "globe",
44
- space: { preset: "milkyway" }
45
- });
46
- return t.once("idle", () => {
47
- s.map = t;
48
- }), () => t.remove();
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
+ setDataSource(sourceId, features) {
9
+ const source = mapManager.map?.getSource(sourceId);
10
+ if (isGeoJSONSource(source)) {
11
+ source.setData({
12
+ type: "FeatureCollection",
13
+ features
14
+ });
15
+ }
16
+ }
17
+ refreshMap() {
18
+ if (mapManager.map) {
19
+ this.removeExcludedLayers();
20
+ }
21
+ }
22
+ removeExcludedLayers() {
23
+ for (const toExclude of excludeLayers) {
24
+ if (mapManager.map?.getLayer(toExclude)) {
25
+ mapManager.map.removeLayer(toExclude);
26
+ }
27
+ }
28
+ }
29
+ removeMap() {
30
+ return mapManager.map?.remove();
31
+ }
32
+ }
33
+ export const mapManager = new MapManager();
34
+ export const initializeMap = (container) => {
35
+ const map = new MaptilerMap({
36
+ container: container,
37
+ center: [-119.7987626619462, 36.76272050981146],
38
+ zoom: 7,
39
+ style: DefaultMapStyle,
40
+ projection: "globe",
41
+ space: {
42
+ preset: "milkyway"
43
+ }
44
+ });
45
+ map.once("idle", () => {
46
+ mapManager.map = map;
47
+ });
48
+ return () => map.remove();
49
49
  };
50
- //#endregion
51
- export { a as DefaultMapStyle, c as initializeMap, s as mapManager };
@@ -0,0 +1,7 @@
1
+ import type { Component } from "svelte";
2
+ import { Popup } from "@maptiler/sdk";
3
+ import type { ReferenceMapStyle, GeoJSONSource, LngLat } from "@maptiler/sdk";
4
+ export declare const MAP_STYLE_OPTIONS: ReferenceMapStyle[];
5
+ export declare function isGeoJSONSource(source: unknown): source is GeoJSONSource;
6
+ export declare function mountPopup<P extends Record<string, unknown>>(component: Component<P>, props: P, lngLat: LngLat, closeButton?: boolean): Popup;
7
+ export declare function mountClickPopup<P extends Record<string, unknown>>(component: Component<P>, props: P, lngLat: LngLat): Popup;
@@ -1,33 +1,36 @@
1
- import { mount as e, unmount as t } from "svelte";
2
- import { MapStyle as n, Popup as r } from "@maptiler/sdk";
3
- //#region src/lib/map/utils.ts
4
- var i = (() => {
5
- let e = /* @__PURE__ */ new Map();
6
- for (let t of Object.values(n)) {
7
- let n = t.getId(), r = n.match(/^(.+?)_V(\d+)$/i), i = r ? r[1] : n, a = r ? parseInt(r[2], 10) : 0, o = e.get(i);
8
- (!o || a > o.version) && e.set(i, {
9
- version: a,
10
- style: t
11
- });
12
- }
13
- return Array.from(e.values()).map((e) => e.style).sort((e, t) => e.getName().localeCompare(t.getName()));
1
+ import { mount, unmount } from "svelte";
2
+ import { MapStyle, Popup } from "@maptiler/sdk";
3
+ export const MAP_STYLE_OPTIONS = (() => {
4
+ const latest = new Map();
5
+ for (const style of Object.values(MapStyle)) {
6
+ const id = style.getId();
7
+ const match = id.match(/^(.+?)_V(\d+)$/i);
8
+ const baseName = match ? match[1] : id;
9
+ const version = match ? parseInt(match[2], 10) : 0;
10
+ const existing = latest.get(baseName);
11
+ if (!existing || version > existing.version) {
12
+ latest.set(baseName, { version, style });
13
+ }
14
+ }
15
+ return Array.from(latest.values())
16
+ .map((e) => e.style)
17
+ .sort((a, b) => a.getName().localeCompare(b.getName()));
14
18
  })();
15
- function a(e) {
16
- return typeof e == "object" && !!e && "type" in e && e.type === "geojson";
19
+ export function isGeoJSONSource(source) {
20
+ return (typeof source === "object" &&
21
+ source !== null &&
22
+ "type" in source &&
23
+ source.type === "geojson");
17
24
  }
18
- function o(n, i, a, o = !1) {
19
- let s = document.createElement("div"), c = e(n, {
20
- target: s,
21
- props: i
22
- }), l = new r({
23
- closeButton: o,
24
- closeOnClick: !1,
25
- maxWidth: "none"
26
- }).setLngLat(a).setDOMContent(s);
27
- return l.on("close", () => t(c)), l;
25
+ export function mountPopup(component, props, lngLat, closeButton = false) {
26
+ const container = document.createElement("div");
27
+ const instance = mount(component, { target: container, props });
28
+ const popup = new Popup({ closeButton, closeOnClick: false, maxWidth: "none" })
29
+ .setLngLat(lngLat)
30
+ .setDOMContent(container);
31
+ popup.on("close", () => unmount(instance));
32
+ return popup;
28
33
  }
29
- function s(e, t, n) {
30
- return o(e, t, n, !0);
34
+ export function mountClickPopup(component, props, lngLat) {
35
+ return mountPopup(component, props, lngLat, true);
31
36
  }
32
- //#endregion
33
- export { i as MAP_STYLE_OPTIONS, a as isGeoJSONSource, s as mountClickPopup, o as mountPopup };
@@ -0,0 +1,112 @@
1
+ <script lang="ts">
2
+ import type { Geometry } from "geojson";
3
+ import { GeoJSONSource } from "@maptiler/sdk";
4
+ import type { SJVAirEntryLevel } from "@sjvair/sdk";
5
+ import type { ComponentProps } from "svelte";
6
+ import { area } from "@turf/area";
7
+ import { convertArea } from "@turf/helpers";
8
+ import DataBox from "../../components/DataBox.svelte";
9
+ import { mapManager } from "../../map/map.svelte";
10
+ import type { MonitorClusterMapFeature, MonitorMapFeature } from "../types";
11
+ import { monitorsManager } from "../monitors.svelte";
12
+ import { getCurrentLevel } from "../monitor-utils";
13
+
14
+ interface MonitorClusterTooltipProps {
15
+ feature: MonitorClusterMapFeature;
16
+ }
17
+
18
+ interface MonitorClusterTooltipData extends ComponentProps<typeof DataBox> {
19
+ clusterType: string;
20
+ count: number;
21
+ coverage?: string;
22
+ max: number;
23
+ min: number;
24
+ }
25
+
26
+ const { feature }: MonitorClusterTooltipProps = $props();
27
+
28
+ let data: MonitorClusterTooltipData | undefined = $state();
29
+
30
+ $effect(() => {
31
+ const source = mapManager.map!.getSource(feature.source)! as GeoJSONSource;
32
+ const latest = monitorsManager.latest;
33
+ const meta = monitorsManager.meta;
34
+
35
+ source
36
+ .getClusterLeaves(feature.properties.cluster_id, feature.properties.point_count, 0)
37
+ .then((features) => {
38
+ //const monitor = monitorsManager.latest?.get(feature.properties.id);
39
+
40
+ if (!features.length || !meta || !latest) return;
41
+ const monitors = (features as Array<MonitorMapFeature>).map((f) =>
42
+ latest?.get(f.properties.id)
43
+ );
44
+
45
+ const firstMonitor = monitors[0];
46
+ if (!firstMonitor) return;
47
+
48
+ const entryType = meta.entryType(firstMonitor.latest.entry_type);
49
+ const monitorType = meta.monitorType(firstMonitor.type);
50
+
51
+ const coords = monitors.map((m) => m!.position!.coordinates);
52
+ const values = monitors.map((m) => parseFloat(m?.latest.value ?? "0"));
53
+
54
+ const avg = Math.round(values.reduce((sum, value) => sum + value, 0) / monitors.length);
55
+
56
+ const level: SJVAirEntryLevel | undefined = getCurrentLevel(avg, entryType.asIter.levels!);
57
+
58
+ data = {
59
+ color: level?.color || "#d3d3d3",
60
+ count: feature.properties.point_count,
61
+ coverage: calculateArea(coords),
62
+ header: entryType.label,
63
+ clusterType: `${firstMonitor.is_sjvair ? "SJVAir " : ""}${monitorType.label} Monitors`,
64
+ subheading: "(cluster avg)",
65
+ max: values.reduce((prev, current) => (prev > current ? prev : current)),
66
+ min: values.reduce((prev, current) => (prev < current ? prev : current)),
67
+ value: avg.toString()
68
+ };
69
+ });
70
+
71
+ function calculateArea(coords: Array<Array<number>>) {
72
+ // TODO: update to handle lines as well as area (only 2 in cluster)
73
+ if (coords.length === 3) {
74
+ coords.push(coords[0]);
75
+ }
76
+
77
+ const coverage = area({
78
+ type: "Feature",
79
+ geometry: {
80
+ type: "Polygon",
81
+ coordinates: [coords]
82
+ }
83
+ } as unknown as Geometry);
84
+
85
+ return coverage > 0 ? convertArea(coverage, "meters", "miles").toFixed(3) : undefined;
86
+ }
87
+ });
88
+ </script>
89
+
90
+ {#if data}
91
+ <div class="flex gap-2">
92
+ <DataBox
93
+ color={data.color}
94
+ header={data.header}
95
+ subheading={data.subheading}
96
+ value={data.value}
97
+ />
98
+ <div class="flex flex-col">
99
+ <h1 class="text-lg font-bold">{data.clusterType}</h1>
100
+ <p>
101
+ {data.count} monitors
102
+ {#if data.coverage}
103
+ <span>covering {data.coverage}mi²</span>
104
+ {/if}
105
+ </p>
106
+ <div class="mt-auto">
107
+ <p class="text-base">Max: {data.max}µg/m³</p>
108
+ <p class="text-base leading-none">Min: {data.min}µg/m³</p>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ {/if}
@@ -0,0 +1,7 @@
1
+ import type { MonitorClusterMapFeature } from "../types";
2
+ interface MonitorClusterTooltipProps {
3
+ feature: MonitorClusterMapFeature;
4
+ }
5
+ declare const MonitorClusterTooltip: import("svelte").Component<MonitorClusterTooltipProps, {}, "">;
6
+ type MonitorClusterTooltip = ReturnType<typeof MonitorClusterTooltip>;
7
+ export default MonitorClusterTooltip;
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import { monitorsManager } from "../monitors.svelte.ts";
3
+
4
+ const label = $derived(monitorsManager.pollutant === "pm25" ? "PM 2.5" : "Ozone");
5
+ const values = $derived(
6
+ monitorsManager.pollutant === "pm25" ? [12, 35, 55, 150, 250] : [55, 71, 86, 106, 201]
7
+ );
8
+ </script>
9
+
10
+ <div class="min-w-50 flex flex-col bg-white rounded shadow py-[0.5em] px-[1.5em]">
11
+ <p class="text-center whitespace-nowrap font-semibold">
12
+ {label} Concentration
13
+ </p>
14
+ <div class="map-legend-bar inline-block h-[1.5em]">&nbsp;</div>
15
+ <div class="flex mb-[1.5em]">
16
+ <div class="w-1/5 shrink-0 h-[0.5em] border-l border-black">
17
+ <span class="relative top-[0.5em] right-[0.3em]">0</span>
18
+ </div>
19
+ {#each values as value, idx (idx)}
20
+ <div class="w-1/5 shrink-0 h-[0.5em] border-l border-black last:relative last:right-px">
21
+ <span class="relative top-[0.5em] {idx >= 3 ? 'right-[0.8em]' : 'right-[0.5em]'}"
22
+ >{value}</span
23
+ >
24
+ </div>
25
+ {/each}
26
+ </div>
27
+ </div>
28
+
29
+ <style>
30
+ .map-legend-bar {
31
+ background: linear-gradient(
32
+ 90deg,
33
+ #00e400 0%,
34
+ #ffff00 20%,
35
+ #ff7e00 40%,
36
+ #ff0000 60%,
37
+ #8f3f97 80%,
38
+ #7e0023 100%
39
+ );
40
+ }
41
+ </style>
@@ -0,0 +1,3 @@
1
+ declare const MonitorMarkersLegend: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type MonitorMarkersLegend = ReturnType<typeof MonitorMarkersLegend>;
3
+ export default MonitorMarkersLegend;