@undp/data-viz 1.5.6 → 1.5.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ThreeDGlobe.js","sources":["../node_modules/@turf/area/dist/esm/index.js","../src/Components/Graphs/Maps/ThreeDGlobe/Graph.tsx","../src/Components/Graphs/Maps/ThreeDGlobe/index.tsx"],"sourcesContent":["// index.ts\nimport { earthRadius } from \"@turf/helpers\";\nimport { geomReduce } from \"@turf/meta\";\nfunction area(geojson) {\n return geomReduce(\n geojson,\n (value, geom) => {\n return value + calculateArea(geom);\n },\n 0\n );\n}\nfunction calculateArea(geom) {\n let total = 0;\n let i;\n switch (geom.type) {\n case \"Polygon\":\n return polygonArea(geom.coordinates);\n case \"MultiPolygon\":\n for (i = 0; i < geom.coordinates.length; i++) {\n total += polygonArea(geom.coordinates[i]);\n }\n return total;\n case \"Point\":\n case \"MultiPoint\":\n case \"LineString\":\n case \"MultiLineString\":\n return 0;\n }\n return 0;\n}\nfunction polygonArea(coords) {\n let total = 0;\n if (coords && coords.length > 0) {\n total += Math.abs(ringArea(coords[0]));\n for (let i = 1; i < coords.length; i++) {\n total -= Math.abs(ringArea(coords[i]));\n }\n }\n return total;\n}\nvar FACTOR = earthRadius * earthRadius / 2;\nvar PI_OVER_180 = Math.PI / 180;\nfunction ringArea(coords) {\n const coordsLength = coords.length - 1;\n if (coordsLength <= 2) return 0;\n let total = 0;\n let i = 0;\n while (i < coordsLength) {\n const lower = coords[i];\n const middle = coords[i + 1 === coordsLength ? 0 : i + 1];\n const upper = coords[i + 2 >= coordsLength ? (i + 2) % coordsLength : i + 2];\n const lowerX = lower[0] * PI_OVER_180;\n const middleY = middle[1] * PI_OVER_180;\n const upperX = upper[0] * PI_OVER_180;\n total += (upperX - lowerX) * Math.sin(middleY);\n i++;\n }\n return total * FACTOR;\n}\nvar turf_area_default = area;\nexport {\n area,\n turf_area_default as default\n};\n//# sourceMappingURL=index.js.map","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport Globe, { GlobeMethods } from 'react-globe.gl';\r\nimport isEqual from 'fast-deep-equal';\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { scaleOrdinal, scaleThreshold } from 'd3-scale';\r\nimport * as THREE from 'three';\r\nimport { Modal } from '@undp/design-system-react/Modal';\r\nimport { P } from '@undp/design-system-react/Typography';\r\nimport centerOfMass from '@turf/center-of-mass';\r\nimport area from '@turf/area';\r\nimport { Feature, GeoJsonProperties, MultiPolygon, Polygon } from 'geojson';\r\n\r\nimport {\r\n ChoroplethMapDataType,\r\n ClassNameObject,\r\n FogDataType,\r\n LightConfig,\r\n StyleObject,\r\n} from '@/Types';\r\nimport { Tooltip } from '@/Components/Elements/Tooltip';\r\nimport { numberFormattingFunction } from '@/Utils/numberFormattingFunction';\r\nimport { X } from '@/Components/Icons';\r\nimport { string2HTML } from '@/Utils/string2HTML';\r\n\r\ninterface Props {\r\n width: number;\r\n data: ChoroplethMapDataType[];\r\n autoRotate: number;\r\n enableZoom: boolean;\r\n categorical: boolean;\r\n colorDomain: (number | string)[];\r\n colors: string[];\r\n height: number;\r\n globeMaterial?: THREE.Material;\r\n lights: LightConfig[];\r\n polygonData: any;\r\n mapProperty: string;\r\n mapBorderColor: string;\r\n atmosphereColor: string;\r\n tooltip?: string | ((_d: any) => React.ReactNode);\r\n styles?: StyleObject;\r\n classNames?: ClassNameObject;\r\n onSeriesMouseOver?: (_d: any) => void;\r\n onSeriesMouseClick?: (_d: any) => void;\r\n mapNoDataColor: string;\r\n colorLegendTitle?: string;\r\n showColorScale: boolean;\r\n hoverStrokeColor: string;\r\n detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n resetSelectionOnDoubleClick: boolean;\r\n highlightedIds: string[];\r\n scale: number;\r\n globeOffset: [number, number];\r\n polygonAltitude: number;\r\n centerLng: number;\r\n centerLat: number;\r\n atmosphereAltitude: number;\r\n globeCurvatureResolution: number;\r\n fogSettings?: FogDataType;\r\n highlightedAltitude: number;\r\n selectedId?: string;\r\n}\r\n\r\nfunction getMainlandCentroid(\r\n multiPolygonFeature: Feature<Polygon | MultiPolygon, GeoJsonProperties>,\r\n) {\r\n // If it's already a Polygon, just return its centroid\r\n if (multiPolygonFeature.geometry.type === 'Polygon') {\r\n return centerOfMass(multiPolygonFeature);\r\n }\r\n\r\n // If it's MultiPolygon → find the largest polygon\r\n if (multiPolygonFeature.geometry.type === 'MultiPolygon') {\r\n let maxArea = 0;\r\n let largestPolygon: Feature<Polygon, GeoJsonProperties> | null = null;\r\n\r\n for (const coords of multiPolygonFeature.geometry.coordinates) {\r\n const poly: Feature<Polygon, GeoJsonProperties> = {\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Polygon',\r\n coordinates: coords,\r\n },\r\n properties: {},\r\n };\r\n\r\n const polyArea = area(poly);\r\n if (polyArea > maxArea) {\r\n maxArea = polyArea;\r\n largestPolygon = poly;\r\n }\r\n }\r\n\r\n return centerOfMass(largestPolygon);\r\n }\r\n\r\n throw new Error('Unsupported geometry type');\r\n}\r\n\r\nfunction createLightFromConfig(config: LightConfig): THREE.Light {\r\n let light: THREE.Light;\r\n\r\n switch (config.type) {\r\n case 'ambient':\r\n light = new THREE.AmbientLight(config.color, config.intensity);\r\n break;\r\n case 'directional':\r\n light = new THREE.DirectionalLight(config.color, config.intensity);\r\n if (config.position) {\r\n if (config.position === 'camera') light.position.set(0, 0, 0);\r\n else light.position.set(config.position.x, config.position.y, config.position.z);\r\n }\r\n if (config.target || config.position === 'camera') {\r\n (light as THREE.SpotLight).target.position.set(\r\n config.target?.x || 0,\r\n config.target?.y || 0,\r\n config.target?.z === undefined ? -1 : config.target.z,\r\n );\r\n }\r\n if (config.castShadow) {\r\n (light as THREE.DirectionalLight).castShadow = true;\r\n if (config.shadow) {\r\n (light as THREE.DirectionalLight).shadow.mapSize.width = config.shadow.mapSize.width;\r\n (light as THREE.DirectionalLight).shadow.mapSize.height = config.shadow.mapSize.height;\r\n (light as THREE.DirectionalLight).shadow.camera.near = config.shadow.camera.near;\r\n (light as THREE.DirectionalLight).shadow.camera.far = config.shadow.camera.far;\r\n }\r\n }\r\n break;\r\n case 'point':\r\n light = new THREE.PointLight(\r\n config.color,\r\n config.intensity,\r\n config.distance || 0,\r\n config.decay || 2,\r\n );\r\n if (config.position) {\r\n if (config.position === 'camera') light.position.set(0, 0, 0);\r\n else light.position.set(config.position.x, config.position.y, config.position.z);\r\n }\r\n break;\r\n case 'spot':\r\n light = new THREE.SpotLight(\r\n config.color,\r\n config.intensity,\r\n config.distance || 0,\r\n config.angle || Math.PI / 3,\r\n config.penumbra || 0,\r\n config.decay || 2,\r\n );\r\n if (config.position) {\r\n if (config.position === 'camera') light.position.set(0, 0, 0);\r\n else light.position.set(config.position.x, config.position.y, config.position.z);\r\n }\r\n if (config.target || config.position === 'camera') {\r\n (light as THREE.SpotLight).target.position.set(\r\n config.target?.x || 0,\r\n config.target?.y || 0,\r\n config.target?.z || 0,\r\n );\r\n }\r\n if (config.castShadow) {\r\n (light as THREE.SpotLight).castShadow = true;\r\n if (config.shadow) {\r\n (light as THREE.SpotLight).shadow.mapSize.width = config.shadow.mapSize.width;\r\n (light as THREE.SpotLight).shadow.mapSize.height = config.shadow.mapSize.height;\r\n (light as THREE.SpotLight).shadow.camera.near = config.shadow.camera.near;\r\n (light as THREE.SpotLight).shadow.camera.far = config.shadow.camera.far;\r\n }\r\n }\r\n break;\r\n default:\r\n throw new Error('Unknown light type');\r\n }\r\n\r\n return light;\r\n}\r\nfunction Graph(props: Props) {\r\n const {\r\n width,\r\n autoRotate,\r\n data,\r\n enableZoom,\r\n categorical,\r\n colorDomain,\r\n colors,\r\n globeMaterial,\r\n height,\r\n polygonData,\r\n mapProperty,\r\n mapBorderColor,\r\n atmosphereColor,\r\n tooltip,\r\n styles,\r\n classNames,\r\n mapNoDataColor,\r\n colorLegendTitle,\r\n showColorScale,\r\n hoverStrokeColor,\r\n detailsOnClick,\r\n onSeriesMouseClick,\r\n onSeriesMouseOver,\r\n resetSelectionOnDoubleClick,\r\n highlightedIds,\r\n scale,\r\n globeOffset,\r\n polygonAltitude,\r\n centerLng,\r\n centerLat,\r\n atmosphereAltitude,\r\n globeCurvatureResolution,\r\n fogSettings,\r\n lights,\r\n highlightedAltitude,\r\n selectedId,\r\n } = props;\r\n const [globeReady, setGlobeReady] = useState(false);\r\n const globeEl = useRef<GlobeMethods | undefined>(undefined);\r\n const [mouseClickData, setMouseClickData] = useState<any>(undefined);\r\n const [showLegend, setShowLegend] = useState(!(width < 680));\r\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\r\n const [mouseOverData, setMouseOverData] = useState<ChoroplethMapDataType | undefined>(undefined);\r\n const colorScale = categorical\r\n ? scaleOrdinal<number | string, string>().domain(colorDomain).range(colors)\r\n : scaleThreshold<number, string>()\r\n .domain(colorDomain as number[])\r\n .range(colors);\r\n useEffect(() => {\r\n if (globeEl.current) {\r\n globeEl.current.controls().enableZoom = enableZoom;\r\n }\r\n }, [enableZoom]);\r\n useEffect(() => {\r\n if (globeEl.current) {\r\n if (mouseOverData || mouseClickData || selectedId) {\r\n globeEl.current.controls().autoRotate = false;\r\n } else {\r\n globeEl.current.controls().autoRotate = autoRotate === 0 ? false : true;\r\n globeEl.current.controls().autoRotateSpeed = autoRotate;\r\n }\r\n }\r\n }, [mouseOverData, mouseClickData, selectedId, autoRotate]);\r\n useEffect(() => {\r\n if (globeEl.current && selectedId) {\r\n const selectedPolygon = polygonData.find(\r\n (d: any) => d.properties[mapProperty] === selectedId,\r\n );\r\n const [lng, lat] = getMainlandCentroid(selectedPolygon).geometry.coordinates;\r\n globeEl.current.pointOfView({ lat, lng, altitude: scale }, 1000);\r\n }\r\n }, [selectedId, scale, polygonData, mapProperty]);\r\n\r\n useEffect(() => {\r\n const canvas = globeEl.current?.renderer().domElement;\r\n if (!canvas) return;\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n setMousePos({ x: e.clientX, y: e.clientY });\r\n };\r\n\r\n canvas.addEventListener('mousemove', handleMouseMove);\r\n return () => canvas.removeEventListener('mousemove', handleMouseMove);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (globeEl.current) {\r\n globeEl.current.pointOfView({ lat: centerLat, lng: centerLng, altitude: scale }, 1000);\r\n }\r\n }, [scale, centerLng, centerLat]);\r\n const materials =\r\n globeMaterial ||\r\n new THREE.MeshBasicMaterial({\r\n color: '#FFF',\r\n });\r\n const setupCustomLighting = useCallback(() => {\r\n if (!globeEl.current) return;\r\n\r\n const scene = globeEl.current.scene();\r\n const camera = globeEl.current.camera();\r\n\r\n let lightsAndObjToRemove: THREE.Object3D[] = [];\r\n scene.traverse(obj => {\r\n if (obj instanceof THREE.Light) {\r\n lightsAndObjToRemove.push(obj);\r\n }\r\n });\r\n lightsAndObjToRemove = [...lightsAndObjToRemove, ...camera.children];\r\n lightsAndObjToRemove.forEach(light => light.parent?.remove(light));\r\n\r\n const lightConfig = lights.map(config => createLightFromConfig(config));\r\n lightConfig.forEach((light, i) => {\r\n if (lights[i].type !== 'ambient' && lights[i].position === 'camera') {\r\n camera.add(light);\r\n if (lights[i].type !== 'point') {\r\n camera.add((light as THREE.DirectionalLight | THREE.SpotLight).target);\r\n }\r\n } else {\r\n scene.add(light);\r\n }\r\n });\r\n\r\n if (fogSettings) {\r\n scene.fog = new THREE.Fog(fogSettings.color, fogSettings.near, fogSettings.far);\r\n }\r\n }, [lights, fogSettings]);\r\n\r\n const handleGlobeReady = useCallback(() => {\r\n setGlobeReady(true);\r\n setupCustomLighting();\r\n }, [setupCustomLighting]);\r\n useEffect(() => {\r\n if (globeReady) {\r\n setupCustomLighting();\r\n }\r\n }, [globeReady, setupCustomLighting]);\r\n return (\r\n <div className='relative'>\r\n <Globe\r\n ref={globeEl}\r\n height={height}\r\n width={width}\r\n globeOffset={globeOffset}\r\n lineHoverPrecision={0}\r\n polygonsData={polygonData}\r\n polygonAltitude={(polygon: any) =>\r\n highlightedIds.includes(polygon?.properties?.[mapProperty]) ||\r\n polygon?.properties?.[mapProperty] === selectedId\r\n ? highlightedAltitude\r\n : polygon?.properties?.[mapProperty] === mouseOverData?.id ||\r\n polygon?.properties?.[mapProperty] === mouseClickData?.id\r\n ? highlightedAltitude\r\n : polygonAltitude\r\n }\r\n polygonCapColor={(polygon: any) => {\r\n const id = polygon?.properties?.[mapProperty];\r\n const val = data.find(el => el.id === id)?.x;\r\n if (val !== undefined && val !== null) {\r\n return colorScale(val as any);\r\n }\r\n return mapNoDataColor;\r\n }}\r\n polygonSideColor={(polygon: any) => {\r\n const id = polygon?.properties?.[mapProperty];\r\n const val = data.find(el => el.id === id)?.x;\r\n const color = val !== undefined && val !== null ? colorScale(val as any) : mapNoDataColor;\r\n return highlightedIds.includes(polygon?.properties?.[mapProperty])\r\n ? color\r\n : 'rgba(100,100,100,0)';\r\n }}\r\n polygonStrokeColor={(polygon: any) =>\r\n polygon?.properties?.[mapProperty] === mouseOverData?.id\r\n ? hoverStrokeColor\r\n : mapBorderColor\r\n }\r\n onGlobeClick={() => {\r\n setMouseClickData(undefined);\r\n }}\r\n onPolygonClick={(polygon: any) => {\r\n const clickedData = polygon?.properties?.[mapProperty]\r\n ? data.find(el => el.id === polygon?.properties?.[mapProperty])\r\n : undefined;\r\n if (onSeriesMouseClick || detailsOnClick) {\r\n if (\r\n isEqual(mouseClickData, clickedData) &&\r\n resetSelectionOnDoubleClick &&\r\n clickedData\r\n ) {\r\n setMouseClickData(undefined);\r\n onSeriesMouseClick?.(undefined);\r\n } else {\r\n setMouseClickData(clickedData);\r\n onSeriesMouseClick?.(clickedData);\r\n }\r\n }\r\n }}\r\n onPolygonHover={(polygon: any) => {\r\n const hoverData = polygon?.properties?.[mapProperty]\r\n ? data.find(el => el.id === polygon?.properties?.[mapProperty])\r\n : undefined;\r\n setMouseOverData(hoverData);\r\n onSeriesMouseOver?.(hoverData);\r\n }}\r\n atmosphereColor={atmosphereColor}\r\n atmosphereAltitude={atmosphereAltitude}\r\n globeCurvatureResolution={globeCurvatureResolution}\r\n globeMaterial={materials}\r\n backgroundColor='rgba(0, 0, 0, 0)'\r\n polygonsTransitionDuration={100}\r\n onGlobeReady={() => {\r\n if (globeEl.current) {\r\n globeEl.current.pointOfView({\r\n lat: centerLat,\r\n lng: centerLng,\r\n });\r\n const scene = globeEl.current.scene();\r\n setTimeout(() => {\r\n const polygons = scene.children[3]?.children[0]?.children[4]?.children || [];\r\n polygons.forEach(d => {\r\n const line = d.children[1];\r\n line.renderOrder = 2;\r\n });\r\n }, 300);\r\n const camera = globeEl.current.camera();\r\n scene.add(camera);\r\n handleGlobeReady();\r\n }\r\n }}\r\n />\r\n {showColorScale === false ? null : (\r\n <div className='absolute left-4 bottom-4'>\r\n {showLegend ? (\r\n <>\r\n <div\r\n style={{\r\n backgroundColor: 'rgba(240,240,240, 0.7)',\r\n border: '1px solid var(--gray-400)',\r\n borderRadius: '999px',\r\n width: '24px',\r\n height: '24px',\r\n padding: '3px',\r\n cursor: 'pointer',\r\n zIndex: 10,\r\n position: 'absolute',\r\n right: '-0.75rem',\r\n top: '-0.75rem',\r\n }}\r\n onClick={() => {\r\n setShowLegend(false);\r\n }}\r\n >\r\n <X />\r\n </div>\r\n <div\r\n className='p-2'\r\n style={{\r\n backgroundColor: 'rgba(240,240,240, 0.7)',\r\n width: categorical ? undefined : '340px',\r\n }}\r\n >\r\n {colorLegendTitle && colorLegendTitle !== '' ? (\r\n <P\r\n size='xs'\r\n marginBottom='xs'\r\n className='p-0 leading-normal overflow-hidden text-primary-gray-700 dark:text-primary-gray-300'\r\n style={{\r\n display: '-webkit-box',\r\n WebkitLineClamp: '1',\r\n WebkitBoxOrient: 'vertical',\r\n }}\r\n >\r\n {colorLegendTitle}\r\n </P>\r\n ) : null}\r\n {!categorical ? (\r\n <svg width='100%' viewBox='0 0 320 30' direction='ltr'>\r\n <g>\r\n {colorDomain.map((d, i) => (\r\n <g key={i} className='cursor-pointer'>\r\n <rect\r\n x={(i * 320) / colors.length + 1}\r\n y={1}\r\n width={320 / colors.length - 2}\r\n height={8}\r\n style={{\r\n fill: colors[i],\r\n stroke: colors[i],\r\n }}\r\n />\r\n <text\r\n x={((i + 1) * 320) / colors.length}\r\n y={25}\r\n className='fill-primary-gray-700 dark:fill-primary-gray-300 text-xs'\r\n style={{ textAnchor: 'middle' }}\r\n >\r\n {numberFormattingFunction(d as number, 'NA')}\r\n </text>\r\n </g>\r\n ))}\r\n <g>\r\n <rect\r\n x={(colorDomain.length * 320) / colors.length + 1}\r\n y={1}\r\n width={320 / colors.length - 2}\r\n height={8}\r\n style={{\r\n fill: colors[colorDomain.length],\r\n stroke: colors[colorDomain.length],\r\n }}\r\n />\r\n </g>\r\n </g>\r\n </svg>\r\n ) : (\r\n <div className='flex flex-col gap-3'>\r\n {colorDomain.map((d, i) => (\r\n <div key={i} className='flex gap-2 items-center'>\r\n <div\r\n className='w-2 h-2 rounded-full'\r\n style={{ backgroundColor: colors[i % colors.length] }}\r\n />\r\n <P size='sm' marginBottom='none' leading='none'>\r\n {d}\r\n </P>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <button\r\n type='button'\r\n className='mb-0 border-0 bg-transparent p-0 self-start'\r\n onClick={() => {\r\n setShowLegend(true);\r\n }}\r\n >\r\n <div className='items-start text-sm font-medium cursor-pointer p-2 mb-0 flex text-primary-black dark:text-primary-gray-300 bg-primary-gray-300 dark:bg-primary-gray-550 border-primary-gray-400 dark:border-primary-gray-500'>\r\n Show Legend\r\n </div>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {mouseOverData && tooltip ? (\r\n <Tooltip\r\n data={mouseOverData}\r\n body={tooltip}\r\n xPos={mousePos.x}\r\n yPos={mousePos.y}\r\n backgroundStyle={styles?.tooltip}\r\n className={classNames?.tooltip}\r\n />\r\n ) : null}\r\n {detailsOnClick && mouseClickData !== undefined ? (\r\n <Modal\r\n open={mouseClickData !== undefined}\r\n onClose={() => {\r\n setMouseClickData(undefined);\r\n }}\r\n >\r\n <div\r\n className='graph-modal-content m-0'\r\n dangerouslySetInnerHTML={\r\n typeof detailsOnClick === 'string'\r\n ? { __html: string2HTML(detailsOnClick, mouseClickData) }\r\n : undefined\r\n }\r\n >\r\n {typeof detailsOnClick === 'function' ? detailsOnClick(mouseClickData) : null}\r\n </div>\r\n </Modal>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Graph;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Spinner } from '@undp/design-system-react/Spinner';\r\nimport * as THREE from 'three';\r\nimport { cn } from '@undp/design-system-react/cn';\r\n\r\nimport Graph from './Graph';\r\n\r\nimport { GraphHeader } from '@/Components/Elements/GraphHeader';\r\nimport { GraphFooter } from '@/Components/Elements/GraphFooter';\r\nimport {\r\n ChoroplethMapDataType,\r\n ClassNameObject,\r\n FogDataType,\r\n Languages,\r\n LightConfig,\r\n ScaleDataType,\r\n SourcesDataType,\r\n StyleObject,\r\n} from '@/Types';\r\nimport { fetchAndParseJSON } from '@/Utils/fetchAndParseData';\r\nimport { Colors } from '@/Components/ColorPalette';\r\nimport { getUniqValue } from '@/Utils/getUniqValue';\r\nimport { getJenks } from '@/Utils/getJenks';\r\n\r\ninterface Props {\r\n // Data\r\n /** Array of data objects */\r\n data: ChoroplethMapDataType[];\r\n\r\n // Titles, Labels, and Sources\r\n /** Title of the graph */\r\n graphTitle?: string | React.ReactNode;\r\n /** Description of the graph */\r\n graphDescription?: string | React.ReactNode;\r\n /** Footnote for the graph */\r\n footNote?: string | React.ReactNode;\r\n /** Source data for the graph */\r\n sources?: SourcesDataType[];\r\n /** Accessibility label */\r\n ariaLabel?: string;\r\n\r\n // Colors and Styling\r\n /** Colors for the choropleth map */\r\n colors?: string[];\r\n /** Domain of colors for the graph */\r\n colorDomain?: number[] | string[];\r\n /** Title for the color legend */\r\n colorLegendTitle?: string;\r\n /** Color for the areas where data is no available */\r\n mapNoDataColor?: string;\r\n /** Background color of the graph */\r\n backgroundColor?: string | boolean;\r\n /** Custom styles for the graph. Each object should be a valid React CSS style object. */\r\n styles?: StyleObject;\r\n /** Custom class names */\r\n classNames?: ClassNameObject;\r\n\r\n // Size and Spacing\r\n /** Width of the graph */\r\n width?: number;\r\n /** Height of the graph */\r\n height?: number;\r\n /** Minimum height of the graph */\r\n minHeight?: number;\r\n /** Relative height scaling factor. This overwrites the height props */\r\n relativeHeight?: number;\r\n /** Padding around the graph. Defaults to 0 if no backgroundColor is mentioned else defaults to 1rem */\r\n padding?: string;\r\n\r\n // Graph Parameters\r\n /** Map data as an object in geoJson format or a url for geoJson */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n mapData?: any;\r\n /** Stroke color of the regions in the map */\r\n mapBorderColor?: string;\r\n /** Center point of the map */\r\n centerPoint?: [number, number];\r\n /** Defines if the globe rotates automatically */\r\n autoRotate?: number | boolean;\r\n /** Defines the material property applied to the sphere of the globe */\r\n globeMaterial?: THREE.Material;\r\n /** Defines the lights for the 3D scene */\r\n lights?: LightConfig[];\r\n /** Defines the colo of the glow around the globe */\r\n atmosphereColor?: string;\r\n /** Defines if the globe can be zoomed when scrolled */\r\n enableZoom?: boolean;\r\n /** Position offset of the globe relative to the canvas center */\r\n globeOffset?: [number, number];\r\n /** Defines the camera distance from Earth. This helps in defining the default size of the globe. Smaller = closer camera therefore the globe is bigger) */\r\n scale?: number;\r\n /** Defines the spacing between the country shape polygon with the sphere */\r\n polygonAltitude?: number;\r\n /** Scale for the colors */\r\n scaleType?: Exclude<ScaleDataType, 'linear'>;\r\n /** Toggle visibility of color scale. */\r\n showColorScale?: boolean;\r\n /** The max altitude of the atmosphere, in terms of globe radius units. */\r\n atmosphereAltitude?: number;\r\n /** Resolution in angular degrees of the sphere curvature. The finer the resolution, the more the globe is fragmented into smaller faces to approximate the spheric surface, at the cost of performance. */\r\n globeCurvatureResolution?: number;\r\n /** Defines fog settings for the scene. */\r\n fogSettings?: FogDataType;\r\n /** Property in the property object in mapData geoJson object is used to match to the id in the data object */\r\n mapProperty?: string;\r\n /** Countries or regions to be highlighted */\r\n selectedId?: string;\r\n /** Countries or regions to be highlighted */\r\n highlightedIds?: string[];\r\n /** Defines the altitude of the highlighted countries or the countries on mouseover. */\r\n highlightedAltitude?: number;\r\n /** Enable data download option as a csv */\r\n dataDownload?: boolean;\r\n /** Reset selection on double-click. Only applicable when used in a dashboard context with filters. */\r\n resetSelectionOnDoubleClick?: boolean;\r\n\r\n // Interactions and Callbacks\r\n /** Tooltip content. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n tooltip?: string | ((_d: any) => React.ReactNode);\r\n /** Details displayed on the modal when user clicks of a data point. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n /** Callback for mouse over event */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n onSeriesMouseOver?: (_d: any) => void;\r\n /** Callback for mouse click event */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n onSeriesMouseClick?: (_d: any) => void;\r\n\r\n // Configuration and Options\r\n /** Language setting */\r\n language?: Languages;\r\n /** Color theme */\r\n theme?: 'light' | 'dark';\r\n /** Unique ID for the graph */\r\n graphID?: string;\r\n}\r\n\r\n/** For using these maps you will have to install [`three`](https://threejs.org/manual/) and [react-globe.gl](https://www.npmjs.com/package/react-globe.gl) package to your project */\r\nexport function ThreeDGlobe(props: Props) {\r\n const {\r\n data,\r\n mapData = 'https://raw.githubusercontent.com/UNDP-Data/dv-country-geojson/refs/heads/main/worldMap-simplified.json',\r\n graphTitle,\r\n colors,\r\n sources,\r\n graphDescription,\r\n height,\r\n width,\r\n footNote = 'The designations employed and the presentation of material on this map do not imply the expression of any opinion whatsoever on the part of the Secretariat of the United Nations or UNDP concerning the legal status of any country, territory, city or area or its authorities, or concerning the delimitation of its frontiers or boundaries.',\r\n colorDomain,\r\n colorLegendTitle,\r\n scaleType = 'threshold',\r\n padding,\r\n mapNoDataColor = Colors.light.graphNoData,\r\n backgroundColor = false,\r\n mapBorderColor = Colors.light.grays['gray-500'],\r\n relativeHeight,\r\n tooltip,\r\n graphID,\r\n mapProperty = 'ISO3',\r\n dataDownload = false,\r\n language = 'en',\r\n minHeight = 0,\r\n theme = 'light',\r\n ariaLabel,\r\n styles,\r\n classNames,\r\n autoRotate = true,\r\n enableZoom = true,\r\n globeMaterial,\r\n centerPoint = [0, 0],\r\n atmosphereColor = '#999',\r\n showColorScale = true,\r\n resetSelectionOnDoubleClick = true,\r\n detailsOnClick,\r\n onSeriesMouseOver,\r\n onSeriesMouseClick,\r\n highlightedIds = [],\r\n highlightedAltitude = 0.1,\r\n scale = 1,\r\n globeOffset = [0, 0],\r\n polygonAltitude = 0.01,\r\n globeCurvatureResolution = 4,\r\n atmosphereAltitude = 0.15,\r\n fogSettings,\r\n lights = [\r\n {\r\n type: 'ambient',\r\n color: 0x404040,\r\n intensity: 0.4,\r\n },\r\n {\r\n type: 'directional',\r\n color: 0xffffff,\r\n intensity: 1,\r\n position: { x: 5, y: 10, z: 5 },\r\n },\r\n ],\r\n selectedId,\r\n } = props;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const [mapShape, setMapShape] = useState<any>(undefined);\r\n\r\n const [svgWidth, setSvgWidth] = useState(0);\r\n const [svgHeight, setSvgHeight] = useState(0);\r\n\r\n const graphDiv = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const resizeObserver = new ResizeObserver(entries => {\r\n setSvgWidth(width || entries[0].target.clientWidth || 760);\r\n setSvgHeight(height || entries[0].target.clientHeight || 480);\r\n });\r\n if (graphDiv.current) {\r\n setSvgHeight(graphDiv.current.clientHeight || 480);\r\n setSvgWidth(graphDiv.current.clientWidth || 760);\r\n if (!width) resizeObserver.observe(graphDiv.current);\r\n }\r\n return () => resizeObserver.disconnect();\r\n }, [width, height]);\r\n useEffect(() => {\r\n if (typeof mapData === 'string') {\r\n const fetchData = fetchAndParseJSON(mapData);\r\n fetchData.then(d => {\r\n if (\r\n mapData ===\r\n 'https://raw.githubusercontent.com/UNDP-Data/dv-country-geojson/refs/heads/main/worldMap-simplified.json'\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const features = d.features.map((el: any) => {\r\n if (el.geometry.type === 'Polygon') {\r\n const reversed = [...el.geometry.coordinates[0]].reverse();\r\n const geometry = { ...el.geometry, coordinates: [reversed] };\r\n return { ...el, geometry };\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const coord: any = [];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n el.geometry.coordinates.forEach((c: any) => {\r\n const reversed = [...c[0]].reverse();\r\n coord.push([reversed]);\r\n });\r\n const geometry = { ...el.geometry, coordinates: coord };\r\n return { ...el, geometry };\r\n });\r\n setMapShape(features);\r\n } else setMapShape(d.features);\r\n });\r\n } else {\r\n setMapShape(mapData.features);\r\n }\r\n }, [mapData]);\r\n\r\n const domain =\r\n colorDomain ||\r\n (scaleType === 'categorical'\r\n ? getUniqValue(data, 'x')\r\n : getJenks(\r\n data.map(d => d.x as number | null | undefined),\r\n colors?.length || 4,\r\n ));\r\n return (\r\n <div\r\n className={`${theme || 'light'} flex ${width ? 'w-fit grow-0' : 'w-full grow'}`}\r\n dir={language === 'he' || language === 'ar' ? 'rtl' : undefined}\r\n >\r\n <div\r\n className={cn(\r\n `${\r\n !backgroundColor\r\n ? 'bg-transparent '\r\n : backgroundColor === true\r\n ? 'bg-primary-gray-200 dark:bg-primary-gray-650 '\r\n : ''\r\n }ml-auto mr-auto flex flex-col grow h-inherit ${language || 'en'}`,\r\n width ? 'w-fit' : 'w-full',\r\n classNames?.graphContainer,\r\n )}\r\n style={{\r\n ...(styles?.graphContainer || {}),\r\n ...(backgroundColor && backgroundColor !== true ? { backgroundColor } : {}),\r\n }}\r\n id={graphID}\r\n aria-label={\r\n ariaLabel ||\r\n `${\r\n graphTitle ? `The graph shows ${graphTitle}. ` : ''\r\n }This is a map.${graphDescription ? ` ${graphDescription}` : ''}`\r\n }\r\n >\r\n <div\r\n className='flex grow'\r\n style={{ padding: backgroundColor ? padding || '1rem' : padding || 0 }}\r\n >\r\n <div className='flex flex-col w-full gap-4 grow justify-between'>\r\n {graphTitle || graphDescription || dataDownload ? (\r\n <GraphHeader\r\n styles={{\r\n title: styles?.title,\r\n description: styles?.description,\r\n }}\r\n classNames={{\r\n title: classNames?.title,\r\n description: classNames?.description,\r\n }}\r\n graphTitle={graphTitle}\r\n graphDescription={graphDescription}\r\n width={width}\r\n graphDownload={undefined}\r\n dataDownload={\r\n dataDownload\r\n ? data.map(d => d.data).filter(d => d !== undefined).length > 0\r\n ? data.map(d => d.data).filter(d => d !== undefined)\r\n : data.filter(d => d !== undefined)\r\n : null\r\n }\r\n />\r\n ) : null}\r\n <div\r\n className='flex flex-col grow justify-center leading-0'\r\n ref={graphDiv}\r\n aria-label='Map area'\r\n >\r\n {(width || svgWidth) && (height || svgHeight) && mapShape ? (\r\n <Graph\r\n data={data}\r\n globeOffset={globeOffset}\r\n polygonData={mapShape}\r\n colorDomain={domain}\r\n width={width || svgWidth}\r\n height={Math.max(\r\n minHeight,\r\n height ||\r\n (relativeHeight\r\n ? minHeight\r\n ? (width || svgWidth) * relativeHeight > minHeight\r\n ? (width || svgWidth) * relativeHeight\r\n : minHeight\r\n : (width || svgWidth) * relativeHeight\r\n : svgHeight),\r\n )}\r\n colors={\r\n colors ||\r\n (scaleType === 'categorical'\r\n ? Colors[theme].sequentialColors[\r\n `neutralColorsx0${domain.length as 4 | 5 | 6 | 7 | 8 | 9}`\r\n ]\r\n : Colors[theme].sequentialColors[\r\n `neutralColorsx0${(domain.length + 1) as 4 | 5 | 6 | 7 | 8 | 9}`\r\n ])\r\n }\r\n mapNoDataColor={mapNoDataColor}\r\n categorical={scaleType === 'categorical'}\r\n mapBorderColor={mapBorderColor}\r\n tooltip={tooltip}\r\n mapProperty={mapProperty}\r\n styles={styles}\r\n classNames={classNames}\r\n autoRotate={autoRotate === true ? 1.5 : autoRotate === false ? 0 : autoRotate}\r\n enableZoom={enableZoom}\r\n globeMaterial={globeMaterial}\r\n atmosphereColor={atmosphereColor}\r\n colorLegendTitle={colorLegendTitle}\r\n showColorScale={showColorScale}\r\n hoverStrokeColor={\r\n theme === 'light'\r\n ? Colors.light.grays['gray-700']\r\n : Colors.light.grays['gray-300']\r\n }\r\n highlightedIds={highlightedIds}\r\n resetSelectionOnDoubleClick={resetSelectionOnDoubleClick}\r\n detailsOnClick={detailsOnClick}\r\n onSeriesMouseOver={onSeriesMouseOver}\r\n onSeriesMouseClick={onSeriesMouseClick}\r\n scale={scale}\r\n polygonAltitude={polygonAltitude}\r\n centerLat={centerPoint[0]}\r\n centerLng={centerPoint[1]}\r\n atmosphereAltitude={atmosphereAltitude}\r\n globeCurvatureResolution={globeCurvatureResolution}\r\n fogSettings={fogSettings}\r\n lights={lights}\r\n highlightedAltitude={highlightedAltitude}\r\n selectedId={selectedId}\r\n />\r\n ) : (\r\n <div\r\n style={{\r\n height: `${Math.max(\r\n minHeight,\r\n height ||\r\n (relativeHeight\r\n ? minHeight\r\n ? (width || svgWidth) * relativeHeight > minHeight\r\n ? (width || svgWidth) * relativeHeight\r\n : minHeight\r\n : (width || svgWidth) * relativeHeight\r\n : svgHeight),\r\n )}px`,\r\n }}\r\n className='flex items-center justify-center'\r\n >\r\n <Spinner aria-label='Loading graph' />\r\n </div>\r\n )}\r\n </div>\r\n {sources || footNote ? (\r\n <GraphFooter\r\n styles={{ footnote: styles?.footnote, source: styles?.source }}\r\n classNames={{\r\n footnote: classNames?.footnote,\r\n source: classNames?.source,\r\n }}\r\n sources={sources}\r\n footNote={footNote}\r\n width={width}\r\n />\r\n ) : null}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["area","geojson","geomReduce","value","geom","calculateArea","total","i","polygonArea","coords","ringArea","FACTOR","earthRadius","PI_OVER_180","coordsLength","lower","middle","upper","lowerX","middleY","upperX","turf_area_default","getMainlandCentroid","multiPolygonFeature","centerOfMass","maxArea","largestPolygon","poly","polyArea","createLightFromConfig","config","light","THREE","Graph","props","width","autoRotate","data","enableZoom","categorical","colorDomain","colors","globeMaterial","height","polygonData","mapProperty","mapBorderColor","atmosphereColor","tooltip","styles","classNames","mapNoDataColor","colorLegendTitle","showColorScale","hoverStrokeColor","detailsOnClick","onSeriesMouseClick","onSeriesMouseOver","resetSelectionOnDoubleClick","highlightedIds","scale","globeOffset","polygonAltitude","centerLng","centerLat","atmosphereAltitude","globeCurvatureResolution","fogSettings","lights","highlightedAltitude","selectedId","globeReady","setGlobeReady","useState","globeEl","useRef","mouseClickData","setMouseClickData","showLegend","setShowLegend","mousePos","setMousePos","mouseOverData","setMouseOverData","colorScale","scaleOrdinal","scaleThreshold","useEffect","selectedPolygon","d","lng","lat","canvas","handleMouseMove","e","materials","setupCustomLighting","useCallback","scene","camera","lightsAndObjToRemove","obj","handleGlobeReady","jsxs","jsx","Globe","polygon","id","val","el","color","clickedData","isEqual","hoverData","line","Fragment","X","P","numberFormattingFunction","Tooltip","Modal","string2HTML","ThreeDGlobe","mapData","graphTitle","sources","graphDescription","footNote","scaleType","padding","Colors","backgroundColor","relativeHeight","graphID","dataDownload","language","minHeight","theme","ariaLabel","centerPoint","mapShape","setMapShape","svgWidth","setSvgWidth","svgHeight","setSvgHeight","graphDiv","resizeObserver","entries","fetchAndParseJSON","features","reversed","geometry","coord","c","domain","getUniqValue","getJenks","cn","GraphHeader","Spinner","GraphFooter"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ThreeDGlobe.js","sources":["../src/Components/Graphs/Maps/ThreeDGlobe/Graph.tsx","../src/Components/Graphs/Maps/ThreeDGlobe/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport Globe, { GlobeMethods } from 'react-globe.gl';\r\nimport isEqual from 'fast-deep-equal';\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { scaleOrdinal, scaleThreshold } from 'd3-scale';\r\nimport * as THREE from 'three';\r\nimport { Modal } from '@undp/design-system-react/Modal';\r\nimport { P } from '@undp/design-system-react/Typography';\r\n\r\nimport {\r\n ChoroplethMapDataType,\r\n ClassNameObject,\r\n FogDataType,\r\n LightConfig,\r\n StyleObject,\r\n} from '@/Types';\r\nimport { Tooltip } from '@/Components/Elements/Tooltip';\r\nimport { numberFormattingFunction } from '@/Utils/numberFormattingFunction';\r\nimport { X } from '@/Components/Icons';\r\nimport { string2HTML } from '@/Utils/string2HTML';\r\nimport { getCentroidCoordinates } from '@/Utils/getCentroidCoordinates';\r\n\r\ninterface Props {\r\n width: number;\r\n data: ChoroplethMapDataType[];\r\n autoRotate: number;\r\n enableZoom: boolean;\r\n categorical: boolean;\r\n colorDomain: (number | string)[];\r\n colors: string[];\r\n height: number;\r\n globeMaterial?: THREE.Material;\r\n lights: LightConfig[];\r\n polygonData: any;\r\n mapProperty: string;\r\n mapBorderColor: string;\r\n atmosphereColor: string;\r\n tooltip?: string | ((_d: any) => React.ReactNode);\r\n styles?: StyleObject;\r\n classNames?: ClassNameObject;\r\n onSeriesMouseOver?: (_d: any) => void;\r\n onSeriesMouseClick?: (_d: any) => void;\r\n mapNoDataColor: string;\r\n colorLegendTitle?: string;\r\n showColorScale: boolean;\r\n hoverStrokeColor: string;\r\n detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n resetSelectionOnDoubleClick: boolean;\r\n highlightedIds: string[];\r\n scale: number;\r\n globeOffset: [number, number];\r\n polygonAltitude: number;\r\n centerLng: number;\r\n centerLat: number;\r\n atmosphereAltitude: number;\r\n globeCurvatureResolution: number;\r\n fogSettings?: FogDataType;\r\n highlightedAltitude: number;\r\n selectedId?: string;\r\n}\r\n\r\nfunction createLightFromConfig(config: LightConfig): THREE.Light {\r\n let light: THREE.Light;\r\n\r\n switch (config.type) {\r\n case 'ambient':\r\n light = new THREE.AmbientLight(config.color, config.intensity);\r\n break;\r\n case 'directional':\r\n light = new THREE.DirectionalLight(config.color, config.intensity);\r\n if (config.position) {\r\n if (config.position === 'camera') light.position.set(0, 0, 0);\r\n else light.position.set(config.position.x, config.position.y, config.position.z);\r\n }\r\n if (config.target || config.position === 'camera') {\r\n (light as THREE.SpotLight).target.position.set(\r\n config.target?.x || 0,\r\n config.target?.y || 0,\r\n config.target?.z === undefined ? -1 : config.target.z,\r\n );\r\n }\r\n if (config.castShadow) {\r\n (light as THREE.DirectionalLight).castShadow = true;\r\n if (config.shadow) {\r\n (light as THREE.DirectionalLight).shadow.mapSize.width = config.shadow.mapSize.width;\r\n (light as THREE.DirectionalLight).shadow.mapSize.height = config.shadow.mapSize.height;\r\n (light as THREE.DirectionalLight).shadow.camera.near = config.shadow.camera.near;\r\n (light as THREE.DirectionalLight).shadow.camera.far = config.shadow.camera.far;\r\n }\r\n }\r\n break;\r\n case 'point':\r\n light = new THREE.PointLight(\r\n config.color,\r\n config.intensity,\r\n config.distance || 0,\r\n config.decay || 2,\r\n );\r\n if (config.position) {\r\n if (config.position === 'camera') light.position.set(0, 0, 0);\r\n else light.position.set(config.position.x, config.position.y, config.position.z);\r\n }\r\n break;\r\n case 'spot':\r\n light = new THREE.SpotLight(\r\n config.color,\r\n config.intensity,\r\n config.distance || 0,\r\n config.angle || Math.PI / 3,\r\n config.penumbra || 0,\r\n config.decay || 2,\r\n );\r\n if (config.position) {\r\n if (config.position === 'camera') light.position.set(0, 0, 0);\r\n else light.position.set(config.position.x, config.position.y, config.position.z);\r\n }\r\n if (config.target || config.position === 'camera') {\r\n (light as THREE.SpotLight).target.position.set(\r\n config.target?.x || 0,\r\n config.target?.y || 0,\r\n config.target?.z || 0,\r\n );\r\n }\r\n if (config.castShadow) {\r\n (light as THREE.SpotLight).castShadow = true;\r\n if (config.shadow) {\r\n (light as THREE.SpotLight).shadow.mapSize.width = config.shadow.mapSize.width;\r\n (light as THREE.SpotLight).shadow.mapSize.height = config.shadow.mapSize.height;\r\n (light as THREE.SpotLight).shadow.camera.near = config.shadow.camera.near;\r\n (light as THREE.SpotLight).shadow.camera.far = config.shadow.camera.far;\r\n }\r\n }\r\n break;\r\n default:\r\n throw new Error('Unknown light type');\r\n }\r\n\r\n return light;\r\n}\r\nfunction Graph(props: Props) {\r\n const {\r\n width,\r\n autoRotate,\r\n data,\r\n enableZoom,\r\n categorical,\r\n colorDomain,\r\n colors,\r\n globeMaterial,\r\n height,\r\n polygonData,\r\n mapProperty,\r\n mapBorderColor,\r\n atmosphereColor,\r\n tooltip,\r\n styles,\r\n classNames,\r\n mapNoDataColor,\r\n colorLegendTitle,\r\n showColorScale,\r\n hoverStrokeColor,\r\n detailsOnClick,\r\n onSeriesMouseClick,\r\n onSeriesMouseOver,\r\n resetSelectionOnDoubleClick,\r\n highlightedIds,\r\n scale,\r\n globeOffset,\r\n polygonAltitude,\r\n centerLng,\r\n centerLat,\r\n atmosphereAltitude,\r\n globeCurvatureResolution,\r\n fogSettings,\r\n lights,\r\n highlightedAltitude,\r\n selectedId,\r\n } = props;\r\n const [globeReady, setGlobeReady] = useState(false);\r\n const globeEl = useRef<GlobeMethods | undefined>(undefined);\r\n const [mouseClickData, setMouseClickData] = useState<any>(undefined);\r\n const [showLegend, setShowLegend] = useState(!(width < 680));\r\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\r\n const [mouseOverData, setMouseOverData] = useState<ChoroplethMapDataType | undefined>(undefined);\r\n const colorScale = categorical\r\n ? scaleOrdinal<number | string, string>().domain(colorDomain).range(colors)\r\n : scaleThreshold<number, string>()\r\n .domain(colorDomain as number[])\r\n .range(colors);\r\n useEffect(() => {\r\n if (globeEl.current) {\r\n globeEl.current.controls().enableZoom = enableZoom;\r\n }\r\n }, [enableZoom]);\r\n useEffect(() => {\r\n if (globeEl.current) {\r\n if (mouseOverData || selectedId) {\r\n globeEl.current.controls().autoRotate = false;\r\n } else {\r\n globeEl.current.controls().autoRotate = autoRotate === 0 ? false : true;\r\n globeEl.current.controls().autoRotateSpeed = autoRotate;\r\n }\r\n }\r\n }, [mouseOverData, selectedId, autoRotate]);\r\n useEffect(() => {\r\n if (globeEl.current && selectedId) {\r\n const selectedPolygon = polygonData.find(\r\n (d: any) => d.properties[mapProperty] === selectedId,\r\n );\r\n const [lng, lat] = getCentroidCoordinates(selectedPolygon);\r\n globeEl.current.pointOfView({ lat, lng, altitude: scale }, 1000);\r\n }\r\n }, [selectedId, scale, polygonData, mapProperty]);\r\n\r\n useEffect(() => {\r\n const canvas = globeEl.current?.renderer().domElement;\r\n if (!canvas) return;\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n setMousePos({ x: e.clientX, y: e.clientY });\r\n };\r\n\r\n canvas.addEventListener('mousemove', handleMouseMove);\r\n return () => canvas.removeEventListener('mousemove', handleMouseMove);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (globeEl.current) {\r\n globeEl.current.pointOfView({ lat: centerLat, lng: centerLng, altitude: scale }, 1000);\r\n }\r\n }, [scale, centerLng, centerLat]);\r\n const materials =\r\n globeMaterial ||\r\n new THREE.MeshBasicMaterial({\r\n color: '#FFF',\r\n });\r\n const setupCustomLighting = useCallback(() => {\r\n if (!globeEl.current) return;\r\n\r\n const scene = globeEl.current.scene();\r\n const camera = globeEl.current.camera();\r\n\r\n let lightsAndObjToRemove: THREE.Object3D[] = [];\r\n scene.traverse(obj => {\r\n if (obj instanceof THREE.Light) {\r\n lightsAndObjToRemove.push(obj);\r\n }\r\n });\r\n lightsAndObjToRemove = [...lightsAndObjToRemove, ...camera.children];\r\n lightsAndObjToRemove.forEach(light => light.parent?.remove(light));\r\n\r\n const lightConfig = lights.map(config => createLightFromConfig(config));\r\n lightConfig.forEach((light, i) => {\r\n if (lights[i].type !== 'ambient' && lights[i].position === 'camera') {\r\n camera.add(light);\r\n if (lights[i].type !== 'point') {\r\n camera.add((light as THREE.DirectionalLight | THREE.SpotLight).target);\r\n }\r\n } else {\r\n scene.add(light);\r\n }\r\n });\r\n\r\n if (fogSettings) {\r\n scene.fog = new THREE.Fog(fogSettings.color, fogSettings.near, fogSettings.far);\r\n }\r\n }, [lights, fogSettings]);\r\n\r\n const handleGlobeReady = useCallback(() => {\r\n setGlobeReady(true);\r\n setupCustomLighting();\r\n }, [setupCustomLighting]);\r\n useEffect(() => {\r\n if (globeReady) {\r\n setupCustomLighting();\r\n }\r\n }, [globeReady, setupCustomLighting]);\r\n return (\r\n <div className='relative'>\r\n <Globe\r\n ref={globeEl}\r\n height={height}\r\n width={width}\r\n globeOffset={globeOffset}\r\n lineHoverPrecision={0}\r\n polygonsData={polygonData}\r\n polygonAltitude={(polygon: any) =>\r\n highlightedIds.includes(polygon?.properties?.[mapProperty]) ||\r\n polygon?.properties?.[mapProperty] === selectedId\r\n ? highlightedAltitude * (polygon?.properties?.[mapProperty] === selectedId ? 2 : 1)\r\n : polygon?.properties?.[mapProperty] === mouseOverData?.id ||\r\n polygon?.properties?.[mapProperty] === mouseClickData?.id\r\n ? highlightedAltitude\r\n : polygonAltitude\r\n }\r\n polygonCapColor={(polygon: any) => {\r\n const id = polygon?.properties?.[mapProperty];\r\n const val = data.find(el => el.id === id)?.x;\r\n if (val !== undefined && val !== null) {\r\n return colorScale(val as any);\r\n }\r\n return mapNoDataColor;\r\n }}\r\n polygonSideColor={(polygon: any) => {\r\n const id = polygon?.properties?.[mapProperty];\r\n const val = data.find(el => el.id === id)?.x;\r\n const color = val !== undefined && val !== null ? colorScale(val as any) : mapNoDataColor;\r\n return highlightedIds.includes(polygon?.properties?.[mapProperty]) ||\r\n polygon?.properties?.[mapProperty] === selectedId\r\n ? color\r\n : 'rgba(100,100,100,0)';\r\n }}\r\n polygonStrokeColor={(polygon: any) =>\r\n polygon?.properties?.[mapProperty] === mouseOverData?.id\r\n ? hoverStrokeColor\r\n : mapBorderColor\r\n }\r\n onGlobeClick={() => {\r\n setMouseClickData(undefined);\r\n }}\r\n onPolygonClick={(polygon: any) => {\r\n const clickedData = polygon?.properties?.[mapProperty]\r\n ? data.find(el => el.id === polygon?.properties?.[mapProperty])\r\n : undefined;\r\n if (onSeriesMouseClick || detailsOnClick) {\r\n if (\r\n isEqual(mouseClickData, clickedData) &&\r\n resetSelectionOnDoubleClick &&\r\n clickedData\r\n ) {\r\n setMouseClickData(undefined);\r\n onSeriesMouseClick?.(undefined);\r\n } else {\r\n setMouseClickData(clickedData);\r\n onSeriesMouseClick?.(clickedData);\r\n }\r\n }\r\n }}\r\n onPolygonHover={(polygon: any) => {\r\n const hoverData = polygon?.properties?.[mapProperty]\r\n ? data.find(el => el.id === polygon?.properties?.[mapProperty])\r\n : undefined;\r\n setMouseOverData(hoverData);\r\n onSeriesMouseOver?.(hoverData);\r\n }}\r\n atmosphereColor={atmosphereColor}\r\n atmosphereAltitude={atmosphereAltitude}\r\n globeCurvatureResolution={globeCurvatureResolution}\r\n globeMaterial={materials}\r\n backgroundColor='rgba(0, 0, 0, 0)'\r\n polygonsTransitionDuration={100}\r\n onGlobeReady={() => {\r\n if (globeEl.current) {\r\n globeEl.current.pointOfView({\r\n lat: centerLat,\r\n lng: centerLng,\r\n });\r\n const scene = globeEl.current.scene();\r\n setTimeout(() => {\r\n const polygons = scene.children[3]?.children[0]?.children[4]?.children || [];\r\n polygons.forEach(d => {\r\n const line = d.children[1];\r\n line.renderOrder = 2;\r\n });\r\n }, 300);\r\n const camera = globeEl.current.camera();\r\n scene.add(camera);\r\n handleGlobeReady();\r\n }\r\n }}\r\n />\r\n {showColorScale === false ? null : (\r\n <div className='absolute left-4 bottom-4'>\r\n {showLegend ? (\r\n <>\r\n <div\r\n style={{\r\n backgroundColor: 'rgba(240,240,240, 0.7)',\r\n border: '1px solid var(--gray-400)',\r\n borderRadius: '999px',\r\n width: '24px',\r\n height: '24px',\r\n padding: '3px',\r\n cursor: 'pointer',\r\n zIndex: 10,\r\n position: 'absolute',\r\n right: '-0.75rem',\r\n top: '-0.75rem',\r\n }}\r\n onClick={() => {\r\n setShowLegend(false);\r\n }}\r\n >\r\n <X />\r\n </div>\r\n <div\r\n className='p-2'\r\n style={{\r\n backgroundColor: 'rgba(240,240,240, 0.7)',\r\n width: categorical ? undefined : '340px',\r\n }}\r\n >\r\n {colorLegendTitle && colorLegendTitle !== '' ? (\r\n <P\r\n size='xs'\r\n marginBottom='xs'\r\n className='p-0 leading-normal overflow-hidden text-primary-gray-700 dark:text-primary-gray-300'\r\n style={{\r\n display: '-webkit-box',\r\n WebkitLineClamp: '1',\r\n WebkitBoxOrient: 'vertical',\r\n }}\r\n >\r\n {colorLegendTitle}\r\n </P>\r\n ) : null}\r\n {!categorical ? (\r\n <svg width='100%' viewBox='0 0 320 30' direction='ltr'>\r\n <g>\r\n {colorDomain.map((d, i) => (\r\n <g key={i} className='cursor-pointer'>\r\n <rect\r\n x={(i * 320) / colors.length + 1}\r\n y={1}\r\n width={320 / colors.length - 2}\r\n height={8}\r\n style={{\r\n fill: colors[i],\r\n stroke: colors[i],\r\n }}\r\n />\r\n <text\r\n x={((i + 1) * 320) / colors.length}\r\n y={25}\r\n className='fill-primary-gray-700 dark:fill-primary-gray-300 text-xs'\r\n style={{ textAnchor: 'middle' }}\r\n >\r\n {numberFormattingFunction(d as number, 'NA')}\r\n </text>\r\n </g>\r\n ))}\r\n <g>\r\n <rect\r\n x={(colorDomain.length * 320) / colors.length + 1}\r\n y={1}\r\n width={320 / colors.length - 2}\r\n height={8}\r\n style={{\r\n fill: colors[colorDomain.length],\r\n stroke: colors[colorDomain.length],\r\n }}\r\n />\r\n </g>\r\n </g>\r\n </svg>\r\n ) : (\r\n <div className='flex flex-col gap-3'>\r\n {colorDomain.map((d, i) => (\r\n <div key={i} className='flex gap-2 items-center'>\r\n <div\r\n className='w-2 h-2 rounded-full'\r\n style={{ backgroundColor: colors[i % colors.length] }}\r\n />\r\n <P size='sm' marginBottom='none' leading='none'>\r\n {d}\r\n </P>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <button\r\n type='button'\r\n className='mb-0 border-0 bg-transparent p-0 self-start'\r\n onClick={() => {\r\n setShowLegend(true);\r\n }}\r\n >\r\n <div className='items-start text-sm font-medium cursor-pointer p-2 mb-0 flex text-primary-black dark:text-primary-gray-300 bg-primary-gray-300 dark:bg-primary-gray-550 border-primary-gray-400 dark:border-primary-gray-500'>\r\n Show Legend\r\n </div>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {mouseOverData && tooltip ? (\r\n <Tooltip\r\n data={mouseOverData}\r\n body={tooltip}\r\n xPos={mousePos.x}\r\n yPos={mousePos.y}\r\n backgroundStyle={styles?.tooltip}\r\n className={classNames?.tooltip}\r\n />\r\n ) : null}\r\n {detailsOnClick && mouseClickData !== undefined ? (\r\n <Modal\r\n open={mouseClickData !== undefined}\r\n onClose={() => {\r\n setMouseClickData(undefined);\r\n }}\r\n >\r\n <div\r\n className='graph-modal-content m-0'\r\n dangerouslySetInnerHTML={\r\n typeof detailsOnClick === 'string'\r\n ? { __html: string2HTML(detailsOnClick, mouseClickData) }\r\n : undefined\r\n }\r\n >\r\n {typeof detailsOnClick === 'function' ? detailsOnClick(mouseClickData) : null}\r\n </div>\r\n </Modal>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Graph;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Spinner } from '@undp/design-system-react/Spinner';\r\nimport * as THREE from 'three';\r\nimport { cn } from '@undp/design-system-react/cn';\r\n\r\nimport Graph from './Graph';\r\n\r\nimport { GraphHeader } from '@/Components/Elements/GraphHeader';\r\nimport { GraphFooter } from '@/Components/Elements/GraphFooter';\r\nimport {\r\n ChoroplethMapDataType,\r\n ClassNameObject,\r\n FogDataType,\r\n Languages,\r\n LightConfig,\r\n ScaleDataType,\r\n SourcesDataType,\r\n StyleObject,\r\n} from '@/Types';\r\nimport { fetchAndParseJSON } from '@/Utils/fetchAndParseData';\r\nimport { Colors } from '@/Components/ColorPalette';\r\nimport { getUniqValue } from '@/Utils/getUniqValue';\r\nimport { getJenks } from '@/Utils/getJenks';\r\n\r\ninterface Props {\r\n // Data\r\n /** Array of data objects */\r\n data: ChoroplethMapDataType[];\r\n\r\n // Titles, Labels, and Sources\r\n /** Title of the graph */\r\n graphTitle?: string | React.ReactNode;\r\n /** Description of the graph */\r\n graphDescription?: string | React.ReactNode;\r\n /** Footnote for the graph */\r\n footNote?: string | React.ReactNode;\r\n /** Source data for the graph */\r\n sources?: SourcesDataType[];\r\n /** Accessibility label */\r\n ariaLabel?: string;\r\n\r\n // Colors and Styling\r\n /** Colors for the choropleth map */\r\n colors?: string[];\r\n /** Domain of colors for the graph */\r\n colorDomain?: number[] | string[];\r\n /** Title for the color legend */\r\n colorLegendTitle?: string;\r\n /** Color for the areas where data is no available */\r\n mapNoDataColor?: string;\r\n /** Background color of the graph */\r\n backgroundColor?: string | boolean;\r\n /** Custom styles for the graph. Each object should be a valid React CSS style object. */\r\n styles?: StyleObject;\r\n /** Custom class names */\r\n classNames?: ClassNameObject;\r\n\r\n // Size and Spacing\r\n /** Width of the graph */\r\n width?: number;\r\n /** Height of the graph */\r\n height?: number;\r\n /** Minimum height of the graph */\r\n minHeight?: number;\r\n /** Relative height scaling factor. This overwrites the height props */\r\n relativeHeight?: number;\r\n /** Padding around the graph. Defaults to 0 if no backgroundColor is mentioned else defaults to 1rem */\r\n padding?: string;\r\n\r\n // Graph Parameters\r\n /** Map data as an object in geoJson format or a url for geoJson */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n mapData?: any;\r\n /** Stroke color of the regions in the map */\r\n mapBorderColor?: string;\r\n /** Center point of the map */\r\n centerPoint?: [number, number];\r\n /** Defines if the globe rotates automatically */\r\n autoRotate?: number | boolean;\r\n /** Defines the material property applied to the sphere of the globe */\r\n globeMaterial?: THREE.Material;\r\n /** Defines the lights for the 3D scene */\r\n lights?: LightConfig[];\r\n /** Defines the colo of the glow around the globe */\r\n atmosphereColor?: string;\r\n /** Defines if the globe can be zoomed when scrolled */\r\n enableZoom?: boolean;\r\n /** Position offset of the globe relative to the canvas center */\r\n globeOffset?: [number, number];\r\n /** Defines the camera distance from Earth. This helps in defining the default size of the globe. Smaller = closer camera therefore the globe is bigger) */\r\n scale?: number;\r\n /** Defines the spacing between the country shape polygon with the sphere */\r\n polygonAltitude?: number;\r\n /** Scale for the colors */\r\n scaleType?: Exclude<ScaleDataType, 'linear'>;\r\n /** Toggle visibility of color scale. */\r\n showColorScale?: boolean;\r\n /** The max altitude of the atmosphere, in terms of globe radius units. */\r\n atmosphereAltitude?: number;\r\n /** Resolution in angular degrees of the sphere curvature. The finer the resolution, the more the globe is fragmented into smaller faces to approximate the spheric surface, at the cost of performance. */\r\n globeCurvatureResolution?: number;\r\n /** Defines fog settings for the scene. */\r\n fogSettings?: FogDataType;\r\n /** Property in the property object in mapData geoJson object is used to match to the id in the data object */\r\n mapProperty?: string;\r\n /** Countries or regions to be highlighted */\r\n selectedId?: string;\r\n /** Countries or regions to be highlighted */\r\n highlightedIds?: string[];\r\n /** Defines the altitude of the highlighted countries or the countries on mouseover. */\r\n highlightedAltitude?: number;\r\n /** Enable data download option as a csv */\r\n dataDownload?: boolean;\r\n /** Reset selection on double-click. Only applicable when used in a dashboard context with filters. */\r\n resetSelectionOnDoubleClick?: boolean;\r\n\r\n // Interactions and Callbacks\r\n /** Tooltip content. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n tooltip?: string | ((_d: any) => React.ReactNode);\r\n /** Details displayed on the modal when user clicks of a data point. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n /** Callback for mouse over event */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n onSeriesMouseOver?: (_d: any) => void;\r\n /** Callback for mouse click event */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n onSeriesMouseClick?: (_d: any) => void;\r\n\r\n // Configuration and Options\r\n /** Language setting */\r\n language?: Languages;\r\n /** Color theme */\r\n theme?: 'light' | 'dark';\r\n /** Unique ID for the graph */\r\n graphID?: string;\r\n}\r\n\r\n/** For using these maps you will have to install [`three`](https://threejs.org/manual/) and [react-globe.gl](https://www.npmjs.com/package/react-globe.gl) package to your project */\r\nexport function ThreeDGlobe(props: Props) {\r\n const {\r\n data,\r\n mapData = 'https://raw.githubusercontent.com/UNDP-Data/dv-country-geojson/refs/heads/main/worldMap-simplified.json',\r\n graphTitle,\r\n colors,\r\n sources,\r\n graphDescription,\r\n height,\r\n width,\r\n footNote = 'The designations employed and the presentation of material on this map do not imply the expression of any opinion whatsoever on the part of the Secretariat of the United Nations or UNDP concerning the legal status of any country, territory, city or area or its authorities, or concerning the delimitation of its frontiers or boundaries.',\r\n colorDomain,\r\n colorLegendTitle,\r\n scaleType = 'threshold',\r\n padding,\r\n mapNoDataColor = Colors.light.graphNoData,\r\n backgroundColor = false,\r\n mapBorderColor = Colors.light.grays['gray-500'],\r\n relativeHeight,\r\n tooltip,\r\n graphID,\r\n mapProperty = 'ISO3',\r\n dataDownload = false,\r\n language = 'en',\r\n minHeight = 0,\r\n theme = 'light',\r\n ariaLabel,\r\n styles,\r\n classNames,\r\n autoRotate = true,\r\n enableZoom = true,\r\n globeMaterial,\r\n centerPoint = [0, 0],\r\n atmosphereColor = '#999',\r\n showColorScale = true,\r\n resetSelectionOnDoubleClick = true,\r\n detailsOnClick,\r\n onSeriesMouseOver,\r\n onSeriesMouseClick,\r\n highlightedIds = [],\r\n highlightedAltitude = 0.1,\r\n scale = 1,\r\n globeOffset = [0, 0],\r\n polygonAltitude = 0.01,\r\n globeCurvatureResolution = 4,\r\n atmosphereAltitude = 0.15,\r\n fogSettings,\r\n lights = [\r\n {\r\n type: 'ambient',\r\n color: 0x404040,\r\n intensity: 0.4,\r\n },\r\n {\r\n type: 'directional',\r\n color: 0xffffff,\r\n intensity: 1,\r\n position: { x: 5, y: 10, z: 5 },\r\n },\r\n ],\r\n selectedId,\r\n } = props;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const [mapShape, setMapShape] = useState<any>(undefined);\r\n\r\n const [svgWidth, setSvgWidth] = useState(0);\r\n const [svgHeight, setSvgHeight] = useState(0);\r\n\r\n const graphDiv = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const resizeObserver = new ResizeObserver(entries => {\r\n setSvgWidth(width || entries[0].target.clientWidth || 760);\r\n setSvgHeight(height || entries[0].target.clientHeight || 480);\r\n });\r\n if (graphDiv.current) {\r\n setSvgHeight(graphDiv.current.clientHeight || 480);\r\n setSvgWidth(graphDiv.current.clientWidth || 760);\r\n if (!width) resizeObserver.observe(graphDiv.current);\r\n }\r\n return () => resizeObserver.disconnect();\r\n }, [width, height]);\r\n useEffect(() => {\r\n if (typeof mapData === 'string') {\r\n const fetchData = fetchAndParseJSON(mapData);\r\n fetchData.then(d => {\r\n if (\r\n mapData ===\r\n 'https://raw.githubusercontent.com/UNDP-Data/dv-country-geojson/refs/heads/main/worldMap-simplified.json'\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const features = d.features.map((el: any) => {\r\n if (el.geometry.type === 'Polygon') {\r\n const reversed = [...el.geometry.coordinates[0]].reverse();\r\n const geometry = { ...el.geometry, coordinates: [reversed] };\r\n return { ...el, geometry };\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const coord: any = [];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n el.geometry.coordinates.forEach((c: any) => {\r\n const reversed = [...c[0]].reverse();\r\n coord.push([reversed]);\r\n });\r\n const geometry = { ...el.geometry, coordinates: coord };\r\n return { ...el, geometry };\r\n });\r\n setMapShape(features);\r\n } else setMapShape(d.features);\r\n });\r\n } else {\r\n setMapShape(mapData.features);\r\n }\r\n }, [mapData]);\r\n\r\n const domain =\r\n colorDomain ||\r\n (scaleType === 'categorical'\r\n ? getUniqValue(data, 'x')\r\n : getJenks(\r\n data.map(d => d.x as number | null | undefined),\r\n colors?.length || 4,\r\n ));\r\n return (\r\n <div\r\n className={`${theme || 'light'} flex ${width ? 'w-fit grow-0' : 'w-full grow'}`}\r\n dir={language === 'he' || language === 'ar' ? 'rtl' : undefined}\r\n >\r\n <div\r\n className={cn(\r\n `${\r\n !backgroundColor\r\n ? 'bg-transparent '\r\n : backgroundColor === true\r\n ? 'bg-primary-gray-200 dark:bg-primary-gray-650 '\r\n : ''\r\n }ml-auto mr-auto flex flex-col grow h-inherit ${language || 'en'}`,\r\n width ? 'w-fit' : 'w-full',\r\n classNames?.graphContainer,\r\n )}\r\n style={{\r\n ...(styles?.graphContainer || {}),\r\n ...(backgroundColor && backgroundColor !== true ? { backgroundColor } : {}),\r\n }}\r\n id={graphID}\r\n aria-label={\r\n ariaLabel ||\r\n `${\r\n graphTitle ? `The graph shows ${graphTitle}. ` : ''\r\n }This is a map.${graphDescription ? ` ${graphDescription}` : ''}`\r\n }\r\n >\r\n <div\r\n className='flex grow'\r\n style={{ padding: backgroundColor ? padding || '1rem' : padding || 0 }}\r\n >\r\n <div className='flex flex-col w-full gap-4 grow justify-between'>\r\n {graphTitle || graphDescription || dataDownload ? (\r\n <GraphHeader\r\n styles={{\r\n title: styles?.title,\r\n description: styles?.description,\r\n }}\r\n classNames={{\r\n title: classNames?.title,\r\n description: classNames?.description,\r\n }}\r\n graphTitle={graphTitle}\r\n graphDescription={graphDescription}\r\n width={width}\r\n graphDownload={undefined}\r\n dataDownload={\r\n dataDownload\r\n ? data.map(d => d.data).filter(d => d !== undefined).length > 0\r\n ? data.map(d => d.data).filter(d => d !== undefined)\r\n : data.filter(d => d !== undefined)\r\n : null\r\n }\r\n />\r\n ) : null}\r\n <div\r\n className='flex flex-col grow justify-center leading-0'\r\n ref={graphDiv}\r\n aria-label='Map area'\r\n >\r\n {(width || svgWidth) && (height || svgHeight) && mapShape ? (\r\n <Graph\r\n data={data}\r\n globeOffset={globeOffset}\r\n polygonData={mapShape}\r\n colorDomain={domain}\r\n width={width || svgWidth}\r\n height={Math.max(\r\n minHeight,\r\n height ||\r\n (relativeHeight\r\n ? minHeight\r\n ? (width || svgWidth) * relativeHeight > minHeight\r\n ? (width || svgWidth) * relativeHeight\r\n : minHeight\r\n : (width || svgWidth) * relativeHeight\r\n : svgHeight),\r\n )}\r\n colors={\r\n colors ||\r\n (scaleType === 'categorical'\r\n ? Colors[theme].sequentialColors[\r\n `neutralColorsx0${domain.length as 4 | 5 | 6 | 7 | 8 | 9}`\r\n ]\r\n : Colors[theme].sequentialColors[\r\n `neutralColorsx0${(domain.length + 1) as 4 | 5 | 6 | 7 | 8 | 9}`\r\n ])\r\n }\r\n mapNoDataColor={mapNoDataColor}\r\n categorical={scaleType === 'categorical'}\r\n mapBorderColor={mapBorderColor}\r\n tooltip={tooltip}\r\n mapProperty={mapProperty}\r\n styles={styles}\r\n classNames={classNames}\r\n autoRotate={autoRotate === true ? 1.5 : autoRotate === false ? 0 : autoRotate}\r\n enableZoom={enableZoom}\r\n globeMaterial={globeMaterial}\r\n atmosphereColor={atmosphereColor}\r\n colorLegendTitle={colorLegendTitle}\r\n showColorScale={showColorScale}\r\n hoverStrokeColor={\r\n theme === 'light'\r\n ? Colors.light.grays['gray-700']\r\n : Colors.light.grays['gray-300']\r\n }\r\n highlightedIds={highlightedIds}\r\n resetSelectionOnDoubleClick={resetSelectionOnDoubleClick}\r\n detailsOnClick={detailsOnClick}\r\n onSeriesMouseOver={onSeriesMouseOver}\r\n onSeriesMouseClick={onSeriesMouseClick}\r\n scale={scale}\r\n polygonAltitude={polygonAltitude}\r\n centerLat={centerPoint[0]}\r\n centerLng={centerPoint[1]}\r\n atmosphereAltitude={atmosphereAltitude}\r\n globeCurvatureResolution={globeCurvatureResolution}\r\n fogSettings={fogSettings}\r\n lights={lights}\r\n highlightedAltitude={highlightedAltitude}\r\n selectedId={selectedId}\r\n />\r\n ) : (\r\n <div\r\n style={{\r\n height: `${Math.max(\r\n minHeight,\r\n height ||\r\n (relativeHeight\r\n ? minHeight\r\n ? (width || svgWidth) * relativeHeight > minHeight\r\n ? (width || svgWidth) * relativeHeight\r\n : minHeight\r\n : (width || svgWidth) * relativeHeight\r\n : svgHeight),\r\n )}px`,\r\n }}\r\n className='flex items-center justify-center'\r\n >\r\n <Spinner aria-label='Loading graph' />\r\n </div>\r\n )}\r\n </div>\r\n {sources || footNote ? (\r\n <GraphFooter\r\n styles={{ footnote: styles?.footnote, source: styles?.source }}\r\n classNames={{\r\n footnote: classNames?.footnote,\r\n source: classNames?.source,\r\n }}\r\n sources={sources}\r\n footNote={footNote}\r\n width={width}\r\n />\r\n ) : null}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["createLightFromConfig","config","light","THREE","Graph","props","width","autoRotate","data","enableZoom","categorical","colorDomain","colors","globeMaterial","height","polygonData","mapProperty","mapBorderColor","atmosphereColor","tooltip","styles","classNames","mapNoDataColor","colorLegendTitle","showColorScale","hoverStrokeColor","detailsOnClick","onSeriesMouseClick","onSeriesMouseOver","resetSelectionOnDoubleClick","highlightedIds","scale","globeOffset","polygonAltitude","centerLng","centerLat","atmosphereAltitude","globeCurvatureResolution","fogSettings","lights","highlightedAltitude","selectedId","globeReady","setGlobeReady","useState","globeEl","useRef","mouseClickData","setMouseClickData","showLegend","setShowLegend","mousePos","setMousePos","mouseOverData","setMouseOverData","colorScale","scaleOrdinal","scaleThreshold","useEffect","selectedPolygon","d","lng","lat","getCentroidCoordinates","canvas","handleMouseMove","e","materials","setupCustomLighting","useCallback","scene","camera","lightsAndObjToRemove","obj","i","handleGlobeReady","jsxs","jsx","Globe","polygon","id","val","el","color","clickedData","isEqual","hoverData","line","Fragment","X","P","numberFormattingFunction","Tooltip","Modal","string2HTML","ThreeDGlobe","mapData","graphTitle","sources","graphDescription","footNote","scaleType","padding","Colors","backgroundColor","relativeHeight","graphID","dataDownload","language","minHeight","theme","ariaLabel","centerPoint","mapShape","setMapShape","svgWidth","setSvgWidth","svgHeight","setSvgHeight","graphDiv","resizeObserver","entries","fetchAndParseJSON","features","reversed","geometry","coord","c","domain","getUniqValue","getJenks","cn","GraphHeader","Spinner","GraphFooter"],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { g as d, e as s, t as c } from "./index-9tDEUqOZ.js";
2
+ function h(t) {
3
+ return d(
4
+ t,
5
+ (e, r) => e + m(r),
6
+ 0
7
+ );
8
+ }
9
+ function m(t) {
10
+ let e = 0, r;
11
+ switch (t.type) {
12
+ case "Polygon":
13
+ return u(t.coordinates);
14
+ case "MultiPolygon":
15
+ for (r = 0; r < t.coordinates.length; r++)
16
+ e += u(t.coordinates[r]);
17
+ return e;
18
+ case "Point":
19
+ case "MultiPoint":
20
+ case "LineString":
21
+ case "MultiLineString":
22
+ return 0;
23
+ }
24
+ return 0;
25
+ }
26
+ function u(t) {
27
+ let e = 0;
28
+ if (t && t.length > 0) {
29
+ e += Math.abs(f(t[0]));
30
+ for (let r = 1; r < t.length; r++)
31
+ e -= Math.abs(f(t[r]));
32
+ }
33
+ return e;
34
+ }
35
+ var M = s * s / 2, l = Math.PI / 180;
36
+ function f(t) {
37
+ const e = t.length - 1;
38
+ if (e <= 2) return 0;
39
+ let r = 0, n = 0;
40
+ for (; n < e; ) {
41
+ const i = t[n], o = t[n + 1 === e ? 0 : n + 1], a = t[n + 2 >= e ? (n + 2) % e : n + 2], g = i[0] * l, p = o[1] * l, y = a[0] * l;
42
+ r += (y - g) * Math.sin(p), n++;
43
+ }
44
+ return r * M;
45
+ }
46
+ var _ = h;
47
+ function w(t, e = !0) {
48
+ if (t.geometry.type === "Polygon" || e === !1)
49
+ return c(t).geometry.coordinates;
50
+ if (t.geometry.type === "MultiPolygon") {
51
+ let r = 0, n = null;
52
+ for (const i of t.geometry.coordinates) {
53
+ const o = {
54
+ type: "Feature",
55
+ geometry: {
56
+ type: "Polygon",
57
+ coordinates: i
58
+ },
59
+ properties: {}
60
+ }, a = _(o);
61
+ a > r && (r = a, n = o);
62
+ }
63
+ return c(n).geometry.coordinates;
64
+ }
65
+ throw new Error("Unsupported geometry type");
66
+ }
67
+ export {
68
+ w as g
69
+ };
70
+ //# sourceMappingURL=getCentroidCoordinates-Dfk6IqEG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCentroidCoordinates-Dfk6IqEG.js","sources":["../node_modules/@turf/area/dist/esm/index.js","../src/Utils/getCentroidCoordinates.ts"],"sourcesContent":["// index.ts\nimport { earthRadius } from \"@turf/helpers\";\nimport { geomReduce } from \"@turf/meta\";\nfunction area(geojson) {\n return geomReduce(\n geojson,\n (value, geom) => {\n return value + calculateArea(geom);\n },\n 0\n );\n}\nfunction calculateArea(geom) {\n let total = 0;\n let i;\n switch (geom.type) {\n case \"Polygon\":\n return polygonArea(geom.coordinates);\n case \"MultiPolygon\":\n for (i = 0; i < geom.coordinates.length; i++) {\n total += polygonArea(geom.coordinates[i]);\n }\n return total;\n case \"Point\":\n case \"MultiPoint\":\n case \"LineString\":\n case \"MultiLineString\":\n return 0;\n }\n return 0;\n}\nfunction polygonArea(coords) {\n let total = 0;\n if (coords && coords.length > 0) {\n total += Math.abs(ringArea(coords[0]));\n for (let i = 1; i < coords.length; i++) {\n total -= Math.abs(ringArea(coords[i]));\n }\n }\n return total;\n}\nvar FACTOR = earthRadius * earthRadius / 2;\nvar PI_OVER_180 = Math.PI / 180;\nfunction ringArea(coords) {\n const coordsLength = coords.length - 1;\n if (coordsLength <= 2) return 0;\n let total = 0;\n let i = 0;\n while (i < coordsLength) {\n const lower = coords[i];\n const middle = coords[i + 1 === coordsLength ? 0 : i + 1];\n const upper = coords[i + 2 >= coordsLength ? (i + 2) % coordsLength : i + 2];\n const lowerX = lower[0] * PI_OVER_180;\n const middleY = middle[1] * PI_OVER_180;\n const upperX = upper[0] * PI_OVER_180;\n total += (upperX - lowerX) * Math.sin(middleY);\n i++;\n }\n return total * FACTOR;\n}\nvar turf_area_default = area;\nexport {\n area,\n turf_area_default as default\n};\n//# sourceMappingURL=index.js.map","import area from '@turf/area';\r\nimport centerOfMass from '@turf/center-of-mass';\r\nimport { Feature, Polygon, MultiPolygon, GeoJsonProperties } from 'geojson';\r\n\r\nexport function getCentroidCoordinates(\r\n multiPolygonFeature: Feature<Polygon | MultiPolygon, GeoJsonProperties>,\r\n centerLargestPolygon = true,\r\n) {\r\n // If it's already a Polygon, just return its centroid\r\n if (multiPolygonFeature.geometry.type === 'Polygon' || centerLargestPolygon === false) {\r\n return centerOfMass(multiPolygonFeature).geometry.coordinates;\r\n }\r\n\r\n // If it's MultiPolygon → find the largest polygon\r\n if (multiPolygonFeature.geometry.type === 'MultiPolygon') {\r\n let maxArea = 0;\r\n let largestPolygon: Feature<Polygon, GeoJsonProperties> | null = null;\r\n\r\n for (const coords of multiPolygonFeature.geometry.coordinates) {\r\n const poly: Feature<Polygon, GeoJsonProperties> = {\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Polygon',\r\n coordinates: coords,\r\n },\r\n properties: {},\r\n };\r\n\r\n const polyArea = area(poly);\r\n if (polyArea > maxArea) {\r\n maxArea = polyArea;\r\n largestPolygon = poly;\r\n }\r\n }\r\n\r\n return centerOfMass(largestPolygon).geometry.coordinates;\r\n }\r\n\r\n throw new Error('Unsupported geometry type');\r\n}\r\n"],"names":["area","geojson","geomReduce","value","geom","calculateArea","total","i","polygonArea","coords","ringArea","FACTOR","earthRadius","PI_OVER_180","coordsLength","lower","middle","upper","lowerX","middleY","upperX","turf_area_default","getCentroidCoordinates","multiPolygonFeature","centerLargestPolygon","centerOfMass","maxArea","largestPolygon","poly","polyArea"],"mappings":";AAGA,SAASA,EAAKC,GAAS;AACrB,SAAOC;AAAA,IACLD;AAAA,IACA,CAACE,GAAOC,MACCD,IAAQE,EAAcD,CAAI;AAAA,IAEnC;AAAA,EACJ;AACA;AACA,SAASC,EAAcD,GAAM;AAC3B,MAAIE,IAAQ,GACRC;AACJ,UAAQH,EAAK,MAAI;AAAA,IACf,KAAK;AACH,aAAOI,EAAYJ,EAAK,WAAW;AAAA,IACrC,KAAK;AACH,WAAKG,IAAI,GAAGA,IAAIH,EAAK,YAAY,QAAQG;AACvC,QAAAD,KAASE,EAAYJ,EAAK,YAAYG,CAAC,CAAC;AAE1C,aAAOD;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACb;AACE,SAAO;AACT;AACA,SAASE,EAAYC,GAAQ;AAC3B,MAAIH,IAAQ;AACZ,MAAIG,KAAUA,EAAO,SAAS,GAAG;AAC/B,IAAAH,KAAS,KAAK,IAAII,EAASD,EAAO,CAAC,CAAC,CAAC;AACrC,aAASF,IAAI,GAAGA,IAAIE,EAAO,QAAQF;AACjC,MAAAD,KAAS,KAAK,IAAII,EAASD,EAAOF,CAAC,CAAC,CAAC;AAAA,EAEzC;AACA,SAAOD;AACT;AACA,IAAIK,IAASC,IAAcA,IAAc,GACrCC,IAAc,KAAK,KAAK;AAC5B,SAASH,EAASD,GAAQ;AACxB,QAAMK,IAAeL,EAAO,SAAS;AACrC,MAAIK,KAAgB,EAAG,QAAO;AAC9B,MAAIR,IAAQ,GACRC,IAAI;AACR,SAAOA,IAAIO,KAAc;AACvB,UAAMC,IAAQN,EAAOF,CAAC,GAChBS,IAASP,EAAOF,IAAI,MAAMO,IAAe,IAAIP,IAAI,CAAC,GAClDU,IAAQR,EAAOF,IAAI,KAAKO,KAAgBP,IAAI,KAAKO,IAAeP,IAAI,CAAC,GACrEW,IAASH,EAAM,CAAC,IAAIF,GACpBM,IAAUH,EAAO,CAAC,IAAIH,GACtBO,IAASH,EAAM,CAAC,IAAIJ;AAC1B,IAAAP,MAAUc,IAASF,KAAU,KAAK,IAAIC,CAAO,GAC7CZ;AAAA,EACF;AACA,SAAOD,IAAQK;AACjB;AACA,IAAIU,IAAoBrB;ACxDjB,SAASsB,EACdC,GACAC,IAAuB,IACvB;AAEA,MAAID,EAAoB,SAAS,SAAS,aAAaC,MAAyB;AAC9E,WAAOC,EAAaF,CAAmB,EAAE,SAAS;AAIpD,MAAIA,EAAoB,SAAS,SAAS,gBAAgB;AACxD,QAAIG,IAAU,GACVC,IAA6D;AAEjE,eAAWlB,KAAUc,EAAoB,SAAS,aAAa;AAC7D,YAAMK,IAA4C;AAAA,QAChD,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAanB;AAAA,QAAA;AAAA,QAEf,YAAY,CAAA;AAAA,MAAC,GAGToB,IAAW7B,EAAK4B,CAAI;AAC1B,MAAIC,IAAWH,MACbA,IAAUG,GACVF,IAAiBC;AAAA,IAErB;AAEA,WAAOH,EAAaE,CAAc,EAAE,SAAS;AAAA,EAC/C;AAEA,QAAM,IAAI,MAAM,2BAA2B;AAC7C;","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ "use strict";const o=require("./index-CoZbeNM9.cjs");function d(t){return o.geomReduce(t,(e,r)=>e+p(r),0)}function p(t){let e=0,r;switch(t.type){case"Polygon":return u(t.coordinates);case"MultiPolygon":for(r=0;r<t.coordinates.length;r++)e+=u(t.coordinates[r]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function u(t){let e=0;if(t&&t.length>0){e+=Math.abs(c(t[0]));for(let r=1;r<t.length;r++)e-=Math.abs(c(t[r]))}return e}var h=o.earthRadius*o.earthRadius/2,l=Math.PI/180;function c(t){const e=t.length-1;if(e<=2)return 0;let r=0,n=0;for(;n<e;){const s=t[n],a=t[n+1===e?0:n+1],i=t[n+2>=e?(n+2)%e:n+2],f=s[0]*l,g=a[1]*l,y=i[0]*l;r+=(y-f)*Math.sin(g),n++}return r*h}var _=d;function M(t,e=!0){if(t.geometry.type==="Polygon"||e===!1)return o.turf_center_of_mass_default(t).geometry.coordinates;if(t.geometry.type==="MultiPolygon"){let r=0,n=null;for(const s of t.geometry.coordinates){const a={type:"Feature",geometry:{type:"Polygon",coordinates:s},properties:{}},i=_(a);i>r&&(r=i,n=a)}return o.turf_center_of_mass_default(n).geometry.coordinates}throw new Error("Unsupported geometry type")}exports.getCentroidCoordinates=M;
2
+ //# sourceMappingURL=getCentroidCoordinates-DxTBqzp2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCentroidCoordinates-DxTBqzp2.cjs","sources":["../node_modules/@turf/area/dist/esm/index.js","../src/Utils/getCentroidCoordinates.ts"],"sourcesContent":["// index.ts\nimport { earthRadius } from \"@turf/helpers\";\nimport { geomReduce } from \"@turf/meta\";\nfunction area(geojson) {\n return geomReduce(\n geojson,\n (value, geom) => {\n return value + calculateArea(geom);\n },\n 0\n );\n}\nfunction calculateArea(geom) {\n let total = 0;\n let i;\n switch (geom.type) {\n case \"Polygon\":\n return polygonArea(geom.coordinates);\n case \"MultiPolygon\":\n for (i = 0; i < geom.coordinates.length; i++) {\n total += polygonArea(geom.coordinates[i]);\n }\n return total;\n case \"Point\":\n case \"MultiPoint\":\n case \"LineString\":\n case \"MultiLineString\":\n return 0;\n }\n return 0;\n}\nfunction polygonArea(coords) {\n let total = 0;\n if (coords && coords.length > 0) {\n total += Math.abs(ringArea(coords[0]));\n for (let i = 1; i < coords.length; i++) {\n total -= Math.abs(ringArea(coords[i]));\n }\n }\n return total;\n}\nvar FACTOR = earthRadius * earthRadius / 2;\nvar PI_OVER_180 = Math.PI / 180;\nfunction ringArea(coords) {\n const coordsLength = coords.length - 1;\n if (coordsLength <= 2) return 0;\n let total = 0;\n let i = 0;\n while (i < coordsLength) {\n const lower = coords[i];\n const middle = coords[i + 1 === coordsLength ? 0 : i + 1];\n const upper = coords[i + 2 >= coordsLength ? (i + 2) % coordsLength : i + 2];\n const lowerX = lower[0] * PI_OVER_180;\n const middleY = middle[1] * PI_OVER_180;\n const upperX = upper[0] * PI_OVER_180;\n total += (upperX - lowerX) * Math.sin(middleY);\n i++;\n }\n return total * FACTOR;\n}\nvar turf_area_default = area;\nexport {\n area,\n turf_area_default as default\n};\n//# sourceMappingURL=index.js.map","import area from '@turf/area';\r\nimport centerOfMass from '@turf/center-of-mass';\r\nimport { Feature, Polygon, MultiPolygon, GeoJsonProperties } from 'geojson';\r\n\r\nexport function getCentroidCoordinates(\r\n multiPolygonFeature: Feature<Polygon | MultiPolygon, GeoJsonProperties>,\r\n centerLargestPolygon = true,\r\n) {\r\n // If it's already a Polygon, just return its centroid\r\n if (multiPolygonFeature.geometry.type === 'Polygon' || centerLargestPolygon === false) {\r\n return centerOfMass(multiPolygonFeature).geometry.coordinates;\r\n }\r\n\r\n // If it's MultiPolygon → find the largest polygon\r\n if (multiPolygonFeature.geometry.type === 'MultiPolygon') {\r\n let maxArea = 0;\r\n let largestPolygon: Feature<Polygon, GeoJsonProperties> | null = null;\r\n\r\n for (const coords of multiPolygonFeature.geometry.coordinates) {\r\n const poly: Feature<Polygon, GeoJsonProperties> = {\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Polygon',\r\n coordinates: coords,\r\n },\r\n properties: {},\r\n };\r\n\r\n const polyArea = area(poly);\r\n if (polyArea > maxArea) {\r\n maxArea = polyArea;\r\n largestPolygon = poly;\r\n }\r\n }\r\n\r\n return centerOfMass(largestPolygon).geometry.coordinates;\r\n }\r\n\r\n throw new Error('Unsupported geometry type');\r\n}\r\n"],"names":["area","geojson","geomReduce","value","geom","calculateArea","total","i","polygonArea","coords","ringArea","FACTOR","earthRadius","PI_OVER_180","coordsLength","lower","middle","upper","lowerX","middleY","upperX","turf_area_default","getCentroidCoordinates","multiPolygonFeature","centerLargestPolygon","centerOfMass","maxArea","largestPolygon","poly","polyArea"],"mappings":"qDAGA,SAASA,EAAKC,EAAS,CACrB,OAAOC,EAAAA,WACLD,EACA,CAACE,EAAOC,IACCD,EAAQE,EAAcD,CAAI,EAEnC,CACJ,CACA,CACA,SAASC,EAAcD,EAAM,CAC3B,IAAIE,EAAQ,EACRC,EACJ,OAAQH,EAAK,KAAI,CACf,IAAK,UACH,OAAOI,EAAYJ,EAAK,WAAW,EACrC,IAAK,eACH,IAAKG,EAAI,EAAGA,EAAIH,EAAK,YAAY,OAAQG,IACvCD,GAASE,EAAYJ,EAAK,YAAYG,CAAC,CAAC,EAE1C,OAAOD,EACT,IAAK,QACL,IAAK,aACL,IAAK,aACL,IAAK,kBACH,MAAO,EACb,CACE,MAAO,EACT,CACA,SAASE,EAAYC,EAAQ,CAC3B,IAAIH,EAAQ,EACZ,GAAIG,GAAUA,EAAO,OAAS,EAAG,CAC/BH,GAAS,KAAK,IAAII,EAASD,EAAO,CAAC,CAAC,CAAC,EACrC,QAASF,EAAI,EAAGA,EAAIE,EAAO,OAAQF,IACjCD,GAAS,KAAK,IAAII,EAASD,EAAOF,CAAC,CAAC,CAAC,CAEzC,CACA,OAAOD,CACT,CACA,IAAIK,EAASC,EAAAA,YAAcA,EAAAA,YAAc,EACrCC,EAAc,KAAK,GAAK,IAC5B,SAASH,EAASD,EAAQ,CACxB,MAAMK,EAAeL,EAAO,OAAS,EACrC,GAAIK,GAAgB,EAAG,MAAO,GAC9B,IAAIR,EAAQ,EACRC,EAAI,EACR,KAAOA,EAAIO,GAAc,CACvB,MAAMC,EAAQN,EAAOF,CAAC,EAChBS,EAASP,EAAOF,EAAI,IAAMO,EAAe,EAAIP,EAAI,CAAC,EAClDU,EAAQR,EAAOF,EAAI,GAAKO,GAAgBP,EAAI,GAAKO,EAAeP,EAAI,CAAC,EACrEW,EAASH,EAAM,CAAC,EAAIF,EACpBM,EAAUH,EAAO,CAAC,EAAIH,EACtBO,EAASH,EAAM,CAAC,EAAIJ,EAC1BP,IAAUc,EAASF,GAAU,KAAK,IAAIC,CAAO,EAC7CZ,GACF,CACA,OAAOD,EAAQK,CACjB,CACA,IAAIU,EAAoBrB,ECxDjB,SAASsB,EACdC,EACAC,EAAuB,GACvB,CAEA,GAAID,EAAoB,SAAS,OAAS,WAAaC,IAAyB,GAC9E,OAAOC,8BAAaF,CAAmB,EAAE,SAAS,YAIpD,GAAIA,EAAoB,SAAS,OAAS,eAAgB,CACxD,IAAIG,EAAU,EACVC,EAA6D,KAEjE,UAAWlB,KAAUc,EAAoB,SAAS,YAAa,CAC7D,MAAMK,EAA4C,CAChD,KAAM,UACN,SAAU,CACR,KAAM,UACN,YAAanB,CAAA,EAEf,WAAY,CAAA,CAAC,EAGToB,EAAW7B,EAAK4B,CAAI,EACtBC,EAAWH,IACbA,EAAUG,EACVF,EAAiBC,EAErB,CAEA,OAAOH,8BAAaE,CAAc,EAAE,SAAS,WAC/C,CAEA,MAAM,IAAI,MAAM,2BAA2B,CAC7C","x_google_ignoreList":[0]}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./BarGraph.cjs"),i=require("./index-CVlCtJbC.cjs"),h=require("./DonutChart.cjs"),s=require("./DumbbellChart.cjs"),l=require("./BeeSwarmChart.cjs"),c=require("./DualAxisLineChart.cjs"),u=require("./LineChartWithConfidenceInterval.cjs"),d=require("./SimpleLineChart.cjs"),p=require("./MultiLineChart.cjs"),g=require("./MultiLineAltChart.cjs"),m=require("./DifferenceLineChart.cjs"),C=require("./SparkLine.cjs"),S=require("./BiVariateChoroplethMap.cjs"),D=require("./ChoroplethMap.cjs"),G=require("./DotDensityMap.cjs"),q=require("./ThreeDGlobe.cjs"),f=require("./GeoHubMap.cjs"),b=require("./GeoHubCompareMaps.cjs"),F=require("./GeoHubMapWithLayerSelection.cjs"),M=require("./ScatterPlot.cjs"),L=require("./SlopeChart.cjs"),B=require("./BulletChart.cjs"),T=require("./AreaChart.cjs"),v=require("./BasicStatCard.cjs"),P=require("./StatCardFromData.cjs"),y=require("./TreeMapGraph.cjs"),A=require("./UnitChart.cjs"),H=require("./HeatMap.cjs"),O=require("./DataTable.cjs"),w=require("./DataCards.cjs"),I=require("./StripChart.cjs"),k=require("./ParetoChart.cjs"),W=require("./ButterflyChart.cjs"),x=require("./Histogram.cjs"),N=require("./SankeyChart.cjs"),V=require("./RadarChart.cjs"),J=require("./MultiGraphDashboard.cjs"),U=require("./PerformanceIntensiveMultiGraphDashboard.cjs"),E=require("./MultiGraphDashboardWideToLongFormat.cjs"),R=require("./SingleGraphDashboard.cjs"),Q=require("./SingleGraphDashboardGeoHubMaps.cjs"),j=require("./SingleGraphDashboardThreeDGraphs.cjs"),z=require("./GriddedGraphs.cjs"),K=require("./ScrollStory.cjs"),X=require("./PerformanceIntensiveScrollStory.cjs"),Y=require("./MultiGraphDashboardFromConfig.cjs"),Z=require("./PerformanceIntensiveMultiGraphDashboardFromConfig.cjs"),_=require("./MultiGraphDashboardWideToLongFormatFromConfig.cjs"),$=require("./SingleGraphDashboardFromConfig.cjs"),ee=require("./SingleGraphDashboardGeoHubMapsFromConfig.cjs"),re=require("./SingleGraphDashboardThreeDGraphsFromConfig.cjs"),ae=require("./GriddedGraphsFromConfig.cjs"),te=require("./ExcelDownloadButton.cjs"),oe=require("./ImageDownloadButton.cjs"),ne=require("./SVGDownloadButton.cjs"),ie=require("./CsvDownloadButton.cjs"),he=require("./CopyTextButton.cjs"),se=require("./Colors.cjs"),le=require("./ColorLegend.cjs"),ce=require("./ColorLegendWithMouseOver.cjs"),ue=require("./LinearColorLegend.cjs"),de=require("./ThresholdColorLegendWithMouseOver.cjs"),pe=require("./GraphFooter.cjs"),ge=require("./GraphHeader.cjs"),me=require("./FootNote.cjs"),Ce=require("./GraphDescription.cjs"),Se=require("./GraphTitle.cjs"),De=require("./Source.cjs"),Ge=require("./checkIfNullOrUndefined-BCW3Y1ML.cjs"),a=require("./removeOutliers-WELHHqiI.cjs"),qe=require("./numberFormattingFunction-02t-wJta.cjs"),fe=require("./getTextColorBasedOnBgColor-nqY-bsM_.cjs"),be=require("./getJenks-GYmdwBqm.cjs"),Fe=require("./imageDownload-CgDcm1Sj.cjs"),Me=require("./svgDownload-D9zEGjTF.cjs"),Le=require("./excelDownload-BQpsCa62.cjs"),Be=require("./getUniqValue-RViz8tTw.cjs"),r=require("./fetchAndParseData-Ba-_CgxS.cjs"),n=require("./transformDataForAggregation-KXGm6flX.cjs"),Te=require("./transformDataForGraphFromFile-DVZodTHd.cjs"),o=require("./validateSchema.cjs"),e=require("./getSchema.cjs"),ve=require("./getGraphList-gf02xgT2.cjs");exports.GroupedBarGraph=t.GroupedBarGraph;exports.SimpleBarGraph=t.SimpleBarGraph;exports.StackedBarGraph=t.StackedBarGraph;exports.CirclePackingGraph=i.CirclePackingGraph;exports.DonutChart=h.DonutChart;exports.DumbbellChart=s.DumbbellChart;exports.BeeSwarmChart=l.BeeSwarmChart;exports.DualAxisLineChart=c.DualAxisLineChart;exports.LineChartWithConfidenceInterval=u.LineChartWithConfidenceInterval;exports.SimpleLineChart=d.SimpleLineChart;exports.MultiLineChart=p.MultiLineChart;exports.MultiLineAltChart=g.MultiLineAltChart;exports.DifferenceLineChart=m.DifferenceLineChart;exports.SparkLine=C.SparkLine;exports.BiVariateChoroplethMap=S.BiVariateChoroplethMap;exports.ChoroplethMap=D.ChoroplethMap;exports.DotDensityMap=G.DotDensityMap;exports.ThreeDGlobe=q.ThreeDGlobe;exports.GeoHubMap=f.GeoHubMap;exports.GeoHubCompareMaps=b.GeoHubCompareMaps;exports.GeoHubMapWithLayerSelection=F.GeoHubMapWithLayerSelection;exports.ScatterPlot=M.ScatterPlot;exports.SlopeChart=L.SlopeChart;exports.BulletChart=B.BulletChart;exports.AreaChart=T.AreaChart;exports.BasicStatCard=v.BasicStatCard;exports.StatCardFromData=P.StatCardFromData;exports.TreeMapGraph=y.TreeMapGraph;exports.UnitChart=A.UnitChart;exports.HeatMap=H.HeatMap;exports.DataTable=O.DataTable;exports.DataCards=w.DataCards;exports.StripChart=I.StripChart;exports.ParetoChart=k.ParetoChart;exports.ButterflyChart=W.ButterflyChart;exports.Histogram=x.Histogram;exports.SankeyChart=N.SankeyChart;exports.RadarChart=V.RadarChart;exports.MultiGraphDashboard=J.MultiGraphDashboard;exports.PerformanceIntensiveMultiGraphDashboard=U.PerformanceIntensiveMultiGraphDashboard;exports.MultiGraphDashboardWideToLongFormat=E.MultiGraphDashboardWideToLongFormat;exports.SingleGraphDashboard=R.SingleGraphDashboard;exports.SingleGraphDashboardGeoHubMaps=Q.SingleGraphDashboardGeoHubMaps;exports.SingleGraphDashboardThreeDGraphs=j.SingleGraphDashboardThreeDGraphs;exports.GriddedGraphs=z.GriddedGraphs;exports.ScrollStory=K.ScrollStory;exports.PerformanceIntensiveScrollStory=X.PerformanceIntensiveScrollStory;exports.MultiGraphDashboardFromConfig=Y.MultiGraphDashboardFromConfig;exports.PerformanceIntensiveMultiGraphDashboardFromConfig=Z.PerformanceIntensiveMultiGraphDashboardFromConfig;exports.MultiGraphDashboardWideToLongFormatFromConfig=_.MultiGraphDashboardWideToLongFormatFromConfig;exports.SingleGraphDashboardFromConfig=$.SingleGraphDashboardFromConfig;exports.SingleGraphDashboardGeoHubMapsFromConfig=ee.SingleGraphDashboardGeoHubMapsFromConfig;exports.SingleGraphDashboardThreeDGraphsFromConfig=re.SingleGraphDashboardThreeDGraphsFromConfig;exports.GriddedGraphsFromConfig=ae.GriddedGraphsFromConfig;exports.ExcelDownloadButton=te.ExcelDownloadButton;exports.ImageDownloadButton=oe.ImageDownloadButton;exports.SVGDownloadButton=ne.SVGDownloadButton;exports.CsvDownloadButton=ie.CsvDownloadButton;exports.CopyTextButton=he.CopyTextButton;exports.Colors=se.Colors;exports.ColorLegend=le.ColorLegend;exports.ColorLegendWithMouseOver=ce.ColorLegendWithMouseOver;exports.LinearColorLegend=ue.LinearColorLegend;exports.ThresholdColorLegendWithMouseOver=de.ThresholdColorLegendWithMouseOver;exports.GraphFooter=pe.GraphFooter;exports.GraphHeader=ge.GraphHeader;exports.FootNote=me.FootNote;exports.GraphDescription=Ce.GraphDescription;exports.GraphTitle=Se.GraphTitle;exports.Source=De.Source;exports.checkIfNullOrUndefined=Ge.checkIfNullOrUndefined;exports.generateEmbedLink=a.generateEmbedLink;exports.generateIframeCode=a.generateIframeCode;exports.getPercentileValue=a.getPercentileValue;exports.getQueryParamsFromLink=a.getQueryParamsFromLink;exports.removeOutliers=a.removeOutliers;exports.numberFormattingFunction=qe.numberFormattingFunction;exports.getTextColorBasedOnBgColor=fe.getTextColorBasedOnBgColor;exports.getJenks=be.getJenks;exports.imageDownload=Fe.imageDownload;exports.svgDownload=Me.svgDownload;exports.excelDownload=Le.excelDownload;exports.getUniqValue=Be.getUniqValue;exports.fetchAndParseCSV=r.fetchAndParseCSV;exports.fetchAndParseCSVFromTextBlob=r.fetchAndParseCSVFromTextBlob;exports.fetchAndParseJSON=r.fetchAndParseJSON;exports.fetchAndParseMultipleDataSources=r.fetchAndParseMultipleDataSources;exports.fetchAndTransformDataFromAPI=r.fetchAndTransformDataFromAPI;exports.transformColumnsToArray=r.transformColumnsToArray;exports.transformDataForAggregation=n.transformDataForAggregation;exports.transformDataForGraph=n.transformDataForGraph;exports.transformDataForGraphFromFile=Te.transformDataForGraphFromFile;exports.validateConfigSchema=o.validateConfigSchema;exports.validateDataSchema=o.validateDataSchema;exports.validateSettingsSchema=o.validateSettingsSchema;exports.getDashboardJSONSchema=e.getDashboardJSONSchema;exports.getDashboardWideToLongFormatJSONSchema=e.getDashboardWideToLongFormatJSONSchema;exports.getDataFiltersSchema=e.getDataFiltersSchema;exports.getDataSchema=e.getDataSchema;exports.getDataSelectionSchema=e.getDataSelectionSchema;exports.getDataSettingsSchema=e.getDataSettingsSchema;exports.getDataTransformSchema=e.getDataTransformSchema;exports.getFiltersSchema=e.getFiltersSchema;exports.getGraphDataConfigurationSchema=e.getGraphDataConfigurationSchema;exports.getGriddedGraphJSONSchema=e.getGriddedGraphJSONSchema;exports.getReadableHeaderSchema=e.getReadableHeaderSchema;exports.getSettingsSchema=e.getSettingsSchema;exports.getSingleGraphJSONSchema=e.getSingleGraphJSONSchema;exports.graphList=ve.graphList;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./BarGraph.cjs"),i=require("./index-CVlCtJbC.cjs"),h=require("./DonutChart.cjs"),s=require("./DumbbellChart.cjs"),l=require("./BeeSwarmChart.cjs"),c=require("./DualAxisLineChart.cjs"),u=require("./LineChartWithConfidenceInterval.cjs"),d=require("./SimpleLineChart.cjs"),g=require("./MultiLineChart.cjs"),p=require("./MultiLineAltChart.cjs"),C=require("./DifferenceLineChart.cjs"),m=require("./SparkLine.cjs"),S=require("./BiVariateChoroplethMap.cjs"),D=require("./ChoroplethMap.cjs"),G=require("./DotDensityMap.cjs"),q=require("./ThreeDGlobe.cjs"),f=require("./GeoHubMap.cjs"),b=require("./GeoHubCompareMaps.cjs"),F=require("./GeoHubMapWithLayerSelection.cjs"),M=require("./ScatterPlot.cjs"),L=require("./SlopeChart.cjs"),B=require("./BulletChart.cjs"),T=require("./AreaChart.cjs"),v=require("./BasicStatCard.cjs"),P=require("./StatCardFromData.cjs"),y=require("./TreeMapGraph.cjs"),A=require("./UnitChart.cjs"),H=require("./HeatMap.cjs"),O=require("./DataTable.cjs"),w=require("./DataCards.cjs"),I=require("./StripChart.cjs"),k=require("./ParetoChart.cjs"),W=require("./ButterflyChart.cjs"),x=require("./Histogram.cjs"),N=require("./SankeyChart.cjs"),V=require("./RadarChart.cjs"),J=require("./MultiGraphDashboard.cjs"),U=require("./PerformanceIntensiveMultiGraphDashboard.cjs"),E=require("./MultiGraphDashboardWideToLongFormat.cjs"),R=require("./SingleGraphDashboard.cjs"),Q=require("./SingleGraphDashboardGeoHubMaps.cjs"),j=require("./SingleGraphDashboardThreeDGraphs.cjs"),z=require("./GriddedGraphs.cjs"),K=require("./ScrollStory.cjs"),X=require("./PerformanceIntensiveScrollStory.cjs"),Y=require("./MultiGraphDashboardFromConfig.cjs"),Z=require("./PerformanceIntensiveMultiGraphDashboardFromConfig.cjs"),_=require("./MultiGraphDashboardWideToLongFormatFromConfig.cjs"),$=require("./SingleGraphDashboardFromConfig.cjs"),ee=require("./SingleGraphDashboardGeoHubMapsFromConfig.cjs"),re=require("./SingleGraphDashboardThreeDGraphsFromConfig.cjs"),ae=require("./GriddedGraphsFromConfig.cjs"),te=require("./ExcelDownloadButton.cjs"),oe=require("./ImageDownloadButton.cjs"),ne=require("./SVGDownloadButton.cjs"),ie=require("./CsvDownloadButton.cjs"),he=require("./CopyTextButton.cjs"),se=require("./Colors.cjs"),le=require("./ColorLegend.cjs"),ce=require("./ColorLegendWithMouseOver.cjs"),ue=require("./LinearColorLegend.cjs"),de=require("./ThresholdColorLegendWithMouseOver.cjs"),ge=require("./GraphFooter.cjs"),pe=require("./GraphHeader.cjs"),Ce=require("./FootNote.cjs"),me=require("./GraphDescription.cjs"),Se=require("./GraphTitle.cjs"),De=require("./Source.cjs"),Ge=require("./checkIfNullOrUndefined-BCW3Y1ML.cjs"),a=require("./removeOutliers-WELHHqiI.cjs"),qe=require("./numberFormattingFunction-02t-wJta.cjs"),fe=require("./getTextColorBasedOnBgColor-nqY-bsM_.cjs"),be=require("./getJenks-GYmdwBqm.cjs"),Fe=require("./imageDownload-CgDcm1Sj.cjs"),Me=require("./svgDownload-D9zEGjTF.cjs"),Le=require("./excelDownload-BQpsCa62.cjs"),Be=require("./getUniqValue-RViz8tTw.cjs"),Te=require("./getCentroidCoordinates-DxTBqzp2.cjs"),r=require("./fetchAndParseData-Ba-_CgxS.cjs"),n=require("./transformDataForAggregation-KXGm6flX.cjs"),ve=require("./transformDataForGraphFromFile-DVZodTHd.cjs"),o=require("./validateSchema.cjs"),e=require("./getSchema.cjs"),Pe=require("./getGraphList-gf02xgT2.cjs");exports.GroupedBarGraph=t.GroupedBarGraph;exports.SimpleBarGraph=t.SimpleBarGraph;exports.StackedBarGraph=t.StackedBarGraph;exports.CirclePackingGraph=i.CirclePackingGraph;exports.DonutChart=h.DonutChart;exports.DumbbellChart=s.DumbbellChart;exports.BeeSwarmChart=l.BeeSwarmChart;exports.DualAxisLineChart=c.DualAxisLineChart;exports.LineChartWithConfidenceInterval=u.LineChartWithConfidenceInterval;exports.SimpleLineChart=d.SimpleLineChart;exports.MultiLineChart=g.MultiLineChart;exports.MultiLineAltChart=p.MultiLineAltChart;exports.DifferenceLineChart=C.DifferenceLineChart;exports.SparkLine=m.SparkLine;exports.BiVariateChoroplethMap=S.BiVariateChoroplethMap;exports.ChoroplethMap=D.ChoroplethMap;exports.DotDensityMap=G.DotDensityMap;exports.ThreeDGlobe=q.ThreeDGlobe;exports.GeoHubMap=f.GeoHubMap;exports.GeoHubCompareMaps=b.GeoHubCompareMaps;exports.GeoHubMapWithLayerSelection=F.GeoHubMapWithLayerSelection;exports.ScatterPlot=M.ScatterPlot;exports.SlopeChart=L.SlopeChart;exports.BulletChart=B.BulletChart;exports.AreaChart=T.AreaChart;exports.BasicStatCard=v.BasicStatCard;exports.StatCardFromData=P.StatCardFromData;exports.TreeMapGraph=y.TreeMapGraph;exports.UnitChart=A.UnitChart;exports.HeatMap=H.HeatMap;exports.DataTable=O.DataTable;exports.DataCards=w.DataCards;exports.StripChart=I.StripChart;exports.ParetoChart=k.ParetoChart;exports.ButterflyChart=W.ButterflyChart;exports.Histogram=x.Histogram;exports.SankeyChart=N.SankeyChart;exports.RadarChart=V.RadarChart;exports.MultiGraphDashboard=J.MultiGraphDashboard;exports.PerformanceIntensiveMultiGraphDashboard=U.PerformanceIntensiveMultiGraphDashboard;exports.MultiGraphDashboardWideToLongFormat=E.MultiGraphDashboardWideToLongFormat;exports.SingleGraphDashboard=R.SingleGraphDashboard;exports.SingleGraphDashboardGeoHubMaps=Q.SingleGraphDashboardGeoHubMaps;exports.SingleGraphDashboardThreeDGraphs=j.SingleGraphDashboardThreeDGraphs;exports.GriddedGraphs=z.GriddedGraphs;exports.ScrollStory=K.ScrollStory;exports.PerformanceIntensiveScrollStory=X.PerformanceIntensiveScrollStory;exports.MultiGraphDashboardFromConfig=Y.MultiGraphDashboardFromConfig;exports.PerformanceIntensiveMultiGraphDashboardFromConfig=Z.PerformanceIntensiveMultiGraphDashboardFromConfig;exports.MultiGraphDashboardWideToLongFormatFromConfig=_.MultiGraphDashboardWideToLongFormatFromConfig;exports.SingleGraphDashboardFromConfig=$.SingleGraphDashboardFromConfig;exports.SingleGraphDashboardGeoHubMapsFromConfig=ee.SingleGraphDashboardGeoHubMapsFromConfig;exports.SingleGraphDashboardThreeDGraphsFromConfig=re.SingleGraphDashboardThreeDGraphsFromConfig;exports.GriddedGraphsFromConfig=ae.GriddedGraphsFromConfig;exports.ExcelDownloadButton=te.ExcelDownloadButton;exports.ImageDownloadButton=oe.ImageDownloadButton;exports.SVGDownloadButton=ne.SVGDownloadButton;exports.CsvDownloadButton=ie.CsvDownloadButton;exports.CopyTextButton=he.CopyTextButton;exports.Colors=se.Colors;exports.ColorLegend=le.ColorLegend;exports.ColorLegendWithMouseOver=ce.ColorLegendWithMouseOver;exports.LinearColorLegend=ue.LinearColorLegend;exports.ThresholdColorLegendWithMouseOver=de.ThresholdColorLegendWithMouseOver;exports.GraphFooter=ge.GraphFooter;exports.GraphHeader=pe.GraphHeader;exports.FootNote=Ce.FootNote;exports.GraphDescription=me.GraphDescription;exports.GraphTitle=Se.GraphTitle;exports.Source=De.Source;exports.checkIfNullOrUndefined=Ge.checkIfNullOrUndefined;exports.generateEmbedLink=a.generateEmbedLink;exports.generateIframeCode=a.generateIframeCode;exports.getPercentileValue=a.getPercentileValue;exports.getQueryParamsFromLink=a.getQueryParamsFromLink;exports.removeOutliers=a.removeOutliers;exports.numberFormattingFunction=qe.numberFormattingFunction;exports.getTextColorBasedOnBgColor=fe.getTextColorBasedOnBgColor;exports.getJenks=be.getJenks;exports.imageDownload=Fe.imageDownload;exports.svgDownload=Me.svgDownload;exports.excelDownload=Le.excelDownload;exports.getUniqValue=Be.getUniqValue;exports.getCentroidCoordinates=Te.getCentroidCoordinates;exports.fetchAndParseCSV=r.fetchAndParseCSV;exports.fetchAndParseCSVFromTextBlob=r.fetchAndParseCSVFromTextBlob;exports.fetchAndParseJSON=r.fetchAndParseJSON;exports.fetchAndParseMultipleDataSources=r.fetchAndParseMultipleDataSources;exports.fetchAndTransformDataFromAPI=r.fetchAndTransformDataFromAPI;exports.transformColumnsToArray=r.transformColumnsToArray;exports.transformDataForAggregation=n.transformDataForAggregation;exports.transformDataForGraph=n.transformDataForGraph;exports.transformDataForGraphFromFile=ve.transformDataForGraphFromFile;exports.validateConfigSchema=o.validateConfigSchema;exports.validateDataSchema=o.validateDataSchema;exports.validateSettingsSchema=o.validateSettingsSchema;exports.getDashboardJSONSchema=e.getDashboardJSONSchema;exports.getDashboardWideToLongFormatJSONSchema=e.getDashboardWideToLongFormatJSONSchema;exports.getDataFiltersSchema=e.getDataFiltersSchema;exports.getDataSchema=e.getDataSchema;exports.getDataSelectionSchema=e.getDataSelectionSchema;exports.getDataSettingsSchema=e.getDataSettingsSchema;exports.getDataTransformSchema=e.getDataTransformSchema;exports.getFiltersSchema=e.getFiltersSchema;exports.getGraphDataConfigurationSchema=e.getGraphDataConfigurationSchema;exports.getGriddedGraphJSONSchema=e.getGriddedGraphJSONSchema;exports.getReadableHeaderSchema=e.getReadableHeaderSchema;exports.getSettingsSchema=e.getSettingsSchema;exports.getSingleGraphJSONSchema=e.getSingleGraphJSONSchema;exports.graphList=Pe.graphList;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import { default as default_2 } from 'react';
2
+ import { Feature } from 'geojson';
3
+ import { GeoJsonProperties } from 'geojson';
2
4
  import { JSX } from 'react/jsx-runtime';
