@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.
- package/dist/lib/LoadScreen.svelte +68 -0
- package/dist/lib/LoadScreen.svelte.d.ts +25 -0
- package/dist/lib/MainMapView.svelte +1 -0
- package/dist/lib/MainMapView.svelte.d.ts +26 -0
- package/dist/lib/MapLegend.svelte +15 -0
- package/dist/lib/MapLegend.svelte.d.ts +18 -0
- package/dist/lib/MonitorDetailPanel.svelte +152 -0
- package/dist/lib/MonitorDetailPanel.svelte.d.ts +3 -0
- package/dist/lib/MonitorMapLayout.svelte +193 -0
- package/dist/lib/MonitorMapLayout.svelte.d.ts +7 -0
- package/dist/lib/actions.d.ts +3 -0
- package/dist/lib/actions.js +12 -8
- package/dist/lib/assets/icons/adjustment-horizontal.svg +3 -0
- package/dist/lib/assets/logos/airgradient-blue.svg +63 -0
- package/dist/lib/assets/logos/airnow-compact.jpg +0 -0
- package/dist/lib/assets/logos/carb-compact.jpg +0 -0
- package/dist/lib/assets/logos/purpleair-compact.png +0 -0
- package/dist/lib/assets/logos/sjvair-parts/sjvair-air.webp +0 -0
- package/dist/lib/assets/logos/sjvair-parts/sjvair-icon.webp +0 -0
- package/dist/lib/assets/logos/sjvair-parts/sjvair-sjv.webp +0 -0
- package/dist/lib/assets/logos/sjvair-white.svg +115 -0
- package/dist/lib/assets/logos/sjvair.svg +96 -0
- package/dist/lib/collocation-sites/CollocationTooltip.svelte +98 -0
- package/dist/lib/collocation-sites/CollocationTooltip.svelte.d.ts +7 -0
- package/dist/lib/collocation-sites/collocation-utils.d.ts +3 -0
- package/dist/lib/collocation-sites/collocation-utils.js +30 -0
- package/dist/lib/collocation-sites/collocations-icon-manager.svelte.d.ts +7 -0
- package/dist/lib/collocation-sites/collocations-icon-manager.svelte.js +17 -20
- package/dist/lib/collocation-sites/collocations-map-integration.svelte.d.ts +18 -0
- package/dist/lib/collocation-sites/collocations-map-integration.svelte.js +98 -83
- package/dist/lib/collocation-sites/collocations.svelte.d.ts +9 -0
- package/dist/lib/collocation-sites/collocations.svelte.js +17 -26
- package/dist/lib/collocation-sites/types.d.ts +8 -0
- package/dist/lib/collocation-sites/types.js +1 -0
- package/dist/lib/colors.d.ts +17 -0
- package/dist/lib/colors.js +29 -23
- package/dist/lib/components/DataBox.svelte +29 -0
- package/dist/lib/components/DataBox.svelte.d.ts +9 -0
- package/dist/lib/components/DisplayOption.svelte +7 -0
- package/dist/lib/components/DisplayOption.svelte.d.ts +5 -0
- package/dist/lib/components/MapLayersDisplayOptions.svelte +42 -0
- package/dist/lib/components/MapLayersDisplayOptions.svelte.d.ts +18 -0
- package/dist/lib/components/SegmentedControl.svelte +61 -0
- package/dist/lib/components/SegmentedControl.svelte.d.ts +11 -0
- package/dist/lib/components/ToggleSwitch.svelte +93 -0
- package/dist/lib/components/ToggleSwitch.svelte.d.ts +9 -0
- package/dist/lib/components/ui/button/button.svelte +89 -0
- package/dist/lib/components/ui/button/button.svelte.d.ts +70 -0
- package/dist/lib/components/ui/button/index.d.ts +2 -0
- package/dist/lib/components/ui/button/index.js +4 -0
- package/dist/lib/components/ui/range-calendar/index.d.ts +19 -0
- package/dist/lib/components/ui/range-calendar/index.js +21 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-caption.svelte +76 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-caption.svelte.d.ts +19 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-cell.svelte +19 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-cell.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-day.svelte +36 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-day.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.svelte +7 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.svelte +7 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.svelte +12 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid.svelte +16 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-grid.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.svelte +19 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-header.svelte +19 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-header.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-heading.svelte +16 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-heading.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-month-select.svelte +44 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-month-select.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-month.svelte +15 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-month.svelte.d.ts +5 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-months.svelte +19 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-months.svelte.d.ts +5 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-nav.svelte +19 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-nav.svelte.d.ts +5 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-next-button.svelte +36 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-next-button.svelte.d.ts +8 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.svelte +36 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.svelte.d.ts +8 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-year-select.svelte +43 -0
- package/dist/lib/components/ui/range-calendar/range-calendar-year-select.svelte.d.ts +4 -0
- package/dist/lib/components/ui/range-calendar/range-calendar.svelte +112 -0
- package/dist/lib/components/ui/range-calendar/range-calendar.svelte.d.ts +21 -0
- package/dist/lib/data-chart/DataChart.svelte +303 -0
- package/dist/lib/data-chart/DataChart.svelte.d.ts +7 -0
- package/dist/lib/data-chart/DateRange.d.ts +6 -0
- package/dist/lib/data-chart/DateRange.js +15 -14
- package/dist/lib/data-chart/chart-utils.d.ts +3 -0
- package/dist/lib/data-chart/chart-utils.js +157 -93
- package/dist/lib/data-chart/data-chart.svelte.d.ts +7 -0
- package/dist/lib/data-chart/data-chart.svelte.js +7 -28
- package/dist/lib/data-chart/requests.d.ts +3 -0
- package/dist/lib/data-chart/requests.js +36 -28
- package/dist/lib/data-chart/tooltip.d.ts +10 -0
- package/dist/lib/data-chart/tooltip.js +160 -98
- package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte +16 -0
- package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte.d.ts +7 -0
- package/dist/lib/ev-stations/components/EvStationTooltip.svelte +127 -0
- package/dist/lib/ev-stations/components/EvStationTooltip.svelte.d.ts +7 -0
- package/dist/lib/ev-stations/components/EvStationsDisplayOptions.svelte +46 -0
- package/dist/lib/ev-stations/components/EvStationsDisplayOptions.svelte.d.ts +18 -0
- package/dist/lib/ev-stations/data-maps.d.ts +5 -0
- package/dist/lib/ev-stations/data-maps.js +152 -0
- package/dist/lib/ev-stations/ev-station-icons.d.ts +16 -0
- package/dist/lib/ev-stations/ev-station-icons.js +26 -0
- package/dist/lib/ev-stations/ev-stations-cluster-renderer.d.ts +19 -0
- package/dist/lib/ev-stations/ev-stations-cluster-renderer.js +131 -0
- package/dist/lib/ev-stations/ev-stations-map-integration.svelte.d.ts +31 -0
- package/dist/lib/ev-stations/ev-stations-map-integration.svelte.js +207 -0
- package/dist/lib/ev-stations/ev-stations.svelte.d.ts +9 -0
- package/dist/lib/ev-stations/ev-stations.svelte.js +55 -0
- package/dist/lib/ev-stations/types.d.ts +53 -0
- package/dist/lib/ev-stations/types.js +1 -0
- package/dist/lib/ev-stations/zip-codes.d.ts +13 -0
- package/dist/lib/ev-stations/zip-codes.js +458 -0
- package/dist/lib/hms/components/HMSFireLegend.svelte +21 -0
- package/dist/lib/hms/components/HMSFireLegend.svelte.d.ts +18 -0
- package/dist/lib/hms/hms-fire-icon-manager.d.ts +5 -0
- package/dist/lib/hms/hms-fire-icon-manager.js +28 -37
- package/dist/lib/hms/hms-fire-map-integration.svelte.d.ts +23 -0
- package/dist/lib/hms/hms-fire-map-integration.svelte.js +94 -97
- package/dist/lib/hms/hms-smoke-map-integration.svelte.d.ts +19 -0
- package/dist/lib/hms/hms-smoke-map-integration.svelte.js +68 -84
- package/dist/lib/hms/hms.svelte.d.ts +19 -0
- package/dist/lib/hms/hms.svelte.js +225 -76
- package/dist/lib/index.d.ts +68 -0
- package/dist/lib/index.js +56 -19
- package/dist/lib/map/Map.svelte +13 -0
- package/dist/lib/map/Map.svelte.d.ts +8 -0
- package/dist/lib/map/MapStyleDisplayOptions.svelte +61 -0
- package/dist/lib/map/MapStyleDisplayOptions.svelte.d.ts +3 -0
- package/dist/lib/map/Menu.svelte +64 -0
- package/dist/lib/map/Menu.svelte.d.ts +5 -0
- package/dist/lib/map/icons.d.ts +7 -0
- package/dist/lib/map/icons.js +24 -22
- package/dist/lib/map/integrations/base-layer-seperator.d.ts +9 -0
- package/dist/lib/map/integrations/base-layer-seperator.js +11 -12
- package/dist/lib/map/integrations/click-manager.d.ts +14 -0
- package/dist/lib/map/integrations/click-manager.js +52 -33
- package/dist/lib/map/integrations/integrations-manager.d.ts +8 -0
- package/dist/lib/map/integrations/integrations-manager.js +20 -12
- package/dist/lib/map/integrations/map-display-option.svelte.d.ts +7 -0
- package/dist/lib/map/integrations/map-display-option.svelte.js +10 -18
- package/dist/lib/map/integrations/map-geojson-integration.svelte.d.ts +13 -0
- package/dist/lib/map/integrations/map-geojson-integration.svelte.js +21 -17
- package/dist/lib/map/integrations/map-icon-manager.d.ts +15 -0
- package/dist/lib/map/integrations/map-icon-manager.js +52 -43
- package/dist/lib/map/integrations/map-integration.svelte.d.ts +6 -0
- package/dist/lib/map/integrations/map-integration.svelte.js +2 -5
- package/dist/lib/map/integrations/map-layer-integration.svelte.d.ts +11 -0
- package/dist/lib/map/integrations/map-layer-integration.svelte.js +36 -23
- package/dist/lib/map/integrations/tooltip.svelte.d.ts +28 -0
- package/dist/lib/map/integrations/tooltip.svelte.js +120 -78
- package/dist/lib/map/integrations/types.d.ts +14 -0
- package/dist/lib/map/integrations/types.js +1 -0
- package/dist/lib/map/map.svelte.d.ts +14 -0
- package/dist/lib/map/map.svelte.js +48 -50
- package/dist/lib/map/utils.d.ts +7 -0
- package/dist/lib/map/utils.js +33 -27
- package/dist/lib/monitors/components/MonitorClusterTooltip.svelte +112 -0
- package/dist/lib/monitors/components/MonitorClusterTooltip.svelte.d.ts +7 -0
- package/dist/lib/monitors/components/MonitorMarkersLegend.svelte +41 -0
- package/dist/lib/monitors/components/MonitorMarkersLegend.svelte.d.ts +3 -0
- package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte +128 -0
- package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte.d.ts +6 -0
- package/dist/lib/monitors/components/MonitorTooltip.svelte +61 -0
- package/dist/lib/monitors/components/MonitorTooltip.svelte.d.ts +7 -0
- package/dist/lib/monitors/components/MonitorWidgetModal.svelte +100 -0
- package/dist/lib/monitors/components/MonitorWidgetModal.svelte.d.ts +6 -0
- package/dist/lib/monitors/components/MonitorsDisplayOptions.svelte +79 -0
- package/dist/lib/monitors/components/MonitorsDisplayOptions.svelte.d.ts +3 -0
- package/dist/lib/monitors/monitor-utils.d.ts +4 -0
- package/dist/lib/monitors/monitor-utils.js +33 -23
- package/dist/lib/monitors/monitors-cluster-renderer.d.ts +33 -0
- package/dist/lib/monitors/monitors-cluster-renderer.js +218 -209
- package/dist/lib/monitors/monitors-icon-manager.svelte.d.ts +13 -0
- package/dist/lib/monitors/monitors-icon-manager.svelte.js +75 -70
- package/dist/lib/monitors/monitors-map-integration.svelte.d.ts +40 -0
- package/dist/lib/monitors/monitors-map-integration.svelte.js +278 -270
- package/dist/lib/monitors/monitors.svelte.d.ts +16 -0
- package/dist/lib/monitors/monitors.svelte.js +38 -67
- package/dist/lib/monitors/types.d.ts +26 -0
- package/dist/lib/monitors/types.js +1 -0
- package/dist/lib/reactivity.svelte.d.ts +0 -0
- package/dist/lib/reactivity.svelte.js +83 -0
- package/dist/lib/router-context.d.ts +27 -0
- package/dist/lib/router-context.js +13 -0
- package/dist/lib/routes.d.ts +2 -0
- package/dist/lib/routes.js +11 -0
- package/dist/lib/search/Search.svelte +189 -0
- package/dist/lib/search/Search.svelte.d.ts +3 -0
- package/dist/lib/search/service.d.ts +17 -0
- package/dist/lib/search/service.js +80 -0
- package/dist/lib/utils.d.ts +13 -0
- package/dist/lib/utils.js +11 -7
- package/dist/lib/weather.d.ts +1 -0
- package/dist/lib/weather.js +11 -7
- package/dist/lib/wind/wind.svelte.d.ts +10 -0
- package/dist/lib/wind/wind.svelte.js +13 -21
- package/package.json +45 -42
- package/src/lib/LoadScreen.svelte +5 -5
- package/src/lib/MainMapView.svelte +1 -0
- package/src/lib/MapLegend.svelte +15 -0
- package/src/lib/MonitorDetailPanel.svelte +152 -0
- package/src/lib/MonitorMapLayout.svelte +193 -0
- package/src/lib/components/MapLayersDisplayOptions.svelte +6 -2
- package/src/lib/hms/components/HMSFireLegend.svelte +21 -0
- package/src/lib/hms/hms.svelte.ts +8 -9
- package/src/lib/index.ts +52 -0
- package/src/lib/map/Map.svelte +1 -0
- package/src/lib/map/Menu.svelte +4 -7
- package/src/lib/map/integrations/map-icon-manager.ts +4 -1
- package/src/lib/monitors/monitors.svelte.ts +1 -3
- package/src/lib/router-context.ts +48 -0
- package/src/lib/routes.ts +13 -0
- package/src/lib/search/Search.svelte +189 -0
- package/src/lib/search/service.ts +101 -0
- package/src/lib/utils.ts +11 -0
- package/dist/lib/LoadScreen.js +0 -73
- package/dist/lib/assets/icons/adjustment-horizontal.js +0 -4
- package/dist/lib/collocation-sites/CollocationTooltip.js +0 -105
- package/dist/lib/components/DataBox.js +0 -30
- package/dist/lib/components/DisplayOption.js +0 -10
- package/dist/lib/components/MapLayersDisplayOptions.js +0 -78
- package/dist/lib/components/SegmentedControl.js +0 -37
- package/dist/lib/components/ToggleSwitch.js +0 -17
- package/dist/lib/components/ui/button/button.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-caption.js +0 -79
- package/dist/lib/components/ui/range-calendar/range-calendar-cell.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-day.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-body.js +0 -26
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-head.js +0 -26
- package/dist/lib/components/ui/range-calendar/range-calendar-grid-row.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-grid.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-head-cell.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-header.js +0 -34
- package/dist/lib/components/ui/range-calendar/range-calendar-month-select.js +0 -61
- package/dist/lib/components/ui/range-calendar/range-calendar-month.js +0 -25
- package/dist/lib/components/ui/range-calendar/range-calendar-months.js +0 -25
- package/dist/lib/components/ui/range-calendar/range-calendar-nav.js +0 -25
- package/dist/lib/components/ui/range-calendar/range-calendar-next-button.js +0 -57
- package/dist/lib/components/ui/range-calendar/range-calendar-prev-button.js +0 -57
- package/dist/lib/components/ui/range-calendar/range-calendar-year-select.js +0 -59
- package/dist/lib/components/ui/range-calendar/range-calendar.js +0 -272
- package/dist/lib/data-chart/DataChart.js +0 -142
- package/dist/lib/map/Map.js +0 -14
- package/dist/lib/map/MapStyleDisplayOptions.js +0 -43
- package/dist/lib/map/Menu.js +0 -45
- package/dist/lib/monitors/components/MonitorClusterTooltip.js +0 -83
- package/dist/lib/monitors/components/MonitorSubscriptionManager.js +0 -104
- package/dist/lib/monitors/components/MonitorTooltip.js +0 -59
- package/dist/lib/monitors/components/MonitorWidgetModal.js +0 -40
- package/dist/lib/monitors/components/MonitorsDisplayOptions.js +0 -76
- package/dist/lib/node_modules/@internationalized/date/dist/private/CalendarDate.js +0 -122
- package/dist/lib/node_modules/@internationalized/date/dist/private/DateFormatter.js +0 -84
- package/dist/lib/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js +0 -91
- package/dist/lib/node_modules/@internationalized/date/dist/private/conversion.js +0 -104
- package/dist/lib/node_modules/@internationalized/date/dist/private/manipulation.js +0 -159
- package/dist/lib/node_modules/@internationalized/date/dist/private/queries.js +0 -32
- package/dist/lib/node_modules/@internationalized/date/dist/private/string.js +0 -37
- package/dist/lib/node_modules/@internationalized/date/dist/private/utils.js +0 -6
- package/dist/lib/node_modules/clsx/dist/clsx.js +0 -16
- package/dist/lib/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -1723
- package/dist/lib/node_modules/tailwind-variants/dist/chunk-LQJYWU4O.js +0 -70
- package/dist/lib/node_modules/tailwind-variants/dist/chunk-RZF76H2U.js +0 -166
- package/dist/lib/node_modules/tailwind-variants/dist/index.js +0 -19
- package/dist/lib/node_modules/uplot/dist/uPlot.esm.js +0 -2147
- package/dist/lib/sjvair-air.avif +0 -0
- package/dist/lib/sjvair-air.png +0 -0
- package/dist/lib/sjvair-air.webp +0 -0
- package/dist/lib/sjvair-air2.avif +0 -0
- package/dist/lib/sjvair-air2.png +0 -0
- package/dist/lib/sjvair-air2.webp +0 -0
- package/dist/lib/sjvair-icon.avif +0 -0
- package/dist/lib/sjvair-icon.png +0 -0
- package/dist/lib/sjvair-icon.webp +0 -0
- package/dist/lib/sjvair-icon2.avif +0 -0
- package/dist/lib/sjvair-icon2.png +0 -0
- package/dist/lib/sjvair-icon2.webp +0 -0
- package/dist/lib/sjvair-sjv.avif +0 -0
- package/dist/lib/sjvair-sjv.png +0 -0
- package/dist/lib/sjvair-sjv.webp +0 -0
- package/dist/lib/sjvair-sjv2.avif +0 -0
- package/dist/lib/sjvair-sjv2.png +0 -0
- package/dist/lib/sjvair-sjv2.webp +0 -0
- package/dist/lib/src/MapView.js +0 -7
- package/dist/lib/src/MonitorDetailPanel.js +0 -169
- package/dist/lib/src/router.js +0 -9
- package/dist/monitor-map/MonitorDetailPanel.css +0 -1
- package/dist/monitor-map/assets/MonitorDetailPanel-BU_pXZjp.js +0 -15
- package/dist/monitor-map/assets/validate-routes-CgbRa8fT.js +0 -1
- package/dist/monitor-map/inter-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/monitor-map/inter-cyrillic-wght-normal.woff2 +0 -0
- package/dist/monitor-map/inter-greek-ext-wght-normal.woff2 +0 -0
- package/dist/monitor-map/inter-greek-wght-normal.woff2 +0 -0
- package/dist/monitor-map/inter-latin-ext-wght-normal.woff2 +0 -0
- package/dist/monitor-map/inter-latin-wght-normal.woff2 +0 -0
- package/dist/monitor-map/inter-vietnamese-wght-normal.woff2 +0 -0
- package/dist/monitor-map/lungs.svg +0 -99
- package/dist/monitor-map/sjvair-air.avif +0 -0
- package/dist/monitor-map/sjvair-air.png +0 -0
- package/dist/monitor-map/sjvair-air.webp +0 -0
- package/dist/monitor-map/sjvair-air2.avif +0 -0
- package/dist/monitor-map/sjvair-air2.png +0 -0
- package/dist/monitor-map/sjvair-air2.webp +0 -0
- package/dist/monitor-map/sjvair-icon.avif +0 -0
- package/dist/monitor-map/sjvair-icon.png +0 -0
- package/dist/monitor-map/sjvair-icon.webp +0 -0
- package/dist/monitor-map/sjvair-icon2.avif +0 -0
- package/dist/monitor-map/sjvair-icon2.png +0 -0
- package/dist/monitor-map/sjvair-icon2.webp +0 -0
- package/dist/monitor-map/sjvair-sjv.avif +0 -0
- package/dist/monitor-map/sjvair-sjv.png +0 -0
- package/dist/monitor-map/sjvair-sjv.webp +0 -0
- package/dist/monitor-map/sjvair-sjv2.avif +0 -0
- package/dist/monitor-map/sjvair-sjv2.png +0 -0
- package/dist/monitor-map/sjvair-sjv2.webp +0 -0
- package/dist/monitor-map/sjvairMonitorMap.css +0 -1
- 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";
|
package/src/lib/map/Map.svelte
CHANGED
package/src/lib/map/Menu.svelte
CHANGED
|
@@ -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="
|
|
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-
|
|
47
|
+
class="relative size-10 transition-all flex justify-center items-center"
|
|
47
48
|
aria-label="Display Options"
|
|
48
49
|
>
|
|
49
|
-
<
|
|
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
|
+
}
|
package/dist/lib/LoadScreen.js
DELETED
|
@@ -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 };
|