@buildcanada/charts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/README.md +113 -0
- package/package.json +137 -0
- package/src/components/BodyPortal/BodyPortal.tsx +40 -0
- package/src/components/Button/Button.scss +110 -0
- package/src/components/Button/Button.tsx +101 -0
- package/src/components/Checkbox.scss +93 -0
- package/src/components/Checkbox.tsx +47 -0
- package/src/components/ExpandableToggle/ExpandableToggle.scss +123 -0
- package/src/components/ExpandableToggle/ExpandableToggle.tsx +60 -0
- package/src/components/GrapherTabIcon.tsx +156 -0
- package/src/components/GrapherTrendArrow.scss +16 -0
- package/src/components/GrapherTrendArrow.tsx +30 -0
- package/src/components/Halo/Halo.tsx +44 -0
- package/src/components/LabeledSwitch/LabeledSwitch.scss +109 -0
- package/src/components/LabeledSwitch/LabeledSwitch.tsx +62 -0
- package/src/components/MarkdownTextWrap/MarkdownTextWrap.tsx +1173 -0
- package/src/components/OverlayHeader.scss +18 -0
- package/src/components/OverlayHeader.tsx +29 -0
- package/src/components/RadioButton.scss +69 -0
- package/src/components/RadioButton.tsx +42 -0
- package/src/components/SimpleMarkdownText.tsx +89 -0
- package/src/components/TextInput.scss +17 -0
- package/src/components/TextInput.tsx +19 -0
- package/src/components/TextWrap/TextWrap.tsx +361 -0
- package/src/components/TextWrap/TextWrapUtils.ts +32 -0
- package/src/components/closeButton/CloseButton.scss +40 -0
- package/src/components/closeButton/CloseButton.tsx +27 -0
- package/src/components/index.ts +70 -0
- package/src/components/loadingIndicator/LoadingIndicator.scss +40 -0
- package/src/components/loadingIndicator/LoadingIndicator.tsx +28 -0
- package/src/components/markdown/remarkPlainLinks.ts +36 -0
- package/src/components/reactUtil.ts +20 -0
- package/src/components/stubs/CodeSnippet.tsx +19 -0
- package/src/components/stubs/DataCitation.tsx +16 -0
- package/src/components/stubs/IndicatorKeyData.tsx +45 -0
- package/src/components/stubs/IndicatorProcessing.tsx +15 -0
- package/src/components/stubs/IndicatorSources.tsx +15 -0
- package/src/components/styles/colors.scss +113 -0
- package/src/components/styles/mixins.scss +630 -0
- package/src/components/styles/typography.scss +579 -0
- package/src/components/styles/util.scss +89 -0
- package/src/components/styles/variables.scss +208 -0
- package/src/config/ChartsConfig.ts +163 -0
- package/src/config/ChartsProvider.tsx +157 -0
- package/src/config/index.ts +20 -0
- package/src/core-table/CoreTable.ts +1355 -0
- package/src/core-table/CoreTableColumns.ts +973 -0
- package/src/core-table/CoreTableUtils.ts +793 -0
- package/src/core-table/ErrorValues.ts +73 -0
- package/src/core-table/OwidTable.ts +1175 -0
- package/src/core-table/OwidTableSynthesizers.ts +272 -0
- package/src/core-table/OwidTableUtil.ts +76 -0
- package/src/core-table/Transforms.ts +484 -0
- package/src/core-table/index.ts +82 -0
- package/src/explorer/ColumnGrammar.ts +217 -0
- package/src/explorer/Explorer.sample.ts +212 -0
- package/src/explorer/Explorer.scss +148 -0
- package/src/explorer/Explorer.tsx +1283 -0
- package/src/explorer/ExplorerConstants.ts +85 -0
- package/src/explorer/ExplorerControls.scss +156 -0
- package/src/explorer/ExplorerControls.tsx +210 -0
- package/src/explorer/ExplorerDecisionMatrix.ts +471 -0
- package/src/explorer/ExplorerGrammar.ts +161 -0
- package/src/explorer/ExplorerProgram.ts +568 -0
- package/src/explorer/ExplorerUtils.ts +59 -0
- package/src/explorer/GrapherGrammar.ts +387 -0
- package/src/explorer/gridLang/GrammarUtils.ts +121 -0
- package/src/explorer/gridLang/GridCell.ts +298 -0
- package/src/explorer/gridLang/GridLangConstants.ts +255 -0
- package/src/explorer/gridLang/GridProgram.ts +311 -0
- package/src/explorer/gridLang/readme.md +17 -0
- package/src/explorer/index.ts +69 -0
- package/src/explorer/readme.md +19 -0
- package/src/explorer/urlMigrations/CO2UrlMigration.ts +46 -0
- package/src/explorer/urlMigrations/CovidUrlMigration.ts +37 -0
- package/src/explorer/urlMigrations/EnergyUrlMigration.ts +41 -0
- package/src/explorer/urlMigrations/ExplorerPageUrlMigrationSpec.ts +12 -0
- package/src/explorer/urlMigrations/ExplorerUrlMigrationUtils.ts +45 -0
- package/src/explorer/urlMigrations/ExplorerUrlMigrations.ts +33 -0
- package/src/explorer/urlMigrations/LegacyCovidUrlMigration.ts +144 -0
- package/src/explorer/urlMigrations/readme.md +39 -0
- package/src/grapher/axis/Axis.ts +973 -0
- package/src/grapher/axis/AxisConfig.ts +179 -0
- package/src/grapher/axis/AxisViews.tsx +597 -0
- package/src/grapher/barCharts/DiscreteBarChart.tsx +728 -0
- package/src/grapher/barCharts/DiscreteBarChartConstants.ts +60 -0
- package/src/grapher/barCharts/DiscreteBarChartHelpers.ts +338 -0
- package/src/grapher/barCharts/DiscreteBarChartState.ts +354 -0
- package/src/grapher/barCharts/DiscreteBarChartThumbnail.tsx +34 -0
- package/src/grapher/captionedChart/CaptionedChart.scss +61 -0
- package/src/grapher/captionedChart/CaptionedChart.tsx +523 -0
- package/src/grapher/captionedChart/Logos.tsx +141 -0
- package/src/grapher/captionedChart/LogosSVG.tsx +16 -0
- package/src/grapher/captionedChart/StaticChartRasterizer.tsx +178 -0
- package/src/grapher/captionedChart/assets/buildcanada-logo-square.svg +15 -0
- package/src/grapher/captionedChart/assets/buildcanada-logo.svg +15 -0
- package/src/grapher/captionedChart/assets/canadaspends.svg +7 -0
- package/src/grapher/captionedChart/readme.md +14 -0
- package/src/grapher/chart/Chart.tsx +62 -0
- package/src/grapher/chart/ChartAreaContent.tsx +172 -0
- package/src/grapher/chart/ChartDimension.ts +121 -0
- package/src/grapher/chart/ChartInterface.ts +83 -0
- package/src/grapher/chart/ChartManager.ts +113 -0
- package/src/grapher/chart/ChartTabs.ts +178 -0
- package/src/grapher/chart/ChartTypeMap.tsx +158 -0
- package/src/grapher/chart/ChartTypeSwitcher.tsx +26 -0
- package/src/grapher/chart/ChartUtils.tsx +364 -0
- package/src/grapher/chart/DimensionSlot.ts +45 -0
- package/src/grapher/chart/StaticChartWrapper.tsx +94 -0
- package/src/grapher/chart/guidedChartUtils.ts +82 -0
- package/src/grapher/color/BinningStrategies.ts +484 -0
- package/src/grapher/color/BinningStrategyEqualSizeBins.ts +132 -0
- package/src/grapher/color/BinningStrategyLogarithmic.ts +121 -0
- package/src/grapher/color/CategoricalColorAssigner.ts +97 -0
- package/src/grapher/color/ColorBrewerSchemes.ts +80 -0
- package/src/grapher/color/ColorConstants.ts +20 -0
- package/src/grapher/color/ColorScale.ts +339 -0
- package/src/grapher/color/ColorScaleBin.ts +147 -0
- package/src/grapher/color/ColorScaleConfig.ts +204 -0
- package/src/grapher/color/ColorScheme.ts +137 -0
- package/src/grapher/color/ColorSchemes.ts +149 -0
- package/src/grapher/color/ColorUtils.ts +86 -0
- package/src/grapher/color/CustomSchemes.ts +1772 -0
- package/src/grapher/color/readme.md +84 -0
- package/src/grapher/comparisonLine/ComparisonLine.tsx +31 -0
- package/src/grapher/comparisonLine/ComparisonLineConstants.ts +11 -0
- package/src/grapher/comparisonLine/ComparisonLineGenerator.ts +60 -0
- package/src/grapher/comparisonLine/ComparisonLineHelpers.ts +10 -0
- package/src/grapher/comparisonLine/CustomComparisonLine.tsx +159 -0
- package/src/grapher/comparisonLine/VerticalComparisonLine.tsx +208 -0
- package/src/grapher/controls/ActionButtons.scss +97 -0
- package/src/grapher/controls/ActionButtons.tsx +453 -0
- package/src/grapher/controls/CommandPalette.scss +50 -0
- package/src/grapher/controls/CommandPalette.tsx +74 -0
- package/src/grapher/controls/ContentSwitchers.scss +93 -0
- package/src/grapher/controls/ContentSwitchers.tsx +238 -0
- package/src/grapher/controls/Controls.scss +158 -0
- package/src/grapher/controls/DataTableFilterDropdown.scss +7 -0
- package/src/grapher/controls/DataTableFilterDropdown.tsx +168 -0
- package/src/grapher/controls/DataTableSearchField.scss +3 -0
- package/src/grapher/controls/DataTableSearchField.tsx +76 -0
- package/src/grapher/controls/Dropdown.scss +252 -0
- package/src/grapher/controls/Dropdown.tsx +235 -0
- package/src/grapher/controls/EntitySelectionToggle.tsx +135 -0
- package/src/grapher/controls/MapRegionDropdown.scss +3 -0
- package/src/grapher/controls/MapRegionDropdown.tsx +104 -0
- package/src/grapher/controls/MapResetButton.tsx +115 -0
- package/src/grapher/controls/MapZoomDropdown.scss +9 -0
- package/src/grapher/controls/MapZoomDropdown.tsx +270 -0
- package/src/grapher/controls/MapZoomToSelectionButton.tsx +87 -0
- package/src/grapher/controls/SearchField.scss +78 -0
- package/src/grapher/controls/SearchField.tsx +63 -0
- package/src/grapher/controls/SettingsMenu.scss +191 -0
- package/src/grapher/controls/SettingsMenu.tsx +399 -0
- package/src/grapher/controls/ShareMenu.scss +58 -0
- package/src/grapher/controls/ShareMenu.tsx +304 -0
- package/src/grapher/controls/SortIcon.tsx +39 -0
- package/src/grapher/controls/VerticalScrollContainer.tsx +263 -0
- package/src/grapher/controls/controlsRow/ControlsRow.tsx +168 -0
- package/src/grapher/controls/dropdown-icons.scss +4 -0
- package/src/grapher/controls/entityPicker/EntityPicker.scss +255 -0
- package/src/grapher/controls/entityPicker/EntityPicker.tsx +816 -0
- package/src/grapher/controls/entityPicker/EntityPickerConstants.ts +23 -0
- package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.scss +129 -0
- package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.tsx +463 -0
- package/src/grapher/controls/globalEntitySelector/GlobalEntitySelectorConstants.ts +3 -0
- package/src/grapher/controls/globalEntitySelector/readme.md +17 -0
- package/src/grapher/controls/settings/AbsRelToggle.tsx +64 -0
- package/src/grapher/controls/settings/AxisScaleToggle.tsx +53 -0
- package/src/grapher/controls/settings/FacetStrategySelector.tsx +110 -0
- package/src/grapher/controls/settings/FacetYDomainToggle.tsx +51 -0
- package/src/grapher/controls/settings/NoDataAreaToggle.tsx +38 -0
- package/src/grapher/controls/settings/ZoomToggle.tsx +36 -0
- package/src/grapher/core/EntitiesByRegionType.ts +174 -0
- package/src/grapher/core/EntityCodes.ts +19 -0
- package/src/grapher/core/EntityUrlBuilder.ts +200 -0
- package/src/grapher/core/FetchingGrapher.tsx +156 -0
- package/src/grapher/core/Grapher.tsx +760 -0
- package/src/grapher/core/GrapherAnalytics.ts +229 -0
- package/src/grapher/core/GrapherConstants.ts +173 -0
- package/src/grapher/core/GrapherState.tsx +3659 -0
- package/src/grapher/core/GrapherUrl.ts +184 -0
- package/src/grapher/core/GrapherUrlMigrations.ts +29 -0
- package/src/grapher/core/GrapherUseHelpers.tsx +147 -0
- package/src/grapher/core/LegacyToOwidTable.ts +841 -0
- package/src/grapher/core/grapher.entry.ts +5 -0
- package/src/grapher/core/grapher.scss +257 -0
- package/src/grapher/core/loadGrapherTableHelpers.ts +116 -0
- package/src/grapher/core/loadVariable.ts +104 -0
- package/src/grapher/core/relatedQuestion.ts +12 -0
- package/src/grapher/core/typography.scss +206 -0
- package/src/grapher/dataTable/DataTable.sample.ts +206 -0
- package/src/grapher/dataTable/DataTable.scss +249 -0
- package/src/grapher/dataTable/DataTable.tsx +1332 -0
- package/src/grapher/dataTable/DataTableConstants.ts +186 -0
- package/src/grapher/entitySelector/EntitySelector.scss +255 -0
- package/src/grapher/entitySelector/EntitySelector.tsx +1838 -0
- package/src/grapher/facet/FacetChart.tsx +943 -0
- package/src/grapher/facet/FacetChartConstants.ts +24 -0
- package/src/grapher/facet/FacetChartUtils.ts +51 -0
- package/src/grapher/facet/FacetMap.tsx +604 -0
- package/src/grapher/facet/FacetMapConstants.ts +23 -0
- package/src/grapher/facet/readme.md +13 -0
- package/src/grapher/focus/FocusArray.ts +79 -0
- package/src/grapher/footer/Footer.scss +63 -0
- package/src/grapher/footer/Footer.tsx +809 -0
- package/src/grapher/footer/FooterManager.ts +44 -0
- package/src/grapher/fullScreen/FullScreen.scss +11 -0
- package/src/grapher/fullScreen/FullScreen.tsx +61 -0
- package/src/grapher/header/Header.scss +35 -0
- package/src/grapher/header/Header.tsx +372 -0
- package/src/grapher/header/HeaderManager.ts +28 -0
- package/src/grapher/index.ts +157 -0
- package/src/grapher/interaction/InteractionState.ts +60 -0
- package/src/grapher/legend/HorizontalColorLegends.tsx +923 -0
- package/src/grapher/legend/LegendInteractionState.ts +40 -0
- package/src/grapher/legend/VerticalColorLegend.tsx +295 -0
- package/src/grapher/lineCharts/LineChart.tsx +968 -0
- package/src/grapher/lineCharts/LineChartConstants.ts +89 -0
- package/src/grapher/lineCharts/LineChartHelpers.ts +184 -0
- package/src/grapher/lineCharts/LineChartState.ts +394 -0
- package/src/grapher/lineCharts/LineChartThumbnail.tsx +437 -0
- package/src/grapher/lineCharts/Lines.tsx +258 -0
- package/src/grapher/lineLegend/LineLegend.tsx +723 -0
- package/src/grapher/lineLegend/LineLegendConstants.ts +9 -0
- package/src/grapher/lineLegend/LineLegendFilterAlgorithms.ts +143 -0
- package/src/grapher/lineLegend/LineLegendHelpers.ts +253 -0
- package/src/grapher/lineLegend/LineLegendTypes.ts +32 -0
- package/src/grapher/mapCharts/CanadaTopology.ts +17922 -0
- package/src/grapher/mapCharts/ChoroplethGlobe.tsx +949 -0
- package/src/grapher/mapCharts/ChoroplethMap.tsx +662 -0
- package/src/grapher/mapCharts/GeoFeatures.ts +184 -0
- package/src/grapher/mapCharts/GlobeController.ts +496 -0
- package/src/grapher/mapCharts/MapAnnotationPlacements.json +1040 -0
- package/src/grapher/mapCharts/MapAnnotationPlacements.ts +31 -0
- package/src/grapher/mapCharts/MapAnnotations.ts +723 -0
- package/src/grapher/mapCharts/MapChart.sample.ts +59 -0
- package/src/grapher/mapCharts/MapChart.scss +5 -0
- package/src/grapher/mapCharts/MapChart.tsx +720 -0
- package/src/grapher/mapCharts/MapChartConstants.ts +260 -0
- package/src/grapher/mapCharts/MapChartState.ts +416 -0
- package/src/grapher/mapCharts/MapChartThumbnail.tsx +25 -0
- package/src/grapher/mapCharts/MapComponents.tsx +338 -0
- package/src/grapher/mapCharts/MapConfig.ts +156 -0
- package/src/grapher/mapCharts/MapHelpers.ts +181 -0
- package/src/grapher/mapCharts/MapProjections.ts +49 -0
- package/src/grapher/mapCharts/MapSparkline.tsx +257 -0
- package/src/grapher/mapCharts/MapTooltip.scss +49 -0
- package/src/grapher/mapCharts/MapTooltip.tsx +409 -0
- package/src/grapher/mapCharts/MapTopology.ts +1766 -0
- package/src/grapher/mapCharts/d3-bboxCollide.js +204 -0
- package/src/grapher/mapCharts/d3-geo-projection.ts +198 -0
- package/src/grapher/modal/DownloadIcons.tsx +39 -0
- package/src/grapher/modal/DownloadModal.scss +300 -0
- package/src/grapher/modal/DownloadModal.tsx +1226 -0
- package/src/grapher/modal/EmbedModal.scss +40 -0
- package/src/grapher/modal/EmbedModal.tsx +160 -0
- package/src/grapher/modal/EntitySelectorModal.tsx +59 -0
- package/src/grapher/modal/Modal.scss +31 -0
- package/src/grapher/modal/Modal.tsx +90 -0
- package/src/grapher/modal/ModalHeader.scss +12 -0
- package/src/grapher/modal/ModalHeader.tsx +16 -0
- package/src/grapher/modal/SourcesDescriptions.scss +87 -0
- package/src/grapher/modal/SourcesDescriptions.tsx +89 -0
- package/src/grapher/modal/SourcesKeyDataTable.scss +49 -0
- package/src/grapher/modal/SourcesKeyDataTable.tsx +87 -0
- package/src/grapher/modal/SourcesModal.scss +301 -0
- package/src/grapher/modal/SourcesModal.tsx +568 -0
- package/src/grapher/noDataModal/NoDataModal.tsx +125 -0
- package/src/grapher/scatterCharts/ConnectedScatterLegend.tsx +143 -0
- package/src/grapher/scatterCharts/MultiColorPolyline.tsx +129 -0
- package/src/grapher/scatterCharts/NoDataSection.scss +14 -0
- package/src/grapher/scatterCharts/NoDataSection.tsx +56 -0
- package/src/grapher/scatterCharts/ScatterPlotChart.tsx +792 -0
- package/src/grapher/scatterCharts/ScatterPlotChartConstants.ts +157 -0
- package/src/grapher/scatterCharts/ScatterPlotChartState.ts +678 -0
- package/src/grapher/scatterCharts/ScatterPlotChartThumbnail.tsx +155 -0
- package/src/grapher/scatterCharts/ScatterPlotTooltip.tsx +560 -0
- package/src/grapher/scatterCharts/ScatterPoints.tsx +153 -0
- package/src/grapher/scatterCharts/ScatterPointsWithLabels.tsx +708 -0
- package/src/grapher/scatterCharts/ScatterSizeLegend.tsx +327 -0
- package/src/grapher/scatterCharts/ScatterUtils.ts +265 -0
- package/src/grapher/scatterCharts/Triangle.tsx +41 -0
- package/src/grapher/schema/README.md +33 -0
- package/src/grapher/schema/defaultGrapherConfig.ts +100 -0
- package/src/grapher/schema/grapher-schema.009.yaml +781 -0
- package/src/grapher/schema/migrations/helpers.ts +58 -0
- package/src/grapher/schema/migrations/migrate.ts +75 -0
- package/src/grapher/schema/migrations/migrations.ts +158 -0
- package/src/grapher/selection/MapSelectionArray.ts +99 -0
- package/src/grapher/selection/SelectionArray.ts +71 -0
- package/src/grapher/selection/readme.md +16 -0
- package/src/grapher/sidePanel/SidePanel.scss +10 -0
- package/src/grapher/sidePanel/SidePanel.tsx +23 -0
- package/src/grapher/slideInDrawer/SlideInDrawer.scss +57 -0
- package/src/grapher/slideInDrawer/SlideInDrawer.tsx +125 -0
- package/src/grapher/slideshowController/SlideShowController.tsx +43 -0
- package/src/grapher/slideshowController/readme.md +7 -0
- package/src/grapher/slopeCharts/MarkX.tsx +45 -0
- package/src/grapher/slopeCharts/Slope.tsx +102 -0
- package/src/grapher/slopeCharts/SlopeChart.tsx +1152 -0
- package/src/grapher/slopeCharts/SlopeChartConstants.ts +33 -0
- package/src/grapher/slopeCharts/SlopeChartHelpers.ts +73 -0
- package/src/grapher/slopeCharts/SlopeChartState.ts +392 -0
- package/src/grapher/slopeCharts/SlopeChartThumbnail.tsx +368 -0
- package/src/grapher/stackedCharts/AbstractStackedChartState.ts +370 -0
- package/src/grapher/stackedCharts/MarimekkoBars.tsx +190 -0
- package/src/grapher/stackedCharts/MarimekkoBarsForOneEntity.tsx +168 -0
- package/src/grapher/stackedCharts/MarimekkoChart.tsx +1144 -0
- package/src/grapher/stackedCharts/MarimekkoChartConstants.ts +112 -0
- package/src/grapher/stackedCharts/MarimekkoChartHelpers.ts +21 -0
- package/src/grapher/stackedCharts/MarimekkoChartState.ts +465 -0
- package/src/grapher/stackedCharts/MarimekkoChartThumbnail.tsx +168 -0
- package/src/grapher/stackedCharts/MarimekkoInternalLabels.tsx +124 -0
- package/src/grapher/stackedCharts/StackedAreaChart.tsx +678 -0
- package/src/grapher/stackedCharts/StackedAreaChartState.ts +34 -0
- package/src/grapher/stackedCharts/StackedAreaChartThumbnail.tsx +215 -0
- package/src/grapher/stackedCharts/StackedAreas.tsx +223 -0
- package/src/grapher/stackedCharts/StackedBarChart.tsx +619 -0
- package/src/grapher/stackedCharts/StackedBarChartState.ts +80 -0
- package/src/grapher/stackedCharts/StackedBarChartThumbnail.tsx +220 -0
- package/src/grapher/stackedCharts/StackedBarSegment.tsx +87 -0
- package/src/grapher/stackedCharts/StackedBars.tsx +102 -0
- package/src/grapher/stackedCharts/StackedConstants.ts +109 -0
- package/src/grapher/stackedCharts/StackedDiscreteBarChart.tsx +270 -0
- package/src/grapher/stackedCharts/StackedDiscreteBarChartState.ts +296 -0
- package/src/grapher/stackedCharts/StackedDiscreteBarChartThumbnail.tsx +27 -0
- package/src/grapher/stackedCharts/StackedDiscreteBars.tsx +648 -0
- package/src/grapher/stackedCharts/StackedUtils.ts +142 -0
- package/src/grapher/tabs/Tabs.scss +169 -0
- package/src/grapher/tabs/Tabs.tsx +54 -0
- package/src/grapher/tabs/TabsWithDropdown.scss +62 -0
- package/src/grapher/tabs/TabsWithDropdown.tsx +114 -0
- package/src/grapher/testData/OwidTestData.sample.ts +273 -0
- package/src/grapher/testData/OwidTestData.ts +64 -0
- package/src/grapher/timeline/TimelineComponent.scss +139 -0
- package/src/grapher/timeline/TimelineComponent.tsx +658 -0
- package/src/grapher/timeline/TimelineController.ts +368 -0
- package/src/grapher/timeline/readme.md +7 -0
- package/src/grapher/tooltip/Tooltip.scss +510 -0
- package/src/grapher/tooltip/Tooltip.tsx +294 -0
- package/src/grapher/tooltip/TooltipContents.tsx +383 -0
- package/src/grapher/tooltip/TooltipProps.ts +123 -0
- package/src/grapher/tooltip/TooltipState.ts +81 -0
- package/src/grapher/verticalLabels/VerticalLabels.tsx +31 -0
- package/src/grapher/verticalLabels/VerticalLabelsState.ts +154 -0
- package/src/index.ts +226 -0
- package/src/styles/charts.scss +15 -0
- package/src/types/NominalType.ts +30 -0
- package/src/types/OwidOrigin.ts +18 -0
- package/src/types/OwidSource.ts +9 -0
- package/src/types/OwidVariable.ts +133 -0
- package/src/types/OwidVariableDisplayConfigInterface.ts +49 -0
- package/src/types/analyticsTypes.ts +54 -0
- package/src/types/dbTypes/Tags.ts +11 -0
- package/src/types/domainTypes/Archive.ts +139 -0
- package/src/types/domainTypes/Author.ts +28 -0
- package/src/types/domainTypes/ContentGraph.ts +76 -0
- package/src/types/domainTypes/CoreTableTypes.ts +305 -0
- package/src/types/domainTypes/DeployStatus.ts +23 -0
- package/src/types/domainTypes/Layout.ts +34 -0
- package/src/types/domainTypes/Posts.ts +34 -0
- package/src/types/domainTypes/Search.ts +299 -0
- package/src/types/domainTypes/Site.ts +8 -0
- package/src/types/domainTypes/StaticViz.ts +64 -0
- package/src/types/domainTypes/Toc.ts +11 -0
- package/src/types/domainTypes/Tombstone.ts +19 -0
- package/src/types/domainTypes/Various.ts +79 -0
- package/src/types/gdocTypes/Gdoc.ts +280 -0
- package/src/types/grapherTypes/BinningStrategyTypes.ts +46 -0
- package/src/types/grapherTypes/GrapherConstants.ts +53 -0
- package/src/types/grapherTypes/GrapherTypes.ts +743 -0
- package/src/types/index.ts +316 -0
- package/src/types/wordpressTypes/WordpressTypes.ts +9 -0
- package/src/utils/Bounds.ts +439 -0
- package/src/utils/BrowserUtils.ts +12 -0
- package/src/utils/FuzzySearch.ts +74 -0
- package/src/utils/MultiDimDataPageConfig.ts +31 -0
- package/src/utils/OwidVariable.ts +82 -0
- package/src/utils/PointVector.ts +97 -0
- package/src/utils/PromiseCache.ts +36 -0
- package/src/utils/PromiseSwitcher.ts +52 -0
- package/src/utils/TimeBounds.ts +130 -0
- package/src/utils/Tippy.tsx +57 -0
- package/src/utils/Util.ts +2369 -0
- package/src/utils/archival/archivalDate.ts +48 -0
- package/src/utils/dayjs.ts +32 -0
- package/src/utils/formatValue.ts +242 -0
- package/src/utils/grapherConfigUtils.ts +81 -0
- package/src/utils/image.ts +225 -0
- package/src/utils/index.ts +318 -0
- package/src/utils/isPresent.ts +5 -0
- package/src/utils/metadataHelpers.ts +329 -0
- package/src/utils/persistable/Persistable.ts +82 -0
- package/src/utils/persistable/readme.md +50 -0
- package/src/utils/regions.json +5635 -0
- package/src/utils/regions.ts +463 -0
- package/src/utils/serializers.ts +16 -0
- package/src/utils/string.ts +42 -0
- package/src/utils/urls/Url.ts +195 -0
- package/src/utils/urls/UrlMigration.ts +10 -0
- package/src/utils/urls/UrlUtils.ts +54 -0
- package/src/utils/urls/readme.md +90 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Vector utility class
|
|
3
|
+
* Partly based on the Unity vector: https://docs.unity3d.com/ScriptReference/Vector2.html
|
|
4
|
+
* Wraps the Victor library, mainly so we can do type hinting
|
|
5
|
+
*
|
|
6
|
+
* @project Our World In Data
|
|
7
|
+
* @author Jaiden Mispy
|
|
8
|
+
* @created 2017-03-15
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export class PointVector {
|
|
12
|
+
x: number
|
|
13
|
+
y: number
|
|
14
|
+
|
|
15
|
+
constructor(x: number, y: number) {
|
|
16
|
+
this.x = x
|
|
17
|
+
this.y = y
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
subtract(v: PointVector): PointVector {
|
|
21
|
+
return new PointVector(this.x - v.x, this.y - v.y)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
add(v: PointVector): PointVector {
|
|
25
|
+
return new PointVector(this.x + v.x, this.y + v.y)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
times(n: number): PointVector {
|
|
29
|
+
return new PointVector(this.x * n, this.y * n)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get magnitude(): number {
|
|
33
|
+
return Math.sqrt(this.x ** 2 + this.y ** 2)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
normalize(): PointVector {
|
|
37
|
+
const magnitude = this.magnitude
|
|
38
|
+
if (magnitude > 1e-5)
|
|
39
|
+
return new PointVector(this.x / magnitude, this.y / magnitude)
|
|
40
|
+
|
|
41
|
+
return new PointVector(0, 0)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
normals(): [PointVector, PointVector] {
|
|
45
|
+
return [
|
|
46
|
+
new PointVector(-this.y, this.x),
|
|
47
|
+
new PointVector(this.y, -this.x),
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
toString(): string {
|
|
52
|
+
return `PointVector<${this.x}, ${this.y}>`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static up = new PointVector(0, -1)
|
|
56
|
+
static zero = new PointVector(0, 0)
|
|
57
|
+
|
|
58
|
+
static distanceSq(a: PointVector, b: PointVector): number {
|
|
59
|
+
return (b.x - a.x) ** 2 + (b.y - a.y) ** 2
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static distance(a: PointVector, b: PointVector): number {
|
|
63
|
+
return Math.sqrt(PointVector.distanceSq(a, b))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static angle(a: PointVector, b: PointVector): number {
|
|
67
|
+
return (
|
|
68
|
+
Math.acos(
|
|
69
|
+
Math.max(
|
|
70
|
+
Math.min(PointVector.dot(a.normalize(), b.normalize()), 1),
|
|
71
|
+
-1
|
|
72
|
+
)
|
|
73
|
+
) * 57.29578 // this is 180/pi, used to convert radians to degrees
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private static dot(lhs: PointVector, rhs: PointVector): number {
|
|
78
|
+
return lhs.x * rhs.x + lhs.y * rhs.y
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// From: http://stackoverflow.com/a/1501725/1983739
|
|
82
|
+
static distanceFromPointToLineSegmentSq(
|
|
83
|
+
p: PointVector,
|
|
84
|
+
v: PointVector, // start of line segment
|
|
85
|
+
w: PointVector // end of line segment
|
|
86
|
+
): number {
|
|
87
|
+
const l2 = PointVector.distanceSq(v, w)
|
|
88
|
+
if (l2 === 0) return PointVector.distanceSq(p, v)
|
|
89
|
+
|
|
90
|
+
let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2
|
|
91
|
+
t = Math.max(0, Math.min(1, t))
|
|
92
|
+
return PointVector.distanceSq(
|
|
93
|
+
p,
|
|
94
|
+
new PointVector(v.x + t * (w.x - v.x), v.y + t * (w.y - v.y))
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prevents creating multiple promises for a single key.
|
|
3
|
+
*
|
|
4
|
+
* If an existing promise for a key is pending, that promise will be returned without
|
|
5
|
+
* creating a new one.
|
|
6
|
+
*
|
|
7
|
+
* If a promise throws an error, it will be discarded, and a new one created the next
|
|
8
|
+
* time a key is requested.
|
|
9
|
+
*
|
|
10
|
+
* For now it only supports primitive value keys, but we can extend it if necessary.
|
|
11
|
+
*/
|
|
12
|
+
export class PromiseCache<Key extends string | number | undefined, Result> {
|
|
13
|
+
constructor(private createPromiseFromKey: (key: Key) => Promise<Result>) {}
|
|
14
|
+
|
|
15
|
+
private promisesByKey = new Map<Key, Promise<Result>>()
|
|
16
|
+
|
|
17
|
+
get(key: Key): Promise<Result> {
|
|
18
|
+
if (!this.promisesByKey.has(key)) {
|
|
19
|
+
this.promisesByKey.set(
|
|
20
|
+
key,
|
|
21
|
+
// Make sure to attach .catch() _before_ adding it to the cache.
|
|
22
|
+
// Otherwise external logic would be able to attach a catch() that
|
|
23
|
+
// could make this one unreachable.
|
|
24
|
+
this.createPromiseFromKey(key).catch((error) => {
|
|
25
|
+
this.promisesByKey.delete(key)
|
|
26
|
+
throw error
|
|
27
|
+
})
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
return this.promisesByKey.get(key)!
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
has(key: Key): boolean {
|
|
34
|
+
return this.promisesByKey.has(key)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
interface PromiseSelectorArg<Result> {
|
|
2
|
+
onResolve?: (result: Result) => void
|
|
3
|
+
onReject?: (error: any) => void
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* An alternative to cancellable promises. Allows set()-ing a single promise,
|
|
8
|
+
* discarding the results of any previous ones, regardless whether they
|
|
9
|
+
* resolve or reject.
|
|
10
|
+
*
|
|
11
|
+
* The problem it solves:
|
|
12
|
+
*
|
|
13
|
+
* 1. User interacts with UI
|
|
14
|
+
* 2. Request sent to fetch required data: `getViewData().then((data) => updateView(data))`
|
|
15
|
+
* 3. But now what if the user navigates away? When the promise completes, it will
|
|
16
|
+
* update the view regardless.
|
|
17
|
+
*
|
|
18
|
+
* In order to solve this, we use `switcher = PromiseSwitcher({ onResolve: updateView })`
|
|
19
|
+
* And then send off requests with `switcher.set(getViewData())`
|
|
20
|
+
* If set() is called with a new Promise while the previous is still pending, the
|
|
21
|
+
* pending promise is ignored – it doesn't call `onResolve` or `onReject`.
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
export class PromiseSwitcher<Result> {
|
|
25
|
+
private pendingPromise: Promise<Result> | undefined
|
|
26
|
+
|
|
27
|
+
private onResolve?: (result: Result) => void
|
|
28
|
+
private onReject?: (error: any) => void
|
|
29
|
+
|
|
30
|
+
constructor(arg: PromiseSelectorArg<Result>) {
|
|
31
|
+
this.onResolve = arg.onResolve
|
|
32
|
+
this.onReject = arg.onReject
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async set(promise: Promise<Result>): Promise<void> {
|
|
36
|
+
this.pendingPromise = promise
|
|
37
|
+
try {
|
|
38
|
+
const result = await promise
|
|
39
|
+
if (this.pendingPromise === promise) {
|
|
40
|
+
this.onResolve?.(result)
|
|
41
|
+
}
|
|
42
|
+
} catch (error) {
|
|
43
|
+
if (this.pendingPromise === promise) {
|
|
44
|
+
this.onReject?.(error)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
clear(): void {
|
|
50
|
+
this.pendingPromise = undefined
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EPOCH_DATE,
|
|
3
|
+
Time,
|
|
4
|
+
TimeBound,
|
|
5
|
+
TimeBoundValue,
|
|
6
|
+
TimeBoundValueStr,
|
|
7
|
+
} from "../types/index.js"
|
|
8
|
+
import {
|
|
9
|
+
parseIntOrUndefined,
|
|
10
|
+
diffDateISOStringInDays,
|
|
11
|
+
formatDay,
|
|
12
|
+
isNegativeInfinity,
|
|
13
|
+
isPositiveInfinity,
|
|
14
|
+
} from "./Util.js"
|
|
15
|
+
import * as R from "remeda"
|
|
16
|
+
|
|
17
|
+
export const timeFromTimebounds = (
|
|
18
|
+
timeBound: TimeBound,
|
|
19
|
+
minTime: Time,
|
|
20
|
+
maxTime: Time
|
|
21
|
+
): number => {
|
|
22
|
+
switch (timeBound) {
|
|
23
|
+
case -Infinity:
|
|
24
|
+
return minTime
|
|
25
|
+
case Infinity:
|
|
26
|
+
return maxTime
|
|
27
|
+
default:
|
|
28
|
+
return timeBound
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const hasAnInfinity = (timeBound: TimeBound): timeBound is TimeBoundValue =>
|
|
33
|
+
isNegativeInfinity(timeBound) || isPositiveInfinity(timeBound)
|
|
34
|
+
|
|
35
|
+
const formatTimeBound = (timeBound: TimeBound): string => {
|
|
36
|
+
if (isNegativeInfinity(timeBound)) return TimeBoundValueStr.unboundedLeft
|
|
37
|
+
if (isPositiveInfinity(timeBound)) return TimeBoundValueStr.unboundedRight
|
|
38
|
+
return `${timeBound}`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const parseTimeBound = (str: string): TimeBound | undefined => {
|
|
42
|
+
if (str === TimeBoundValueStr.unboundedLeft)
|
|
43
|
+
return TimeBoundValue.negativeInfinity
|
|
44
|
+
|
|
45
|
+
if (str === TimeBoundValueStr.unboundedRight)
|
|
46
|
+
return TimeBoundValue.positiveInfinity
|
|
47
|
+
|
|
48
|
+
return parseIntOrUndefined(str)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Use this to not repeat logic
|
|
52
|
+
const fromJSON = (value: TimeBound | string | undefined): number | undefined =>
|
|
53
|
+
R.isString(value) ? parseTimeBound(value) : value
|
|
54
|
+
|
|
55
|
+
const toJSON = (
|
|
56
|
+
bound: TimeBound | undefined
|
|
57
|
+
): TimeBoundValueStr | number | undefined => {
|
|
58
|
+
if (bound === undefined) return undefined
|
|
59
|
+
if (isNegativeInfinity(bound)) return TimeBoundValueStr.unboundedLeft
|
|
60
|
+
if (isPositiveInfinity(bound)) return TimeBoundValueStr.unboundedRight
|
|
61
|
+
return bound
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const minTimeBoundFromJSONOrNegativeInfinity = (
|
|
65
|
+
minTime: TimeBound | string | undefined
|
|
66
|
+
): TimeBound => fromJSON(minTime) ?? TimeBoundValue.negativeInfinity
|
|
67
|
+
|
|
68
|
+
export const maxTimeBoundFromJSONOrPositiveInfinity = (
|
|
69
|
+
maxTime: TimeBound | string | undefined
|
|
70
|
+
): TimeBound => fromJSON(maxTime) ?? TimeBoundValue.positiveInfinity
|
|
71
|
+
|
|
72
|
+
export const minTimeToJSON = toJSON
|
|
73
|
+
export const maxTimeToJSON = toJSON
|
|
74
|
+
|
|
75
|
+
const reISODateComponent = new RegExp("\\d{4}-[01]\\d-[0-3]\\d")
|
|
76
|
+
const reISODate = new RegExp(`^(${reISODateComponent.source})$`)
|
|
77
|
+
|
|
78
|
+
export const timeBoundToTimeBoundString = (
|
|
79
|
+
timeBound: TimeBound,
|
|
80
|
+
isDate: boolean
|
|
81
|
+
): string => {
|
|
82
|
+
if (hasAnInfinity(timeBound)) return formatTimeBound(timeBound)
|
|
83
|
+
return isDate
|
|
84
|
+
? formatDay(timeBound, { format: "YYYY-MM-DD" })
|
|
85
|
+
: `${timeBound}`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const parseTimeURIComponent = (param: string): TimeBound | undefined =>
|
|
89
|
+
reISODate.test(param)
|
|
90
|
+
? diffDateISOStringInDays(param, EPOCH_DATE)
|
|
91
|
+
: parseTimeBound(param)
|
|
92
|
+
|
|
93
|
+
const upgradeLegacyTimeString = (time: string): string => {
|
|
94
|
+
// In the past we supported unbounded time parameters like time=2015.. which would be
|
|
95
|
+
// equivalent to time=2015..latest. We don't actively generate these kinds of URL any
|
|
96
|
+
// more because URLs ending with dots are not interpreted correctly by many services
|
|
97
|
+
// (Twitter, Facebook and others) - but we still want to recognize incoming requests
|
|
98
|
+
// for these "legacy" URLs!
|
|
99
|
+
if (time === "..") return "earliest..latest"
|
|
100
|
+
return time.endsWith("..")
|
|
101
|
+
? time + "latest"
|
|
102
|
+
: time.startsWith("..")
|
|
103
|
+
? "earliest" + time
|
|
104
|
+
: time
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const getTimeDomainFromQueryString = (
|
|
108
|
+
time: string
|
|
109
|
+
): [number, number] => {
|
|
110
|
+
time = upgradeLegacyTimeString(time)
|
|
111
|
+
|
|
112
|
+
const reIntComponent = new RegExp("\\-?\\d+")
|
|
113
|
+
const reIntRange = new RegExp(
|
|
114
|
+
`^(${reIntComponent.source}|earliest)\\.\\.(${reIntComponent.source}|latest)$`
|
|
115
|
+
)
|
|
116
|
+
const reDateRange = new RegExp(
|
|
117
|
+
`^(${reISODateComponent.source}|earliest)\\.\\.(${reISODateComponent.source}|latest)$`
|
|
118
|
+
)
|
|
119
|
+
if (reIntRange.test(time) || reDateRange.test(time)) {
|
|
120
|
+
const [start, end] = time.split("..")
|
|
121
|
+
return [
|
|
122
|
+
parseTimeURIComponent(start) ?? TimeBoundValue.negativeInfinity,
|
|
123
|
+
parseTimeURIComponent(end) ?? TimeBoundValue.positiveInfinity,
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const timebound =
|
|
128
|
+
parseTimeURIComponent(time) ?? TimeBoundValue.positiveInfinity
|
|
129
|
+
return [timebound, timebound]
|
|
130
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { default as OriginalTippy, TippyProps } from "@tippyjs/react"
|
|
3
|
+
|
|
4
|
+
interface CustomTippyProps extends TippyProps {
|
|
5
|
+
lazy?: boolean
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const Tippy = (props: CustomTippyProps): React.ReactElement => {
|
|
9
|
+
const { lazy, ...tippyProps } = props
|
|
10
|
+
|
|
11
|
+
const TippyInstance = lazy ? LazyTippy : OriginalTippy
|
|
12
|
+
return <TippyInstance theme="light" {...tippyProps} />
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// A Tippy instance that only evaluates `content` when the tooltip is shown.
|
|
16
|
+
// Taken from https://gist.github.com/atomiks/520f4b0c7b537202a23a3059d4eec908
|
|
17
|
+
// This will hopefully become supported in Tippy itself someday: See https://github.com/atomiks/tippyjs-react/issues/209
|
|
18
|
+
export const LazyTippy = (props: TippyProps): React.ReactElement => {
|
|
19
|
+
const [mounted, setMounted] = React.useState(false)
|
|
20
|
+
|
|
21
|
+
const lazyPlugin = {
|
|
22
|
+
fn: (): { onMount: () => void; onHidden: () => void } => ({
|
|
23
|
+
onMount: (): void => setMounted(true),
|
|
24
|
+
onHidden: (): void => setMounted(false),
|
|
25
|
+
}),
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const computedProps = { ...props }
|
|
29
|
+
|
|
30
|
+
computedProps.plugins = [lazyPlugin, ...(props.plugins || [])]
|
|
31
|
+
|
|
32
|
+
if (props.render) {
|
|
33
|
+
const render = props.render // let TypeScript safely derive that render is not undefined
|
|
34
|
+
computedProps.render = (...args): React.ReactNode =>
|
|
35
|
+
mounted ? render(...args) : ""
|
|
36
|
+
} else {
|
|
37
|
+
computedProps.content = mounted ? props.content : ""
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return <Tippy {...computedProps} />
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface TippyIfInteractiveProps extends CustomTippyProps {
|
|
44
|
+
isInteractive: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// We sometimes need a conditional Tippy instance, i.e. a Tippy that is only hooked up to
|
|
48
|
+
// interactive charts (and not in static SVG exports etc.). This is that: If `isInteractive=false`,
|
|
49
|
+
// then it bypasses Tippy and just renders the children.
|
|
50
|
+
export const TippyIfInteractive = (
|
|
51
|
+
props: TippyIfInteractiveProps
|
|
52
|
+
): React.ReactElement => {
|
|
53
|
+
const { isInteractive, ...tippyProps } = props
|
|
54
|
+
|
|
55
|
+
if (isInteractive) return <Tippy {...tippyProps} />
|
|
56
|
+
else return <>{props.children}</>
|
|
57
|
+
}
|