@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,9 @@
|
|
|
1
|
+
// Minimum vertical space between two legend items
|
|
2
|
+
export const LEGEND_ITEM_MIN_SPACING = 4
|
|
3
|
+
// Horizontal distance from the end of the chart to the start of the marker
|
|
4
|
+
export const MARKER_MARGIN = 4
|
|
5
|
+
// Space between the label and the annotation
|
|
6
|
+
export const ANNOTATION_PADDING = 1
|
|
7
|
+
|
|
8
|
+
export const DEFAULT_CONNECTOR_LINE_WIDTH = 25
|
|
9
|
+
export const DEFAULT_FONT_WEIGHT = 400
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import * as _ from "lodash-es"
|
|
2
|
+
import {
|
|
3
|
+
computeCandidateScores,
|
|
4
|
+
LineLegendFilterAlgorithmContext,
|
|
5
|
+
pickAsManyAsPossibleWithRetry,
|
|
6
|
+
pickCandidate,
|
|
7
|
+
pickCandidateWithMaxDistanceToReferenceCandidate,
|
|
8
|
+
pickCandidateWithRetry,
|
|
9
|
+
} from "./LineLegendHelpers"
|
|
10
|
+
import { PlacedSeries } from "./LineLegendTypes"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Keep a subset of series that fit within the available height, prioritizing by
|
|
14
|
+
* importance. Focused series have priority, even if they're less important.
|
|
15
|
+
*
|
|
16
|
+
* Note that more important (but longer) series names might be skipped if they don't fit.
|
|
17
|
+
*/
|
|
18
|
+
export function findImportantSeriesThatFitIntoTheAvailableSpace(
|
|
19
|
+
seriesSortedByImportance: PlacedSeries[],
|
|
20
|
+
availableHeight: number
|
|
21
|
+
) {
|
|
22
|
+
let context: LineLegendFilterAlgorithmContext = {
|
|
23
|
+
candidates: new Set(seriesSortedByImportance),
|
|
24
|
+
availableHeight,
|
|
25
|
+
sortedKeepSeries: [],
|
|
26
|
+
keepSeriesHeight: 0,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const [focusedCandidates, nonFocusedCandidates] = _.partition(
|
|
30
|
+
seriesSortedByImportance,
|
|
31
|
+
(series) => series.focus?.active
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
const importanceScore = new Map(
|
|
35
|
+
seriesSortedByImportance.map((series, index) => [
|
|
36
|
+
series.seriesName,
|
|
37
|
+
-index, // higher index means lower importance
|
|
38
|
+
])
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const getMostImportantCandidate = (candidates: PlacedSeries[]) =>
|
|
42
|
+
_.maxBy(candidates, (c) => importanceScore.get(c.seriesName))
|
|
43
|
+
|
|
44
|
+
// focused series have priority
|
|
45
|
+
context = pickAsManyAsPossibleWithRetry({
|
|
46
|
+
context,
|
|
47
|
+
candidateSubset: focusedCandidates,
|
|
48
|
+
getCandidateFromSubset: getMostImportantCandidate,
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
context = pickAsManyAsPossibleWithRetry({
|
|
52
|
+
context,
|
|
53
|
+
candidateSubset: nonFocusedCandidates,
|
|
54
|
+
getCandidateFromSubset: getMostImportantCandidate,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
return context.sortedKeepSeries
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Pick a subset of series that fit within the available height.
|
|
62
|
+
*
|
|
63
|
+
* The algorithm tries to pick labels in a 'balanced' way such that they're
|
|
64
|
+
* spread out as much as possible. Focused series have priority.
|
|
65
|
+
*
|
|
66
|
+
* The algorithm works as follows: Given a set of placed labels and a set of
|
|
67
|
+
* candidates, for each candidate, we find the two closest already placed labels,
|
|
68
|
+
* one to each side, and calculate a score based on the available space between
|
|
69
|
+
* the two placed labels (the bigger, the better) and the candidate's distance to
|
|
70
|
+
* the midpoint (the smaller, the better). We then pick the candidate with the best
|
|
71
|
+
* score that fits into the available space.
|
|
72
|
+
*/
|
|
73
|
+
export function findSeriesThatFitIntoTheAvailableSpace(
|
|
74
|
+
series: PlacedSeries[],
|
|
75
|
+
availableHeight: number
|
|
76
|
+
): PlacedSeries[] {
|
|
77
|
+
let context: LineLegendFilterAlgorithmContext = {
|
|
78
|
+
candidates: new Set(series),
|
|
79
|
+
availableHeight,
|
|
80
|
+
sortedKeepSeries: [],
|
|
81
|
+
keepSeriesHeight: 0,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const [focusedCandidates, nonFocusedCandidates] = _.partition(
|
|
85
|
+
series,
|
|
86
|
+
(series) => series.focus?.active
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
// focused series have priority
|
|
90
|
+
context = pickAsManyAsPossibleWithRetry({
|
|
91
|
+
context,
|
|
92
|
+
candidateSubset: focusedCandidates,
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
// we initially need to pick at least two candidates
|
|
96
|
+
const numPickedCandidates = context.sortedKeepSeries.length
|
|
97
|
+
if (numPickedCandidates === 0) {
|
|
98
|
+
// pick two candidates with maximal distance to each other.
|
|
99
|
+
// by convention we pick the max candidate first, but we could also
|
|
100
|
+
// start by picking the min cadidate
|
|
101
|
+
const maxCandidate = _.maxBy(nonFocusedCandidates, (c) => c.midY)
|
|
102
|
+
if (maxCandidate) {
|
|
103
|
+
context = pickCandidate(context, maxCandidate)
|
|
104
|
+
|
|
105
|
+
context = pickCandidateWithMaxDistanceToReferenceCandidate({
|
|
106
|
+
context,
|
|
107
|
+
candidateSubset: nonFocusedCandidates,
|
|
108
|
+
referenceCandidate: context.sortedKeepSeries[0],
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
} else if (numPickedCandidates === 1) {
|
|
112
|
+
// pick the candidate that is furthest away from the focused label
|
|
113
|
+
context = pickCandidateWithMaxDistanceToReferenceCandidate({
|
|
114
|
+
context,
|
|
115
|
+
candidateSubset: nonFocusedCandidates,
|
|
116
|
+
referenceCandidate: context.sortedKeepSeries[0],
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// pick candidates based on a scoring system
|
|
121
|
+
while (
|
|
122
|
+
context.candidates.size > 0 &&
|
|
123
|
+
context.keepSeriesHeight <= availableHeight
|
|
124
|
+
) {
|
|
125
|
+
const candidates = Array.from(context.candidates)
|
|
126
|
+
const scoreMap = computeCandidateScores(
|
|
127
|
+
candidates,
|
|
128
|
+
context.sortedKeepSeries
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
// pick the candidate with the highest score
|
|
132
|
+
const getBestCandidate = (candidates: PlacedSeries[]) =>
|
|
133
|
+
_.maxBy(candidates, (c) => scoreMap.get(c.seriesName))
|
|
134
|
+
|
|
135
|
+
context = pickCandidateWithRetry({
|
|
136
|
+
context,
|
|
137
|
+
candidateSubset: candidates,
|
|
138
|
+
getCandidateFromSubset: getBestCandidate,
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return context.sortedKeepSeries
|
|
143
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import * as _ from "lodash-es"
|
|
2
|
+
import { SeriesName } from "../../utils/index.js"
|
|
3
|
+
import { PlacedSeries } from "./LineLegendTypes"
|
|
4
|
+
import { LEGEND_ITEM_MIN_SPACING } from "./LineLegendConstants"
|
|
5
|
+
import * as R from "remeda"
|
|
6
|
+
|
|
7
|
+
type Bracket = [number, number]
|
|
8
|
+
|
|
9
|
+
export interface LineLegendFilterAlgorithmContext {
|
|
10
|
+
candidates: Set<PlacedSeries> // remaining candidates to be considered for placement
|
|
11
|
+
availableHeight: number
|
|
12
|
+
sortedKeepSeries: PlacedSeries[] // series that have been picked to be labelled, sorted by their y position
|
|
13
|
+
keepSeriesHeight: number // total height of the picked series
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface PickFromCandidateSubsetParams {
|
|
17
|
+
context: LineLegendFilterAlgorithmContext
|
|
18
|
+
candidateSubset: PlacedSeries[]
|
|
19
|
+
getCandidateFromSubset?: (
|
|
20
|
+
candidateSubset: PlacedSeries[]
|
|
21
|
+
) => PlacedSeries | undefined
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const dist = (c1: PlacedSeries, c2: PlacedSeries) => Math.abs(c1.midY - c2.midY)
|
|
25
|
+
|
|
26
|
+
function getNewHeight(currentHeight: number, candidate: PlacedSeries): number {
|
|
27
|
+
// if the candidate is the first one, don't add padding
|
|
28
|
+
const padding = currentHeight === 0 ? 0 : LEGEND_ITEM_MIN_SPACING
|
|
29
|
+
return currentHeight + candidate.bounds.height + padding
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Given a sorted list of brackets, like [[0, 10], [10, 20], [20, 30]],
|
|
34
|
+
* find the bracket that contains the given number n.
|
|
35
|
+
*/
|
|
36
|
+
function findBracket(
|
|
37
|
+
sortedBrackets: Bracket[],
|
|
38
|
+
n: number
|
|
39
|
+
): [number | undefined, number | undefined] {
|
|
40
|
+
if (sortedBrackets.length === 0) return [undefined, undefined]
|
|
41
|
+
|
|
42
|
+
const firstBracketValue = sortedBrackets[0][0]
|
|
43
|
+
const lastBracketValue = R.last(sortedBrackets)![1]
|
|
44
|
+
|
|
45
|
+
if (n < firstBracketValue) return [undefined, firstBracketValue]
|
|
46
|
+
if (n >= lastBracketValue) return [lastBracketValue, undefined]
|
|
47
|
+
|
|
48
|
+
for (const bracket of sortedBrackets) {
|
|
49
|
+
if (n >= bracket[0] && n < bracket[1]) return bracket
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return [undefined, undefined]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Add a candidate to the list of picked series and update the context accordingly.
|
|
57
|
+
*/
|
|
58
|
+
export function pickCandidate(
|
|
59
|
+
context: LineLegendFilterAlgorithmContext,
|
|
60
|
+
candidate: PlacedSeries
|
|
61
|
+
): LineLegendFilterAlgorithmContext {
|
|
62
|
+
let { candidates, sortedKeepSeries, keepSeriesHeight } = context
|
|
63
|
+
|
|
64
|
+
// insert into sortedKeepSeries at the right position
|
|
65
|
+
const insertIndex = R.sortedIndexBy(
|
|
66
|
+
context.sortedKeepSeries,
|
|
67
|
+
candidate,
|
|
68
|
+
(s) => s.midY
|
|
69
|
+
)
|
|
70
|
+
sortedKeepSeries.splice(insertIndex, 0, candidate)
|
|
71
|
+
|
|
72
|
+
// update keepSeriesHeight
|
|
73
|
+
keepSeriesHeight = getNewHeight(keepSeriesHeight, candidate)
|
|
74
|
+
|
|
75
|
+
// delete from candidates
|
|
76
|
+
candidates.delete(candidate)
|
|
77
|
+
|
|
78
|
+
return { ...context, candidates, sortedKeepSeries, keepSeriesHeight }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Remove a candidate from the list of candidates to be considered for placement.
|
|
83
|
+
*/
|
|
84
|
+
function dismissCandidate(
|
|
85
|
+
context: LineLegendFilterAlgorithmContext,
|
|
86
|
+
candidate: PlacedSeries
|
|
87
|
+
) {
|
|
88
|
+
const { candidates } = context
|
|
89
|
+
candidates.delete(candidate)
|
|
90
|
+
return { ...context, candidates }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Pick from a subset of candidates until one of the following conditions is met:
|
|
95
|
+
* - no candidates are left or the maximum number of candidates to pick is reached
|
|
96
|
+
* - no more candidates fit into the available space
|
|
97
|
+
*
|
|
98
|
+
* The order of candidates to consider for placement is determined by the
|
|
99
|
+
* `getCandidateFromSubset` function. The function should return the next candidate
|
|
100
|
+
* to consider. If the function returns `undefined`, the algorithm stops.
|
|
101
|
+
*
|
|
102
|
+
* If no custom function is provided, the algorithm picks candidates starting from
|
|
103
|
+
* the end (!) of the given list.
|
|
104
|
+
*/
|
|
105
|
+
function pickFromCandidateSubsetWithRetry(
|
|
106
|
+
params: PickFromCandidateSubsetParams & { maxCandidatesToPick?: number }
|
|
107
|
+
): LineLegendFilterAlgorithmContext {
|
|
108
|
+
let {
|
|
109
|
+
context,
|
|
110
|
+
candidateSubset,
|
|
111
|
+
getCandidateFromSubset,
|
|
112
|
+
maxCandidatesToPick,
|
|
113
|
+
} = params
|
|
114
|
+
|
|
115
|
+
if (candidateSubset.length === 0 || maxCandidatesToPick === 0)
|
|
116
|
+
return context
|
|
117
|
+
|
|
118
|
+
const remainingCandidates = [...candidateSubset]
|
|
119
|
+
let numPicked = 0
|
|
120
|
+
|
|
121
|
+
// if a custom function to get a candidate is provided, use it
|
|
122
|
+
// otherwise, pop the last candidate
|
|
123
|
+
const getCandidate = (): PlacedSeries | undefined => {
|
|
124
|
+
if (getCandidateFromSubset) {
|
|
125
|
+
const candidate = getCandidateFromSubset(remainingCandidates)
|
|
126
|
+
if (candidate) {
|
|
127
|
+
const index = remainingCandidates.indexOf(candidate)
|
|
128
|
+
remainingCandidates.splice(index, 1)
|
|
129
|
+
}
|
|
130
|
+
return candidate
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return remainingCandidates.pop()
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
while (remainingCandidates.length > 0) {
|
|
137
|
+
const candidate = getCandidate()
|
|
138
|
+
if (!candidate) break
|
|
139
|
+
|
|
140
|
+
// sanity check if this is a valid candidate
|
|
141
|
+
if (!context.candidates.has(candidate)) continue
|
|
142
|
+
|
|
143
|
+
// either pick or dismiss the candidate
|
|
144
|
+
const newHeight = getNewHeight(context.keepSeriesHeight, candidate)
|
|
145
|
+
if (newHeight <= context.availableHeight) {
|
|
146
|
+
context = pickCandidate(context, candidate)
|
|
147
|
+
numPicked++
|
|
148
|
+
} else {
|
|
149
|
+
context = dismissCandidate(context, candidate)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// stop if we picked enough candidates
|
|
153
|
+
if (numPicked === maxCandidatesToPick) break
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return context
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Pick as many candidates as possible from a given subset.
|
|
161
|
+
*
|
|
162
|
+
* The order of candidates to consider for placement is determined by the
|
|
163
|
+
* `getCandidateFromSubset` function. The function should return the next candidate
|
|
164
|
+
* to consider. If the function returns `undefined`, the algorithm stops.
|
|
165
|
+
*
|
|
166
|
+
* If no custom function is provided, the algorithm picks candidates starting from
|
|
167
|
+
* the end (!) of the given list.
|
|
168
|
+
*/
|
|
169
|
+
export function pickAsManyAsPossibleWithRetry(
|
|
170
|
+
params: PickFromCandidateSubsetParams
|
|
171
|
+
): LineLegendFilterAlgorithmContext {
|
|
172
|
+
return pickFromCandidateSubsetWithRetry(params)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Pick a fixed number of candidates from a give subset.
|
|
177
|
+
*
|
|
178
|
+
* The order of candidates to consider for placement is determined by the
|
|
179
|
+
* `getCandidateFromSubset` function. The function should return the next candidate
|
|
180
|
+
* to consider. If the function returns `undefined`, the algorithm stops.
|
|
181
|
+
*
|
|
182
|
+
* If no custom function is provided, the algorithm picks candidates starting from
|
|
183
|
+
* the end (!) of the given list.
|
|
184
|
+
*/
|
|
185
|
+
export function pickCandidateWithRetry(
|
|
186
|
+
params: PickFromCandidateSubsetParams
|
|
187
|
+
): LineLegendFilterAlgorithmContext {
|
|
188
|
+
return pickFromCandidateSubsetWithRetry({
|
|
189
|
+
...params,
|
|
190
|
+
maxCandidatesToPick: 1,
|
|
191
|
+
})
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export function pickCandidateWithMaxDistanceToReferenceCandidate(params: {
|
|
195
|
+
context: LineLegendFilterAlgorithmContext
|
|
196
|
+
candidateSubset: PlacedSeries[]
|
|
197
|
+
referenceCandidate: PlacedSeries
|
|
198
|
+
}): LineLegendFilterAlgorithmContext {
|
|
199
|
+
const { context, candidateSubset, referenceCandidate } = params
|
|
200
|
+
|
|
201
|
+
const getMaxDistCandidate = (candidates: PlacedSeries[]) =>
|
|
202
|
+
_.maxBy(candidates, (c) => dist(c, referenceCandidate))
|
|
203
|
+
|
|
204
|
+
return pickCandidateWithRetry({
|
|
205
|
+
context,
|
|
206
|
+
candidateSubset,
|
|
207
|
+
getCandidateFromSubset: getMaxDistCandidate,
|
|
208
|
+
})
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Compute a score for each candidate based on how large the space between the
|
|
213
|
+
* neighboring labels is and how far it is from the mid point of the neighboring
|
|
214
|
+
* labels.
|
|
215
|
+
*/
|
|
216
|
+
export function computeCandidateScores(
|
|
217
|
+
candidates: PlacedSeries[],
|
|
218
|
+
sortedKeepSeries: PlacedSeries[]
|
|
219
|
+
): Map<SeriesName, number> {
|
|
220
|
+
const scoreMap = new Map<SeriesName, number>()
|
|
221
|
+
|
|
222
|
+
const sortedBrackets = sortedKeepSeries
|
|
223
|
+
.slice(0, -1)
|
|
224
|
+
.map((s, i) => [s.midY, sortedKeepSeries[i + 1].midY])
|
|
225
|
+
.filter((bracket) => bracket[0] !== bracket[1]) as Bracket[]
|
|
226
|
+
|
|
227
|
+
// score each candidate based on how well it fits into the available space
|
|
228
|
+
for (const candidate of candidates) {
|
|
229
|
+
// find the bracket that the candidate is contained in
|
|
230
|
+
const [start, end] = findBracket(sortedBrackets, candidate.midY)
|
|
231
|
+
|
|
232
|
+
// if no bracket is found, return the worst possible score
|
|
233
|
+
if (end === undefined || start === undefined) {
|
|
234
|
+
scoreMap.set(candidate.seriesName, 0)
|
|
235
|
+
continue
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// score the candidate based on how far it is from the
|
|
239
|
+
// middle of the bracket and how large the bracket is
|
|
240
|
+
const length = end - start
|
|
241
|
+
const midPoint = start + length / 2
|
|
242
|
+
const distanceFromMidPoint = Math.abs(candidate.midY - midPoint)
|
|
243
|
+
const score = length - distanceFromMidPoint
|
|
244
|
+
|
|
245
|
+
scoreMap.set(candidate.seriesName, score)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return scoreMap
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export function getSeriesKey(series: PlacedSeries, index: number): string {
|
|
252
|
+
return `${series.seriesName}-${index}`
|
|
253
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { MarkdownTextWrap, TextWrap } from "../../components/index.js"
|
|
2
|
+
import { Bounds } from "../../utils/index.js"
|
|
3
|
+
import { ChartSeries } from "../chart/ChartInterface"
|
|
4
|
+
import { InteractionState } from "../interaction/InteractionState"
|
|
5
|
+
|
|
6
|
+
export interface LineLabelSeries extends ChartSeries {
|
|
7
|
+
label: string
|
|
8
|
+
yValue: number
|
|
9
|
+
annotation?: string
|
|
10
|
+
formattedValue?: string
|
|
11
|
+
placeFormattedValueInNewLine?: boolean
|
|
12
|
+
yRange?: [number, number]
|
|
13
|
+
hover?: InteractionState
|
|
14
|
+
focus?: InteractionState
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface SizedSeries extends LineLabelSeries {
|
|
18
|
+
textWrap: TextWrap | MarkdownTextWrap
|
|
19
|
+
annotationTextWrap?: TextWrap
|
|
20
|
+
width: number
|
|
21
|
+
height: number
|
|
22
|
+
fontWeight?: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface PlacedSeries extends SizedSeries {
|
|
26
|
+
origBounds: Bounds
|
|
27
|
+
bounds: Bounds
|
|
28
|
+
repositions: number
|
|
29
|
+
level: number
|
|
30
|
+
totalLevels: number
|
|
31
|
+
midY: number
|
|
32
|
+
}
|