@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.
Files changed (404) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +113 -0
  3. package/package.json +137 -0
  4. package/src/components/BodyPortal/BodyPortal.tsx +40 -0
  5. package/src/components/Button/Button.scss +110 -0
  6. package/src/components/Button/Button.tsx +101 -0
  7. package/src/components/Checkbox.scss +93 -0
  8. package/src/components/Checkbox.tsx +47 -0
  9. package/src/components/ExpandableToggle/ExpandableToggle.scss +123 -0
  10. package/src/components/ExpandableToggle/ExpandableToggle.tsx +60 -0
  11. package/src/components/GrapherTabIcon.tsx +156 -0
  12. package/src/components/GrapherTrendArrow.scss +16 -0
  13. package/src/components/GrapherTrendArrow.tsx +30 -0
  14. package/src/components/Halo/Halo.tsx +44 -0
  15. package/src/components/LabeledSwitch/LabeledSwitch.scss +109 -0
  16. package/src/components/LabeledSwitch/LabeledSwitch.tsx +62 -0
  17. package/src/components/MarkdownTextWrap/MarkdownTextWrap.tsx +1173 -0
  18. package/src/components/OverlayHeader.scss +18 -0
  19. package/src/components/OverlayHeader.tsx +29 -0
  20. package/src/components/RadioButton.scss +69 -0
  21. package/src/components/RadioButton.tsx +42 -0
  22. package/src/components/SimpleMarkdownText.tsx +89 -0
  23. package/src/components/TextInput.scss +17 -0
  24. package/src/components/TextInput.tsx +19 -0
  25. package/src/components/TextWrap/TextWrap.tsx +361 -0
  26. package/src/components/TextWrap/TextWrapUtils.ts +32 -0
  27. package/src/components/closeButton/CloseButton.scss +40 -0
  28. package/src/components/closeButton/CloseButton.tsx +27 -0
  29. package/src/components/index.ts +70 -0
  30. package/src/components/loadingIndicator/LoadingIndicator.scss +40 -0
  31. package/src/components/loadingIndicator/LoadingIndicator.tsx +28 -0
  32. package/src/components/markdown/remarkPlainLinks.ts +36 -0
  33. package/src/components/reactUtil.ts +20 -0
  34. package/src/components/stubs/CodeSnippet.tsx +19 -0
  35. package/src/components/stubs/DataCitation.tsx +16 -0
  36. package/src/components/stubs/IndicatorKeyData.tsx +45 -0
  37. package/src/components/stubs/IndicatorProcessing.tsx +15 -0
  38. package/src/components/stubs/IndicatorSources.tsx +15 -0
  39. package/src/components/styles/colors.scss +113 -0
  40. package/src/components/styles/mixins.scss +630 -0
  41. package/src/components/styles/typography.scss +579 -0
  42. package/src/components/styles/util.scss +89 -0
  43. package/src/components/styles/variables.scss +208 -0
  44. package/src/config/ChartsConfig.ts +163 -0
  45. package/src/config/ChartsProvider.tsx +157 -0
  46. package/src/config/index.ts +20 -0
  47. package/src/core-table/CoreTable.ts +1355 -0
  48. package/src/core-table/CoreTableColumns.ts +973 -0
  49. package/src/core-table/CoreTableUtils.ts +793 -0
  50. package/src/core-table/ErrorValues.ts +73 -0
  51. package/src/core-table/OwidTable.ts +1175 -0
  52. package/src/core-table/OwidTableSynthesizers.ts +272 -0
  53. package/src/core-table/OwidTableUtil.ts +76 -0
  54. package/src/core-table/Transforms.ts +484 -0
  55. package/src/core-table/index.ts +82 -0
  56. package/src/explorer/ColumnGrammar.ts +217 -0
  57. package/src/explorer/Explorer.sample.ts +212 -0
  58. package/src/explorer/Explorer.scss +148 -0
  59. package/src/explorer/Explorer.tsx +1283 -0
  60. package/src/explorer/ExplorerConstants.ts +85 -0
  61. package/src/explorer/ExplorerControls.scss +156 -0
  62. package/src/explorer/ExplorerControls.tsx +210 -0
  63. package/src/explorer/ExplorerDecisionMatrix.ts +471 -0
  64. package/src/explorer/ExplorerGrammar.ts +161 -0
  65. package/src/explorer/ExplorerProgram.ts +568 -0
  66. package/src/explorer/ExplorerUtils.ts +59 -0
  67. package/src/explorer/GrapherGrammar.ts +387 -0
  68. package/src/explorer/gridLang/GrammarUtils.ts +121 -0
  69. package/src/explorer/gridLang/GridCell.ts +298 -0
  70. package/src/explorer/gridLang/GridLangConstants.ts +255 -0
  71. package/src/explorer/gridLang/GridProgram.ts +311 -0
  72. package/src/explorer/gridLang/readme.md +17 -0
  73. package/src/explorer/index.ts +69 -0
  74. package/src/explorer/readme.md +19 -0
  75. package/src/explorer/urlMigrations/CO2UrlMigration.ts +46 -0
  76. package/src/explorer/urlMigrations/CovidUrlMigration.ts +37 -0
  77. package/src/explorer/urlMigrations/EnergyUrlMigration.ts +41 -0
  78. package/src/explorer/urlMigrations/ExplorerPageUrlMigrationSpec.ts +12 -0
  79. package/src/explorer/urlMigrations/ExplorerUrlMigrationUtils.ts +45 -0
  80. package/src/explorer/urlMigrations/ExplorerUrlMigrations.ts +33 -0
  81. package/src/explorer/urlMigrations/LegacyCovidUrlMigration.ts +144 -0
  82. package/src/explorer/urlMigrations/readme.md +39 -0
  83. package/src/grapher/axis/Axis.ts +973 -0
  84. package/src/grapher/axis/AxisConfig.ts +179 -0
  85. package/src/grapher/axis/AxisViews.tsx +597 -0
  86. package/src/grapher/barCharts/DiscreteBarChart.tsx +728 -0
  87. package/src/grapher/barCharts/DiscreteBarChartConstants.ts +60 -0
  88. package/src/grapher/barCharts/DiscreteBarChartHelpers.ts +338 -0
  89. package/src/grapher/barCharts/DiscreteBarChartState.ts +354 -0
  90. package/src/grapher/barCharts/DiscreteBarChartThumbnail.tsx +34 -0
  91. package/src/grapher/captionedChart/CaptionedChart.scss +61 -0
  92. package/src/grapher/captionedChart/CaptionedChart.tsx +523 -0
  93. package/src/grapher/captionedChart/Logos.tsx +141 -0
  94. package/src/grapher/captionedChart/LogosSVG.tsx +16 -0
  95. package/src/grapher/captionedChart/StaticChartRasterizer.tsx +178 -0
  96. package/src/grapher/captionedChart/assets/buildcanada-logo-square.svg +15 -0
  97. package/src/grapher/captionedChart/assets/buildcanada-logo.svg +15 -0
  98. package/src/grapher/captionedChart/assets/canadaspends.svg +7 -0
  99. package/src/grapher/captionedChart/readme.md +14 -0
  100. package/src/grapher/chart/Chart.tsx +62 -0
  101. package/src/grapher/chart/ChartAreaContent.tsx +172 -0
  102. package/src/grapher/chart/ChartDimension.ts +121 -0
  103. package/src/grapher/chart/ChartInterface.ts +83 -0
  104. package/src/grapher/chart/ChartManager.ts +113 -0
  105. package/src/grapher/chart/ChartTabs.ts +178 -0
  106. package/src/grapher/chart/ChartTypeMap.tsx +158 -0
  107. package/src/grapher/chart/ChartTypeSwitcher.tsx +26 -0
  108. package/src/grapher/chart/ChartUtils.tsx +364 -0
  109. package/src/grapher/chart/DimensionSlot.ts +45 -0
  110. package/src/grapher/chart/StaticChartWrapper.tsx +94 -0
  111. package/src/grapher/chart/guidedChartUtils.ts +82 -0
  112. package/src/grapher/color/BinningStrategies.ts +484 -0
  113. package/src/grapher/color/BinningStrategyEqualSizeBins.ts +132 -0
  114. package/src/grapher/color/BinningStrategyLogarithmic.ts +121 -0
  115. package/src/grapher/color/CategoricalColorAssigner.ts +97 -0
  116. package/src/grapher/color/ColorBrewerSchemes.ts +80 -0
  117. package/src/grapher/color/ColorConstants.ts +20 -0
  118. package/src/grapher/color/ColorScale.ts +339 -0
  119. package/src/grapher/color/ColorScaleBin.ts +147 -0
  120. package/src/grapher/color/ColorScaleConfig.ts +204 -0
  121. package/src/grapher/color/ColorScheme.ts +137 -0
  122. package/src/grapher/color/ColorSchemes.ts +149 -0
  123. package/src/grapher/color/ColorUtils.ts +86 -0
  124. package/src/grapher/color/CustomSchemes.ts +1772 -0
  125. package/src/grapher/color/readme.md +84 -0
  126. package/src/grapher/comparisonLine/ComparisonLine.tsx +31 -0
  127. package/src/grapher/comparisonLine/ComparisonLineConstants.ts +11 -0
  128. package/src/grapher/comparisonLine/ComparisonLineGenerator.ts +60 -0
  129. package/src/grapher/comparisonLine/ComparisonLineHelpers.ts +10 -0
  130. package/src/grapher/comparisonLine/CustomComparisonLine.tsx +159 -0
  131. package/src/grapher/comparisonLine/VerticalComparisonLine.tsx +208 -0
  132. package/src/grapher/controls/ActionButtons.scss +97 -0
  133. package/src/grapher/controls/ActionButtons.tsx +453 -0
  134. package/src/grapher/controls/CommandPalette.scss +50 -0
  135. package/src/grapher/controls/CommandPalette.tsx +74 -0
  136. package/src/grapher/controls/ContentSwitchers.scss +93 -0
  137. package/src/grapher/controls/ContentSwitchers.tsx +238 -0
  138. package/src/grapher/controls/Controls.scss +158 -0
  139. package/src/grapher/controls/DataTableFilterDropdown.scss +7 -0
  140. package/src/grapher/controls/DataTableFilterDropdown.tsx +168 -0
  141. package/src/grapher/controls/DataTableSearchField.scss +3 -0
  142. package/src/grapher/controls/DataTableSearchField.tsx +76 -0
  143. package/src/grapher/controls/Dropdown.scss +252 -0
  144. package/src/grapher/controls/Dropdown.tsx +235 -0
  145. package/src/grapher/controls/EntitySelectionToggle.tsx +135 -0
  146. package/src/grapher/controls/MapRegionDropdown.scss +3 -0
  147. package/src/grapher/controls/MapRegionDropdown.tsx +104 -0
  148. package/src/grapher/controls/MapResetButton.tsx +115 -0
  149. package/src/grapher/controls/MapZoomDropdown.scss +9 -0
  150. package/src/grapher/controls/MapZoomDropdown.tsx +270 -0
  151. package/src/grapher/controls/MapZoomToSelectionButton.tsx +87 -0
  152. package/src/grapher/controls/SearchField.scss +78 -0
  153. package/src/grapher/controls/SearchField.tsx +63 -0
  154. package/src/grapher/controls/SettingsMenu.scss +191 -0
  155. package/src/grapher/controls/SettingsMenu.tsx +399 -0
  156. package/src/grapher/controls/ShareMenu.scss +58 -0
  157. package/src/grapher/controls/ShareMenu.tsx +304 -0
  158. package/src/grapher/controls/SortIcon.tsx +39 -0
  159. package/src/grapher/controls/VerticalScrollContainer.tsx +263 -0
  160. package/src/grapher/controls/controlsRow/ControlsRow.tsx +168 -0
  161. package/src/grapher/controls/dropdown-icons.scss +4 -0
  162. package/src/grapher/controls/entityPicker/EntityPicker.scss +255 -0
  163. package/src/grapher/controls/entityPicker/EntityPicker.tsx +816 -0
  164. package/src/grapher/controls/entityPicker/EntityPickerConstants.ts +23 -0
  165. package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.scss +129 -0
  166. package/src/grapher/controls/globalEntitySelector/GlobalEntitySelector.tsx +463 -0
  167. package/src/grapher/controls/globalEntitySelector/GlobalEntitySelectorConstants.ts +3 -0
  168. package/src/grapher/controls/globalEntitySelector/readme.md +17 -0
  169. package/src/grapher/controls/settings/AbsRelToggle.tsx +64 -0
  170. package/src/grapher/controls/settings/AxisScaleToggle.tsx +53 -0
  171. package/src/grapher/controls/settings/FacetStrategySelector.tsx +110 -0
  172. package/src/grapher/controls/settings/FacetYDomainToggle.tsx +51 -0
  173. package/src/grapher/controls/settings/NoDataAreaToggle.tsx +38 -0
  174. package/src/grapher/controls/settings/ZoomToggle.tsx +36 -0
  175. package/src/grapher/core/EntitiesByRegionType.ts +174 -0
  176. package/src/grapher/core/EntityCodes.ts +19 -0
  177. package/src/grapher/core/EntityUrlBuilder.ts +200 -0
  178. package/src/grapher/core/FetchingGrapher.tsx +156 -0
  179. package/src/grapher/core/Grapher.tsx +760 -0
  180. package/src/grapher/core/GrapherAnalytics.ts +229 -0
  181. package/src/grapher/core/GrapherConstants.ts +173 -0
  182. package/src/grapher/core/GrapherState.tsx +3659 -0
  183. package/src/grapher/core/GrapherUrl.ts +184 -0
  184. package/src/grapher/core/GrapherUrlMigrations.ts +29 -0
  185. package/src/grapher/core/GrapherUseHelpers.tsx +147 -0
  186. package/src/grapher/core/LegacyToOwidTable.ts +841 -0
  187. package/src/grapher/core/grapher.entry.ts +5 -0
  188. package/src/grapher/core/grapher.scss +257 -0
  189. package/src/grapher/core/loadGrapherTableHelpers.ts +116 -0
  190. package/src/grapher/core/loadVariable.ts +104 -0
  191. package/src/grapher/core/relatedQuestion.ts +12 -0
  192. package/src/grapher/core/typography.scss +206 -0
  193. package/src/grapher/dataTable/DataTable.sample.ts +206 -0
  194. package/src/grapher/dataTable/DataTable.scss +249 -0
  195. package/src/grapher/dataTable/DataTable.tsx +1332 -0
  196. package/src/grapher/dataTable/DataTableConstants.ts +186 -0
  197. package/src/grapher/entitySelector/EntitySelector.scss +255 -0
  198. package/src/grapher/entitySelector/EntitySelector.tsx +1838 -0
  199. package/src/grapher/facet/FacetChart.tsx +943 -0
  200. package/src/grapher/facet/FacetChartConstants.ts +24 -0
  201. package/src/grapher/facet/FacetChartUtils.ts +51 -0
  202. package/src/grapher/facet/FacetMap.tsx +604 -0
  203. package/src/grapher/facet/FacetMapConstants.ts +23 -0
  204. package/src/grapher/facet/readme.md +13 -0
  205. package/src/grapher/focus/FocusArray.ts +79 -0
  206. package/src/grapher/footer/Footer.scss +63 -0
  207. package/src/grapher/footer/Footer.tsx +809 -0
  208. package/src/grapher/footer/FooterManager.ts +44 -0
  209. package/src/grapher/fullScreen/FullScreen.scss +11 -0
  210. package/src/grapher/fullScreen/FullScreen.tsx +61 -0
  211. package/src/grapher/header/Header.scss +35 -0
  212. package/src/grapher/header/Header.tsx +372 -0
  213. package/src/grapher/header/HeaderManager.ts +28 -0
  214. package/src/grapher/index.ts +157 -0
  215. package/src/grapher/interaction/InteractionState.ts +60 -0
  216. package/src/grapher/legend/HorizontalColorLegends.tsx +923 -0
  217. package/src/grapher/legend/LegendInteractionState.ts +40 -0
  218. package/src/grapher/legend/VerticalColorLegend.tsx +295 -0
  219. package/src/grapher/lineCharts/LineChart.tsx +968 -0
  220. package/src/grapher/lineCharts/LineChartConstants.ts +89 -0
  221. package/src/grapher/lineCharts/LineChartHelpers.ts +184 -0
  222. package/src/grapher/lineCharts/LineChartState.ts +394 -0
  223. package/src/grapher/lineCharts/LineChartThumbnail.tsx +437 -0
  224. package/src/grapher/lineCharts/Lines.tsx +258 -0
  225. package/src/grapher/lineLegend/LineLegend.tsx +723 -0
  226. package/src/grapher/lineLegend/LineLegendConstants.ts +9 -0
  227. package/src/grapher/lineLegend/LineLegendFilterAlgorithms.ts +143 -0
  228. package/src/grapher/lineLegend/LineLegendHelpers.ts +253 -0
  229. package/src/grapher/lineLegend/LineLegendTypes.ts +32 -0
  230. package/src/grapher/mapCharts/CanadaTopology.ts +17922 -0
  231. package/src/grapher/mapCharts/ChoroplethGlobe.tsx +949 -0
  232. package/src/grapher/mapCharts/ChoroplethMap.tsx +662 -0
  233. package/src/grapher/mapCharts/GeoFeatures.ts +184 -0
  234. package/src/grapher/mapCharts/GlobeController.ts +496 -0
  235. package/src/grapher/mapCharts/MapAnnotationPlacements.json +1040 -0
  236. package/src/grapher/mapCharts/MapAnnotationPlacements.ts +31 -0
  237. package/src/grapher/mapCharts/MapAnnotations.ts +723 -0
  238. package/src/grapher/mapCharts/MapChart.sample.ts +59 -0
  239. package/src/grapher/mapCharts/MapChart.scss +5 -0
  240. package/src/grapher/mapCharts/MapChart.tsx +720 -0
  241. package/src/grapher/mapCharts/MapChartConstants.ts +260 -0
  242. package/src/grapher/mapCharts/MapChartState.ts +416 -0
  243. package/src/grapher/mapCharts/MapChartThumbnail.tsx +25 -0
  244. package/src/grapher/mapCharts/MapComponents.tsx +338 -0
  245. package/src/grapher/mapCharts/MapConfig.ts +156 -0
  246. package/src/grapher/mapCharts/MapHelpers.ts +181 -0
  247. package/src/grapher/mapCharts/MapProjections.ts +49 -0
  248. package/src/grapher/mapCharts/MapSparkline.tsx +257 -0
  249. package/src/grapher/mapCharts/MapTooltip.scss +49 -0
  250. package/src/grapher/mapCharts/MapTooltip.tsx +409 -0
  251. package/src/grapher/mapCharts/MapTopology.ts +1766 -0
  252. package/src/grapher/mapCharts/d3-bboxCollide.js +204 -0
  253. package/src/grapher/mapCharts/d3-geo-projection.ts +198 -0
  254. package/src/grapher/modal/DownloadIcons.tsx +39 -0
  255. package/src/grapher/modal/DownloadModal.scss +300 -0
  256. package/src/grapher/modal/DownloadModal.tsx +1226 -0
  257. package/src/grapher/modal/EmbedModal.scss +40 -0
  258. package/src/grapher/modal/EmbedModal.tsx +160 -0
  259. package/src/grapher/modal/EntitySelectorModal.tsx +59 -0
  260. package/src/grapher/modal/Modal.scss +31 -0
  261. package/src/grapher/modal/Modal.tsx +90 -0
  262. package/src/grapher/modal/ModalHeader.scss +12 -0
  263. package/src/grapher/modal/ModalHeader.tsx +16 -0
  264. package/src/grapher/modal/SourcesDescriptions.scss +87 -0
  265. package/src/grapher/modal/SourcesDescriptions.tsx +89 -0
  266. package/src/grapher/modal/SourcesKeyDataTable.scss +49 -0
  267. package/src/grapher/modal/SourcesKeyDataTable.tsx +87 -0
  268. package/src/grapher/modal/SourcesModal.scss +301 -0
  269. package/src/grapher/modal/SourcesModal.tsx +568 -0
  270. package/src/grapher/noDataModal/NoDataModal.tsx +125 -0
  271. package/src/grapher/scatterCharts/ConnectedScatterLegend.tsx +143 -0
  272. package/src/grapher/scatterCharts/MultiColorPolyline.tsx +129 -0
  273. package/src/grapher/scatterCharts/NoDataSection.scss +14 -0
  274. package/src/grapher/scatterCharts/NoDataSection.tsx +56 -0
  275. package/src/grapher/scatterCharts/ScatterPlotChart.tsx +792 -0
  276. package/src/grapher/scatterCharts/ScatterPlotChartConstants.ts +157 -0
  277. package/src/grapher/scatterCharts/ScatterPlotChartState.ts +678 -0
  278. package/src/grapher/scatterCharts/ScatterPlotChartThumbnail.tsx +155 -0
  279. package/src/grapher/scatterCharts/ScatterPlotTooltip.tsx +560 -0
  280. package/src/grapher/scatterCharts/ScatterPoints.tsx +153 -0
  281. package/src/grapher/scatterCharts/ScatterPointsWithLabels.tsx +708 -0
  282. package/src/grapher/scatterCharts/ScatterSizeLegend.tsx +327 -0
  283. package/src/grapher/scatterCharts/ScatterUtils.ts +265 -0
  284. package/src/grapher/scatterCharts/Triangle.tsx +41 -0
  285. package/src/grapher/schema/README.md +33 -0
  286. package/src/grapher/schema/defaultGrapherConfig.ts +100 -0
  287. package/src/grapher/schema/grapher-schema.009.yaml +781 -0
  288. package/src/grapher/schema/migrations/helpers.ts +58 -0
  289. package/src/grapher/schema/migrations/migrate.ts +75 -0
  290. package/src/grapher/schema/migrations/migrations.ts +158 -0
  291. package/src/grapher/selection/MapSelectionArray.ts +99 -0
  292. package/src/grapher/selection/SelectionArray.ts +71 -0
  293. package/src/grapher/selection/readme.md +16 -0
  294. package/src/grapher/sidePanel/SidePanel.scss +10 -0
  295. package/src/grapher/sidePanel/SidePanel.tsx +23 -0
  296. package/src/grapher/slideInDrawer/SlideInDrawer.scss +57 -0
  297. package/src/grapher/slideInDrawer/SlideInDrawer.tsx +125 -0
  298. package/src/grapher/slideshowController/SlideShowController.tsx +43 -0
  299. package/src/grapher/slideshowController/readme.md +7 -0
  300. package/src/grapher/slopeCharts/MarkX.tsx +45 -0
  301. package/src/grapher/slopeCharts/Slope.tsx +102 -0
  302. package/src/grapher/slopeCharts/SlopeChart.tsx +1152 -0
  303. package/src/grapher/slopeCharts/SlopeChartConstants.ts +33 -0
  304. package/src/grapher/slopeCharts/SlopeChartHelpers.ts +73 -0
  305. package/src/grapher/slopeCharts/SlopeChartState.ts +392 -0
  306. package/src/grapher/slopeCharts/SlopeChartThumbnail.tsx +368 -0
  307. package/src/grapher/stackedCharts/AbstractStackedChartState.ts +370 -0
  308. package/src/grapher/stackedCharts/MarimekkoBars.tsx +190 -0
  309. package/src/grapher/stackedCharts/MarimekkoBarsForOneEntity.tsx +168 -0
  310. package/src/grapher/stackedCharts/MarimekkoChart.tsx +1144 -0
  311. package/src/grapher/stackedCharts/MarimekkoChartConstants.ts +112 -0
  312. package/src/grapher/stackedCharts/MarimekkoChartHelpers.ts +21 -0
  313. package/src/grapher/stackedCharts/MarimekkoChartState.ts +465 -0
  314. package/src/grapher/stackedCharts/MarimekkoChartThumbnail.tsx +168 -0
  315. package/src/grapher/stackedCharts/MarimekkoInternalLabels.tsx +124 -0
  316. package/src/grapher/stackedCharts/StackedAreaChart.tsx +678 -0
  317. package/src/grapher/stackedCharts/StackedAreaChartState.ts +34 -0
  318. package/src/grapher/stackedCharts/StackedAreaChartThumbnail.tsx +215 -0
  319. package/src/grapher/stackedCharts/StackedAreas.tsx +223 -0
  320. package/src/grapher/stackedCharts/StackedBarChart.tsx +619 -0
  321. package/src/grapher/stackedCharts/StackedBarChartState.ts +80 -0
  322. package/src/grapher/stackedCharts/StackedBarChartThumbnail.tsx +220 -0
  323. package/src/grapher/stackedCharts/StackedBarSegment.tsx +87 -0
  324. package/src/grapher/stackedCharts/StackedBars.tsx +102 -0
  325. package/src/grapher/stackedCharts/StackedConstants.ts +109 -0
  326. package/src/grapher/stackedCharts/StackedDiscreteBarChart.tsx +270 -0
  327. package/src/grapher/stackedCharts/StackedDiscreteBarChartState.ts +296 -0
  328. package/src/grapher/stackedCharts/StackedDiscreteBarChartThumbnail.tsx +27 -0
  329. package/src/grapher/stackedCharts/StackedDiscreteBars.tsx +648 -0
  330. package/src/grapher/stackedCharts/StackedUtils.ts +142 -0
  331. package/src/grapher/tabs/Tabs.scss +169 -0
  332. package/src/grapher/tabs/Tabs.tsx +54 -0
  333. package/src/grapher/tabs/TabsWithDropdown.scss +62 -0
  334. package/src/grapher/tabs/TabsWithDropdown.tsx +114 -0
  335. package/src/grapher/testData/OwidTestData.sample.ts +273 -0
  336. package/src/grapher/testData/OwidTestData.ts +64 -0
  337. package/src/grapher/timeline/TimelineComponent.scss +139 -0
  338. package/src/grapher/timeline/TimelineComponent.tsx +658 -0
  339. package/src/grapher/timeline/TimelineController.ts +368 -0
  340. package/src/grapher/timeline/readme.md +7 -0
  341. package/src/grapher/tooltip/Tooltip.scss +510 -0
  342. package/src/grapher/tooltip/Tooltip.tsx +294 -0
  343. package/src/grapher/tooltip/TooltipContents.tsx +383 -0
  344. package/src/grapher/tooltip/TooltipProps.ts +123 -0
  345. package/src/grapher/tooltip/TooltipState.ts +81 -0
  346. package/src/grapher/verticalLabels/VerticalLabels.tsx +31 -0
  347. package/src/grapher/verticalLabels/VerticalLabelsState.ts +154 -0
  348. package/src/index.ts +226 -0
  349. package/src/styles/charts.scss +15 -0
  350. package/src/types/NominalType.ts +30 -0
  351. package/src/types/OwidOrigin.ts +18 -0
  352. package/src/types/OwidSource.ts +9 -0
  353. package/src/types/OwidVariable.ts +133 -0
  354. package/src/types/OwidVariableDisplayConfigInterface.ts +49 -0
  355. package/src/types/analyticsTypes.ts +54 -0
  356. package/src/types/dbTypes/Tags.ts +11 -0
  357. package/src/types/domainTypes/Archive.ts +139 -0
  358. package/src/types/domainTypes/Author.ts +28 -0
  359. package/src/types/domainTypes/ContentGraph.ts +76 -0
  360. package/src/types/domainTypes/CoreTableTypes.ts +305 -0
  361. package/src/types/domainTypes/DeployStatus.ts +23 -0
  362. package/src/types/domainTypes/Layout.ts +34 -0
  363. package/src/types/domainTypes/Posts.ts +34 -0
  364. package/src/types/domainTypes/Search.ts +299 -0
  365. package/src/types/domainTypes/Site.ts +8 -0
  366. package/src/types/domainTypes/StaticViz.ts +64 -0
  367. package/src/types/domainTypes/Toc.ts +11 -0
  368. package/src/types/domainTypes/Tombstone.ts +19 -0
  369. package/src/types/domainTypes/Various.ts +79 -0
  370. package/src/types/gdocTypes/Gdoc.ts +280 -0
  371. package/src/types/grapherTypes/BinningStrategyTypes.ts +46 -0
  372. package/src/types/grapherTypes/GrapherConstants.ts +53 -0
  373. package/src/types/grapherTypes/GrapherTypes.ts +743 -0
  374. package/src/types/index.ts +316 -0
  375. package/src/types/wordpressTypes/WordpressTypes.ts +9 -0
  376. package/src/utils/Bounds.ts +439 -0
  377. package/src/utils/BrowserUtils.ts +12 -0
  378. package/src/utils/FuzzySearch.ts +74 -0
  379. package/src/utils/MultiDimDataPageConfig.ts +31 -0
  380. package/src/utils/OwidVariable.ts +82 -0
  381. package/src/utils/PointVector.ts +97 -0
  382. package/src/utils/PromiseCache.ts +36 -0
  383. package/src/utils/PromiseSwitcher.ts +52 -0
  384. package/src/utils/TimeBounds.ts +130 -0
  385. package/src/utils/Tippy.tsx +57 -0
  386. package/src/utils/Util.ts +2369 -0
  387. package/src/utils/archival/archivalDate.ts +48 -0
  388. package/src/utils/dayjs.ts +32 -0
  389. package/src/utils/formatValue.ts +242 -0
  390. package/src/utils/grapherConfigUtils.ts +81 -0
  391. package/src/utils/image.ts +225 -0
  392. package/src/utils/index.ts +318 -0
  393. package/src/utils/isPresent.ts +5 -0
  394. package/src/utils/metadataHelpers.ts +329 -0
  395. package/src/utils/persistable/Persistable.ts +82 -0
  396. package/src/utils/persistable/readme.md +50 -0
  397. package/src/utils/regions.json +5635 -0
  398. package/src/utils/regions.ts +463 -0
  399. package/src/utils/serializers.ts +16 -0
  400. package/src/utils/string.ts +42 -0
  401. package/src/utils/urls/Url.ts +195 -0
  402. package/src/utils/urls/UrlMigration.ts +10 -0
  403. package/src/utils/urls/UrlUtils.ts +54 -0
  404. package/src/utils/urls/readme.md +90 -0
