@sjvair/monitor-map 4.3.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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -138
  3. package/dist/lib/MonitorDetailPanel.svelte +23 -20
  4. package/dist/lib/MonitorMapLayout.svelte +147 -77
  5. package/dist/lib/components/DataBox.svelte +4 -1
  6. package/dist/lib/components/ui/range-calendar/range-calendar.svelte.d.ts +1 -1
  7. package/dist/lib/config.svelte.d.ts +7 -0
  8. package/dist/lib/config.svelte.js +10 -0
  9. package/dist/lib/core.d.ts +2 -2
  10. package/dist/lib/core.js +2 -1
  11. package/dist/lib/data-chart/DataChart.svelte +40 -25
  12. package/dist/lib/data-chart/DateRange.d.ts +13 -4
  13. package/dist/lib/data-chart/DateRange.js +50 -14
  14. package/dist/lib/data-chart/chart-utils.js +5 -7
  15. package/dist/lib/data-chart/level-colors.d.ts +3 -4
  16. package/dist/lib/data-chart/level-colors.js +7 -4
  17. package/dist/lib/data-chart/pacific-time.d.ts +9 -0
  18. package/dist/lib/data-chart/pacific-time.js +25 -0
  19. package/dist/lib/data-chart/tooltip.js +2 -2
  20. package/{src/lib/ev-stations/components/EvStationTooltip.svelte → dist/lib/ev-stations/EvPopup.svelte} +6 -5
  21. package/dist/lib/ev-stations/EvPopup.svelte.d.ts +7 -0
  22. package/dist/lib/ev-stations/ev-plugin.svelte.d.ts +14 -0
  23. package/dist/lib/ev-stations/ev-plugin.svelte.js +71 -0
  24. package/dist/lib/ev-stations/ev-station-icons.d.ts +1 -4
  25. package/dist/lib/ev-stations/ev-station-icons.js +1 -13
  26. package/dist/lib/ev-stations/ev-stations.d.ts +7 -0
  27. package/dist/lib/ev-stations/ev-stations.js +53 -0
  28. package/dist/lib/ev-stations/ev-store.svelte.d.ts +21 -0
  29. package/dist/lib/ev-stations/ev-store.svelte.js +83 -0
  30. package/dist/lib/ev-stations/station-popup.svelte.d.ts +14 -0
  31. package/dist/lib/ev-stations/station-popup.svelte.js +54 -0
  32. package/dist/lib/ev-stations/types.d.ts +0 -29
  33. package/dist/lib/ev-stations/zip-codes.d.ts +11 -0
  34. package/dist/lib/ev-stations/zip-codes.js +28 -16
  35. package/dist/lib/index.d.ts +8 -56
  36. package/dist/lib/index.js +7 -46
  37. package/dist/lib/legend/Legend.svelte +18 -19
  38. package/dist/lib/legend/Legend.svelte.d.ts +2 -2
  39. package/dist/lib/levels.d.ts +7 -0
  40. package/dist/lib/levels.js +19 -0
  41. package/dist/lib/map/MapShell.svelte +17 -24
  42. package/dist/lib/map/MapShell.svelte.d.ts +4 -4
  43. package/dist/lib/map/basemaps.d.ts +25 -0
  44. package/dist/lib/map/basemaps.js +66 -0
  45. package/dist/lib/map/live-map.svelte.d.ts +3 -0
  46. package/dist/lib/map/live-map.svelte.js +22 -0
  47. package/dist/lib/map/sync-plugins.svelte.d.ts +19 -0
  48. package/dist/lib/map/sync-plugins.svelte.js +52 -0
  49. package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte +66 -61
  50. package/dist/lib/monitors/filtered-source.svelte.d.ts +9 -0
  51. package/dist/lib/monitors/filtered-source.svelte.js +28 -0
  52. package/dist/lib/monitors/monitors.svelte.d.ts +25 -35
  53. package/dist/lib/monitors/monitors.svelte.js +35 -218
  54. package/dist/lib/monitors/retry-load.d.ts +8 -0
  55. package/dist/lib/monitors/retry-load.js +11 -0
  56. package/dist/lib/monitors/types.d.ts +1 -41
  57. package/dist/lib/options/map-option-defaults.d.ts +25 -36
  58. package/dist/lib/options/map-option-defaults.js +12 -30
  59. package/dist/lib/options/map-options.svelte.d.ts +13 -0
  60. package/dist/lib/options/map-options.svelte.js +26 -0
  61. package/dist/lib/options/menus/LayersMenu.svelte +8 -20
  62. package/dist/lib/options/menus/LayersMenu.svelte.d.ts +17 -2
  63. package/dist/lib/options/menus/MonitorsMenu.svelte +34 -18
  64. package/dist/lib/options/menus/OverlaysMenu.svelte +2 -2
  65. package/dist/lib/options/menus/PollutantMenu.svelte +4 -9
  66. package/dist/lib/options/menus/SettingsMenu.svelte +32 -25
  67. package/dist/lib/options/menus/SettingsMenu.svelte.d.ts +5 -16
  68. package/dist/lib/options/plugin-order.d.ts +8 -0
  69. package/dist/lib/options/plugin-order.js +36 -0
  70. package/dist/lib/options/pollutant-param.d.ts +7 -5
  71. package/dist/lib/options/pollutant-param.js +9 -5
  72. package/dist/lib/options/row-icons.d.ts +8 -0
  73. package/dist/lib/options/row-icons.js +15 -0
  74. package/dist/lib/options/rows/MarkerIcon.svelte +5 -5
  75. package/dist/lib/options/rows/MarkerIcon.svelte.d.ts +1 -2
  76. package/dist/lib/search/Search.svelte +20 -33
  77. package/dist/lib/search/Search.svelte.d.ts +5 -1
  78. package/dist/lib/search/search-pin.svelte.d.ts +11 -0
  79. package/dist/lib/search/search-pin.svelte.js +28 -0
  80. package/dist/lib/search/service.d.ts +7 -2
  81. package/dist/lib/search/service.js +17 -10
  82. package/dist/lib/stores.svelte.d.ts +8 -0
  83. package/dist/lib/stores.svelte.js +9 -0
  84. package/dist/lib/wind/wind-plugin.d.ts +11 -0
  85. package/dist/lib/wind/wind-plugin.js +25 -0
  86. package/package.json +12 -10
  87. package/src/lib/MonitorDetailPanel.svelte +23 -20
  88. package/src/lib/MonitorMapLayout.svelte +147 -77
  89. package/src/lib/components/DataBox.svelte +4 -1
  90. package/src/lib/config.svelte.ts +16 -0
  91. package/src/lib/core.ts +2 -2
  92. package/src/lib/data-chart/DataChart.svelte +40 -25
  93. package/src/lib/data-chart/DateRange.ts +58 -15
  94. package/src/lib/data-chart/chart-utils.ts +6 -7
  95. package/src/lib/data-chart/level-colors.ts +8 -9
  96. package/src/lib/data-chart/pacific-time.ts +31 -0
  97. package/src/lib/data-chart/tooltip.ts +2 -2
  98. package/{dist/lib/ev-stations/components/EvStationTooltip.svelte → src/lib/ev-stations/EvPopup.svelte} +6 -5
  99. package/src/lib/ev-stations/ev-plugin.svelte.ts +86 -0
  100. package/src/lib/ev-stations/ev-station-icons.ts +1 -17
  101. package/src/lib/ev-stations/ev-stations.ts +72 -0
  102. package/src/lib/ev-stations/ev-store.svelte.ts +117 -0
  103. package/src/lib/ev-stations/station-popup.svelte.ts +64 -0
  104. package/src/lib/ev-stations/types.ts +0 -34
  105. package/src/lib/ev-stations/zip-codes.ts +29 -16
  106. package/src/lib/index.ts +8 -99
  107. package/src/lib/legend/Legend.svelte +18 -19
  108. package/src/lib/levels.ts +24 -0
  109. package/src/lib/map/MapShell.svelte +17 -24
  110. package/src/lib/map/basemaps.ts +76 -0
  111. package/src/lib/map/live-map.svelte.ts +24 -0
  112. package/src/lib/map/sync-plugins.svelte.ts +69 -0
  113. package/src/lib/monitors/components/MonitorSubscriptionManager.svelte +66 -61
  114. package/src/lib/monitors/filtered-source.svelte.ts +38 -0
  115. package/src/lib/monitors/monitors.svelte.ts +58 -261
  116. package/src/lib/monitors/retry-load.ts +14 -0
  117. package/src/lib/monitors/types.ts +1 -47
  118. package/src/lib/options/map-option-defaults.ts +30 -53
  119. package/src/lib/options/map-options.svelte.ts +30 -0
  120. package/src/lib/options/menus/LayersMenu.svelte +8 -20
  121. package/src/lib/options/menus/MonitorsMenu.svelte +34 -18
  122. package/src/lib/options/menus/OverlaysMenu.svelte +2 -2
  123. package/src/lib/options/menus/PollutantMenu.svelte +4 -9
  124. package/src/lib/options/menus/SettingsMenu.svelte +32 -25
  125. package/src/lib/options/plugin-order.ts +38 -0
  126. package/src/lib/options/pollutant-param.ts +14 -9
  127. package/src/lib/options/row-icons.ts +17 -0
  128. package/src/lib/options/rows/MarkerIcon.svelte +5 -5
  129. package/src/lib/search/Search.svelte +20 -33
  130. package/src/lib/search/search-pin.svelte.ts +35 -0
  131. package/src/lib/search/service.ts +34 -15
  132. package/src/lib/stores.svelte.ts +15 -0
  133. package/src/lib/wind/wind-plugin.ts +33 -0
  134. package/dist/lib/collocation-sites/CollocationTooltip.svelte +0 -98
  135. package/dist/lib/collocation-sites/CollocationTooltip.svelte.d.ts +0 -7
  136. package/dist/lib/collocation-sites/collocations-icon-manager.svelte.d.ts +0 -7
  137. package/dist/lib/collocation-sites/collocations-icon-manager.svelte.js +0 -18
  138. package/dist/lib/collocation-sites/collocations-map-integration.svelte.d.ts +0 -21
  139. package/dist/lib/collocation-sites/collocations-map-integration.svelte.js +0 -113
  140. package/dist/lib/collocation-sites/collocations.svelte.d.ts +0 -10
  141. package/dist/lib/collocation-sites/collocations.svelte.js +0 -21
  142. package/dist/lib/collocation-sites/types.d.ts +0 -8
  143. package/dist/lib/collocation-sites/types.js +0 -1
  144. package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte +0 -16
  145. package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte.d.ts +0 -7
  146. package/dist/lib/ev-stations/components/EvStationTooltip.svelte.d.ts +0 -7
  147. package/dist/lib/ev-stations/ev-stations-cluster-renderer.d.ts +0 -19
  148. package/dist/lib/ev-stations/ev-stations-cluster-renderer.js +0 -131
  149. package/dist/lib/ev-stations/ev-stations-map-integration.svelte.d.ts +0 -31
  150. package/dist/lib/ev-stations/ev-stations-map-integration.svelte.js +0 -226
  151. package/dist/lib/ev-stations/ev-stations.svelte.d.ts +0 -10
  152. package/dist/lib/ev-stations/ev-stations.svelte.js +0 -57
  153. package/dist/lib/hms/hms-fire-icon-manager.d.ts +0 -13
  154. package/dist/lib/hms/hms-fire-icon-manager.js +0 -39
  155. package/dist/lib/hms/hms-fire-map-integration.svelte.d.ts +0 -23
  156. package/dist/lib/hms/hms-fire-map-integration.svelte.js +0 -94
  157. package/dist/lib/hms/hms-smoke-map-integration.svelte.d.ts +0 -39
  158. package/dist/lib/hms/hms-smoke-map-integration.svelte.js +0 -87
  159. package/dist/lib/hms/hms.svelte.d.ts +0 -20
  160. package/dist/lib/hms/hms.svelte.js +0 -237
  161. package/dist/lib/legend/LegendBar.svelte +0 -45
  162. package/dist/lib/legend/LegendBar.svelte.d.ts +0 -7
  163. package/dist/lib/legend/legend-data.d.ts +0 -40
  164. package/dist/lib/legend/legend-data.js +0 -65
  165. package/dist/lib/map/Map.svelte +0 -13
  166. package/dist/lib/map/Map.svelte.d.ts +0 -8
  167. package/dist/lib/map/basemap.d.ts +0 -14
  168. package/dist/lib/map/basemap.js +0 -10
  169. package/dist/lib/map/icons.d.ts +0 -7
  170. package/dist/lib/map/icons.js +0 -33
  171. package/dist/lib/map/integrations/base-layer-seperator.d.ts +0 -9
  172. package/dist/lib/map/integrations/base-layer-seperator.js +0 -11
  173. package/dist/lib/map/integrations/click-manager.d.ts +0 -14
  174. package/dist/lib/map/integrations/click-manager.js +0 -52
  175. package/dist/lib/map/integrations/integrations-manager.d.ts +0 -8
  176. package/dist/lib/map/integrations/integrations-manager.js +0 -20
  177. package/dist/lib/map/integrations/map-display-option.svelte.d.ts +0 -7
  178. package/dist/lib/map/integrations/map-display-option.svelte.js +0 -10
  179. package/dist/lib/map/integrations/map-geojson-integration.svelte.d.ts +0 -32
  180. package/dist/lib/map/integrations/map-geojson-integration.svelte.js +0 -60
  181. package/dist/lib/map/integrations/map-icon-manager.d.ts +0 -15
  182. package/dist/lib/map/integrations/map-icon-manager.js +0 -52
  183. package/dist/lib/map/integrations/map-integration.svelte.d.ts +0 -6
  184. package/dist/lib/map/integrations/map-integration.svelte.js +0 -2
  185. package/dist/lib/map/integrations/map-layer-integration.svelte.d.ts +0 -11
  186. package/dist/lib/map/integrations/map-layer-integration.svelte.js +0 -40
  187. package/dist/lib/map/integrations/tooltip.svelte.d.ts +0 -36
  188. package/dist/lib/map/integrations/tooltip.svelte.js +0 -131
  189. package/dist/lib/map/integrations/types.d.ts +0 -14
  190. package/dist/lib/map/integrations/types.js +0 -1
  191. package/dist/lib/map/map-manager.svelte.d.ts +0 -20
  192. package/dist/lib/map/map-manager.svelte.js +0 -63
  193. package/dist/lib/map/map-style-state.svelte.d.ts +0 -23
  194. package/dist/lib/map/map-style-state.svelte.js +0 -86
  195. package/dist/lib/map/utils.d.ts +0 -7
  196. package/dist/lib/map/utils.js +0 -36
  197. package/dist/lib/monitors/components/MonitorClusterTooltip.svelte +0 -112
  198. package/dist/lib/monitors/components/MonitorClusterTooltip.svelte.d.ts +0 -7
  199. package/dist/lib/monitors/components/MonitorTooltip.svelte +0 -61
  200. package/dist/lib/monitors/components/MonitorTooltip.svelte.d.ts +0 -7
  201. package/dist/lib/monitors/monitor-utils.d.ts +0 -4
  202. package/dist/lib/monitors/monitor-utils.js +0 -41
  203. package/dist/lib/monitors/monitors-cluster-renderer.d.ts +0 -33
  204. package/dist/lib/monitors/monitors-cluster-renderer.js +0 -221
  205. package/dist/lib/monitors/monitors-icon-manager.svelte.d.ts +0 -15
  206. package/dist/lib/monitors/monitors-icon-manager.svelte.js +0 -78
  207. package/dist/lib/monitors/monitors-map-integration.svelte.d.ts +0 -43
  208. package/dist/lib/monitors/monitors-map-integration.svelte.js +0 -301
  209. package/dist/lib/options/reset-map-options.d.ts +0 -2
  210. package/dist/lib/options/reset-map-options.js +0 -24
  211. package/dist/lib/reactivity.svelte.d.ts +0 -0
  212. package/dist/lib/reactivity.svelte.js +0 -83
  213. package/dist/lib/wind/wind.svelte.d.ts +0 -10
  214. package/dist/lib/wind/wind.svelte.js +0 -13
  215. package/src/lib/collocation-sites/CollocationTooltip.svelte +0 -98
  216. package/src/lib/collocation-sites/collocations-icon-manager.svelte.ts +0 -21
  217. package/src/lib/collocation-sites/collocations-map-integration.svelte.ts +0 -136
  218. package/src/lib/collocation-sites/collocations.svelte.ts +0 -27
  219. package/src/lib/collocation-sites/types.ts +0 -10
  220. package/src/lib/ev-stations/components/EvStationClusterTooltip.svelte +0 -16
  221. package/src/lib/ev-stations/ev-stations-cluster-renderer.ts +0 -162
  222. package/src/lib/ev-stations/ev-stations-map-integration.svelte.ts +0 -248
  223. package/src/lib/ev-stations/ev-stations.svelte.ts +0 -84
  224. package/src/lib/hms/hms-fire-icon-manager.ts +0 -48
  225. package/src/lib/hms/hms-fire-map-integration.svelte.ts +0 -109
  226. package/src/lib/hms/hms-smoke-map-integration.svelte.ts +0 -105
  227. package/src/lib/hms/hms.svelte.ts +0 -270
  228. package/src/lib/legend/LegendBar.svelte +0 -45
  229. package/src/lib/legend/legend-data.ts +0 -101
  230. package/src/lib/map/Map.svelte +0 -13
  231. package/src/lib/map/basemap.ts +0 -24
  232. package/src/lib/map/icons.ts +0 -42
  233. package/src/lib/map/integrations/base-layer-seperator.ts +0 -17
  234. package/src/lib/map/integrations/click-manager.ts +0 -64
  235. package/src/lib/map/integrations/integrations-manager.ts +0 -25
  236. package/src/lib/map/integrations/map-display-option.svelte.ts +0 -13
  237. package/src/lib/map/integrations/map-geojson-integration.svelte.ts +0 -77
  238. package/src/lib/map/integrations/map-icon-manager.ts +0 -67
  239. package/src/lib/map/integrations/map-integration.svelte.ts +0 -8
  240. package/src/lib/map/integrations/map-layer-integration.svelte.ts +0 -49
  241. package/src/lib/map/integrations/tooltip.svelte.ts +0 -153
  242. package/src/lib/map/integrations/types.ts +0 -24
  243. package/src/lib/map/map-manager.svelte.ts +0 -83
  244. package/src/lib/map/map-style-state.svelte.ts +0 -94
  245. package/src/lib/map/utils.ts +0 -53
  246. package/src/lib/monitors/components/MonitorClusterTooltip.svelte +0 -112
  247. package/src/lib/monitors/components/MonitorTooltip.svelte +0 -61
  248. package/src/lib/monitors/monitor-utils.ts +0 -57
  249. package/src/lib/monitors/monitors-cluster-renderer.ts +0 -285
  250. package/src/lib/monitors/monitors-icon-manager.svelte.ts +0 -98
  251. package/src/lib/monitors/monitors-map-integration.svelte.ts +0 -318
  252. package/src/lib/options/reset-map-options.ts +0 -28
  253. package/src/lib/reactivity.svelte.ts +0 -82
  254. package/src/lib/wind/wind.svelte.ts +0 -20
