@sjvair/monitor-map 3.0.2 → 3.0.4

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 (324) 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 -0
  109. package/dist/lib/ev-stations/ev-station-icons.d.ts +16 -0
  110. package/dist/lib/ev-stations/ev-station-icons.js +26 -0
  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 +131 -0
  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 +207 -0
  115. package/dist/lib/ev-stations/ev-stations.svelte.d.ts +9 -0
  116. package/dist/lib/ev-stations/ev-stations.svelte.js +55 -0
  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 +458 -0
  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 -19
  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 -43
  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 +33 -27
  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 -67
  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 +13 -0
  193. package/dist/lib/routes.d.ts +2 -0
  194. package/dist/lib/routes.js +11 -0
  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 +80 -0
  199. package/dist/lib/utils.d.ts +13 -0
  200. package/dist/lib/utils.js +11 -7
  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 +45 -42
  206. package/src/lib/LoadScreen.svelte +5 -5
  207. package/src/lib/MainMapView.svelte +1 -0
  208. package/src/lib/MapLegend.svelte +15 -0
  209. package/src/lib/MonitorDetailPanel.svelte +152 -0
  210. package/src/lib/MonitorMapLayout.svelte +193 -0
  211. package/src/lib/components/MapLayersDisplayOptions.svelte +6 -2
  212. package/src/lib/hms/components/HMSFireLegend.svelte +21 -0
  213. package/src/lib/hms/hms.svelte.ts +8 -9
  214. package/src/lib/index.ts +52 -0
  215. package/src/lib/map/Map.svelte +1 -0
  216. package/src/lib/map/Menu.svelte +4 -7
  217. package/src/lib/map/integrations/map-icon-manager.ts +4 -1
  218. package/src/lib/monitors/monitors.svelte.ts +1 -3
  219. package/src/lib/router-context.ts +48 -0
  220. package/src/lib/routes.ts +13 -0
  221. package/src/lib/search/Search.svelte +189 -0
  222. package/src/lib/search/service.ts +101 -0
  223. package/src/lib/utils.ts +11 -0
  224. package/dist/lib/LoadScreen.js +0 -73
  225. package/dist/lib/assets/icons/adjustment-horizontal.js +0 -4
  226. package/dist/lib/collocation-sites/CollocationTooltip.js +0 -105
  227. package/dist/lib/components/DataBox.js +0 -30
  228. package/dist/lib/components/DisplayOption.js +0 -10
  229. package/dist/lib/components/MapLayersDisplayOptions.js +0 -78
  230. package/dist/lib/components/SegmentedControl.js +0 -37
  231. package/dist/lib/components/ToggleSwitch.js +0 -17
  232. package/dist/lib/components/ui/button/button.js +0 -34
  233. package/dist/lib/components/ui/range-calendar/range-calendar-caption.js +0 -79
  234. package/dist/lib/components/ui/range-calendar/range-calendar-cell.js +0 -34
  235. package/dist/lib/components/ui/range-calendar/range-calendar-day.js +0 -34
  236. package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.js +0 -26
  237. package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.js +0 -26
  238. package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.js +0 -34
  239. package/dist/lib/components/ui/range-calendar/range-calendar-grid.js +0 -34
  240. package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.js +0 -34
  241. package/dist/lib/components/ui/range-calendar/range-calendar-header.js +0 -34
  242. package/dist/lib/components/ui/range-calendar/range-calendar-month-select.js +0 -61
  243. package/dist/lib/components/ui/range-calendar/range-calendar-month.js +0 -25
  244. package/dist/lib/components/ui/range-calendar/range-calendar-months.js +0 -25
  245. package/dist/lib/components/ui/range-calendar/range-calendar-nav.js +0 -25
  246. package/dist/lib/components/ui/range-calendar/range-calendar-next-button.js +0 -57
  247. package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.js +0 -57
  248. package/dist/lib/components/ui/range-calendar/range-calendar-year-select.js +0 -59
  249. package/dist/lib/components/ui/range-calendar/range-calendar.js +0 -272
  250. package/dist/lib/data-chart/DataChart.js +0 -142
  251. package/dist/lib/map/Map.js +0 -14
  252. package/dist/lib/map/MapStyleDisplayOptions.js +0 -43
  253. package/dist/lib/map/Menu.js +0 -45
  254. package/dist/lib/monitors/components/MonitorClusterTooltip.js +0 -83
  255. package/dist/lib/monitors/components/MonitorSubscriptionManager.js +0 -104
  256. package/dist/lib/monitors/components/MonitorTooltip.js +0 -59
  257. package/dist/lib/monitors/components/MonitorWidgetModal.js +0 -40
  258. package/dist/lib/monitors/components/MonitorsDisplayOptions.js +0 -76
  259. package/dist/lib/node_modules/@internationalized/date/dist/private/CalendarDate.js +0 -122
  260. package/dist/lib/node_modules/@internationalized/date/dist/private/DateFormatter.js +0 -84
  261. package/dist/lib/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js +0 -91
  262. package/dist/lib/node_modules/@internationalized/date/dist/private/conversion.js +0 -104
  263. package/dist/lib/node_modules/@internationalized/date/dist/private/manipulation.js +0 -159
  264. package/dist/lib/node_modules/@internationalized/date/dist/private/queries.js +0 -32
  265. package/dist/lib/node_modules/@internationalized/date/dist/private/string.js +0 -37
  266. package/dist/lib/node_modules/@internationalized/date/dist/private/utils.js +0 -6
  267. package/dist/lib/node_modules/clsx/dist/clsx.js +0 -16
  268. package/dist/lib/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -1723
  269. package/dist/lib/node_modules/tailwind-variants/dist/chunk-LQJYWU4O.js +0 -70
  270. package/dist/lib/node_modules/tailwind-variants/dist/chunk-RZF76H2U.js +0 -166
  271. package/dist/lib/node_modules/tailwind-variants/dist/index.js +0 -19
  272. package/dist/lib/node_modules/uplot/dist/uPlot.esm.js +0 -2147
  273. package/dist/lib/sjvair-air.avif +0 -0
  274. package/dist/lib/sjvair-air.png +0 -0
  275. package/dist/lib/sjvair-air.webp +0 -0
  276. package/dist/lib/sjvair-air2.avif +0 -0
  277. package/dist/lib/sjvair-air2.png +0 -0
  278. package/dist/lib/sjvair-air2.webp +0 -0
  279. package/dist/lib/sjvair-icon.avif +0 -0
  280. package/dist/lib/sjvair-icon.png +0 -0
  281. package/dist/lib/sjvair-icon.webp +0 -0
  282. package/dist/lib/sjvair-icon2.avif +0 -0
  283. package/dist/lib/sjvair-icon2.png +0 -0
  284. package/dist/lib/sjvair-icon2.webp +0 -0
  285. package/dist/lib/sjvair-sjv.avif +0 -0
  286. package/dist/lib/sjvair-sjv.png +0 -0
  287. package/dist/lib/sjvair-sjv.webp +0 -0
  288. package/dist/lib/sjvair-sjv2.avif +0 -0
  289. package/dist/lib/sjvair-sjv2.png +0 -0
  290. package/dist/lib/sjvair-sjv2.webp +0 -0
  291. package/dist/lib/src/MapView.js +0 -7
  292. package/dist/lib/src/MonitorDetailPanel.js +0 -169
  293. package/dist/lib/src/router.js +0 -9
  294. package/dist/monitor-map/MonitorDetailPanel.css +0 -1
  295. package/dist/monitor-map/assets/MonitorDetailPanel-BU_pXZjp.js +0 -15
  296. package/dist/monitor-map/assets/validate-routes-CgbRa8fT.js +0 -1
  297. package/dist/monitor-map/inter-cyrillic-ext-wght-normal.woff2 +0 -0
  298. package/dist/monitor-map/inter-cyrillic-wght-normal.woff2 +0 -0
  299. package/dist/monitor-map/inter-greek-ext-wght-normal.woff2 +0 -0
  300. package/dist/monitor-map/inter-greek-wght-normal.woff2 +0 -0
  301. package/dist/monitor-map/inter-latin-ext-wght-normal.woff2 +0 -0
  302. package/dist/monitor-map/inter-latin-wght-normal.woff2 +0 -0
  303. package/dist/monitor-map/inter-vietnamese-wght-normal.woff2 +0 -0
  304. package/dist/monitor-map/lungs.svg +0 -99
  305. package/dist/monitor-map/sjvair-air.avif +0 -0
  306. package/dist/monitor-map/sjvair-air.png +0 -0
  307. package/dist/monitor-map/sjvair-air.webp +0 -0
  308. package/dist/monitor-map/sjvair-air2.avif +0 -0
  309. package/dist/monitor-map/sjvair-air2.png +0 -0
  310. package/dist/monitor-map/sjvair-air2.webp +0 -0
  311. package/dist/monitor-map/sjvair-icon.avif +0 -0
  312. package/dist/monitor-map/sjvair-icon.png +0 -0
  313. package/dist/monitor-map/sjvair-icon.webp +0 -0
  314. package/dist/monitor-map/sjvair-icon2.avif +0 -0
  315. package/dist/monitor-map/sjvair-icon2.png +0 -0
  316. package/dist/monitor-map/sjvair-icon2.webp +0 -0
  317. package/dist/monitor-map/sjvair-sjv.avif +0 -0
  318. package/dist/monitor-map/sjvair-sjv.png +0 -0
  319. package/dist/monitor-map/sjvair-sjv.webp +0 -0
  320. package/dist/monitor-map/sjvair-sjv2.avif +0 -0
  321. package/dist/monitor-map/sjvair-sjv2.png +0 -0
  322. package/dist/monitor-map/sjvair-sjv2.webp +0 -0
  323. package/dist/monitor-map/sjvairMonitorMap.css +0 -1
  324. package/dist/monitor-map/sjvairMonitorMap.js +0 -4042