@@ -0,0 +1,112 @@
1
+ import { ChartManager } from "../chart/ChartManager"
2
+
3
+ import {
4
+ Color,
5
+ SortConfig,
6
+ Time,
7
+ Bounds,
8
+ EntityName,
9
+ ColumnSlug,
10
+ } from "../../utils/index.js"
11
+ import { OwidTable } from "../../core-table/index.js"
12
+ import { StackedPoint } from "./StackedConstants"
13
+ import { DualAxis } from "../axis/Axis"
14
+ import { InteractionState } from "../interaction/InteractionState.js"
15
+
16
+ export interface MarimekkoChartManager extends ChartManager {
17
+ endTime?: Time
18
+ matchingEntitiesOnly?: boolean
19
+ xOverrideTime?: number
20
+ tableAfterAuthorTimelineAndActiveChartTransform?: OwidTable
21
+ sortConfig?: SortConfig
22
+ hideNoDataArea?: boolean
23
+ }
24
+
25
+ export interface EntityColorData {
26
+ color: Color
27
+ colorDomainValue: string
28
+ }
29
+
30
+ // Points used on the X axis
31
+ export interface SimplePoint {
32
+ value: number
33
+ entity: string
34
+ time: number
35
+ }
36
+
37
+ export interface SimpleChartSeries {
38
+ seriesName: string
39
+ points: SimplePoint[]
40
+ }
41
+
42
+ export enum BarShape {
43
+ Bar,
44
+ BarPlaceholder,
45
+ }
46
+
47
+ export interface Bar {
48
+ kind: BarShape.Bar
49
+ color: Color // color from the variable
50
+ seriesName: string
51
+ yPoint: StackedPoint<EntityName>
52
+ columnSlug?: ColumnSlug
53
+ }
54
+
55
+ export interface BarPlaceholder {
56
+ kind: BarShape.BarPlaceholder
57
+ seriesName: string
58
+ height: number
59
+ }
60
+
61
+ export type BarOrPlaceholder = Bar | BarPlaceholder
62
+
63
+ export interface Item {
64
+ entityName: string
65
+ shortEntityName?: string
66
+ entityColor: EntityColorData | undefined
67
+ bars: Bar[] // contains the y values for every y variable
68
+ xPoint: SimplePoint | undefined // contains the single x value
69
+ focus: InteractionState
70
+ }
71
+
72
+ export interface PlacedItem extends Item {
73
+ xPosition: number // x value (in pixel space) when placed in final sorted order and including shifts due to one pixel entity minimum
74
+ }
75
+
76
+ export interface EntityWithSize {
77
+ entityName: string
78
+ shortEntityName?: string
79
+ xValue: number
80
+ ySortValue: number | undefined
81
+ }
82
+ export interface LabelCandidate {
83
+ item: EntityWithSize
84
+ label: string
85
+ bounds: Bounds
86
+ isPicked: boolean
87
+ isSelected: boolean
88
+ }
89
+
90
+ export interface LabelWithPlacement {
91
+ label: React.ReactElement
92
+ preferredPlacement: number
93
+ correctedPlacement: number
94
+ labelKey: string
95
+ }
96
+
97
+ export interface LabelCandidateWithElement {
98
+ candidate: LabelCandidate
99
+ labelElement: React.ReactElement
100
+ }
101
+
102
+ export interface MarimekkoBarProps {
103
+ bar: BarOrPlaceholder
104
+ barWidth: number
105
+ isHovered: boolean
106
+ isSelected: boolean
107
+ isFaint: boolean
108
+ focus: InteractionState
109
+ entityColor: string | undefined
110
+ y0: number
111
+ dualAxis: DualAxis
112
+ }
@@ -0,0 +1,21 @@
1
+ import { DualAxis } from "../axis/Axis"
2
+ import { PlacedItem } from "./MarimekkoChartConstants"
3
+ import { MarimekkoChartState } from "./MarimekkoChartState"
4
+
5
+ export function toPlacedMarimekkoItems(
6
+ chartState: MarimekkoChartState,
7
+ { dualAxis }: { dualAxis: DualAxis }
8
+ ): PlacedItem[] {
9
+ const { x0, sortedItems } = chartState
10
+ const placedItems: PlacedItem[] = []
11
+ let currentX = 0
12
+ for (const item of sortedItems) {
13
+ placedItems.push({ ...item, xPosition: currentX })
14
+ const xValue = item.xPoint?.value ?? 1 // one is the default here because if no x dim is given we make all bars the same width
15
+ const preciseX =
16
+ dualAxis.horizontalAxis.place(xValue) -
17
+ dualAxis.horizontalAxis.place(x0)
18
+ currentX += preciseX
19
+ }
20
+ return placedItems
21
+ }
@@ -0,0 +1,465 @@
1
+ import * as _ from "lodash-es"
2
+ import * as R from "remeda"
3
+ import { computed, makeObservable } from "mobx"
4
+ import { ChartState } from "../chart/ChartInterface"
5
+ import { ColorScale, ColorScaleManager } from "../color/ColorScale"
6
+ import {
7
+ Bar,
8
+ BarShape,
9
+ EntityColorData,
10
+ Item,
11
+ MarimekkoChartManager,
12
+ SimpleChartSeries,
13
+ SimplePoint,
14
+ } from "./MarimekkoChartConstants"
15
+ import { CoreColumn, OwidTable } from "../../core-table/index.js"
16
+ import {
17
+ autoDetectYColumnSlugs,
18
+ getShortNameForEntity,
19
+ makeSelectionArray,
20
+ } from "../chart/ChartUtils"
21
+ import { ColorScaleConfig } from "../color/ColorScaleConfig"
22
+ import {
23
+ ChartErrorInfo,
24
+ ColorSchemeName,
25
+ EntityName,
26
+ ColorScaleConfigInterface,
27
+ OwidVariableRow,
28
+ SortConfig,
29
+ SortBy,
30
+ SortOrder,
31
+ ScaleType,
32
+ } from "../../types/index.js"
33
+ import { OWID_NO_DATA_GRAY } from "../color/ColorConstants"
34
+ import { StackedPoint, StackedSeries } from "./StackedConstants"
35
+ import { ColorScheme } from "../color/ColorScheme"
36
+ import { ColorSchemes } from "../color/ColorSchemes"
37
+ import { excludeUndefined } from "../../utils/index.js"
38
+ import { SelectionArray } from "../selection/SelectionArray"
39
+ import { FocusArray } from "../focus/FocusArray"
40
+ import { AxisConfig } from "../axis/AxisConfig.js"
41
+ import { HorizontalAxis, VerticalAxis } from "../axis/Axis.js"
42
+
43
+ export class MarimekkoChartState implements ChartState, ColorScaleManager {
44
+ manager: MarimekkoChartManager
45
+
46
+ colorScale: ColorScale
47
+ defaultBaseColorScheme = ColorSchemeName.continents
48
+ defaultNoDataColor = OWID_NO_DATA_GRAY
49
+
50
+ constructor({ manager }: { manager: MarimekkoChartManager }) {
51
+ this.manager = manager
52
+ this.colorScale = manager.colorScaleOverride ?? new ColorScale(this)
53
+ makeObservable(this)
54
+ }
55
+
56
+ @computed get inputTable(): OwidTable {
57
+ return this.manager.table
58
+ }
59
+
60
+ @computed get transformedTable(): OwidTable {
61
+ const { inputTable } = this
62
+ return this.manager.transformedTable ?? this.transformTable(inputTable)
63
+ }
64
+
65
+ transformTable(table: OwidTable): OwidTable {
66
+ const { yColumnSlugs, manager, colorColumnSlug, xColumnSlug } = this
67
+ if (!this.yColumnSlugs.length) return table
68
+
69
+ // TODO: remove this filter once we don't have mixed type columns in datasets
70
+ table = table.replaceNonNumericCellsWithErrorValues(yColumnSlugs)
71
+
72
+ yColumnSlugs.forEach((slug) => {
73
+ table = table.interpolateColumnWithTolerance(slug)
74
+ })
75
+
76
+ if (xColumnSlug)
77
+ table = table.interpolateColumnWithTolerance(xColumnSlug)
78
+
79
+ if (colorColumnSlug && manager.matchingEntitiesOnly)
80
+ table = table.dropRowsWithErrorValuesForColumn(colorColumnSlug)
81
+
82
+ if (!manager.showNoDataArea)
83
+ table = table.dropRowsWithErrorValuesForAllColumns(yColumnSlugs)
84
+
85
+ if (xColumnSlug)
86
+ table = table.dropRowsWithErrorValuesForColumn(xColumnSlug)
87
+ if (manager.isRelativeMode) {
88
+ // TODO: this should not be necessary but we sometimes get NoMatchingValuesAfterJoin if both relative and showNoDataArea are set
89
+ table = table.dropRowsWithErrorValuesForColumn(
90
+ table.timeColumn.slug
91
+ )
92
+ if (xColumnSlug) {
93
+ table = table.toPercentageFromEachEntityForEachTime(xColumnSlug)
94
+
95
+ // relativized columns ditch their units, making "Population %" hard to parse. Add a sensible replacement
96
+ Object.assign(table.get(xColumnSlug)?.def, {
97
+ unit: "share of total",
98
+ })
99
+ }
100
+ }
101
+
102
+ return table
103
+ }
104
+
105
+ @computed get selectionArray(): SelectionArray {
106
+ return makeSelectionArray(this.manager.selection)
107
+ }
108
+
109
+ @computed get focusArray(): FocusArray {
110
+ return this.manager.focusArray ?? new FocusArray()
111
+ }
112
+
113
+ @computed get isFocusModeActive(): boolean {
114
+ return this.focusArray.hasFocusedSeries
115
+ }
116
+
117
+ @computed get yColumnSlugs(): string[] {
118
+ return this.manager.yColumnSlugs ?? autoDetectYColumnSlugs(this.manager)
119
+ }
120
+
121
+ @computed get yColumns(): CoreColumn[] {
122
+ return this.transformedTable.getColumns(this.yColumnSlugs)
123
+ }
124
+
125
+ @computed get formatColumn(): CoreColumn {
126
+ return this.yColumns[0]
127
+ }
128
+
129
+ @computed get xColumnSlug(): string | undefined {
130
+ return this.manager.xColumnSlug
131
+ }
132
+
133
+ @computed get xColumn(): CoreColumn | undefined {
134
+ if (this.xColumnSlug === undefined) return undefined
135
+ const columnSlugs = this.xColumnSlug ? [this.xColumnSlug] : []
136
+ return this.transformedTable.getColumns(columnSlugs)[0]
137
+ }
138
+
139
+ @computed get colorColumnSlug(): string | undefined {
140
+ // Marimekko charts only support categorical variables as color dimension
141
+ return this.manager.categoricalColorColumnSlug
142
+ }
143
+
144
+ @computed get colorColumn(): CoreColumn {
145
+ return this.transformedTable.get(this.colorColumnSlug)
146
+ }
147
+
148
+ @computed get colorScaleConfig(): ColorScaleConfigInterface | undefined {
149
+ return (
150
+ ColorScaleConfig.fromDSL(this.colorColumn.def) ??
151
+ this.manager.colorScale
152
+ )
153
+ }
154
+
155
+ @computed get colorScaleColumn(): CoreColumn {
156
+ const { manager, inputTable } = this
157
+ return (
158
+ // For faceted charts, we have to get the values of inputTable before it's filtered by
159
+ // the faceting logic.
160
+ manager.colorScaleColumnOverride ??
161
+ // We need to use filteredTable in order to get consistent coloring for a variable across
162
+ // charts, e.g. each continent being assigned to the same color.
163
+ // inputTable is unfiltered, so it contains every value that exists in the variable.
164
+
165
+ // 2022-05-25: I considered using the filtered table below to get rid of Antarctica automatically
166
+ // but the way things are currently done this leads to a shift in the colors assigned to continents
167
+ // (i.e. they are no longer consistent cross the site). I think this downside is heavier than the
168
+ // upside so I comment this out for now. Reconsider when we do colors differently.
169
+
170
+ // manager.tableAfterAuthorTimelineAndActiveChartTransform?.get(
171
+ // this.colorColumnSlug
172
+ // ) ??
173
+ inputTable.get(this.colorColumnSlug)
174
+ )
175
+ }
176
+
177
+ @computed private get colorScheme(): ColorScheme {
178
+ return (
179
+ (this.manager.baseColorScheme
180
+ ? ColorSchemes.get(this.manager.baseColorScheme)
181
+ : undefined) ??
182
+ ColorSchemes.get(ColorSchemeName["owid-distinct"])
183
+ )
184
+ }
185
+
186
+ @computed private get sortConfig(): SortConfig {
187
+ return this.manager.sortConfig ?? {}
188
+ }
189
+
190
+ @computed private get unstackedSeries(): StackedSeries<EntityName>[] {
191
+ const { colorScheme, yColumns } = this
192
+ return (
193
+ yColumns
194
+ .map((col, i) => {
195
+ return {
196
+ seriesName: col.displayName,
197
+ columnSlug: col.slug,
198
+ color:
199
+ col.def.color ??
200
+ colorScheme.getColors(yColumns.length)[i],
201
+ points: col.owidRows.map((row) => ({
202
+ time: row.originalTime,
203
+ position: row.entityName,
204
+ value: row.value,
205
+ valueOffset: 0,
206
+ })),
207
+ }
208
+ })
209
+ // Do not plot columns without data
210
+ .filter((series) => series.points.length > 0)
211
+ )
212
+ }
213
+
214
+ @computed get series(): readonly StackedSeries<EntityName>[] {
215
+ const valueOffsets = new Map<string, number>()
216
+ return this.unstackedSeries.map((series) => ({
217
+ ...series,
218
+ points: series.points.map((point) => {
219
+ const offset = valueOffsets.get(point.position) ?? 0
220
+ const newPoint = { ...point, valueOffset: offset }
221
+ valueOffsets.set(point.position, offset + point.value)
222
+ return newPoint
223
+ }),
224
+ }))
225
+ }
226
+
227
+ @computed private get allPoints(): StackedPoint<EntityName>[] {
228
+ return this.series.flatMap((series) => series.points)
229
+ }
230
+
231
+ @computed get x0(): number {
232
+ return 0
233
+ }
234
+
235
+ @computed get y0(): number {
236
+ return 0
237
+ }
238
+
239
+ @computed get xSeries(): SimpleChartSeries | undefined {
240
+ const createStackedXPoints = (
241
+ rows: OwidVariableRow<any>[]
242
+ ): SimplePoint[] => {
243
+ const points: SimplePoint[] = []
244
+ for (const row of rows) {
245
+ points.push({
246
+ time: row.originalTime,
247
+ value: row.value,
248
+ entity: row.entityName,
249
+ })
250
+ }
251
+ return points
252
+ }
253
+ if (this.xColumn === undefined) return undefined
254
+ const column = this.xColumn
255
+ return {
256
+ seriesName: column.displayName,
257
+ points: createStackedXPoints(column.owidRows),
258
+ }
259
+ }
260
+
261
+ @computed get domainColorForEntityMap(): Map<string, EntityColorData> {
262
+ const { colorColumn, colorScale, uniqueEntityNames } = this
263
+ const hasColorColumn = !colorColumn.isMissing
264
+ const colorRowsByEntity = hasColorColumn
265
+ ? colorColumn.owidRowsByEntityName
266
+ : undefined
267
+ const domainColorMap = new Map<string, EntityColorData>()
268
+ if (uniqueEntityNames !== undefined) {
269
+ for (const name of uniqueEntityNames) {
270
+ const colorDomainValue = colorRowsByEntity?.get(name)?.[0]
271
+
272
+ if (colorDomainValue) {
273
+ const color = colorScale.getColor(colorDomainValue.value)
274
+ if (color)
275
+ domainColorMap.set(name, {
276
+ color,
277
+ colorDomainValue: colorDomainValue.value,
278
+ })
279
+ }
280
+ }
281
+ }
282
+ return domainColorMap
283
+ }
284
+
285
+ @computed private get uniqueEntityNames(): EntityName[] | undefined {
286
+ return this.xColumn?.uniqEntityNames ?? this.yColumns[0].uniqEntityNames
287
+ }
288
+
289
+ @computed get items(): Item[] {
290
+ const { xSeries, series, domainColorForEntityMap, uniqueEntityNames } =
291
+ this
292
+
293
+ if (uniqueEntityNames === undefined) return []
294
+
295
+ const items: Item[] = uniqueEntityNames
296
+ .map((entityName) => {
297
+ const xPoint = xSeries
298
+ ? xSeries.points.find(
299
+ (point) => point.entity === entityName
300
+ )
301
+ : undefined
302
+ if (xSeries && !xPoint) return undefined
303
+
304
+ return {
305
+ entityName,
306
+ shortEntityName: getShortNameForEntity(entityName),
307
+ xPoint: xPoint,
308
+ entityColor: domainColorForEntityMap.get(entityName),
309
+ bars: excludeUndefined(
310
+ series.map((series): Bar | undefined => {
311
+ const point = series.points.find(
312
+ (point) => point.position === entityName
313
+ )
314
+ if (!point) return undefined
315
+ return {
316
+ kind: BarShape.Bar,
317
+ yPoint: point,
318
+ color: series.color,
319
+ seriesName: series.seriesName,
320
+ columnSlug: series.columnSlug,
321
+ }
322
+ })
323
+ ),
324
+ focus: this.focusArray.state(entityName),
325
+ }
326
+ })
327
+ .filter((item) => item !== undefined) satisfies Item[]
328
+
329
+ return items
330
+ }
331
+
332
+ @computed get sortedItems(): Item[] {
333
+ const { items, sortConfig } = this
334
+
335
+ let sortByFuncs: ((item: Item) => number | string | undefined)[]
336
+ switch (sortConfig.sortBy) {
337
+ case SortBy.custom:
338
+ sortByFuncs = [(): undefined => undefined]
339
+ break
340
+ case SortBy.entityName:
341
+ sortByFuncs = [(item: Item): string => item.entityName]
342
+ break
343
+ case SortBy.column: {
344
+ const sortColumnSlug = sortConfig.sortColumnSlug
345
+ sortByFuncs = [
346
+ (item: Item): number =>
347
+ item.bars.find((b) => b.seriesName === sortColumnSlug)
348
+ ?.yPoint.value ?? 0,
349
+ (item: Item): string => item.entityName,
350
+ ]
351
+ break
352
+ }
353
+ default:
354
+ case SortBy.total:
355
+ sortByFuncs = [
356
+ (item: Item): number => {
357
+ const lastPoint = R.last(item.bars)?.yPoint
358
+ if (!lastPoint) return 0
359
+ return lastPoint.valueOffset + lastPoint.value
360
+ },
361
+ (item: Item): string => item.entityName,
362
+ ]
363
+ }
364
+ const sortedItems = _.sortBy(items, sortByFuncs)
365
+ const sortOrder = sortConfig.sortOrder ?? SortOrder.desc
366
+ if (sortOrder === SortOrder.desc) sortedItems.reverse()
367
+
368
+ const [itemsWithValues, itemsWithoutValues] = _.partition(
369
+ sortedItems,
370
+ (item) => item.bars.length !== 0
371
+ )
372
+
373
+ return [...itemsWithValues, ...itemsWithoutValues]
374
+ }
375
+
376
+ @computed get selectedItems(): Item[] {
377
+ const selectedSet = this.selectionArray.selectedSet
378
+ if (selectedSet.size === 0) return []
379
+ return this.sortedItems.filter((item) =>
380
+ selectedSet.has(item.entityName)
381
+ )
382
+ }
383
+
384
+ @computed get yDomainDefault(): [number, number] {
385
+ const maxValues = this.allPoints.map(
386
+ (point) => point.value + point.valueOffset
387
+ )
388
+ return [
389
+ Math.min(this.y0, _.min(maxValues) as number),
390
+ Math.max(this.y0, _.max(maxValues) as number),
391
+ ]
392
+ }
393
+
394
+ @computed get xDomainDefault(): [number, number] {
395
+ if (this.xSeries !== undefined) {
396
+ const sum = _.sumBy(this.xSeries.points, (point) => point.value)
397
+
398
+ return [this.x0, sum]
399
+ } else return [this.x0, this.items.length]
400
+ }
401
+
402
+ @computed private get xAxisLabelBase(): string {
403
+ const xDimName = this.defaultXAxisLabel
404
+ if (this.manager.xOverrideTime !== undefined)
405
+ return `${xDimName} in ${this.manager.xOverrideTime}`
406
+ return xDimName ?? "" // This sets the axis label to emtpy if we don't have an x column - not entirely sure this is what we want
407
+ }
408
+
409
+ @computed private get defaultXAxisLabel(): string | undefined {
410
+ return this.xColumn?.displayName
411
+ }
412
+
413
+ @computed get horizontalAxisLabel(): string {
414
+ const { xAxisLabelBase } = this
415
+ const config = this.manager.xAxisConfig
416
+ return config?.label || xAxisLabelBase
417
+ }
418
+
419
+ toHorizontalAxis(config: AxisConfig): HorizontalAxis {
420
+ let axis = config.toHorizontalAxis()
421
+ if (this.manager.isRelativeMode && this.xColumn) {
422
+ // MobX and classes interact in an annoying way here so we have to construct a new object via
423
+ // an object copy of the AxisConfig class instance to be able to set a property without
424
+ // making MobX unhappy about a mutation originating from a computed property
425
+ axis = new HorizontalAxis(
426
+ new AxisConfig(
427
+ { ...config.toObject(), maxTicks: 10 },
428
+ config.axisManager
429
+ ),
430
+ config.axisManager
431
+ )
432
+ axis.domain = [0, 100]
433
+ } else {
434
+ axis.updateDomainPreservingUserSettings(this.xDomainDefault)
435
+ }
436
+
437
+ axis.formatColumn = this.xColumn
438
+
439
+ axis.label = this.horizontalAxisLabel
440
+
441
+ return axis
442
+ }
443
+
444
+ toVerticalAxis(config: AxisConfig): VerticalAxis {
445
+ const axis = config.toVerticalAxis()
446
+ axis.updateDomainPreservingUserSettings(this.yDomainDefault)
447
+
448
+ axis.scaleType = ScaleType.linear
449
+ axis.formatColumn = this.formatColumn
450
+ axis.label = ""
451
+
452
+ return axis
453
+ }
454
+
455
+ @computed get errorInfo(): ChartErrorInfo {
456
+ const column = this.yColumns[0]
457
+ const { yColumns } = this
458
+
459
+ if (!column) return { reason: "No Y column to chart" }
460
+
461
+ return yColumns.every((col) => col.isEmpty)
462
+ ? { reason: "No matching data" }
463
+ : { reason: "" }
464
+ }
465
+ }