@@ -1,98 +0,0 @@
1
- <script lang="ts">
2
- import { format, formatDistanceToNow } from "date-fns";
3
- import DataBox from "../components/DataBox.svelte";
4
- import type { CollocationSiteMapFeature } from "./types";
5
- import { monitorsManager } from "../monitors/monitors.svelte";
6
- import { getCurrentLevel } from "../monitors/monitor-utils";
7
- import type { MonitorLatest, SJVAirEntryLevel } from "@sjvair/sdk";
8
-
9
- interface CollocationTooltipProps {
10
- feature: CollocationSiteMapFeature;
11
- }
12
-
13
- const { feature }: CollocationTooltipProps = $props();
14
-
15
- const data = $derived.by(() => {
16
- const collocated = monitorsManager.latest?.get(feature.properties.colocated_id);
17
- const reference = monitorsManager.latest?.get(feature.properties.reference_id);
18
-
19
- return {
20
- collocated: getMonitorData(collocated),
21
- reference: getMonitorData(reference)
22
- };
23
- });
24
-
25
- function getMonitorData(monitor: MonitorLatest | undefined) {
26
- if (!monitor || !("value" in monitor.latest) || !monitorsManager.meta) return;
27
-
28
- const entryType = monitorsManager.meta.entryType(monitor.latest.entry_type);
29
- const level: SJVAirEntryLevel | undefined = getCurrentLevel(
30
- monitor.latest.value,
31
- entryType.asIter.levels!
32
- );
33
-
34
- const updateDuration = monitorsManager.meta.monitorType(monitor.type).expected_interval;
35
-
36
- return {
37
- color: level?.color ?? "",
38
- header: entryType.label,
39
- date: {
40
- formatted: format(monitor.latest.timestamp, "h:mm:aaa EEEE MMM dd, yyyy"),
41
- diference: formatDistanceToNow(monitor.latest.timestamp, {
42
- addSuffix: true,
43
- includeSeconds: true
44
- })
45
- },
46
- monitorName: monitor.name,
47
- subheading: `(${updateDuration} avg)`,
48
- value: Math.round(parseInt(monitor.latest.value, 10)).toString()
49
- };
50
- }
51
- </script>
52
-
53
- {#if data}
54
- <div class="flex flex-col gap-4">
55
- {#if data.reference}
56
- <div class="flex gap-2">
57
- <DataBox
58
- color={data.reference.color}
59
- header={data.reference.header}
60
- subheading={data.reference.subheading}
61
- value={data.reference.value}
62
- />
63
- <div class="flex flex-col">
64
- <p class="leading-none">{data.reference.date.formatted}</p>
65
- <h1 class="text-lg font-bold underline">{data.reference.monitorName}</h1>
66
- <p class="leading-none">Reference monitor</p>
67
- <div class="mt-auto">
68
- <p class="text-base leading-none">Last updated</p>
69
- <p class="text-base leading-none">{data.reference.date.diference}</p>
70
- </div>
71
- </div>
72
- </div>
73
- {:else}
74
- <h1>Reference monitor disabled</h1>
75
- {/if}
76
- {#if data.collocated}
77
- <div class="flex flex-row-reverse gap-2">
78
- <DataBox
79
- color={data.collocated.color}
80
- header={data.collocated.header}
81
- subheading={data.collocated.subheading}
82
- value={data.collocated.value}
83
- />
84
- <div class="flex flex-col">
85
- <p class="leading-none">{data.collocated.date.formatted}</p>
86
- <h1 class="text-lg font-bold underline">{data.collocated.monitorName}</h1>
87
- <p class="leading-none">Collocated monitor</p>
88
- <div class="mt-auto">
89
- <p class="text-base leading-none">Last updated</p>
90
- <p class="text-base leading-none">{data.collocated.date.diference}</p>
91
- </div>
92
- </div>
93
- </div>
94
- {:else}
95
- <h1>Collocated monitor disabled</h1>
96
- {/if}
97
- </div>
98
- {/if}
@@ -1,7 +0,0 @@
1
- import type { CollocationSiteMapFeature } from "./types";
2
- interface CollocationTooltipProps {
3
- feature: CollocationSiteMapFeature;
4
- }
5
- declare const CollocationTooltip: import("svelte").Component<CollocationTooltipProps, {}, "">;
6
- type CollocationTooltip = ReturnType<typeof CollocationTooltip>;
7
- export default CollocationTooltip;
@@ -1,7 +0,0 @@
1
- import { MonitorShapeIconManager } from "../monitors/monitors-icon-manager.svelte";
2
- export declare function getCollocationIconId(baseIconId: string): string;
3
- export declare class CollocationIconManager extends MonitorShapeIconManager {
4
- protected get idPrefix(): string;
5
- protected get iconSize(): number;
6
- protected transformSvg(svg: string): string;
7
- }
@@ -1,18 +0,0 @@
1
- import { CROSSHAIR_ICON_SIZE, withCrosshair } from "../map/icons";
2
- import { MonitorShapeIconManager } from "../monitors/monitors-icon-manager.svelte";
3
- const COLLOCATION_ICON_PREFIX = "collocation";
4
- const CROSSHAIR_COLOR = "#4A5FC6";
5
- export function getCollocationIconId(baseIconId) {
6
- return `${COLLOCATION_ICON_PREFIX}-${baseIconId}`;
7
- }
8
- export class CollocationIconManager extends MonitorShapeIconManager {
9
- get idPrefix() {
10
- return COLLOCATION_ICON_PREFIX;
11
- }
12
- get iconSize() {
13
- return CROSSHAIR_ICON_SIZE;
14
- }
15
- transformSvg(svg) {
16
- return withCrosshair(svg, CROSSHAIR_COLOR);
17
- }
18
- }
@@ -1,21 +0,0 @@
1
- import { type Map as MaptilerMap } from "@maptiler/sdk";
2
- import { MapIconLayerIntegration } from "../map/integrations/map-geojson-integration.svelte";
3
- import { CollocationIconManager } from "./collocations-icon-manager.svelte";
4
- import { TooltipManager } from "../map/integrations/tooltip.svelte";
5
- import type { CollocationSiteMapFeature, CollocationSiteMarkerProperties } from "./types";
6
- declare class CollocationSitesMapIntegration extends MapIconLayerIntegration<CollocationSiteMarkerProperties> {
7
- referenceId: string;
8
- enabled: boolean;
9
- icons: CollocationIconManager;
10
- tooltipManager: TooltipManager;
11
- /** The option only applies while monitors are shown with PM2.5. */
12
- get available(): boolean;
13
- features: Array<CollocationSiteMapFeature>;
14
- mapLayer: Parameters<MaptilerMap["addLayer"]>[0];
15
- get mapSource(): Parameters<MaptilerMap["addSource"]>[1];
16
- constructor();
17
- apply(): void;
18
- remove(): void;
19
- }
20
- export declare const collocationSitesMapIntegration: CollocationSitesMapIntegration;
21
- export type { CollocationSitesMapIntegration as MonitorsMapIntegration };
@@ -1,113 +0,0 @@
1
- import { mapManager } from "../map/map-manager.svelte.js";
2
- import { MapIconLayerIntegration } from "../map/integrations/map-geojson-integration.svelte";
3
- import { CollocationIconManager, getCollocationIconId } from "./collocations-icon-manager.svelte";
4
- import { TooltipManager } from "../map/integrations/tooltip.svelte";
5
- import { collocationSitesManager } from "./collocations.svelte";
6
- import { monitorsManager } from "../monitors/monitors.svelte";
7
- import { monitorsMapIntegration } from "../monitors/monitors-map-integration.svelte";
8
- import { untrack } from "svelte";
9
- import CollocationTooltip from "./CollocationTooltip.svelte";
10
- import { mountPopup } from "../map/utils";
11
- function collocationTooltip(evt) {
12
- const feature = evt.features?.[0];
13
- if (!feature)
14
- return;
15
- return mountPopup(CollocationTooltip, { feature }, evt.lngLat);
16
- }
17
- class CollocationSitesMapIntegration extends MapIconLayerIntegration {
18
- referenceId = "collocation-sites";
19
- enabled = $state(false);
20
- icons = new CollocationIconManager(monitorsManager);
21
- tooltipManager = new TooltipManager();
22
- /** The option only applies while monitors are shown with PM2.5. */
23
- get available() {
24
- return monitorsMapIntegration.enabled && monitorsManager.pollutant === "pm25";
25
- }
26
- features = $derived.by(() => {
27
- if (!monitorsManager.meta ||
28
- !monitorsManager.pollutant ||
29
- !collocationSitesManager.collocationSites ||
30
- monitorsMapIntegration.features.length === 0) {
31
- return [];
32
- }
33
- return collocationSitesManager.collocationSites
34
- .map((c) => {
35
- const referenceMonitorFeature = monitorsMapIntegration.features.find((m) => m.properties.id === c.reference_id);
36
- if (!referenceMonitorFeature)
37
- return;
38
- const feature = {
39
- type: "Feature",
40
- properties: {
41
- icon: getCollocationIconId(referenceMonitorFeature.properties.icon),
42
- colocated_id: c.colocated_id,
43
- reference_id: c.reference_id,
44
- name: c.name
45
- },
46
- geometry: c.position
47
- };
48
- return feature;
49
- })
50
- .filter((f) => f !== undefined);
51
- });
52
- mapLayer = {
53
- id: this.referenceId,
54
- type: "symbol",
55
- source: this.referenceId,
56
- layout: {
57
- "icon-allow-overlap": true,
58
- "icon-ignore-placement": true,
59
- "icon-image": ["get", "icon"],
60
- "icon-size": 1
61
- },
62
- paint: {}
63
- };
64
- get mapSource() {
65
- return {
66
- type: "geojson",
67
- promoteId: "id",
68
- data: {
69
- type: "FeatureCollection",
70
- features: this.features
71
- }
72
- };
73
- }
74
- constructor() {
75
- super();
76
- $effect.root(() => {
77
- $effect(() => {
78
- const features = this.features;
79
- if (!mapManager.map || !this.enabled)
80
- return;
81
- mapManager.setDataSource(this.referenceId, features);
82
- });
83
- // Remove the layer while the option is unavailable (Ozone or Pollutant = None); restore
84
- // it when it becomes available again if the user still has it checked.
85
- $effect(() => {
86
- if (!this.available) {
87
- untrack(() => this.remove());
88
- }
89
- else if (untrack(() => this.enabled)) {
90
- untrack(() => this.apply());
91
- }
92
- });
93
- });
94
- }
95
- apply() {
96
- if (!this.available) {
97
- this.remove();
98
- return;
99
- }
100
- if (!mapManager.map)
101
- return;
102
- if (!this.tooltipManager.has(this.referenceId)) {
103
- this.tooltipManager.register(this.referenceId, collocationTooltip, Number.MAX_SAFE_INTEGER);
104
- }
105
- this.tooltipManager.enable();
106
- super.apply();
107
- }
108
- remove() {
109
- this.tooltipManager.disable();
110
- super.remove();
111
- }
112
- }
113
- export const collocationSitesMapIntegration = new CollocationSitesMapIntegration();
@@ -1,10 +0,0 @@
1
- import { type CollocationSite } from "@sjvair/sdk";
2
- import type { SignalOptions } from "../abort";
3
- declare class CollocationSitesManager {
4
- initialized: boolean;
5
- collocationSites: Array<CollocationSite> | null;
6
- init({ signal }?: SignalOptions): Promise<void>;
7
- update({ signal }?: SignalOptions): Promise<void>;
8
- }
9
- export declare const collocationSitesManager: CollocationSitesManager;
10
- export type { CollocationSitesManager };
@@ -1,21 +0,0 @@
1
- import { getCollocationSites } from "@sjvair/sdk";
2
- class CollocationSitesManager {
3
- initialized = $state(false);
4
- collocationSites = $state(null);
5
- async init({ signal } = {}) {
6
- if (this.initialized)
7
- return;
8
- if (signal?.aborted)
9
- throw signal.reason;
10
- this.collocationSites = await getCollocationSites({ signal });
11
- this.initialized = true;
12
- }
13
- async update({ signal } = {}) {
14
- if (!this.initialized)
15
- return;
16
- if (signal?.aborted)
17
- throw signal.reason;
18
- this.collocationSites = await getCollocationSites({ signal });
19
- }
20
- }
21
- export const collocationSitesManager = new CollocationSitesManager();
@@ -1,8 +0,0 @@
1
- import type { Feature, Geometry } from "geojson";
2
- export type CollocationSiteMapFeature = Feature<Geometry, CollocationSiteMarkerProperties>;
3
- export interface CollocationSiteMarkerProperties {
4
- icon: string;
5
- colocated_id: string;
6
- reference_id: string;
7
- name: string;
8
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,16 +0,0 @@
1
- <script lang="ts">
2
- import type { EvStationClusterMapFeature } from "../types";
3
-
4
- interface Props {
5
- feature: EvStationClusterMapFeature;
6
- }
7
-
8
- const { feature }: Props = $props();
9
-
10
- const levelLabel = $derived(feature.source.includes("lvl2") ? "Level 2" : "Level 3");
11
- </script>
12
-
13
- <div class="flex flex-col gap-1 p-1">
14
- <p class="font-semibold">{levelLabel} Chargers</p>
15
- <p class="text-sm">{feature.properties.point_count} stations</p>
16
- </div>
@@ -1,7 +0,0 @@
1
- import type { EvStationClusterMapFeature } from "../types";
2
- interface Props {
3
- feature: EvStationClusterMapFeature;
4
- }
5
- declare const EvStationClusterTooltip: import("svelte").Component<Props, {}, "">;
6
- type EvStationClusterTooltip = ReturnType<typeof EvStationClusterTooltip>;
7
- export default EvStationClusterTooltip;
@@ -1,7 +0,0 @@
1
- import type { EvStationMapFeature } from "../types";
2
- interface Props {
3
- feature: EvStationMapFeature;
4
- }
5
- declare const EvStationTooltip: import("svelte").Component<Props, {}, "">;
6
- type EvStationTooltip = ReturnType<typeof EvStationTooltip>;
7
- export default EvStationTooltip;
@@ -1,19 +0,0 @@
1
- import { type ClickHandler } from "../map/integrations/click-manager";
2
- import { TooltipManager } from "../map/integrations/tooltip.svelte";
3
- import type { EvStationMapFeature } from "./types";
4
- export interface EvStationsClusterContext {
5
- referenceId: string;
6
- featuresByLevel: Record<string, EvStationMapFeature[]>;
7
- beforeLayer?: string;
8
- tooltipManager: TooltipManager;
9
- }
10
- export declare class EvStationsClusterRenderer {
11
- private ctx;
12
- private _levels;
13
- constructor(ctx: EvStationsClusterContext);
14
- apply(stationClickHandler: ClickHandler): void;
15
- remove(): void;
16
- get unclusteredLayerIds(): string[];
17
- syncFeatures(): void;
18
- private makeClusterClickHandler;
19
- }
@@ -1,131 +0,0 @@
1
- import { mapManager } from "../map/map-manager.svelte.js";
2
- import { mountPopup } from "../map/utils";
3
- import { clickManager } from "../map/integrations/click-manager";
4
- import { EV_STATION_LEVELS } from "./ev-station-icons";
5
- import EvStationClusterTooltip from "./components/EvStationClusterTooltip.svelte";
6
- function clusterTooltip(evt) {
7
- const feature = evt.features?.[0];
8
- if (!feature)
9
- return;
10
- return mountPopup(EvStationClusterTooltip, { feature }, evt.lngLat);
11
- }
12
- export class EvStationsClusterRenderer {
13
- ctx;
14
- _levels = [];
15
- constructor(ctx) {
16
- this.ctx = ctx;
17
- }
18
- apply(stationClickHandler) {
19
- if (!mapManager.map)
20
- return;
21
- for (const level of Object.keys(EV_STATION_LEVELS)) {
22
- const sourceId = `${this.ctx.referenceId}-${level}`;
23
- const features = this.ctx.featuresByLevel[level] ?? [];
24
- const { bg } = EV_STATION_LEVELS[level];
25
- const clusterBg = bg.replace("rgb(", "rgba(").replace(")", ", 0.6)");
26
- mapManager.map.addSource(sourceId, {
27
- type: "geojson",
28
- promoteId: "id",
29
- data: { type: "FeatureCollection", features },
30
- cluster: true,
31
- clusterRadius: 40,
32
- clusterMaxZoom: 9
33
- });
34
- mapManager.map.addLayer({
35
- id: `${sourceId}-cluster-circle`,
36
- type: "circle",
37
- source: sourceId,
38
- filter: ["has", "point_count"],
39
- paint: {
40
- "circle-color": clusterBg,
41
- "circle-radius": ["step", ["get", "point_count"], 15, 10, 20, 25, 25]
42
- }
43
- }, this.ctx.beforeLayer);
44
- mapManager.map.addLayer({
45
- id: `${sourceId}-cluster-label`,
46
- type: "symbol",
47
- source: sourceId,
48
- filter: ["has", "point_count"],
49
- layout: {
50
- "text-field": ["get", "point_count_abbreviated"],
51
- "text-size": 12,
52
- "text-allow-overlap": true,
53
- "text-ignore-placement": true
54
- },
55
- paint: { "text-color": "#ffffff" }
56
- }, this.ctx.beforeLayer);
57
- mapManager.map.addLayer({
58
- id: `${sourceId}-unclustered`,
59
- type: "symbol",
60
- source: sourceId,
61
- filter: ["!", ["has", "point_count"]],
62
- layout: {
63
- "icon-image": `ev-station-${level}`,
64
- "icon-allow-overlap": true,
65
- "icon-ignore-placement": true,
66
- "icon-size": 1
67
- },
68
- paint: {}
69
- }, this.ctx.beforeLayer);
70
- const circleLayerId = `${sourceId}-cluster-circle`;
71
- const unclusteredLayerId = `${sourceId}-unclustered`;
72
- if (!this.ctx.tooltipManager.has(circleLayerId)) {
73
- this.ctx.tooltipManager.register(circleLayerId, clusterTooltip);
74
- }
75
- clickManager.register([circleLayerId], this.makeClusterClickHandler(sourceId));
76
- clickManager.register([unclusteredLayerId], stationClickHandler);
77
- this._levels.push(level);
78
- }
79
- }
80
- remove() {
81
- if (!mapManager.map)
82
- return;
83
- for (const level of this._levels) {
84
- const sourceId = `${this.ctx.referenceId}-${level}`;
85
- const layerIds = [
86
- `${sourceId}-cluster-circle`,
87
- `${sourceId}-cluster-label`,
88
- `${sourceId}-unclustered`
89
- ];
90
- for (const layerId of layerIds) {
91
- clickManager.unregister([layerId]);
92
- if (mapManager.map.getLayer(layerId)) {
93
- mapManager.map.removeLayer(layerId);
94
- }
95
- }
96
- if (mapManager.map.getSource(sourceId)) {
97
- mapManager.map.removeSource(sourceId);
98
- }
99
- }
100
- this._levels = [];
101
- }
102
- get unclusteredLayerIds() {
103
- return this._levels.map((level) => `${this.ctx.referenceId}-${level}-unclustered`);
104
- }
105
- syncFeatures() {
106
- if (!mapManager.map)
107
- return;
108
- for (const level of this._levels) {
109
- const sourceId = `${this.ctx.referenceId}-${level}`;
110
- mapManager.setDataSource(sourceId, this.ctx.featuresByLevel[level] ?? []);
111
- }
112
- }
113
- makeClusterClickHandler(sourceId) {
114
- return async (features) => {
115
- try {
116
- const feature = features[0];
117
- if (!feature?.properties?.cluster_id)
118
- return;
119
- const source = mapManager.map?.getSource(sourceId);
120
- if (!source)
121
- return;
122
- const zoom = await source.getClusterExpansionZoom(feature.properties.cluster_id);
123
- const coords = feature.geometry.coordinates;
124
- mapManager.map?.easeTo({ center: coords, zoom });
125
- }
126
- catch (err) {
127
- console.error("EvStations: cluster expansion zoom failed", err);
128
- }
129
- };
130
- }
131
- }
@@ -1,31 +0,0 @@
1
- import type { FilterSpecification, Map as MaptilerMap } from "@maptiler/sdk";
2
- import { MapIconLayerIntegration } from "../map/integrations/map-geojson-integration.svelte";
3
- import { MapDisplayOption } from "../map/integrations/map-display-option.svelte";
4
- import { TooltipManager } from "../map/integrations/tooltip.svelte";
5
- import { EvStationIconManager } from "./ev-station-icons";
6
- import { type EvStationsClusterContext } from "./ev-stations-cluster-renderer";
7
- import type { EvStationMapFeature, EvStationMarkerProperties } from "./types";
8
- declare class EvStationsMapIntegration extends MapIconLayerIntegration<EvStationMarkerProperties> implements EvStationsClusterContext {
9
- referenceId: string;
10
- enabled: boolean;
11
- clustered: boolean;
12
- icons: EvStationIconManager;
13
- tooltipManager: TooltipManager;
14
- private renderer;
15
- private currentPopup;
16
- displayOptions: {
17
- lvl2: MapDisplayOption;
18
- lvl3: MapDisplayOption;
19
- };
20
- features: Array<EvStationMapFeature>;
21
- featuresByLevel: Record<string, EvStationMapFeature[]>;
22
- filters: FilterSpecification;
23
- private handleStationClick;
24
- get mapLayer(): Parameters<MaptilerMap["addLayer"]>[0];
25
- get mapSource(): Parameters<MaptilerMap["addSource"]>[1];
26
- constructor();
27
- apply(): void;
28
- remove(): void;
29
- }
30
- export declare const evStationsMapIntegration: EvStationsMapIntegration;
31
- export type { EvStationsMapIntegration };