package/src/lib/index.ts CHANGED
@@ -1,16 +1,57 @@
1
+ /**
2
+ * Usage in a host app:
3
+ *
4
+ * ```ts
5
+ * // router.ts
6
+ * import { createRouter } from "sv-router";
7
+ * import { monitorMapRoutes } from "@sjvair/monitor-map";
8
+ *
9
+ * export const { route, navigate, p, isActive, Router } = createRouter({
10
+ * "/my-map": monitorMapRoutes
11
+ * // ...the host app's own routes
12
+ * });
13
+ * ```
14
+ *
15
+ * ```svelte
16
+ * <!-- app root -->
17
+ * <script>
18
+ * import { provideMonitorMapRouter } from "@sjvair/monitor-map";
19
+ * import { route, navigate, p, isActive, Router } from "./router";
20
+ *
21
+ * provideMonitorMapRouter({ route, navigate, p, isActive, basePath: "/my-map" });
22
+ * </script>
23
+ *
24
+ * <Router />
25
+ * ```
26
+ */
27
+ export { monitorMapRoutes } from "./routes";
28
+ export {
29
+ ROUTER_KEY,
30
+ provideMonitorMapRouter,
31
+ useMonitorMapRouter,
32
+ type MonitorMapRouterApi
33
+ } from "./router-context";
34
+
1
35
  // State managers
