diff --git a/platform/package.json b/platform/package.json index 228427c896..3f3ccb081a 100644 --- a/platform/package.json +++ b/platform/package.json @@ -18,6 +18,7 @@ "@reduxjs/toolkit": "^1.9.2", "@svgr/webpack": "^6.4.0", "@tailwindcss/typography": "^0.5.9", + "@tippyjs/react": "^4.2.6", "autoprefixer": "^10.4.12", "axios": "^1.4.0", "daisyui": "^2.47.0", @@ -31,6 +32,7 @@ "jspdf": "^2.5.1", "jspdf-autotable": "^3.7.1", "jwt-decode": "^3.1.2", + "mapbox-gl": "^3.1.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40", "next": "^12.2.4", @@ -41,8 +43,9 @@ "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", "react-calendar": "^4.0.0", - "react-country-flag": "^3.1.0", "react-dom": "^18.2.0", + "react-map-gl": "^7.1.7", + "react-mapbox-gl": "^5.1.1", "react-redux": "^8.0.5", "react-tailwindcss-datepicker": "^1.4.2", "recharts": "^2.5.0", @@ -52,6 +55,7 @@ "sass": "^1.54.3", "tailwindcss": "^3.1.8", "timezones.json": "^1.7.1", + "tippy.js": "^6.3.7", "underscore": "^1.13.6" }, "devDependencies": { diff --git a/platform/public/icons/LocationIcon.js b/platform/public/icons/LocationIcon.js index de90bd1892..3fb8d3b3a5 100644 --- a/platform/public/icons/LocationIcon.js +++ b/platform/public/icons/LocationIcon.js @@ -8,20 +8,20 @@ const LocationIcon = ({ width, height, fill, strokeWidth }) => { height={height || '20'} viewBox='0 0 20 20' fill='none'> - + diff --git a/platform/public/icons/SideBar/world_Icon.js b/platform/public/icons/SideBar/world_Icon.js new file mode 100644 index 0000000000..22222f2608 --- /dev/null +++ b/platform/public/icons/SideBar/world_Icon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const world_Icon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default world_Icon; diff --git a/platform/public/icons/map/downArrow.js b/platform/public/icons/map/downArrow.js new file mode 100644 index 0000000000..567d7399de --- /dev/null +++ b/platform/public/icons/map/downArrow.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const downArrow = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default downArrow; diff --git a/platform/public/icons/map/gpsIcon.js b/platform/public/icons/map/gpsIcon.js new file mode 100644 index 0000000000..de20386c01 --- /dev/null +++ b/platform/public/icons/map/gpsIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const gpsIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default gpsIcon; diff --git a/platform/public/icons/map/homeIcon.js b/platform/public/icons/map/homeIcon.js new file mode 100644 index 0000000000..5ae09a89cb --- /dev/null +++ b/platform/public/icons/map/homeIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const homeIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default homeIcon; diff --git a/platform/public/icons/map/layerIcon.js b/platform/public/icons/map/layerIcon.js new file mode 100644 index 0000000000..36b5b34cf3 --- /dev/null +++ b/platform/public/icons/map/layerIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const layerIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default layerIcon; diff --git a/platform/public/icons/map/menuIcon.js b/platform/public/icons/map/menuIcon.js new file mode 100644 index 0000000000..a6bf258fb1 --- /dev/null +++ b/platform/public/icons/map/menuIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const menuIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default menuIcon; diff --git a/platform/public/icons/map/minusIcon.js b/platform/public/icons/map/minusIcon.js new file mode 100644 index 0000000000..64c4f6919d --- /dev/null +++ b/platform/public/icons/map/minusIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const minusIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default minusIcon; diff --git a/platform/public/icons/map/plusIcon.js b/platform/public/icons/map/plusIcon.js new file mode 100644 index 0000000000..4bd5f3e7c6 --- /dev/null +++ b/platform/public/icons/map/plusIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const plusIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default plusIcon; diff --git a/platform/public/icons/map/refreshIcon.js b/platform/public/icons/map/refreshIcon.js new file mode 100644 index 0000000000..28423a7089 --- /dev/null +++ b/platform/public/icons/map/refreshIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const refreshIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default refreshIcon; diff --git a/platform/public/icons/map/shareIcon.js b/platform/public/icons/map/shareIcon.js new file mode 100644 index 0000000000..60ada452fa --- /dev/null +++ b/platform/public/icons/map/shareIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const shareIcon = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default shareIcon; diff --git a/platform/public/icons/map/upArrow.js b/platform/public/icons/map/upArrow.js new file mode 100644 index 0000000000..e2b9400fb1 --- /dev/null +++ b/platform/public/icons/map/upArrow.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const upArrow = ({ width, height, fill }) => { + return ( + + + + ); +}; + +export default upArrow; diff --git a/platform/src/common/components/Layout/index.jsx b/platform/src/common/components/Layout/index.jsx index ac4e4444c8..b7fce8673e 100644 --- a/platform/src/common/components/Layout/index.jsx +++ b/platform/src/common/components/Layout/index.jsx @@ -13,11 +13,18 @@ import { useDispatch, useSelector } from 'react-redux'; import { fetchUserChecklists } from '@/lib/store/services/checklists/CheckData'; import { updateCards } from '@/lib/store/services/checklists/CheckList'; import Head from 'next/head'; +import { useRouter } from 'next/router'; -const Layout = ({ pageTitle = 'AirQo Analytics', children, topbarTitle, noBorderBottom }) => { +const Layout = ({ + pageTitle = 'AirQo Analytics', + children, + topbarTitle, + noBorderBottom, + noTopNav = true, +}) => { // Constants const MAX_WIDTH = '(max-width: 1024px)'; - + const router = useRouter(); const dispatch = useDispatch(); const chartData = useSelector((state) => state.chart); const userInfo = useSelector((state) => state.login.userInfo); @@ -78,6 +85,14 @@ const Layout = ({ pageTitle = 'AirQo Analytics', children, topbarTitle, noBorder useEffect(fetchData, [dispatch, userInfo]); + useEffect(() => { + if (router.pathname === '/map') { + setCollapsed(true); + } else { + setCollapsed(false); + } + }, [router.pathname]); + useEffect(() => { localStorage.setItem('collapsed', collapsed); }, [collapsed]); @@ -114,14 +129,16 @@ const Layout = ({ pageTitle = 'AirQo Analytics', children, topbarTitle, noBorder />
- + {noTopNav && ( + + )} {children}
diff --git a/platform/src/common/components/Map/AirQoMap.jsx b/platform/src/common/components/Map/AirQoMap.jsx new file mode 100644 index 0000000000..5b44495ce7 --- /dev/null +++ b/platform/src/common/components/Map/AirQoMap.jsx @@ -0,0 +1,154 @@ +import React, { useEffect, useRef, useState } from 'react'; +import mapboxgl from 'mapbox-gl'; +import LayerIcon from '@/icons/map/layerIcon'; +import RefreshIcon from '@/icons/map/refreshIcon'; +import ShareIcon from '@/icons/map/shareIcon'; +import { CustomGeolocateControl, CustomZoomControl } from './components/MapControls'; + +const AirQoMap = ({ + latitude = 0.3201412790664193, + longitude = 32.56389785939493, + zoom = 13, + customStyle, + mapboxApiAccessToken, +}) => { + const mapContainerRef = useRef(null); + const mapRef = useRef(null); + const dropdownRef = useRef(null); + const [mapStyle, setMapStyle] = useState('mapbox://styles/mapbox/streets-v11'); + const [isOpen, setIsOpen] = useState(false); + const [refresh, setRefresh] = useState(false); + + const mapStyles = [ + { url: 'mapbox://styles/mapbox/streets-v11', name: 'Streets' }, + { url: 'mapbox://styles/mapbox/outdoors-v11', name: 'Outdoors' }, + { url: 'mapbox://styles/mapbox/light-v10', name: 'Light' }, + { url: 'mapbox://styles/mapbox/dark-v10', name: 'Dark' }, + { url: 'mapbox://styles/mapbox/satellite-v9', name: 'Satellite' }, + { url: 'mapbox://styles/mapbox/satellite-streets-v11', name: 'Satellite Streets' }, + ]; + + useEffect(() => { + mapboxgl.accessToken = mapboxApiAccessToken; + + const map = new mapboxgl.Map({ + container: mapContainerRef.current, + style: mapStyle, + center: [longitude, latitude], + zoom: zoom, + }); + + mapRef.current = map; + + // Add controls upon map load + map.on('load', () => { + map.resize(); + + try { + const zoomControl = new CustomZoomControl(); + map.addControl(zoomControl, 'bottom-right'); + + const geolocateControl = new CustomGeolocateControl(); + map.addControl(geolocateControl, 'bottom-right'); + } catch (error) { + console.log('Error adding map controls', error); + } + }); + + return () => { + map.remove(); + }; + }, [mapStyle, mapboxApiAccessToken, refresh]); + + // generate code to close dropdown when clicked outside + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, [dropdownRef]); + + const refreshMap = () => { + const map = mapRef.current; + map.setStyle(map.getStyle()); + setRefresh(!refresh); + }; + + const shareLocation = () => { + try { + const map = mapRef.current; + const center = map.getCenter(); + const zoom = map.getZoom(); + const currentUrl = window.location.href; + + // Construct URL with labeled parameters + const url = new URL(currentUrl); + url.searchParams.set('lat', center.lat.toFixed(4)); + url.searchParams.set('lng', center.lng.toFixed(4)); + url.searchParams.set('zm', zoom.toFixed(2)); + + navigator.clipboard.writeText(url.toString()); + + alert('Location URL copied to clipboard'); + } catch (error) { + console.error('Error sharing location', error); + } + }; + + return ( + <> +
+
+
+
+
+ + {isOpen && ( +
+
+ {mapStyles.map((style, index) => ( + + ))} +
+
+ )} +
+
+ + +
+
+ + ); +}; + +export default AirQoMap; diff --git a/platform/src/common/components/Map/components/Legend.js b/platform/src/common/components/Map/components/Legend.js new file mode 100644 index 0000000000..37c824d66e --- /dev/null +++ b/platform/src/common/components/Map/components/Legend.js @@ -0,0 +1,82 @@ +import Tippy from '@tippyjs/react'; +import 'tippy.js/dist/tippy.css'; +import 'tippy.js/animations/scale.css'; +import 'tippy.js/themes/light.css'; +import React, { useState } from 'react'; +// Icons +import GoodAir from '@/icons/Charts/GoodAir'; +import ModerateAir from '@/icons/Charts/Moderate'; +import UnhealthyForSensitiveGroups from '@/icons/Charts/UnhealthySG'; +import Unhealthy from '@/icons/Charts/Unhealthy'; +import VeryUnhealthy from '@/icons/Charts/VeryUnhealthy'; +import Hazardous from '@/icons/Charts/Hazardous'; +import UpArrow from '@/icons/map/upArrow'; +import DownArrow from '@/icons/map/downArrow'; + +export const AirQualityLegend = () => { + const [show, setShow] = useState(true); + const levels = [ + { + range: '0μg/m3 - 12μg/m3', + label: 'Air Quality is Good', + icon: , + }, + { + range: '12.4μg/m3 - 25μg/m3 ', + label: 'Air Quality is Moderate', + icon: , + }, + { + range: '25.5μg/m3 - 37.4μg/m3', + label: 'Air Quality is Unhealthy for Sensitive Groups', + icon: , + }, + { + range: '37.5μg/m3 - 50μg/m3', + label: 'Air Quality is Unhealthy', + icon: , + }, + { + range: '50.5μg/m3 - 90μg/m3', + label: 'Air Quality is Very Unhealthy', + icon: , + }, + { + range: '90.5μg/m3 - 500μg/m3', + label: 'Air Quality is Hazardous', + icon: , + }, + ]; + + return ( +
+ + {show && + levels.map((level, index) => ( + +

{level.label}

+

{level.range}

+
+ } + key={index} + offset={[0, 20]} + placement='right' + theme='light' + animation={'scale'}> + + + ))} +
+ ); +}; diff --git a/platform/src/common/components/Map/components/MapControls.js b/platform/src/common/components/Map/components/MapControls.js new file mode 100644 index 0000000000..5d0e76270a --- /dev/null +++ b/platform/src/common/components/Map/components/MapControls.js @@ -0,0 +1,163 @@ +import GeoIcon from '@/icons/map/gpsIcon'; +import React from 'react'; +import PlusIcon from '@/icons/map/plusIcon'; +import MinusIcon from '@/icons/map/minusIcon'; +import { createRoot } from 'react-dom/client'; +import mapboxgl from 'mapbox-gl'; + +export class CustomZoomControl { + constructor() { + this.container = this.createContainer(); + this.zoomInButton = this.createButton('Zoom In', , () => this.map?.zoomIn()); + this.zoomOutButton = this.createButton('Zoom Out', , () => this.map?.zoomOut()); + + this.container.append(this.zoomInButton, this.createSeparator(), this.zoomOutButton); + } + + createContainer() { + const container = document.createElement('div'); + container.className = + 'mapboxgl-ctrl mapboxgl-ctrl-group flex flex-col bg-white rounded-full shadow-md overflow-hidden'; + return container; + } + + createButton(title, component, onClick) { + const button = document.createElement('button'); + button.className = 'mapboxgl-ctrl-icon rounded-full p-2 m-2 flex items-center justify-center'; + button.type = 'button'; + button.title = title; + button.addEventListener('click', onClick); + + const div = document.createElement('div'); + div.className = 'flex items-center justify-center h-full w-full'; + + button.appendChild(div); + + const root = createRoot(div); + root.render(React.cloneElement(component)); + + return button; + } + + createSeparator() { + const separator = document.createElement('div'); + separator.className = 'border-t border-gray-300 w-full'; + return separator; + } + + onAdd(map) { + this.map = map; + return this.container; + } + + onRemove() { + this.container.parentNode.removeChild(this.container); + this.map = undefined; + } +} + +export class CustomGeolocateControl { + constructor() { + this.container = this.createContainer(); + this.geolocateButton = this.createButton('Locate Me', , () => this.locate()); + this.container.appendChild(this.geolocateButton); + } + + createContainer() { + const container = document.createElement('div'); + container.className = + 'mapboxgl-ctrl mapboxgl-ctrl-group flex flex-col items-center justify-center rounded-full shadow-md overflow-hidden bg-white p-2 m-2'; + return container; + } + + createButton(title, component, onClick) { + const button = document.createElement('button'); + button.className = + 'inline-flex items-center justify-center w-[50px] h-[50px] rounded-full bg-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'; + button.type = 'button'; + button.title = title; + + const div = document.createElement('div'); + div.className = 'flex items-center justify-center h-full w-full'; + + button.appendChild(div); + + const root = createRoot(div); + root.render(React.cloneElement(component)); + + button.addEventListener('click', onClick); + return button; + } + + onAdd(map) { + this.map = map; + return this.container; + } + + onRemove() { + this.container.parentNode.removeChild(this.container); + this.map = undefined; + } + + locate() { + if (!navigator.geolocation) { + alert('Geolocation is not supported by your browser.'); + return; + } + + navigator.geolocation.getCurrentPosition( + (position) => { + this.map.flyTo({ + center: [position.coords.longitude, position.coords.latitude], + zoom: 14, + speed: 1, + }); + + // Create and add the marker + new mapboxgl.Marker({ + color: 'blue', + scale: 0.5, + }) + .setLngLat([position.coords.longitude, position.coords.latitude]) + .addTo(this.map); + + // Add a source and layer for the circle + this.map.addSource('circle-source', { + type: 'geojson', + data: { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [position.coords.longitude, position.coords.latitude], + }, + }, + ], + }, + }); + + this.map.addLayer({ + id: 'circle-layer', + type: 'circle', + source: 'circle-source', + paint: { + 'circle-radius': 50, + 'circle-color': '#0000ff', + 'circle-opacity': 0.2, + }, + }); + }, + (error) => { + console.error('Geolocation error:', error); + // Handle errors appropriately + }, + { + enableHighAccuracy: true, // Use high accuracy + timeout: 5000, + maximumAge: 0, + }, + ); + } +} diff --git a/platform/src/common/components/Map/components/countries.json b/platform/src/common/components/Map/components/countries.json new file mode 100644 index 0000000000..b5bfd12eac --- /dev/null +++ b/platform/src/common/components/Map/components/countries.json @@ -0,0 +1,1305 @@ +[ + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1e8.svg", + "country": "Ascension Island", + "code": "ac" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1e9.svg", + "country": "Andorra", + "code": "ad" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ea.svg", + "country": "United Arab Emirates", + "code": "ae" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1eb.svg", + "country": "Afghanistan", + "code": "af" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ec.svg", + "country": "Antigua & Barbuda", + "code": "ag" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ee.svg", + "country": "Anguilla", + "code": "ai" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f1.svg", + "country": "Albania", + "code": "al" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f2.svg", + "country": "Armenia", + "code": "am" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f4.svg", + "country": "Angola", + "code": "ad" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f6.svg", + "country": "Antarctica", + "code": "aq" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f7.svg", + "country": "Argentina", + "code": "ar" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f8.svg", + "country": "American Samoa", + "code": "as" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1f9.svg", + "country": "Austria", + "code": "at" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1fa.svg", + "country": "Australia", + "code": "au" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1fc.svg", + "country": "Aruba", + "code": "aw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1fd.svg", + "country": "Åland Islands", + "code": "ax" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e6-1f1ff.svg", + "country": "Azerbaijan", + "code": "az" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1e6.svg", + "country": "Bosnia & Herzegovina", + "code": "ba" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1e7.svg", + "country": "Barbados", + "code": "bb" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1e9.svg", + "country": "Bangladesh", + "code": "bd" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ea.svg", + "country": "Belgium", + "code": "be" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1eb.svg", + "country": "Burkina Faso", + "code": "bf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ec.svg", + "country": "Bulgaria", + "code": "bg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ed.svg", + "country": "Bahrain", + "code": "bh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ee.svg", + "country": "Burundi", + "code": "bi" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ef.svg", + "country": "Benin", + "code": "bj" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f1.svg", + "country": "St. Barthélemy", + "code": "bl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f2.svg", + "country": "Bermuda", + "code": "bm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f3.svg", + "country": "Brunei", + "code": "bn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f4.svg", + "country": "Bolivia", + "code": "bo" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f6.svg", + "country": "Caribbean Netherlands" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f7.svg", + "country": "Brazil", + "code": "br" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f8.svg", + "country": "Bahamas", + "code": "bs" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1f9.svg", + "country": "Bhutan", + "code": "bt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1fb.svg", + "country": "Bouvet Island", + "code": "bv" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1fc.svg", + "country": "Botswana", + "code": "bw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1fe.svg", + "country": "Belarus", + "code": "by" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e7-1f1ff.svg", + "country": "Belize", + "code": "bz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1e6.svg", + "country": "Canada", + "code": "ca" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1e8.svg", + "country": "Cocos (Keeling) Islands", + "code": "cc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1e9.svg", + "country": "Congo - Kinshasa", + "code": "cg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1eb.svg", + "country": "Central African Republic", + "code": "cf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ec.svg", + "country": "Congo - Brazzaville", + "code": "cd" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ed.svg", + "country": "Switzerland", + "code": "ch" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ee.svg", + "country": "Côte d’Ivoire", + "code": "ci" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f0.svg", + "country": "Cook Islands", + "code": "ck" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f1.svg", + "country": "Chile", + "code": "cl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f2.svg", + "country": "Cameroon", + "code": "cm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f3.svg", + "country": "China", + "code": "cn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f4.svg", + "country": "Colombia", + "code": "co" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f5.svg", + "country": "Clipperton Island", + "code": "cp" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1f7.svg", + "country": "Costa Rica", + "code": "cr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fa.svg", + "country": "Cuba", + "code": "cu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fb.svg", + "country": "Cape Verde", + "code": "cv" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fc.svg", + "country": "Curaçao", + "code": "cw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fd.svg", + "country": "Christmas Island", + "code": "cx" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1fe.svg", + "country": "Cyprus", + "code": "cy" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e8-1f1ff.svg", + "country": "Czechia", + "code": "cz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ea.svg", + "country": "Germany", + "code": "de" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ec.svg", + "country": "Diego Garcia", + "code": "dg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ef.svg", + "country": "Djibouti", + "code": "dj" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1f0.svg", + "country": "Denmark", + "code": "dk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1f2.svg", + "country": "Dominica", + "code": "dm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1f4.svg", + "country": "Dominican Republic", + "code": "do" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1e9-1f1ff.svg", + "country": "Algeria", + "code": "dz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1e6.svg", + "country": "Ceuta & Melilla", + "code": "ea" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1e8.svg", + "country": "Ecuador", + "code": "ec" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1ea.svg", + "country": "Estonia", + "code": "ee" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1ec.svg", + "country": "Egypt", + "code": "eg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1ed.svg", + "country": "Western Sahara", + "code": "eh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1f7.svg", + "country": "Eritrea", + "code": "er" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1f8.svg", + "country": "Spain", + "code": "es" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1f9.svg", + "country": "Ethiopia", + "code": "et" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ea-1f1fa.svg", + "country": "European Union", + "code": "eu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1eb-1f1ee.svg", + "country": "Finland", + "code": "fi" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1eb-1f1ef.svg", + "country": "Fiji", + "code": "fj" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f0.svg", + "country": "Falkland Islands", + "code": "fk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f2.svg", + "country": "Micronesia", + "code": "fm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f4.svg", + "country": "Faroe Islands", + "code": "fo" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1eb-1f1f7.svg", + "country": "France", + "code": "fr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1e6.svg", + "country": "Gabon", + "code": "ga" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1e7.svg", + "country": "United Kingdom", + "code": "gb" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1e9.svg", + "country": "Grenada", + "code": "gd" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ea.svg", + "country": "Georgia", + "code": "ge" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1eb.svg", + "country": "French Guiana", + "code": "gf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ec.svg", + "country": "Guernsey", + "code": "gg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ed.svg", + "country": "Ghana", + "code": "gh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1ee.svg", + "country": "Gibraltar", + "code": "gi" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f1.svg", + "country": "Greenland", + "code": "gl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f2.svg", + "country": "Gambia", + "code": "gm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f3.svg", + "country": "Guinea", + "code": "gn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f5.svg", + "country": "Guadeloupe", + "code": "gp" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f6.svg", + "country": "Equatorial Guinea", + "code": "gq" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f7.svg", + "country": "Greece", + "code": "gr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f8.svg", + "country": "South Georgia & South', Sandwich Islands", + "code": "gs" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1f9.svg", + "country": "Guatemala", + "code": "gt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1fa.svg", + "country": "Guam", + "code": "gu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1fc.svg", + "country": "Guinea-Bissau", + "code": "gw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ec-1f1fe.svg", + "country": "Guyana", + "code": "gy" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f0.svg", + "country": "Hong Kong SAR China", + "code": "hk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f2.svg", + "country": "Heard & McDonald Islands", + "code": "hm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f3.svg", + "country": "Honduras", + "code": "hn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f7.svg", + "country": "Croatia", + "code": "hr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ed-1f1f9.svg", + "country": "Haiti", + "code": "ht" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ed-1f1fa.svg", + "country": "Hungary", + "code": "hu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1e8.svg", + "country": "Canary Islands", + "code": "ic" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1e9.svg", + "country": "Indonesia", + "code": "id" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1ea.svg", + "country": "Ireland", + "code": "ie" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f1.svg", + "country": "Israel", + "code": "il" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f2.svg", + "country": "Isle of Man", + "code": "im" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f3.svg", + "country": "India", + "code": "in" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f4.svg", + "country": "British Indian Ocean Territory", + "code": "io" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f6.svg", + "country": "Iraq", + "code": "iq" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f7.svg", + "country": "Iran" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f8.svg", + "country": "Iceland", + "code": "is" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ee-1f1f9.svg", + "country": "Italy", + "code": "it" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ef-1f1ea.svg", + "country": "Jersey", + "code": "je" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ef-1f1f2.svg", + "country": "Jamaica", + "code": "jm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ef-1f1f4.svg", + "country": "Jordan", + "code": "jo" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ef-1f1f5.svg", + "country": "Japan", + "code": "jp" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ea.svg", + "country": "Kenya", + "code": "ke" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ec.svg", + "country": "Kyrgyzstan", + "code": "kg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ed.svg", + "country": "Cambodia", + "code": "kh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ee.svg", + "country": "Kiribati", + "code": "ki" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f2.svg", + "country": "Comoros", + "code": "km" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f3.svg", + "country": "St. Kitts & Nevis", + "code": "kn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f5.svg", + "country": "North Korea", + "code": "kp" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1f7.svg", + "country": "South Korea", + "code": "kr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1fc.svg", + "country": "Kuwait", + "code": "kw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1fe.svg", + "country": "Cayman Islands", + "code": "ky" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f0-1f1ff.svg", + "country": "Kazakhstan", + "code": "kz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1e6.svg", + "country": "Laos", + "code": "la" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1e7.svg", + "country": "Lebanon", + "code": "lb" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1e8.svg", + "country": "St. Lucia", + "code": "lc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1ee.svg", + "country": "Liechtenstein", + "code": "li" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f0.svg", + "country": "Sri Lanka", + "code": "lk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f7.svg", + "country": "Liberia", + "code": "lr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f8.svg", + "country": "Lesotho", + "code": "ls" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1f9.svg", + "country": "Lithuania", + "code": "lt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1fa.svg", + "country": "Luxembourg", + "code": "lu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1fb.svg", + "country": "Latvia", + "code": "lv" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f1-1f1fe.svg", + "country": "Libya", + "code": "ly" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1e6.svg", + "country": "Morocco", + "code": "ma" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1e8.svg", + "country": "Monaco", + "code": "mc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1e9.svg", + "country": "Moldova", + "code": "md" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ea.svg", + "country": "Montenegro", + "code": "me" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1eb.svg", + "country": "St. Martin", + "code": "mf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ec.svg", + "country": "Madagascar", + "code": "mg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ed.svg", + "country": "Marshall Islands", + "code": "mh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f0.svg", + "country": "North Macedonia", + "code": "mk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f1.svg", + "country": "Mali", + "code": "ml" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f2.svg", + "country": "Myanmar (Burma)", + "code": "mm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f3.svg", + "country": "Mongolia", + "code": "mn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f4.svg", + "country": "Macao Sar China", + "code": "mo" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f5.svg", + "country": "Northern Mariana Islands", + "code": "mp" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f6.svg", + "country": "Martinique", + "code": "mq" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f7.svg", + "country": "Mauritania", + "code": "mr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f8.svg", + "country": "Montserrat", + "code": "ms" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1f9.svg", + "country": "Malta", + "code": "mt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fa.svg", + "country": "Mauritius", + "code": "mu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fb.svg", + "country": "Maldives", + "code": "mv" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fc.svg", + "country": "Malawi", + "code": "mw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fd.svg", + "country": "Mexico", + "code": "mx" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1fe.svg", + "country": "Malaysia", + "code": "my" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f2-1f1ff.svg", + "country": "Mozambique", + "code": "mz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1e6.svg", + "country": "Namibia", + "code": "na" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1e8.svg", + "country": "New Caledonia", + "code": "nc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ea.svg", + "country": "Niger", + "code": "ne" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1eb.svg", + "country": "Norfolk Island", + "code": "nf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ec.svg", + "country": "Nigeria", + "code": "ng" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ee.svg", + "country": "Nicaragua", + "code": "ni" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f1.svg", + "country": "Netherlands", + "code": "nl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f4.svg", + "country": "Norway", + "code": "no" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f5.svg", + "country": "Nepal", + "code": "np" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1f7.svg", + "country": "Nauru", + "code": "nr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1fa.svg", + "country": "Niue", + "code": "nu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f3-1f1ff.svg", + "country": "New Zealand", + "code": "nz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f4-1f1f2.svg", + "country": "Oman", + "code": "om" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1e6.svg", + "country": "Panama", + "code": "pa" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1ea.svg", + "country": "Peru", + "code": "pe" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1eb.svg", + "country": "French Polynesia", + "code": "pf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1ec.svg", + "country": "Papua New Guinea", + "code": "pg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1ed.svg", + "country": "Philippines", + "code": "ph" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f0.svg", + "country": "Pakistan", + "code": "pk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f1.svg", + "country": "Poland", + "code": "pl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f2.svg", + "country": "St. Pierre & Miquelon", + "code": "pm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f3.svg", + "country": "Pitcairn Islands", + "code": "pn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f7.svg", + "country": "Puerto Rico", + "code": "pr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f8.svg", + "country": "Palestinian Territories", + "code": "ps" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1f9.svg", + "country": "Portugal", + "code": "pt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1fc.svg", + "country": "Palau", + "code": "pw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f5-1f1fe.svg", + "country": "Paraguay", + "code": "py" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f6-1f1e6.svg", + "country": "Qatar", + "code": "qa" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f7-1f1ea.svg", + "country": "Réunion", + "code": "re" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f7-1f1f4.svg", + "country": "Romania", + "code": "ro" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f7-1f1f8.svg", + "country": "Serbia", + "code": "yu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f7-1f1fa.svg", + "country": "Russia", + "code": "ru" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f7-1f1fc.svg", + "country": "Rwanda", + "code": "rw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e6.svg", + "country": "Saudi Arabia", + "code": "sa" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e7.svg", + "country": "Solomon Islands", + "code": "sb" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e8.svg", + "country": "Seychelles", + "code": "sc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1e9.svg", + "country": "Sudan", + "code": "sd" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ea.svg", + "country": "Sweden", + "code": "se" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ec.svg", + "country": "Singapore", + "code": "sg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ed.svg", + "country": "St. Helena", + "code": "sh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ee.svg", + "country": "Slovenia", + "code": "si" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ef.svg", + "country": "Svalbard & Jan Mayen", + "code": "sj" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f0.svg", + "country": "Slovakia", + "code": "sk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f1.svg", + "country": "Sierra Leone", + "code": "sl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f2.svg", + "country": "San Marino", + "code": "sm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f3.svg", + "country": "Senegal", + "code": "sn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f4.svg", + "country": "Somalia", + "code": "so" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f7.svg", + "country": "Suriname", + "code": "sr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f8.svg", + "country": "South Sudan", + "code": "ss" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1f9.svg", + "country": "São Tomé & Príncipe", + "code": "st" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1fb.svg", + "country": "El Salvador", + "code": "sv" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1fd.svg", + "country": "Sint Maarten", + "code": "sx" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1fe.svg", + "country": "Syria", + "code": "sy" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f8-1f1ff.svg", + "country": "Eswatini", + "code": "sz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1e6.svg", + "country": "Tristan Da Cunha", + "code": "sh" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1e8.svg", + "country": "Turks & Caicos Islands", + "code": "tc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1e9.svg", + "country": "Chad", + "code": "td" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1eb.svg", + "country": "French Southern Territories", + "code": "tf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ec.svg", + "country": "Togo", + "code": "tg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ed.svg", + "country": "Thailand", + "code": "th" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ef.svg", + "country": "Tajikistan", + "code": "tj" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f0.svg", + "country": "Tokelau", + "code": "tk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f1.svg", + "country": "Timor-Leste", + "code": "tl" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f2.svg", + "country": "Turkmenistan", + "code": "tm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f3.svg", + "country": "Tunisia", + "code": "tn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f4.svg", + "country": "Tonga", + "code": "to" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f7.svg", + "country": "Turkey", + "code": "tr" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1f9.svg", + "country": "Trinidad & Tobago", + "code": "tt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1fb.svg", + "country": "Tuvalu", + "code": "tv" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1fc.svg", + "country": "Taiwan", + "code": "tw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1f9-1f1ff.svg", + "country": "Tanzania", + "code": "tz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1e6.svg", + "country": "Ukraine", + "code": "ua" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1ec.svg", + "country": "Uganda", + "code": "ug" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1f2.svg", + "country": "U.S. Outlying Islands", + "code": "um" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1f3.svg", + "country": "United Nations", + "code": "un" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1f8.svg", + "country": "United States", + "code": "us" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1fe.svg", + "country": "Uruguay", + "code": "uy" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fa-1f1ff.svg", + "country": "Uzbekistan", + "code": "uz" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1e6.svg", + "country": "Vatican City", + "code": "va" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1e8.svg", + "country": "St. Vincent & Grenadines", + "code": "vc" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1ea.svg", + "country": "Venezuela", + "code": "ve" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1ec.svg", + "country": "British Virgin Islands", + "code": "vg" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1ee.svg", + "country": "U.S. Virgin Islands", + "code": "vi" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1f3.svg", + "country": "Vietnam", + "code": "vn" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fb-1f1fa.svg", + "country": "Vanuatu", + "code": "vu" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fc-1f1eb.svg", + "country": "Wallis & Futuna", + "code": "wf" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fc-1f1f8.svg", + "country": "Samoa", + "code": "ws" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fd-1f1f0.svg", + "country": "Kosovo", + "code": "xk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fe-1f1ea.svg", + "country": "Yemen", + "code": "ye" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1fe-1f1f9.svg", + "country": "Mayotte", + "code": "yt" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ff-1f1e6.svg", + "country": "South Africa", + "code": "za" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ff-1f1f2.svg", + "country": "Zambia", + "code": "zm" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f1ff-1f1fc.svg", + "country": "Zimbabwe", + "code": "zw" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg", + "country": "England", + "code": "uk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg", + "country": "Scotland", + "code": "uk" + }, + { + "flag": "https://twemoji.maxcdn.com/2/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg", + "country": "Wales", + "code": "uk" + } +] diff --git a/platform/src/common/components/SideBar/AuthenticatedSidebar.jsx b/platform/src/common/components/SideBar/AuthenticatedSidebar.jsx index 73fd090be2..c52f2b1d62 100644 --- a/platform/src/common/components/SideBar/AuthenticatedSidebar.jsx +++ b/platform/src/common/components/SideBar/AuthenticatedSidebar.jsx @@ -4,6 +4,7 @@ import { useWindowSize } from '@/lib/windowSize'; import SideBarItem, { SideBarDropdownItem, SidebarIconItem } from './SideBarItem'; import AirqoLogo from '@/icons/airqo_logo.svg'; import CloseIcon from '@/icons/close_icon'; +import WorldIcon from '@/icons/SideBar/world_Icon'; import HomeIcon from '@/icons/SideBar/HomeIcon'; import SettingsIcon from '@/icons/SideBar/SettingsIcon'; import BarChartIcon from '@/icons/SideBar/BarChartIcon'; @@ -59,8 +60,7 @@ const AuthenticatedSideBar = ({ toggleDrawer, setToggleDrawer, collapsed, setCol
= 1024 ? 'flex' : sideBarDisplayStyle - } bg-white h-[calc(100vh)] lg:relative flex-col justify-between overflow-y-auto border-t-0 border-r-[1px] border-r-grey-750 scrollbar-thin scrollbar-thumb-gray-800 scrollbar-track-gray-200`} - > + } bg-white h-[calc(100vh)] lg:relative flex-col justify-between overflow-y-auto border-t-0 border-r-[1px] border-r-grey-750 scrollbar-thin scrollbar-thumb-gray-800 scrollbar-track-gray-200`}>
@@ -70,8 +70,7 @@ const AuthenticatedSideBar = ({ toggleDrawer, setToggleDrawer, collapsed, setCol
@@ -87,12 +86,12 @@ const AuthenticatedSideBar = ({ toggleDrawer, setToggleDrawer, collapsed, setCol Icon={CollocateIcon} dropdown toggleMethod={() => setCollocationOpen(!collocationOpen)} - toggleState={collocationOpen} - > + toggleState={collocationOpen}> )} +
@@ -105,8 +104,7 @@ const AuthenticatedSideBar = ({ toggleDrawer, setToggleDrawer, collapsed, setCol
= 1024 ? 'flex' : sideBarDisplayStyle - } bg-white h-[calc(100vh)] lg:relative flex-col justify-between overflow-y-auto border-t-0 border-r-[1px] border-r-grey-750 scrollbar-thin scrollbar-thumb-gray-800 scrollbar-track-gray-200`} - > + } bg-white h-[calc(100vh)] lg:relative flex-col justify-between overflow-y-auto border-t-0 border-r-[1px] border-r-grey-750 scrollbar-thin scrollbar-thumb-gray-800 scrollbar-track-gray-200`}>
@@ -118,6 +116,7 @@ const AuthenticatedSideBar = ({ toggleDrawer, setToggleDrawer, collapsed, setCol {checkAccess('CREATE_UPDATE_AND_DELETE_NETWORK_DEVICES') && ( )} +
diff --git a/platform/src/common/styles/global.scss b/platform/src/common/styles/global.scss index 959edc1c3b..d74d56e474 100644 --- a/platform/src/common/styles/global.scss +++ b/platform/src/common/styles/global.scss @@ -19,6 +19,11 @@ select:focus { outline: none !important; } +.custom-scrollbar::-webkit-scrollbar { + display: none; + height: 0; +} + /* Hide the default scrollbar */ ::-webkit-scrollbar { width: 8px; diff --git a/platform/src/pages/_document.jsx b/platform/src/pages/_document.jsx index 9d5e74beab..4bc02404de 100644 --- a/platform/src/pages/_document.jsx +++ b/platform/src/pages/_document.jsx @@ -13,6 +13,7 @@ class MyDocument extends Document { + { + return ( +
+
+
setSelectedTab('locations')} + className={`px-3 py-2 flex justify-center items-center w-full hover:cursor-pointer text-sm font-medium text-secondary-neutral-light-600${ + selectedTab === 'locations' ? 'border rounded-md bg-white shadow-sm' : '' + }`}> + Locations +
+
setSelectedTab('sites')} + className={`px-3 py-2 flex justify-center items-center w-full hover:cursor-pointer text-sm font-medium text-secondary-neutral-light-600${ + selectedTab === 'sites' ? 'border rounded-md bg-white shadow-sm' : '' + }`}> + Sites +
+
setSelectedTab('airqlouds')} + className={`px-3 py-2 flex justify-center items-center w-full hover:cursor-pointer text-sm font-medium text-secondary-neutral-light-600${ + selectedTab === 'airqlouds' ? 'border rounded-md bg-white shadow-sm' : '' + }`}> + AirQlouds +
+
+
+ ); +}; + +const SearchField = () => { + return ( +
+
+ +
+ +
+ ); +}; + +const filteredCountries = allCountries.filter((country) => + countries.find((c) => c.name === country.country), +); + +const CountryList = ({ selectedCountry, setSelectedCountry }) => ( +
+ {filteredCountries.map((country, index) => ( +
setSelectedCountry(country)}> + {country.country} + {country.country} +
+ ))} +
+); + +const index = () => { + const router = useRouter(); + const [location, setLocation] = useState(); + const [showSideBar, setShowSideBar] = useState(true); + const [selectedTab, setSelectedTab] = useState('locations'); + const [selectedCountry, setSelectedCountry] = useState(null); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth < 768 && router.pathname === '/map') { + setShowSideBar(false); + } else { + localStorage.setItem('collapsed', true); + setShowSideBar(true); + } + }; + window.addEventListener('resize', handleResize); + handleResize(); + return () => window.removeEventListener('resize', handleResize); + }, [router.pathname]); + + const handleHomeClick = () => { + router.push('/Home'); + }; + + const handleSelectedTab = (tab) => { + setSelectedTab(tab); + }; + + const handleLocationSelect = () => { + setLocation(); + }; + + const locations = [ + { + id: 1, + name: 'Kampala', + country: 'Central, Uganda', + }, + { + id: 2, + name: 'Nairobi', + country: 'Central, Kenya', + }, + { + id: 3, + name: 'kiambu', + country: 'Eastern, Kenya', + }, + { + id: 4, + name: 'Kitgum', + country: 'Northern, Uganda', + }, + { + id: 5, + name: 'Kigaali', + country: 'Central, Rwanda', + }, + ]; + + return ( + +
+
+ {showSideBar && ( +
+
+
+
+ +
+ +
+

+ Navigate, Explore, and Understand Air Quality Data with Precision, Right Down to + Your Neighborhood +

+ +
+
+
+ +
+ + +
+
+ +
+
+ {locations.map((location) => ( +
{ + handleLocationSelect(); + }}> +
+ +
+
+ + {location.name} + + + {location.country} + +
+
+ ))} +
+
+
+
+
+ )} +
+ +
+
+
+ {!showSideBar && ( +
+
+ + +
+
+ )} + +
+
+
+ ); +}; + +export default index; diff --git a/platform/yarn.lock b/platform/yarn.lock index 813cec132c..de0fbd380b 100644 --- a/platform/yarn.lock +++ b/platform/yarn.lock @@ -1355,6 +1355,63 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@mapbox/geojson-rewind@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz#591a5d71a9cd1da1a0bf3420b3bea31b0fc7946a" + integrity sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.6" + +"@mapbox/jsonlint-lines-primitives@^2.0.2", "@mapbox/jsonlint-lines-primitives@~2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== + +"@mapbox/mapbox-gl-supported@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz#c15367178d8bfe4765e6b47b542fe821ce259c7b" + integrity sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ== + +"@mapbox/tiny-sdf@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz#9a1d33e5018093e88f6a4df2343e886056287282" + integrity sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA== + +"@mapbox/unitbezier@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz#d32deb66c7177e9e9dfc3bbd697083e2e657ff01" + integrity sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw== + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@maplibre/maplibre-gl-style-spec@^19.2.1": + version "19.3.3" + resolved "https://registry.yarnpkg.com/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.3.tgz#a106248bd2e25e77c963a362aeaf630e00f924e9" + integrity sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw== + dependencies: + "@mapbox/jsonlint-lines-primitives" "~2.0.2" + "@mapbox/unitbezier" "^0.0.1" + json-stringify-pretty-compact "^3.0.0" + minimist "^1.2.8" + rw "^1.3.3" + sort-object "^3.0.3" + "@next/env@12.2.5": version "12.2.5" resolved "https://registry.yarnpkg.com/@next/env/-/env-12.2.5.tgz#d908c57b35262b94db3e431e869b72ac3e1ad3e3" @@ -1453,6 +1510,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@popperjs/core@^2.9.0": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + "@popperjs/core@^2.9.3": version "2.11.6" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" @@ -1740,11 +1802,35 @@ lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" +"@tippyjs/react@^4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@tippyjs/react/-/react-4.2.6.tgz#971677a599bf663f20bb1c60a62b9555b749cc71" + integrity sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw== + dependencies: + tippy.js "^6.3.1" + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@turf/bbox@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-4.7.3.tgz#e3ad4f10a7e9b41b522880d33083198199059067" + integrity sha512-78lSzSQuLHq0363sVlmkX9uxBejeWGyZhQBAh7oc1ucnsYsem1m4ynjDXG8/hKP4nG/yUFWPdV9xklezKdvzKw== + dependencies: + "@turf/meta" "^4.7.3" + +"@turf/helpers@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-4.7.3.tgz#bc312ac43cab3c532a483151c4c382c5649429e9" + integrity sha512-hk5ANVazb80zK6tjJYAG76oCRTWMQo6SAFu5E1dVnlb2kT3FHLoPcOB9P11duwDafMwywz24KZ+FUorB5e728w== + +"@turf/meta@^4.7.3": + version "4.7.4" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-4.7.4.tgz#6de2f1e9890b8f64b669e4b47c09b20893063977" + integrity sha512-cvwz4EI9BjrgRHxmJ3Z3HKxq6k/fj/V95kwNZ8uWNLncCvrb7x1jUBDkQUo1tShnYdZ8eBgA+a2bvJmAM+MJ0A== + "@types/d3-array@^3.0.3": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" @@ -1822,6 +1908,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/geojson@*": + version "7946.0.13" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.13.tgz#e6e77ea9ecf36564980a861e24e62a095988775e" + integrity sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ== + "@types/hoist-non-react-statics@^3.3.0": version "3.3.5" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" @@ -1853,6 +1944,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/mapbox-gl@>=1.0.0": + version "2.7.19" + resolved "https://registry.yarnpkg.com/@types/mapbox-gl/-/mapbox-gl-2.7.19.tgz#d650c30496323a7d429b6f672bc45218c680bda0" + integrity sha512-pkRdlhQJNbtwcKJSVC4uuOA6M3OlOObIMhNecqHB991oeaDF5XkjSIRaTE0lh5p4KClptSCxW6MBiREVRHrl2A== + dependencies: + "@types/geojson" "*" + "@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" @@ -1917,6 +2015,13 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== +"@types/supercluster@^5.0.1": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/supercluster/-/supercluster-5.0.3.tgz#aa03a77c6545265e63b50fa267ab12afe0c27658" + integrity sha512-XMSqQEr7YDuNtFwSgaHHOjsbi0ZGL62V9Js4CW45RBuRYlNWSW/KDqN+RFFE7HdHcGhJPtN0klKvw06r9Kg7rg== + dependencies: + "@types/geojson" "*" + "@types/use-sync-external-store@^0.0.3": version "0.0.3" resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" @@ -2259,6 +2364,11 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -2317,6 +2427,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -2554,6 +2669,21 @@ buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +bytewise-core@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== + dependencies: + typewise-core "^1.2" + +bytewise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== + dependencies: + bytewise-core "^1.2.2" + typewise "^1.0.3" + cachedir@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" @@ -2651,6 +2781,11 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +cheap-ruler@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/cheap-ruler/-/cheap-ruler-3.0.2.tgz#60d2b3a0cb77a420472c8c5bb8f2c320fba4bb87" + integrity sha512-02T332h1/HTN6cDSufLP8x4JzDs2+VC+8qZ/N0kWIVPyc2xUkWwWh3B2fJxR7raXkL4Mq7k554mfuM9ofv/vGg== + check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" @@ -2933,6 +3068,11 @@ css-what@^6.0.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -3149,6 +3289,11 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== +deep-equal@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3276,6 +3421,11 @@ domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +earcut@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== + easy-bem@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/easy-bem/-/easy-bem-1.1.1.tgz#1bfcc10425498090bcfddc0f9c000aba91399e03" @@ -3723,6 +3873,21 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -4021,6 +4186,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -4047,6 +4217,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -4062,6 +4237,11 @@ get-user-locale@^1.2.0: dependencies: lodash.memoize "^4.1.1" +get-value@^2.0.2, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -4076,6 +4256,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gl-matrix@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4172,6 +4357,11 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -4279,7 +4469,7 @@ i18n-iso-countries@^7.7.0: dependencies: diacritics "1.3.0" -ieee754@^1.1.13: +ieee754@^1.1.12, ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4407,6 +4597,18 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4454,6 +4656,13 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4520,6 +4729,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -4665,6 +4879,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stringify-pretty-compact@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz#f71ef9d82ef16483a407869556588e91b681d9ab" + integrity sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4734,6 +4953,16 @@ jwt-decode@^3.1.2: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + +kdbush@^4.0.1, kdbush@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" + integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA== + language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -4890,6 +5119,35 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +mapbox-gl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-3.1.0.tgz#1c82e8854a3d7ddb7802a6a1a33b67e8c64dd985" + integrity sha512-X6gaQ7WCNwMK6MnQn+rlq6ugzRItdE775TSzmyGPy0wN6hs/8PONi/G+hioeGV5ZyQ0a0BmvmF+gCUH0FBvavw== + dependencies: + "@mapbox/geojson-rewind" "^0.5.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^2.0.1" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^2.0.6" + "@mapbox/unitbezier" "^0.0.1" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + cheap-ruler "^3.0.1" + csscolorparser "~1.0.3" + earcut "^2.2.4" + geojson-vt "^3.2.1" + gl-matrix "^3.4.3" + grid-index "^1.1.0" + kdbush "^4.0.1" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^2.0.0" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^8.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.3" + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -4957,6 +5215,11 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + moment-timezone@^0.5.40: version "0.5.40" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.40.tgz#c148f5149fd91dd3e29bf481abc8830ecba16b89" @@ -5000,6 +5263,11 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== + nanoid@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" @@ -5351,6 +5619,14 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -5466,6 +5742,11 @@ postcss@^8.4.18: picocolors "^1.0.0" source-map-js "^1.0.2" +potpack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-2.0.0.tgz#61f4dd2dc4b3d5e996e3698c0ec9426d0e169104" + integrity sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5509,6 +5790,11 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -5559,6 +5845,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + raf-schd@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" @@ -5601,11 +5892,6 @@ react-calendar@^4.0.0: get-user-locale "^1.2.0" prop-types "^15.6.0" -react-country-flag@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/react-country-flag/-/react-country-flag-3.1.0.tgz#f0c4c332934a77d3e894ba4800634f7a887e53d4" - integrity sha512-JWQFw1efdv9sTC+TGQvTKXQg1NKbDU2mBiAiRWcKM9F1sK+/zjhP2yGmm8YDddWyZdXVkR8Md47rPMJmo4YO5g== - react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -5648,6 +5934,25 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-map-gl@^7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/react-map-gl/-/react-map-gl-7.1.7.tgz#f9b7d76cccad6d0bf1627d1827a0a378696ac1d0" + integrity sha512-mwjc0obkBJOXCcoXQr3VoLqmqwo9vS4bXfbGsdxXzEgVCv/PM0v+1QggL7W0d/ccIy+VCjbXNlGij+PENz6VNg== + dependencies: + "@maplibre/maplibre-gl-style-spec" "^19.2.1" + "@types/mapbox-gl" ">=1.0.0" + +react-mapbox-gl@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-mapbox-gl/-/react-mapbox-gl-5.1.1.tgz#49e1ddf441c3ff9406d10ccd577ac5448d51584c" + integrity sha512-8vGldFQf7pW8T5ZV2OOhwXoaBvfigB2F7dnhzaZ/bD5/KJzP9zprMbn0xMX95W3eqbKzGGHnwyD5DyTTwR6wGw== + dependencies: + "@turf/bbox" "4.7.3" + "@turf/helpers" "4.7.3" + "@types/supercluster" "^5.0.1" + deep-equal "1.0.1" + supercluster "^7.0.0" + react-redux@^7.2.0: version "7.2.9" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" @@ -5881,6 +6186,13 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + resolve@^1.1.7, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -5941,6 +6253,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + rxjs@^7.5.1: version "7.5.6" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" @@ -6029,6 +6346,16 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -6085,6 +6412,28 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +sort-asc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.2.0.tgz#00a49e947bc25d510bfde2cbb8dffda9f50eb2fc" + integrity sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA== + +sort-desc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sort-desc/-/sort-desc-0.2.0.tgz#280c1bdafc6577887cedbad1ed2e41c037976646" + integrity sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w== + +sort-object@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sort-object/-/sort-object-3.0.3.tgz#945727165f244af9dc596ad4c7605a8dee80c269" + integrity sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ== + dependencies: + bytewise "^1.1.0" + get-value "^2.0.2" + is-extendable "^0.1.1" + sort-asc "^0.2.0" + sort-desc "^0.2.0" + union-value "^1.0.1" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -6115,6 +6464,13 @@ spawn-wrap@^2.0.0: signal-exit "^3.0.2" which "^2.0.1" +split-string@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -6225,6 +6581,20 @@ styled-jsx@5.0.4: resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.4.tgz#5b1bd0b9ab44caae3dd1361295559706e044aa53" integrity sha512-sDFWLbg4zR+UkNzfk5lPilyIgtpddfxXEULxhujorr5jtePTUqiPDc5BC0v1NRqTr/WaFBGQQUoYToGlF4B2KQ== +supercluster@^7.0.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.5.tgz#65a6ce4a037a972767740614c19051b64b8be5a3" + integrity sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg== + dependencies: + kdbush "^3.0.0" + +supercluster@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-8.0.1.tgz#9946ba123538e9e9ab15de472531f604e7372df5" + integrity sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ== + dependencies: + kdbush "^4.0.2" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6413,6 +6783,18 @@ tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tippy.js@^6.3.1, tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== + dependencies: + "@popperjs/core" "^2.9.0" + tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -6518,6 +6900,18 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typewise-core@^1.2, typewise-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== + +typewise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== + dependencies: + typewise-core "^1.2.0" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -6572,6 +6966,16 @@ unicode-trie@^2.0.0: pako "^0.2.5" tiny-inflate "^1.0.0" +union-value@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -6670,6 +7074,15 @@ vite-compatible-readable-stream@^3.6.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +vt-pbf@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"