3
5
  import { JSX as JSX_2 } from 'react';
6
+ import { MultiPolygon } from 'geojson';
7
+ import { Polygon } from 'geojson';
8
+ import { Position as Position_2 } from 'geojson';
4
9
  import * as THREE from 'three';
5
10
 
6
11
  declare interface AdvancedDataSelectionDataType {
@@ -867,6 +872,8 @@ export declare function GeoHubMap(props: Props_17): JSX.Element;
867
872
  /** For using these maps you will have to install [`maplibre`](https://maplibre.org/maplibre-gl-js/docs/#npm) and [pmtiles](https://www.npmjs.com/package/pmtiles) package to your project */
868
873
  export declare function GeoHubMapWithLayerSelection(props: Props_19): JSX.Element;
869
874
 
875
+ export declare function getCentroidCoordinates(multiPolygonFeature: Feature<Polygon | MultiPolygon, GeoJsonProperties>, centerLargestPolygon?: boolean): Position_2;
876
+
870
877
  export declare const getDashboardJSONSchema: (columnList?: string[]) => Promise<{
871
878
  properties: {
872
879
  dashboardID: {
package/dist/index.js CHANGED
@@ -75,12 +75,13 @@ import { i as zo } from "./imageDownload-Dcci2LEy.js";
75
75
  import { s as Xo } from "./svgDownload-C2-E3yf2.js";
76
76
  import { e as Zo } from "./excelDownload-BOA-lskf.js";
77
77
  import { g as $o } from "./getUniqValue-DiCh_MOD.js";
78
- import { b as oe, d as ee, f as ae, c as te, a as me, t as pe } from "./fetchAndParseData-sapWbnYk.js";
79
- import { t as he, a as ne } from "./transformDataForAggregation-sBpdlX8n.js";
80
- import { t as ie } from "./transformDataForGraphFromFile-ComYvzuz.js";
81
- import { validateConfigSchema as le, validateDataSchema as de, validateSettingsSchema as ge } from "./validateSchema.js";
82
- import { getDashboardJSONSchema as Ce, getDashboardWideToLongFormatJSONSchema as ce, getDataFiltersSchema as De, getDataSchema as Ge, getDataSelectionSchema as ue, getDataSettingsSchema as be, getDataTransformSchema as Fe, getFiltersSchema as Me, getGraphDataConfigurationSchema as Le, getGriddedGraphJSONSchema as Be, getReadableHeaderSchema as Te, getSettingsSchema as Pe, getSingleGraphJSONSchema as ve } from "./getSchema.js";
83
- import { g as Oe } from "./getGraphList-DuColTJM.js";
78
+ import { g as oe } from "./getCentroidCoordinates-Dfk6IqEG.js";
79
+ import { b as ae, d as te, f as me, c as pe, a as fe, t as he } from "./fetchAndParseData-sapWbnYk.js";
80
+ import { t as xe, a as ie } from "./transformDataForAggregation-sBpdlX8n.js";
81
+ import { t as le } from "./transformDataForGraphFromFile-ComYvzuz.js";
82
+ import { validateConfigSchema as ge, validateDataSchema as Se, validateSettingsSchema as Ce } from "./validateSchema.js";
83
+ import { getDashboardJSONSchema as De, getDashboardWideToLongFormatJSONSchema as Ge, getDataFiltersSchema as ue, getDataSchema as be, getDataSelectionSchema as Fe, getDataSettingsSchema as Me, getDataTransformSchema as Le, getFiltersSchema as Be, getGraphDataConfigurationSchema as Te, getGriddedGraphJSONSchema as Pe, getReadableHeaderSchema as ve, getSettingsSchema as Ae, getSingleGraphJSONSchema as Oe } from "./getSchema.js";
84
+ import { g as He } from "./getGraphList-DuColTJM.js";
84
85
  export {
85
86
  K as AreaChart,
86
87
  Y as BasicStatCard,
@@ -154,42 +155,43 @@ export {
154
155
  er as UnitChart,
155
156
  Ho as checkIfNullOrUndefined,
156
157
  Zo as excelDownload,
157
- oe as fetchAndParseCSV,
158
- ee as fetchAndParseCSVFromTextBlob,
159
- ae as fetchAndParseJSON,
160
- te as fetchAndParseMultipleDataSources,
161
- me as fetchAndTransformDataFromAPI,
158
+ ae as fetchAndParseCSV,
159
+ te as fetchAndParseCSVFromTextBlob,
160
+ me as fetchAndParseJSON,
161
+ pe as fetchAndParseMultipleDataSources,
162
+ fe as fetchAndTransformDataFromAPI,
162
163
  wo as generateEmbedLink,
163
164
  Io as generateIframeCode,
164
- Ce as getDashboardJSONSchema,
165
- ce as getDashboardWideToLongFormatJSONSchema,
166
- De as getDataFiltersSchema,
167
- Ge as getDataSchema,
168
- ue as getDataSelectionSchema,
169
- be as getDataSettingsSchema,
170
- Fe as getDataTransformSchema,
171
- Me as getFiltersSchema,
172
- Le as getGraphDataConfigurationSchema,
173
- Be as getGriddedGraphJSONSchema,
165
+ oe as getCentroidCoordinates,
166
+ De as getDashboardJSONSchema,
167
+ Ge as getDashboardWideToLongFormatJSONSchema,
168
+ ue as getDataFiltersSchema,
169
+ be as getDataSchema,
170
+ Fe as getDataSelectionSchema,
171
+ Me as getDataSettingsSchema,
172
+ Le as getDataTransformSchema,
173
+ Be as getFiltersSchema,
174
+ Te as getGraphDataConfigurationSchema,
175
+ Pe as getGriddedGraphJSONSchema,
174
176
  Qo as getJenks,
175
177
  No as getPercentileValue,
176
178
  Wo as getQueryParamsFromLink,
177
- Te as getReadableHeaderSchema,
178
- Pe as getSettingsSchema,
179
- ve as getSingleGraphJSONSchema,
179
+ ve as getReadableHeaderSchema,
180
+ Ae as getSettingsSchema,
181
+ Oe as getSingleGraphJSONSchema,
180
182
  Ro as getTextColorBasedOnBgColor,
181
183
  $o as getUniqValue,
182
- Oe as graphList,
184
+ He as graphList,
183
185
  zo as imageDownload,
184
186
  Uo as numberFormattingFunction,
185
187
  Jo as removeOutliers,
186
188
  Xo as svgDownload,
187
- pe as transformColumnsToArray,
188
- he as transformDataForAggregation,
189
- ne as transformDataForGraph,
190
- ie as transformDataForGraphFromFile,
191
- le as validateConfigSchema,
192
- de as validateDataSchema,
193
- ge as validateSettingsSchema
189
+ he as transformColumnsToArray,
190
+ xe as transformDataForAggregation,
191
+ ie as transformDataForGraph,
192
+ le as transformDataForGraphFromFile,
193
+ ge as validateConfigSchema,
194
+ Se as validateDataSchema,
195
+ Ce as validateSettingsSchema
194
196
  };
195
197
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/utils.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./checkIfNullOrUndefined-BCW3Y1ML.cjs"),e=require("./removeOutliers-WELHHqiI.cjs"),n=require("./numberFormattingFunction-02t-wJta.cjs"),o=require("./getTextColorBasedOnBgColor-nqY-bsM_.cjs"),t=require("./getJenks-GYmdwBqm.cjs"),i=require("./imageDownload-CgDcm1Sj.cjs"),a=require("./svgDownload-D9zEGjTF.cjs"),l=require("./excelDownload-BQpsCa62.cjs"),g=require("./getUniqValue-RViz8tTw.cjs"),u=require("./getGraphList-gf02xgT2.cjs");exports.checkIfNullOrUndefined=r.checkIfNullOrUndefined;exports.generateEmbedLink=e.generateEmbedLink;exports.generateIframeCode=e.generateIframeCode;exports.getPercentileValue=e.getPercentileValue;exports.getQueryParamsFromLink=e.getQueryParamsFromLink;exports.removeOutliers=e.removeOutliers;exports.numberFormattingFunction=n.numberFormattingFunction;exports.getTextColorBasedOnBgColor=o.getTextColorBasedOnBgColor;exports.getJenks=t.getJenks;exports.imageDownload=i.imageDownload;exports.svgDownload=a.svgDownload;exports.excelDownload=l.excelDownload;exports.getUniqValue=g.getUniqValue;exports.graphList=u.graphList;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./checkIfNullOrUndefined-BCW3Y1ML.cjs"),e=require("./removeOutliers-WELHHqiI.cjs"),o=require("./numberFormattingFunction-02t-wJta.cjs"),n=require("./getTextColorBasedOnBgColor-nqY-bsM_.cjs"),t=require("./getJenks-GYmdwBqm.cjs"),i=require("./imageDownload-CgDcm1Sj.cjs"),a=require("./svgDownload-D9zEGjTF.cjs"),g=require("./excelDownload-BQpsCa62.cjs"),l=require("./getUniqValue-RViz8tTw.cjs"),s=require("./getGraphList-gf02xgT2.cjs"),u=require("./getCentroidCoordinates-DxTBqzp2.cjs");exports.checkIfNullOrUndefined=r.checkIfNullOrUndefined;exports.generateEmbedLink=e.generateEmbedLink;exports.generateIframeCode=e.generateIframeCode;exports.getPercentileValue=e.getPercentileValue;exports.getQueryParamsFromLink=e.getQueryParamsFromLink;exports.removeOutliers=e.removeOutliers;exports.numberFormattingFunction=o.numberFormattingFunction;exports.getTextColorBasedOnBgColor=n.getTextColorBasedOnBgColor;exports.getJenks=t.getJenks;exports.imageDownload=i.imageDownload;exports.svgDownload=a.svgDownload;exports.excelDownload=g.excelDownload;exports.getUniqValue=l.getUniqValue;exports.graphList=s.graphList;exports.getCentroidCoordinates=u.getCentroidCoordinates;
2
2
  //# sourceMappingURL=utils.cjs.map
package/dist/utils.d.ts CHANGED
@@ -1,3 +1,9 @@
1
+ import { Feature } from 'geojson';
2
+ import { GeoJsonProperties } from 'geojson';
3
+ import { MultiPolygon } from 'geojson';
4
+ import { Polygon } from 'geojson';
5
+ import { Position } from 'geojson';
6
+
1
7
  /**
2
8
  * Checks whether a given value is `null` or `undefined`.
3
9
  *
@@ -54,6 +60,8 @@ export declare function generateEmbedLink(link: string, params: ParamsProps[]):
54
60
  */
55
61
  export declare function generateIframeCode(link: string, params: ParamsProps[]): string;
56
62
 
63
+ export declare function getCentroidCoordinates(multiPolygonFeature: Feature<Polygon | MultiPolygon, GeoJsonProperties>, centerLargestPolygon?: boolean): Position;
64
+
57
65
  /**
58
66
  * Returns a set of class break values based on Jenks natural breaks algorithm.
59
67
  *