2
36
  export { monitorsManager } from "./monitors/monitors.svelte";
3
37
  export type { MonitorsManager } from "./monitors/monitors.svelte";
4
38
  export { collocationSitesManager } from "./collocation-sites/collocations.svelte";
5
39
  export type { CollocationSitesManager } from "./collocation-sites/collocations.svelte";
40
+ export { evStationsManager } from "./ev-stations/ev-stations.svelte";
41
+ export type { EvStationsManager } from "./ev-stations/ev-stations.svelte";
42
+ export { hmsManager } from "./hms/hms.svelte";
43
+ export type { HMSManager } from "./hms/hms.svelte";
6
44
  export { mapManager, DefaultMapStyle, initializeMap } from "./map/map.svelte";
7
45
  export type { MapManager } from "./map/map.svelte";
8
46
 
9
47
  // Map integrations
10
48
  export { monitorsMapIntegration } from "./monitors/monitors-map-integration.svelte.ts";
11
49
  export { collocationSitesMapIntegration } from "./collocation-sites/collocations-map-integration.svelte.ts";
50
+ export { evStationsMapIntegration } from "./ev-stations/ev-stations-map-integration.svelte.ts";
12
51
  export { windMapIntegration } from "./wind/wind.svelte";
13
52
  export { baseLayerSeperator } from "./map/integrations/base-layer-seperator";
53
+ export { hmsFireMapIntegration } from "./hms/hms-fire-map-integration.svelte.ts";
54
+ export { hmsSmokeMapIntegration } from "./hms/hms-smoke-map-integration.svelte.ts";
14
55
 
15
56
  // Components
16
57
  export { default as Map } from "./map/Map.svelte";
@@ -23,6 +64,7 @@ export {
23
64
  } from "./LoadScreen.svelte";
24
65
  export type { LoadScreenState } from "./LoadScreen.svelte";
25
66
  export { default as MonitorsDisplayOptions } from "./monitors/components/MonitorsDisplayOptions.svelte";
67
+ export { default as EvStationsDisplayOptions } from "./ev-stations/components/EvStationsDisplayOptions.svelte";
26
68
  export { default as MapLayersDisplayOptions } from "./components/MapLayersDisplayOptions.svelte";
27
69
  export { default as MapStyleDisplayOptions } from "./map/MapStyleDisplayOptions.svelte";
28
70
  export { default as ToggleSwitch } from "./components/ToggleSwitch.svelte";
@@ -37,6 +79,10 @@ export { MapIconLayerIntegration as MapGeoJSONIntegration } from "./map/integrat
37
79
  export type { SomeMapIntegration } from "./map/integrations/types";
38
80
  export type { MonitorsMapIntegration } from "./monitors/monitors-map-integration.svelte.ts";
39
81
  export type { WindMapIntegration } from "./wind/wind.svelte.ts";
