@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,60 @@
|
|
|
1
|
+
import { ChartManager } from "../chart/ChartManager"
|
|
2
|
+
import { CoreColumn } from "../../core-table/index.js"
|
|
3
|
+
import { ChartSeries } from "../chart/ChartInterface"
|
|
4
|
+
import { Color, CoreValueType, Time } from "../../types/index.js"
|
|
5
|
+
import { TextWrap } from "../../components/index.js"
|
|
6
|
+
import { InteractionState } from "../interaction/InteractionState.js"
|
|
7
|
+
|
|
8
|
+
export interface DiscreteBarSeries extends ChartSeries {
|
|
9
|
+
entityName: string
|
|
10
|
+
shortEntityName?: string
|
|
11
|
+
yColumn: CoreColumn
|
|
12
|
+
value: number
|
|
13
|
+
time: Time
|
|
14
|
+
colorValue?: CoreValueType
|
|
15
|
+
annotation?: string
|
|
16
|
+
focus: InteractionState
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface SizedDiscreteBarSeries extends DiscreteBarSeries {
|
|
20
|
+
label: TextWrap
|
|
21
|
+
annotationTextWrap?: TextWrap
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface PlacedDiscreteBarSeries extends SizedDiscreteBarSeries {
|
|
25
|
+
// data bar
|
|
26
|
+
barX: number
|
|
27
|
+
barY: number
|
|
28
|
+
barWidth: number
|
|
29
|
+
|
|
30
|
+
// entity label, annotation, and value label positions
|
|
31
|
+
entityLabelX: number
|
|
32
|
+
entityLabelY: number
|
|
33
|
+
annotationY?: number
|
|
34
|
+
valueLabelX: number
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface DiscreteBarChartManager extends ChartManager {
|
|
38
|
+
showYearLabels?: boolean
|
|
39
|
+
endTime?: Time
|
|
40
|
+
hasLineChart?: boolean // used to pick color scheme
|
|
41
|
+
hasSlopeChart?: boolean // used to pick color scheme
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface DiscreteBarItem {
|
|
45
|
+
yColumn: CoreColumn
|
|
46
|
+
seriesName: string
|
|
47
|
+
value: number
|
|
48
|
+
time: number
|
|
49
|
+
colorValue?: CoreValueType
|
|
50
|
+
color?: Color
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface FontSettings {
|
|
54
|
+
fontSize: number
|
|
55
|
+
fontWeight: number
|
|
56
|
+
lineHeight: number
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const BACKGROUND_COLOR = "#fff"
|
|
60
|
+
export const BAR_SPACING_FACTOR = 0.35
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import * as _ from "lodash-es"
|
|
2
|
+
import { TextWrap, shortenWithEllipsis } from "../../components/index.js"
|
|
3
|
+
import { EntityName } from "../../types/index.js"
|
|
4
|
+
import { FontSettings } from "./DiscreteBarChartConstants.js"
|
|
5
|
+
|
|
6
|
+
const ANNOTATION_PADDING = 2
|
|
7
|
+
|
|
8
|
+
// Pattern IDs should be unique per document (!), not just per grapher instance.
|
|
9
|
+
// Including the color in the id guarantees that the pattern uses the correct color,
|
|
10
|
+
// even if it gets resolved to a striped pattern of a different grapher instance.
|
|
11
|
+
export function makeProjectedDataPatternId(color: string): string {
|
|
12
|
+
return `DiscreteBarChart_stripes_${color}`
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Creates a TextWrap for discrete bar chart labels that fits within the bar height.
|
|
17
|
+
*
|
|
18
|
+
* Strategy:
|
|
19
|
+
* 1. Calculate the maximum number of lines that can fit in the bar height
|
|
20
|
+
* 2. Use binary search to find the minimum width that produces at most maxLines
|
|
21
|
+
* 3. If the label doesn't fit even at maxWidth, reduce font size until it fits
|
|
22
|
+
* 4. If the label still doesn't fit, truncate the label with ellipsis
|
|
23
|
+
*/
|
|
24
|
+
function wrapLabelForHeight({
|
|
25
|
+
label,
|
|
26
|
+
availableHeight,
|
|
27
|
+
minWidth,
|
|
28
|
+
maxWidth,
|
|
29
|
+
fontSettings,
|
|
30
|
+
}: {
|
|
31
|
+
label: string
|
|
32
|
+
availableHeight: number
|
|
33
|
+
minWidth: number
|
|
34
|
+
maxWidth: number
|
|
35
|
+
fontSettings: { fontSize: number; fontWeight: number; lineHeight: number }
|
|
36
|
+
}): { textWrap: TextWrap; needsTruncation?: boolean } {
|
|
37
|
+
const originalFontSize = fontSettings.fontSize
|
|
38
|
+
|
|
39
|
+
// Drop new line characters before processing
|
|
40
|
+
const cleanedLabel = label.replace(/\n/g, " ").trim()
|
|
41
|
+
|
|
42
|
+
// Helper to calculate max lines that can fit in available height
|
|
43
|
+
const computeMaxLineCount = (
|
|
44
|
+
availableHeight: number,
|
|
45
|
+
fontSettings: FontSettings
|
|
46
|
+
): number => {
|
|
47
|
+
const lineHeight = fontSettings.fontSize * fontSettings.lineHeight
|
|
48
|
+
return Math.max(1, Math.floor(availableHeight / lineHeight))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Helper to create TextWrap with given width and font size
|
|
52
|
+
const makeTextWrap = (maxWidth: number, fontSize: number): TextWrap =>
|
|
53
|
+
new TextWrap({
|
|
54
|
+
text: cleanedLabel,
|
|
55
|
+
maxWidth,
|
|
56
|
+
...fontSettings,
|
|
57
|
+
fontSize, // Overrides the original font size
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// Calculate max lines that can fit in the bar height
|
|
61
|
+
const maxLines = computeMaxLineCount(availableHeight, fontSettings)
|
|
62
|
+
|
|
63
|
+
// Find the minimum width that produces at most maxLines
|
|
64
|
+
const optimalWidth = findMinWidthForMaxLines({
|
|
65
|
+
label: cleanedLabel,
|
|
66
|
+
maxLines,
|
|
67
|
+
minWidth,
|
|
68
|
+
maxWidth,
|
|
69
|
+
fontSettings,
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
// Check if it fits at the best width with original font size
|
|
73
|
+
const labelWrap = makeTextWrap(optimalWidth, originalFontSize)
|
|
74
|
+
if (labelWrap.lines.length <= maxLines) return { textWrap: labelWrap }
|
|
75
|
+
|
|
76
|
+
// If not, reduce the font size until it fits (or the minimum font size is reached)
|
|
77
|
+
const minFontSize = Math.max(Math.floor(originalFontSize * 0.8), 6)
|
|
78
|
+
const optimalFontSize = findMaxFontSizeForHeight({
|
|
79
|
+
label: cleanedLabel,
|
|
80
|
+
maxWidth,
|
|
81
|
+
availableHeight,
|
|
82
|
+
maxFontSize: originalFontSize,
|
|
83
|
+
minFontSize,
|
|
84
|
+
fontSettings,
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
// Check if the label fits or if it needs truncation
|
|
88
|
+
const reducedFontWrap = makeTextWrap(maxWidth, optimalFontSize)
|
|
89
|
+
const optimalFontSettings = { ...fontSettings, fontSize: optimalFontSize }
|
|
90
|
+
const maxLinesAtReducedSize = computeMaxLineCount(
|
|
91
|
+
availableHeight,
|
|
92
|
+
optimalFontSettings
|
|
93
|
+
)
|
|
94
|
+
const needsTruncation = reducedFontWrap.lines.length > maxLinesAtReducedSize
|
|
95
|
+
|
|
96
|
+
return { textWrap: reducedFontWrap, needsTruncation }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Binary search to find the minimum width that produces at most maxLines */
|
|
100
|
+
function findMinWidthForMaxLines({
|
|
101
|
+
label,
|
|
102
|
+
maxLines,
|
|
103
|
+
minWidth,
|
|
104
|
+
maxWidth,
|
|
105
|
+
fontSettings,
|
|
106
|
+
}: {
|
|
107
|
+
label: string
|
|
108
|
+
maxLines: number
|
|
109
|
+
minWidth: number
|
|
110
|
+
maxWidth: number
|
|
111
|
+
fontSettings: FontSettings
|
|
112
|
+
}): number {
|
|
113
|
+
let low = minWidth
|
|
114
|
+
let high = maxWidth
|
|
115
|
+
let bestWidth = maxWidth
|
|
116
|
+
const step = 1
|
|
117
|
+
|
|
118
|
+
while (low <= high) {
|
|
119
|
+
const mid = Math.floor((low + high) / 2)
|
|
120
|
+
const testWrap = new TextWrap({
|
|
121
|
+
text: label,
|
|
122
|
+
maxWidth: mid,
|
|
123
|
+
...fontSettings,
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
if (testWrap.lines.length <= maxLines) {
|
|
127
|
+
// This width works, try smaller
|
|
128
|
+
bestWidth = mid
|
|
129
|
+
high = mid - step
|
|
130
|
+
} else {
|
|
131
|
+
// Too many lines, need larger width
|
|
132
|
+
low = mid + step
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return bestWidth
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Decrease font size until the label fits within availableHeight at maxWidth */
|
|
140
|
+
function findMaxFontSizeForHeight({
|
|
141
|
+
label,
|
|
142
|
+
maxWidth,
|
|
143
|
+
availableHeight,
|
|
144
|
+
maxFontSize,
|
|
145
|
+
minFontSize,
|
|
146
|
+
fontSettings,
|
|
147
|
+
}: {
|
|
148
|
+
label: string
|
|
149
|
+
maxWidth: number
|
|
150
|
+
availableHeight: number
|
|
151
|
+
maxFontSize: number
|
|
152
|
+
minFontSize: number
|
|
153
|
+
fontSettings: FontSettings
|
|
154
|
+
}): number {
|
|
155
|
+
const step = 0.5
|
|
156
|
+
|
|
157
|
+
let fontSize = maxFontSize
|
|
158
|
+
|
|
159
|
+
while (fontSize >= minFontSize) {
|
|
160
|
+
const lineHeight = fontSize * fontSettings.lineHeight
|
|
161
|
+
const maxLines = Math.max(1, Math.floor(availableHeight / lineHeight))
|
|
162
|
+
|
|
163
|
+
const testWrap = new TextWrap({
|
|
164
|
+
text: label,
|
|
165
|
+
maxWidth,
|
|
166
|
+
...fontSettings,
|
|
167
|
+
fontSize,
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
if (testWrap.lines.length <= maxLines) return fontSize
|
|
171
|
+
|
|
172
|
+
fontSize -= step
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return minFontSize
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Processes series to create sized labels that fit within available height */
|
|
179
|
+
export function enrichSeriesWithLabels<
|
|
180
|
+
TSeries extends {
|
|
181
|
+
entityName: EntityName
|
|
182
|
+
shortEntityName?: string
|
|
183
|
+
annotation?: string
|
|
184
|
+
},
|
|
185
|
+
>({
|
|
186
|
+
series,
|
|
187
|
+
availableHeightPerSeries,
|
|
188
|
+
minLabelWidth,
|
|
189
|
+
maxLabelWidth,
|
|
190
|
+
fontSettings,
|
|
191
|
+
annotationFontSettings = {
|
|
192
|
+
fontSize: 13,
|
|
193
|
+
fontWeight: 300,
|
|
194
|
+
lineHeight: 1,
|
|
195
|
+
},
|
|
196
|
+
}: {
|
|
197
|
+
series: readonly TSeries[]
|
|
198
|
+
availableHeightPerSeries: number
|
|
199
|
+
minLabelWidth: number
|
|
200
|
+
maxLabelWidth: number
|
|
201
|
+
fontSettings: FontSettings
|
|
202
|
+
annotationFontSettings?: FontSettings
|
|
203
|
+
}): (TSeries & { label: TextWrap; annotationTextWrap?: TextWrap })[] {
|
|
204
|
+
// Wrap labels and annotations to fit within the available space
|
|
205
|
+
const wrappedLabels = series.map((series) => {
|
|
206
|
+
const label = series.shortEntityName ?? series.entityName
|
|
207
|
+
|
|
208
|
+
// First, wrap the label without considering annotations
|
|
209
|
+
const {
|
|
210
|
+
textWrap: labelWrap,
|
|
211
|
+
needsTruncation: labelWrapNeedsTruncation,
|
|
212
|
+
} = wrapLabelForHeight({
|
|
213
|
+
label,
|
|
214
|
+
availableHeight: availableHeightPerSeries,
|
|
215
|
+
minWidth: minLabelWidth,
|
|
216
|
+
maxWidth: maxLabelWidth,
|
|
217
|
+
fontSettings,
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
// If there's no annotation, we're done
|
|
221
|
+
if (!series.annotation) return { labelWrap, labelWrapNeedsTruncation }
|
|
222
|
+
|
|
223
|
+
// Calculate remaining height for annotation (4px extra padding to avoid crowding)
|
|
224
|
+
const remainingHeightForAnnotation =
|
|
225
|
+
availableHeightPerSeries - labelWrap.height - ANNOTATION_PADDING - 4
|
|
226
|
+
|
|
227
|
+
// If there's not enough space for even one line of annotation, skip it
|
|
228
|
+
const minAnnotationHeight =
|
|
229
|
+
annotationFontSettings.fontSize * annotationFontSettings.lineHeight
|
|
230
|
+
if (remainingHeightForAnnotation < minAnnotationHeight)
|
|
231
|
+
return { labelWrap, labelWrapNeedsTruncation }
|
|
232
|
+
|
|
233
|
+
// Wrap annotation to fit in remaining space
|
|
234
|
+
const annotationWrap = new TextWrap({
|
|
235
|
+
text: series.annotation,
|
|
236
|
+
// 80px extra to give annotations more room than labels
|
|
237
|
+
maxWidth: Math.min(maxLabelWidth, labelWrap.width + 80),
|
|
238
|
+
...annotationFontSettings,
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
// Check if annotation fits in remaining height
|
|
242
|
+
if (annotationWrap.height > remainingHeightForAnnotation) {
|
|
243
|
+
// Try again with a larger max width
|
|
244
|
+
const annotationWrap = new TextWrap({
|
|
245
|
+
text: series.annotation,
|
|
246
|
+
maxWidth: maxLabelWidth,
|
|
247
|
+
...annotationFontSettings,
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
const annotationWrapNeedsTruncation =
|
|
251
|
+
annotationWrap.height > remainingHeightForAnnotation
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
labelWrap,
|
|
255
|
+
labelWrapNeedsTruncation,
|
|
256
|
+
annotationWrap,
|
|
257
|
+
annotationWrapNeedsTruncation,
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
labelWrap,
|
|
263
|
+
annotationWrap,
|
|
264
|
+
labelWrapNeedsTruncation,
|
|
265
|
+
annotationWrapNeedsTruncation: false,
|
|
266
|
+
}
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
// Return early if no labels or annotations need truncation
|
|
270
|
+
const needsTruncation = wrappedLabels.some(
|
|
271
|
+
(s) => s.labelWrapNeedsTruncation || s.annotationWrapNeedsTruncation
|
|
272
|
+
)
|
|
273
|
+
if (!needsTruncation)
|
|
274
|
+
return series.map((series, index) => ({
|
|
275
|
+
...series,
|
|
276
|
+
label: wrappedLabels[index].labelWrap,
|
|
277
|
+
annotationTextWrap: wrappedLabels[index].annotationWrap,
|
|
278
|
+
}))
|
|
279
|
+
|
|
280
|
+
// The target width for truncation is the max width of non-truncated labels and annotations
|
|
281
|
+
const nonTruncatedLabelWidths = wrappedLabels
|
|
282
|
+
.filter((s) => !s.labelWrapNeedsTruncation)
|
|
283
|
+
.map((s) => s.labelWrap.width)
|
|
284
|
+
const nonTruncatedAnnotationWidths = wrappedLabels
|
|
285
|
+
.filter(
|
|
286
|
+
(s) =>
|
|
287
|
+
s.annotationWrap !== undefined &&
|
|
288
|
+
!s.annotationWrapNeedsTruncation
|
|
289
|
+
)
|
|
290
|
+
.map((s) => s.annotationWrap!.width)
|
|
291
|
+
const targetWidth = Math.max(
|
|
292
|
+
_.max(nonTruncatedLabelWidths) ?? 0,
|
|
293
|
+
_.max(nonTruncatedAnnotationWidths) ?? 0
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
const truncatedLabels = wrappedLabels.map(
|
|
297
|
+
({ labelWrap, labelWrapNeedsTruncation }) => {
|
|
298
|
+
if (!labelWrapNeedsTruncation) return labelWrap
|
|
299
|
+
|
|
300
|
+
const truncatedText = shortenWithEllipsis(
|
|
301
|
+
labelWrap.text,
|
|
302
|
+
targetWidth,
|
|
303
|
+
fontSettings
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
return new TextWrap({
|
|
307
|
+
text: truncatedText,
|
|
308
|
+
maxWidth: Infinity, // Don't wrap truncated labels
|
|
309
|
+
...fontSettings,
|
|
310
|
+
})
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
const truncatedAnnotations = wrappedLabels.map(
|
|
315
|
+
({ annotationWrap, annotationWrapNeedsTruncation }) => {
|
|
316
|
+
if (!annotationWrap || !annotationWrapNeedsTruncation)
|
|
317
|
+
return annotationWrap
|
|
318
|
+
|
|
319
|
+
const truncatedText = shortenWithEllipsis(
|
|
320
|
+
annotationWrap.text,
|
|
321
|
+
targetWidth,
|
|
322
|
+
annotationFontSettings
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
return new TextWrap({
|
|
326
|
+
text: truncatedText,
|
|
327
|
+
maxWidth: Infinity, // Don't wrap truncated labels
|
|
328
|
+
...annotationFontSettings,
|
|
329
|
+
})
|
|
330
|
+
}
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
return series.map((series, index) => ({
|
|
334
|
+
...series,
|
|
335
|
+
label: truncatedLabels[index],
|
|
336
|
+
annotationTextWrap: truncatedAnnotations[index],
|
|
337
|
+
}))
|
|
338
|
+
}
|