82
+ export type { EvStationsMapIntegration } from "./ev-stations/ev-stations-map-integration.svelte.ts";
83
+ export type { HMSFireMapIntegration } from "./hms/hms-fire-map-integration.svelte.ts";
84
+ export type { HMSSmokeMapIntegration } from "./hms/hms-smoke-map-integration.svelte.ts";
85
+ export type { HMSFireGroup } from "./hms/hms.svelte.ts";
40
86
  export type {
41
87
  MonitorMapFeature,
42
88
  MonitorMarkerProperties,
@@ -47,3 +93,9 @@ export type {
47
93
  CollocationSiteMapFeature,
48
94
  CollocationSiteMarkerProperties
49
95
  } from "./collocation-sites/types";
96
+ export type {
97
+ EvStation,
98
+ EvStationMarkerProperties,
99
+ EvStationMapFeature,
100
+ EvStationClusterMapFeature
101
+ } from "./ev-stations/types";
@@ -6,6 +6,7 @@
6
6
 
7
7
  const { integrations }: { integrations: Array<SomeMapIntegration> } = $props();
8
8
 
9
+ // svelte-ignore state_referenced_locally (we only need the initial reference)
9
10
  integrationsManager.register(...integrations);
10
11
  </script>
11
12
 
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { Attachment } from "svelte/attachments";
3
+ import { SlidersHorizontalIcon } from "@lucide/svelte";
3
4
 
4
5
  let { children } = $props();
5
6
  let isOpen: boolean = $state(false);
@@ -37,20 +38,16 @@
37
38
  data-trigger
38
39
  class:rounded-full={!isOpen}
39
40
  class:delay-100={!isOpen}
40
- class="absolute top-0 left-0 flex items-center justify-center overflow-hidden rounded bg-white p-1 shadow transition-all duration-0 select-none"
41
+ class="relative top-0 left-0 flex items-center justify-center overflow-hidden rounded bg-white p-1 shadow transition-all duration-0 select-none"
41
42
  >
42
43
  <button
43
44
  class:w-0={isOpen}
44
45
  class:h-0={isOpen}
45
46
  class:opacity-0={isOpen}
46
- class="relative size-8 transition-all"
47
+ class="relative size-10 transition-all flex justify-center items-center"
47
48
  aria-label="Display Options"
48
49
  >
49
- <enhanced:img
50
- src="$lib/assets/icons/adjustment-horizontal.svg"
51
- alt="SJVAir Icon"
52
- class="size-8"
53
- />
50
+ <SlidersHorizontalIcon size="24" />
54
51
  </button>
55
52
  <div
56
53
  class:h-55={isOpen}
@@ -1,5 +1,4 @@
1
1
  import type { Map as MaptilerMap } from "@maptiler/sdk";
2
- //import { XMap } from "@tstk/builtin-extensions";
3
2
  import { mapManager } from "../map.svelte.ts";
4
3
  import type { MapImageIcon } from "./types";
5
4
  import { SvelteMap } from "svelte/reactivity";
@@ -13,6 +12,10 @@ export class MapIconManager {
13
12
  }
14
13
  }
15
14
 
15
+ get iter(): MapIterator<[string, MapImageIcon]> {
16
+ return this.icons.entries();
17
+ }
18
+
16
19
  get(id: string): MapImageIcon | undefined {
17
20
  return this.icons.get(id);
18
21
  }
@@ -7,7 +7,6 @@ import {
7
7
  type MonitorsMeta,
8
8
  type SJVAirEntryLevel
9
9
  } from "@sjvair/sdk";
10
- import { route } from "../../router.ts";
11
10
  import { XMap } from "@tstk/builtin-extensions";
12
11
  import { Interval } from "@tstk/utils";
13
12
 
@@ -26,12 +25,11 @@ class MonitorsManager {
26
25
  this.meta?.entryType(this.pollutant ?? this.meta.default_pollutant).asIter.levels || null
27
26
  );
28
27
 
29
- async init(): Promise<void> {
28
+ async init(urlPollutant?: string | number | boolean): Promise<void> {
30
29
  if (this.initialized) return;
31
30
 
32
31
  [this.list, this.meta] = await Promise.all([getMonitors(), getMonitorsMeta()]);
33
32
 
34
- const urlPollutant = route.search.pollutant;
35
33
  this.pollutant =
36
34
  urlPollutant === "pm25" || urlPollutant === "o3" ? urlPollutant : this.meta.default_pollutant;
37
35
  this.latest = await getMonitorsLatestMap(this.pollutant);
@@ -0,0 +1,48 @@
1
+ import { getContext, setContext } from "svelte";
2
+ import type {
3
+ ConstructUrlOptions,
4
+ Navigation,
5
+ NavigateOptions,
6
+ RouterApi,
7
+ Routes
8
+ } from "sv-router";
9
+
10
+ export const ROUTER_KEY = Symbol("monitor-map-router");
11
+
12
+ export interface MonitorMapRouterApi {
13
+ route: RouterApi<Routes>["route"];
14
+ /**
15
+ * Loosely typed against `string` rather than sv-router's literal-checked `Path<T>` union:
16
+ * internal calls prefix paths with `basePath` (a runtime string), which can't satisfy a
17
+ * template literal type checked against the host app's full route tree.
18
+ */
19
+ navigate(
20
+ path: string,
21
+ options?: NavigateOptions & { params?: Record<string, string> }
22
+ ): Promise<Navigation>;
23
+ p(path: string, options?: ConstructUrlOptions & { params?: Record<string, string> }): string;
24
+ isActive: {
25
+ (path: string, params?: Record<string, string>): boolean;
26
+ startsWith(path: string, params?: Record<string, string>): boolean;
27
+ };
28
+ /**
29
+ * Prefix under which monitorMapRoutes is mounted in the host app's router,
30
+ * e.g. "" at the app root, or "/my-map" when nested under a host route.
31
+ */
32
+ basePath: string;
33
+ }
34
+
35
+ export function provideMonitorMapRouter(api: MonitorMapRouterApi) {
36
+ setContext(ROUTER_KEY, api);
37
+ }
38
+
39
+ export function useMonitorMapRouter(): MonitorMapRouterApi {
40
+ const api = getContext<MonitorMapRouterApi>(ROUTER_KEY);
41
+ if (!api) {
42
+ throw new Error(
43
+ "monitor-map router context not found. Wrap your app root with " +
44
+ "provideMonitorMapRouter(...) before rendering monitor-map components."
45
+ );
46
+ }
47
+ return api;
48
+ }
@@ -0,0 +1,13 @@
1
+ import type { Routes } from "sv-router";
2
+ import MonitorMapLayout from "./MonitorMapLayout.svelte";
3
+ import MainMapView from "./MainMapView.svelte";
4
+
5
+ // Explicitly typed as sv-router's own `Routes` so declaration emission doesn't
6
+ // need to name svelte2tsx's internal per-component prop types (see
7
+ // MonitorMapLayout/MainMapView.svelte) and so this stays assignable to
8
+ // `createRouter`'s `Routes`-constrained parameter in a host app's router.ts.
9
+ export const monitorMapRoutes: Routes = {
10
+ layout: MonitorMapLayout,
11
+ "/": MainMapView,
12
+ "/monitor/:id": () => import("./MonitorDetailPanel.svelte")
13
+ };
@@ -0,0 +1,189 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from "svelte";
3
+ import { Marker } from "@maptiler/sdk";
4
+ import { SearchIcon } from "@lucide/svelte";
5
+ import { useMonitorMapRouter } from "../router-context";
6
+ import { mapManager } from "$lib/map/map.svelte";
7
+ import { debounce } from "$lib/utils";
8
+ import { monitorSearch, geocode, type SearchResult } from "./service";
9
+ import { monitorsMapIntegration } from "$lib/monitors/monitors-map-integration.svelte";
10
+
11
+ const { navigate, basePath } = useMonitorMapRouter();
12
+
13
+ let collapsed = $state(true);
14
+ let searchText = $state("");
15
+ let results: SearchResult[] = $state([]);
16
+ let marker: Marker | null = $state.raw(null);
17
+ let inputEl: HTMLInputElement | null = $state(null);
18
+
19
+ function clickOutside(node: HTMLElement) {
20
+ function handler(e: MouseEvent) {
21
+ if (!collapsed && !node.contains(e.target as Node)) {
22
+ collapsed = true;
23
+ searchText = "";
24
+ results = [];
25
+ }
26
+ }
27
+ document.addEventListener("click", handler, true);
28
+ return {
29
+ destroy() {
30
+ document.removeEventListener("click", handler, true);
31
+ }
32
+ };
33
+ }
34
+
35
+ async function openSearch() {
36
+ if (collapsed) {
37
+ collapsed = false;
38
+ inputEl?.focus();
39
+ }
40
+ }
41
+
42
+ function clearSearch() {
43
+ searchText = "";
44
+ results = [];
45
+ marker?.remove();
46
+ marker = null;
47
+ }
48
+
49
+ async function handleInput() {
50
+ const query = searchText;
51
+ if (!query) {
52
+ results = [];
53
+ marker?.remove();
54
+ marker = null;
55
+ return;
56
+ }
57
+ const monitorResults = await monitorSearch(query);
58
+ if (searchText !== query) return;
59
+ if (monitorResults.length) {
60
+ results = monitorResults;
61
+ } else if (query.length > 4) {
62
+ const geo = await geocode(query);
63
+ if (searchText !== query) return;
64
+ results = geo;
65
+ } else {
66
+ results = [];
67
+ }
68
+ }
69
+
70
+ const debouncedSearch = debounce(handleInput, 500);
71
+
72
+ async function selectMonitor(result: Extract<SearchResult, { type: "monitor" }>) {
73
+ collapsed = true;
74
+ searchText = "";
75
+ results = [];
76
+ marker?.remove();
77
+ marker = null;
78
+ if (mapManager.map && result.monitor.position) {
79
+ const { coordinates } = result.monitor.position;
80
+ const center: [number, number] = [coordinates[0], coordinates[1]];
81
+ mapManager.map.flyTo({
82
+ center,
83
+ zoom: 12
84
+ });
85
+ }
86
+ await navigate(`${basePath}/monitor/:id`, { params: { id: result.monitor.id } });
87
+ monitorsMapIntegration.selectedMonitorId = result.monitor.id;
88
+ }
89
+
90
+ function selectGeocode(result: Extract<SearchResult, { type: "geocode" }>) {
91
+ const { feature } = result;
92
+ marker?.remove();
93
+ marker = null;
94
+ if (mapManager.map) {
95
+ const center: [number, number] = [feature.center[0], feature.center[1]];
96
+ marker = new Marker().setLngLat(center).addTo(mapManager.map);
97
+ const isAddress = feature.place_type?.[0] === "address";
98
+ mapManager.map.flyTo({
99
+ center,
100
+ ...(isAddress && { zoom: 16 })
101
+ });
102
+ }
103
+ results = [];
104
+ collapsed = true;
105
+ }
106
+
107
+ onDestroy(() => {
108
+ marker?.remove();
109
+ });
110
+ </script>
111
+
112
+ <div
113
+ class={[
114
+ "flex flex-col bg-white shadow-md overflow-hidden transition-all duration-300 select-none",
115
+ collapsed ? "w-12 h-12 rounded-full" : "w-90 rounded-3xl",
116
+ !collapsed && results.length ? "max-h-90" : "max-h-12"
117
+ ]}
118
+ use:clickOutside
119
+ >
120
+ <div class="flex items-center w-full h-12 shrink-0">
121
+ <button
122
+ class="w-12 h-12 shrink-0 flex items-center justify-center rounded-full bg-brand border-4 border-white"
123
+ onclick={openSearch}
124
+ aria-label="Open search"
125
+ >
126
+ <SearchIcon size="24" color="#FFFFFF" />
127
+ </button>
128
+ <div class="overflow-hidden w-full h-full flex items-center">
129
+ <input
130
+ bind:this={inputEl}
131
+ bind:value={searchText}
132
+ oninput={debouncedSearch}
133
+ type="text"
134
+ placeholder="Search monitors or locations..."
135
+ class="h-full px-2 text-sm bg-transparent border-none outline-none w-full"
136
+ tabindex={collapsed ? -1 : 0}
137
+ />
138
+ {#if searchText && !collapsed}
139
+ <button
140
+ onclick={clearSearch}
141
+ class="px-2 text-gray-400 hover:text-gray-600 text-xl leading-none cursor-pointer"
142
+ aria-label="Clear search">×</button
143
+ >
144
+ {/if}
145
+ </div>
146
+ </div>
147
+ <div
148
+ class={[
149
+ "overflow-y-auto transition-all duration-300 divide-y divide-gray-100",
150
+ !collapsed ? "max-h-80" : "max-h-0"
151
+ ]}
152
+ >
153
+ {#each results as result (result.type === "monitor" ? result.monitor.id : result.feature.place_name)}
154
+ {#if result.type === "monitor"}
155
+ <button
156
+ onclick={() => selectMonitor(result)}
157
+ class="flex items-center w-full h-12 px-4 hover:brightness-95 bg-white text-left"
158
+ >
159
+ {#if result.logo.url}
160
+ <img
161
+ src={result.logo.url}
162
+ alt={result.logo.alt}
163
+ class="w-10 h-10 object-contain mr-3 shrink-0"
164
+ />
165
+ {/if}
166
+ <span class="text-sm truncate">{result.monitor.name}</span>
167
+ </button>
168
+ {:else}
169
+ {@const comma = result.feature.place_name.indexOf(",")}
170
+ <button
171
+ onclick={() => selectGeocode(result)}
172
+ class="flex items-center w-full h-12 px-4 hover:brightness-95 bg-white text-left"
173
+ >
174
+ <span class="svg-icon location-on bg-brand w-6 h-6 shrink-0 mr-3"></span>
175
+ <div class="min-w-0">
176
+ <p class="text-sm font-medium truncate">
177
+ {result.feature.place_name.substring(0, comma < 0 ? undefined : comma)}
178
+ </p>
179
+ {#if comma >= 0}
180
+ <p class="text-xs text-muted-foreground truncate">
181
+ {result.feature.place_name.substring(comma + 1).trim()}
182
+ </p>
183
+ {/if}
184
+ </div>
185
+ </button>
186
+ {/if}
187
+ {/each}
188
+ </div>
189
+ </div>
@@ -0,0 +1,101 @@
1
+ import { geocoding, type GeocodingFeature } from "@maptiler/sdk";
2
+ import type { MonitorLatestType } from "@sjvair/sdk";
3
+ import { monitorsManager } from "$lib/monitors/monitors.svelte";
4
+ import AirGradientLogo from "../assets/logos/airgradient-blue.svg";
5
+ import AirNowLogo from "../assets/logos/airnow-compact.jpg";
6
+ import CarbLogo from "../assets/logos/carb-compact.jpg";
7
+ import PurpleairLogo from "../assets/logos/purpleair-compact.png";
8
+ import SJVAirLogo from "../assets/logos/sjvair.svg";
9
+
10
+ export type MonitorResult = {
11
+ type: "monitor";
12
+ monitor: MonitorLatestType<"pm25" | "o3">;
13
+ logo: { url: string; alt: string };
14
+ };
15
+
16
+ export type GeocodeResult = {
17
+ type: "geocode";
18
+ feature: GeocodingFeature;
19
+ };
20
+
21
+ export type SearchResult = MonitorResult | GeocodeResult;
22
+
23
+ const SJV_CENTER: [number, number] = [-119.8, 36.76];
24
+
25
+ function getMonitorLogo(monitor: MonitorLatestType<"pm25" | "o3">): { url: string; alt: string } {
26
+ switch (monitor.data_source.name) {
27
+ case "AQview":
28
+ return { url: CarbLogo, alt: "AQview" };
29
+ case "AirNow.gov":
30
+ return { url: AirNowLogo, alt: "AirNow.gov" };
31
+ case "PurpleAir":
32
+ return { url: PurpleairLogo, alt: "PurpleAir" };
33
+ case "Central California Asthma Collaborative":
34
+ return { url: SJVAirLogo, alt: "Central California Asthma Collaborative" };
35
+ case "AirGradient":
36
+ return { url: AirGradientLogo, alt: "AirGradient" };
37
+ default:
38
+ console.warn(`[search] Unknown data source: ${monitor.data_source.name}`);
39
+ return { url: "", alt: "" };
40
+ }
41
+ }
42
+
43
+ let proximityCache: Promise<[number, number]> | null = null;
44
+
45
+ function getProximity(): Promise<[number, number]> {
46
+ return (proximityCache ??= resolveProximity());
47
+ }
48
+
49
+ function resolveProximity(): Promise<[number, number]> {
50
+ return new Promise((resolve) => {
51
+ if (!navigator.geolocation) {
52
+ resolve(SJV_CENTER);
53
+ return;
54
+ }
55
+ const timeout = setTimeout(() => resolve(SJV_CENTER), 3000);
56
+ navigator.geolocation.getCurrentPosition(
57
+ (pos) => {
58
+ clearTimeout(timeout);
59
+ resolve([pos.coords.longitude, pos.coords.latitude]);
60
+ },
61
+ () => {
62
+ clearTimeout(timeout);
63
+ resolve(SJV_CENTER);
64
+ }
65
+ );
66
+ });
67
+ }
68
+
69
+ export async function monitorSearch(query: string): Promise<SearchResult[]> {
70
+ if (!monitorsManager.latest) return [];
71
+ const normalized = query.toLowerCase();
72
+ const exact: MonitorLatestType<"pm25" | "o3">[] = [];
73
+ const prefix: MonitorLatestType<"pm25" | "o3">[] = [];
74
+ const substr: MonitorLatestType<"pm25" | "o3">[] = [];
75
+
76
+ for (const monitor of monitorsManager.latest.values()) {
77
+ const name = monitor.name.toLowerCase();
78
+ if (name === normalized) exact.push(monitor);
79
+ else if (name.startsWith(normalized)) prefix.push(monitor);
80
+ else if (name.includes(normalized)) substr.push(monitor);
81
+ }
82
+
83
+ return [...exact, ...prefix, ...substr]
84
+ .slice(0, 4)
85
+ .map((monitor) => ({ type: "monitor" as const, monitor, logo: getMonitorLogo(monitor) }));
86
+ }
87
+
88
+ export async function geocode(query: string): Promise<SearchResult[]> {
89
+ const proximity = await getProximity();
90
+ try {
91
+ const result = await geocoding.forward(query, {
92
+ country: ["us"],
93
+ fuzzyMatch: true,
94
+ limit: 4,
95
+ proximity
96
+ });
97
+ return result.features.map((feature) => ({ type: "geocode" as const, feature }));
98
+ } catch {
99
+ return [];
100
+ }
101
+ }
package/src/lib/utils.ts CHANGED
@@ -11,3 +11,14 @@ export type WithoutChild<T> = T extends { child?: any } ? Omit<T, "child"> : T;
11
11
  export type WithoutChildren<T> = T extends { children?: any } ? Omit<T, "children"> : T;
12
12
  export type WithoutChildrenOrChild<T> = WithoutChildren<WithoutChild<T>>;
13
13
  export type WithElementRef<T, U extends HTMLElement = HTMLElement> = T & { ref?: U | null };
14
+
15
+ export function debounce<T extends (...args: unknown[]) => void>(
16
+ fn: T,
17
+ wait: number
18
+ ): (...args: Parameters<T>) => void {
19
+ let timer: ReturnType<typeof setTimeout>;
20
+ return (...args: Parameters<T>) => {
21
+ clearTimeout(timer);
22
+ timer = setTimeout(() => fn(...args), wait);
23
+ };
24
+ }
@@ -1,73 +0,0 @@
1
- import * as e from "svelte/internal/client";
2
- import "svelte/internal/disclose-version";
3
- //#region src/lib/LoadScreen.svelte
4
- var t = e.proxy({
5
- enabled: !0,
6
- entered: !1
7
- });
8
- function n() {
9
- t.enabled ||= !0;
10
- }
11
- function r() {
12
- t.enabled &&= !1;
13
- }
14
- var i = e.from_html("<div class=\"absolute top-0 left-0 z-50 flex h-full w-full flex-col items-center justify-center gap-4 overflow-hidden bg-white\"><div><picture><source type=\"image/avif\"/><source type=\"image/webp\"/><source type=\"image/png\"/><img alt=\"SJVAir Icon\" width=\"458\" height=\"458\"/></picture> <picture><source type=\"image/avif\"/><source type=\"image/webp\"/><source type=\"image/png\"/><img alt=\"SJV\" width=\"755\" height=\"458\"/></picture> <picture><source type=\"image/avif\"/><source type=\"image/webp\"/><source type=\"image/png\"/><img alt=\"Air\" width=\"469\" height=\"458\"/></picture></div></div>");
15
- function a(n) {
16
- let r = () => {
17
- t.entered = !0;
18
- };
19
- var a = e.comment(), o = e.first_child(a), s = (n) => {
20
- var a = i(), o = e.child(a), s = e.child(o), c = e.child(s);
21
- e.set_attribute(c, "srcset", "/sjvair-icon.avif 229w, /sjvair-icon2.avif 458w");
22
- var l = e.sibling(c);
23
- e.set_attribute(l, "srcset", "/sjvair-icon.webp 229w, /sjvair-icon2.webp 458w");
24
- var u = e.sibling(l);
25
- e.set_attribute(u, "srcset", "/sjvair-icon.png 229w, /sjvair-icon2.png 458w");
26
- var d = e.sibling(u);
27
- e.set_attribute(d, "src", "/sjvair-icon2.png");
28
- let f;
29
- e.reset(s);
30
- var p = e.sibling(s, 2), m = e.child(p);
31
- e.set_attribute(m, "srcset", "/sjvair-sjv2.avif 378w, /sjvair-sjv.avif 755w");
32
- var h = e.sibling(m);
33
- e.set_attribute(h, "srcset", "/sjvair-sjv2.webp 378w, /sjvair-sjv.webp 755w");
34
- var g = e.sibling(h);
35
- e.set_attribute(g, "srcset", "/sjvair-sjv.png 378w, /sjvair-sjv2.png 755w");
36
- var _ = e.sibling(g);
37
- e.set_attribute(_, "src", "/sjvair-sjv2.png");
38
- let v;
39
- e.reset(p);
40
- var y = e.sibling(p, 2), b = e.child(y);
41
- e.set_attribute(b, "srcset", "/sjvair-air.avif 235w, /sjvair-air2.avif 469w");
42
- var x = e.sibling(b);
43
- e.set_attribute(x, "srcset", "/sjvair-air.webp 235w, /sjvair-air2.webp 469w");
44
- var S = e.sibling(x);
45
- e.set_attribute(S, "srcset", "/sjvair-air.png 235w, /sjvair-air2.png 469w");
46
- var C = e.sibling(S);
47
- e.set_attribute(C, "src", "/sjvair-air2.png");
48
- let w;
49
- e.reset(y), e.reset(o), e.reset(a), e.attach(a, () => r), e.template_effect(() => {
50
- f = e.set_class(d, 1, "icon inline-block h-24! w-auto! transition-all duration-500 ease-out", null, f, {
51
- "translate-x-0": t.entered,
52
- "-translate-x-full": !t.entered,
53
- "opacity-100": t.entered,
54
- "opacity-0": !t.entered
55
- }), v = e.set_class(_, 1, "sjv inline-block h-24! w-auto! transition-all duration-500 ease-out", null, v, {
56
- "translate-y-0": t.entered,
57
- "-translate-y-full": !t.entered,
58
- "opacity-100": t.entered,
59
- "opacity-0": !t.entered
60
- }), w = e.set_class(C, 1, "air inline-block h-24! w-auto! transition-all duration-500 ease-out", null, w, {
61
- "translate-y-0": t.entered,
62
- "translate-y-full": !t.entered,
63
- "opacity-100": t.entered,
64
- "opacity-0": !t.entered
65
- });
66
- }), e.append(n, a);
67
- };
68
- e.if(o, (e) => {
69
- t.enabled && e(s);
70
- }), e.append(n, a);
71
- }
72
- //#endregion
73
- export { a as default, r as disable, n as enable, t as loadScreenState };
@@ -1,4 +0,0 @@
1
- //#region src/lib/assets/icons/adjustment-horizontal.svg
2
- var e = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2024%2024'%20stroke-width='1.5'%20stroke='currentColor'%20class='size-6'%3e%3cpath%20stroke-linecap='round'%20stroke-linejoin='round'%20d='M10.5%206h9.75M10.5%206a1.5%201.5%200%201%201-3%200m3%200a1.5%201.5%200%201%200-3%200M3.75%206H7.5m3%2012h9.75m-9.75%200a1.5%201.5%200%200%201-3%200m3%200a1.5%201.5%200%200%200-3%200m-3.75%200H7.5m9-6h3.75m-3.75%200a1.5%201.5%200%200%201-3%200m3%200a1.5%201.5%200%200%200-3%200m-9.75%200h9.75'%20/%3e%3c/svg%3e";
3
- //#endregion
4
- export { e as default };