@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,370 @@
1
+ import * as _ from "lodash-es"
2
+ import * as R from "remeda"
3
+ import { ChartState } from "../chart/ChartInterface.js"
4
+ import { ChartManager } from "../chart/ChartManager.js"
5
+ import {
6
+ ChartErrorInfo,
7
+ ColorSchemeName,
8
+ FacetStrategy,
9
+ MissingDataStrategy,
10
+ SeriesName,
11
+ SeriesStrategy,
12
+ } from "../../types/index.js"
13
+ import { computed, makeObservable } from "mobx"
14
+ import {
15
+ StackedPoint,
16
+ StackedRawSeries,
17
+ StackedSeries,
18
+ } from "./StackedConstants.js"
19
+ import {
20
+ OwidTable,
21
+ CoreColumn,
22
+ isNotErrorValueOrEmptyCell,
23
+ } from "../../core-table/index.js"
24
+ import {
25
+ autoDetectSeriesStrategy,
26
+ autoDetectYColumnSlugs,
27
+ getDefaultFailMessage,
28
+ getShortNameForEntity,
29
+ makeSelectionArray,
30
+ } from "../chart/ChartUtils.js"
31
+ import { ColorSchemes } from "../color/ColorSchemes.js"
32
+ import { SelectionArray } from "../selection/SelectionArray.js"
33
+ import {
34
+ CategoricalColorAssigner,
35
+ CategoricalColorMap,
36
+ } from "../color/CategoricalColorAssigner.js"
37
+ import { BinaryMapPaletteE } from "../color/CustomSchemes.js"
38
+ import { FocusArray } from "../focus/FocusArray.js"
39
+ import { AxisConfig } from "../axis/AxisConfig.js"
40
+ import { HorizontalAxis, VerticalAxis } from "../axis/Axis.js"
41
+
42
+ // used in StackedBar charts to color negative and positive bars
43
+ const POSITIVE_COLOR = BinaryMapPaletteE.colorSets[0][0] // orange
44
+ const NEGATIVE_COLOR = BinaryMapPaletteE.colorSets[0][1] // blue
45
+
46
+ export abstract class AbstractStackedChartState implements ChartState {
47
+ manager: ChartManager
48
+
49
+ abstract shouldRunLinearInterpolation: boolean
50
+
51
+ abstract get series(): readonly StackedSeries<number>[]
52
+ abstract get yDomain(): [number, number]
53
+ abstract get useValueBasedColorScheme(): boolean
54
+
55
+ constructor({ manager }: { manager: ChartManager }) {
56
+ this.manager = manager
57
+ makeObservable(this)
58
+ }
59
+
60
+ @computed get inputTable(): OwidTable {
61
+ return this.manager.table
62
+ }
63
+
64
+ @computed get transformedTable(): OwidTable {
65
+ return (
66
+ this.manager.transformedTable ??
67
+ this.transformTable(this.inputTable)
68
+ )
69
+ }
70
+
71
+ transformTable(table: OwidTable): OwidTable {
72
+ table = table.filterByEntityNames(
73
+ this.selectionArray.selectedEntityNames
74
+ )
75
+
76
+ // TODO: remove this filter once we don't have mixed type columns in datasets
77
+ table = table
78
+ .replaceNonNumericCellsWithErrorValues(this.yColumnSlugs)
79
+ .dropRowsWithErrorValuesForAllColumns(this.yColumnSlugs)
80
+
81
+ if (this.shouldRunLinearInterpolation) {
82
+ this.yColumnSlugs.forEach((slug) => {
83
+ table = table.interpolateColumnLinearly(slug)
84
+ })
85
+ }
86
+
87
+ // Drop rows for which no valid data points exist for any display column
88
+ // after interpolation, which most likely means they lie at the start/end
89
+ // of the time range and were not extrapolated
90
+ if (this.missingDataStrategy !== MissingDataStrategy.show) {
91
+ table = table.dropRowsWithErrorValuesForAnyColumn(this.yColumnSlugs)
92
+ }
93
+
94
+ if (this.manager.isRelativeMode) {
95
+ table = this.isEntitySeries
96
+ ? table.toPercentageFromEachEntityForEachTime(
97
+ this.yColumnSlugs[0]
98
+ )
99
+ : table.toPercentageFromEachColumnForEachEntityAndTime(
100
+ this.yColumnSlugs
101
+ )
102
+ }
103
+ return table
104
+ }
105
+
106
+ transformTableForSelection(table: OwidTable): OwidTable {
107
+ // if entities with partial data are not plotted,
108
+ // make sure they don't show up in the entity selector
109
+ if (this.missingDataStrategy !== MissingDataStrategy.show) {
110
+ table = table
111
+ .replaceNonNumericCellsWithErrorValues(this.yColumnSlugs)
112
+ .dropRowsWithErrorValuesForAllColumns(this.yColumnSlugs)
113
+
114
+ if (this.shouldRunLinearInterpolation) {
115
+ this.yColumnSlugs.forEach((slug) => {
116
+ table = table.interpolateColumnLinearly(slug)
117
+ })
118
+ }
119
+
120
+ table = table.dropRowsWithErrorValuesForAnyColumn(this.yColumnSlugs)
121
+ }
122
+
123
+ return table
124
+ }
125
+
126
+ @computed get missingDataStrategy(): MissingDataStrategy {
127
+ return this.manager.missingDataStrategy || MissingDataStrategy.auto
128
+ }
129
+
130
+ @computed get yColumns(): CoreColumn[] {
131
+ return this.transformedTable.getColumns(this.yColumnSlugs)
132
+ }
133
+
134
+ @computed get yColumnSlugs(): string[] {
135
+ return this.manager.yColumnSlugs ?? autoDetectYColumnSlugs(this.manager)
136
+ }
137
+
138
+ @computed get formatColumn(): CoreColumn {
139
+ // we can just use the first column for formatting, b/c we assume all columns have same type
140
+ return this.yColumns[0]
141
+ }
142
+
143
+ @computed get seriesStrategy(): SeriesStrategy {
144
+ return autoDetectSeriesStrategy(this.manager)
145
+ }
146
+
147
+ @computed
148
+ get columnsAsSeries(): readonly StackedRawSeries<number>[] {
149
+ return this.yColumns
150
+ .map((column) => {
151
+ return {
152
+ isProjection: column.isProjection,
153
+ seriesName: column.displayName,
154
+ rows: column.owidRows,
155
+ focus: this.focusArray.state(column.displayName),
156
+ }
157
+ })
158
+ .toReversed() // For stacked charts, we want the first selected series to be on top, so we reverse the order of the stacks.
159
+ }
160
+
161
+ @computed
162
+ get entitiesAsSeries(): readonly StackedRawSeries<number>[] {
163
+ if (!this.yColumns.length) return []
164
+
165
+ const { isProjection, owidRowsByEntityName } = this.yColumns[0]
166
+ return this.selectionArray.selectedEntityNames
167
+ .map((entityName) => {
168
+ return {
169
+ isProjection,
170
+ seriesName: entityName,
171
+ shortEntityName: getShortNameForEntity(entityName),
172
+ rows: owidRowsByEntityName.get(entityName) || [],
173
+ focus: this.focusArray.state(entityName),
174
+ }
175
+ })
176
+ .toReversed() // For stacked charts, we want the first selected series to be on top, so we reverse the order of the stacks.
177
+ }
178
+
179
+ @computed
180
+ get rawSeries(): readonly StackedRawSeries<number>[] {
181
+ return this.isEntitySeries
182
+ ? this.entitiesAsSeries
183
+ : this.columnsAsSeries
184
+ }
185
+
186
+ @computed get seriesByName(): Map<SeriesName, StackedSeries<number>> {
187
+ return new Map(this.series.map((series) => [series.seriesName, series]))
188
+ }
189
+
190
+ @computed
191
+ get allStackedPoints(): readonly StackedPoint<number>[] {
192
+ return this.series.flatMap((series) => series.points)
193
+ }
194
+
195
+ @computed get colorMap(): CategoricalColorMap {
196
+ return this.isEntitySeries
197
+ ? this.inputTable.entityNameColorIndex
198
+ : this.inputTable.columnDisplayNameToColorMap
199
+ }
200
+
201
+ @computed get categoricalColorAssigner(): CategoricalColorAssigner {
202
+ const seriesCount = this.isEntitySeries
203
+ ? this.selectionArray.numSelectedEntities
204
+ : this.yColumns.length
205
+ return new CategoricalColorAssigner({
206
+ colorScheme:
207
+ (this.manager.baseColorScheme
208
+ ? ColorSchemes.get(this.manager.baseColorScheme)
209
+ : null) ??
210
+ ColorSchemes.get(ColorSchemeName.stackedAreaDefault),
211
+ invertColorScheme: this.manager.invertColorScheme,
212
+ colorMap: this.colorMap,
213
+ autoColorMapCache: this.manager.seriesColorMap,
214
+ numColorsInUse: seriesCount,
215
+ })
216
+ }
217
+
218
+ @computed get selectionArray(): SelectionArray {
219
+ return makeSelectionArray(this.manager.selection)
220
+ }
221
+
222
+ @computed get focusArray(): FocusArray {
223
+ return this.manager.focusArray ?? new FocusArray()
224
+ }
225
+
226
+ @computed get isFocusModeActive(): boolean {
227
+ return this.focusArray.hasFocusedSeries
228
+ }
229
+
230
+ @computed get isEntitySeries(): boolean {
231
+ return this.seriesStrategy === SeriesStrategy.entity
232
+ }
233
+
234
+ @computed get availableFacetStrategies(): FacetStrategy[] {
235
+ const strategies: FacetStrategy[] = []
236
+
237
+ const { selectedEntityNames } = this.selectionArray
238
+ const areMultipleEntitiesSelected = selectedEntityNames.length > 1
239
+ const hasMultipleYColumns = this.yColumns.length > 1
240
+ const shortUnits = this.yColumns.map((column) => column.shortUnit)
241
+ const uniqueUnits = new Set(shortUnits)
242
+ const hasMultipleUnits = uniqueUnits.size > 1
243
+ const hasPercentageUnit = shortUnits.some(
244
+ (shortUnit) => shortUnit === "%"
245
+ )
246
+
247
+ // Normally StackedArea/StackedBar charts are always single-entity or single-column,
248
+ // but if we are ever in a mode where we have multiple entities selected (e.g. through
249
+ // GlobalEntitySelector) and multiple columns, it only makes sense when faceted.
250
+ if (
251
+ // No facet strategy makes sense if columns are stacked and a single entity is selected
252
+ (!this.isEntitySeries && !areMultipleEntitiesSelected) ||
253
+ // No facet strategy makes sense if entities are stacked and we have a single column
254
+ (this.isEntitySeries && !hasMultipleYColumns)
255
+ )
256
+ strategies.push(FacetStrategy.none)
257
+
258
+ if (
259
+ // Facetting by entity makes sense if multiple entities are selected
260
+ areMultipleEntitiesSelected &&
261
+ // Stacking columns with different units isn't allowed
262
+ !hasMultipleUnits
263
+ )
264
+ strategies.push(FacetStrategy.entity)
265
+
266
+ if (
267
+ // Facetting by column makes sense if we have multiple columns
268
+ hasMultipleYColumns &&
269
+ // Stacking percentages doesn't make sense unless we're in relative mode
270
+ (!hasPercentageUnit || this.manager.isRelativeMode)
271
+ )
272
+ strategies.push(FacetStrategy.metric)
273
+
274
+ return strategies
275
+ }
276
+
277
+ @computed get unstackedSeries(): readonly StackedSeries<number>[] {
278
+ return this.rawSeries
279
+ .filter((series) => series.rows.length > 0)
280
+
281
+ .map((series) => {
282
+ const { isProjection, seriesName, rows } = series
283
+
284
+ const points = rows.map((row) => {
285
+ const pointColor =
286
+ row.value > 0 ? POSITIVE_COLOR : NEGATIVE_COLOR
287
+ return {
288
+ position: row.originalTime,
289
+ time: row.originalTime,
290
+ value: row.value,
291
+ valueOffset: 0,
292
+ interpolated:
293
+ this.shouldRunLinearInterpolation &&
294
+ isNotErrorValueOrEmptyCell(row.value) &&
295
+ !isNotErrorValueOrEmptyCell(row.originalValue),
296
+ // takes precedence over the series color if given
297
+ color: this.useValueBasedColorScheme
298
+ ? pointColor
299
+ : undefined,
300
+ }
301
+ })
302
+
303
+ return {
304
+ seriesName,
305
+ isProjection,
306
+ points,
307
+ isAllZeros: points.every((point) => point.value === 0),
308
+ color: this.categoricalColorAssigner.assign(seriesName),
309
+ focus: series.focus,
310
+ shortEntityName: series.shortEntityName,
311
+ }
312
+ })
313
+ }
314
+
315
+ @computed get midpoints(): number[] {
316
+ let prevY = 0
317
+ return this.series.map((series) => {
318
+ const lastValue = R.last(series.points)
319
+ if (!lastValue) return 0
320
+
321
+ const y = lastValue.value + lastValue.valueOffset
322
+ const middleY = prevY + (y - prevY) / 2
323
+ prevY = y
324
+ return middleY
325
+ })
326
+ }
327
+
328
+ toHorizontalAxis(config: AxisConfig): HorizontalAxis {
329
+ const axis = config.toHorizontalAxis()
330
+
331
+ // Update domain
332
+ axis.updateDomainPreservingUserSettings(
333
+ this.transformedTable.timeDomainFor(this.yColumnSlugs)
334
+ )
335
+
336
+ axis.formatColumn = this.inputTable.timeColumn
337
+ axis.hideFractionalTicks = true
338
+
339
+ return axis
340
+ }
341
+
342
+ toVerticalAxis(config: AxisConfig): VerticalAxis {
343
+ const axis = config.toVerticalAxis()
344
+
345
+ // Use user settings for axis, unless relative mode
346
+ if (this.manager.isRelativeMode) axis.domain = [0, 100]
347
+ else axis.updateDomainPreservingUserSettings(this.yDomain)
348
+
349
+ axis.formatColumn = this.yColumns[0]
350
+
351
+ return axis
352
+ }
353
+
354
+ @computed get errorInfo(): ChartErrorInfo {
355
+ const message = getDefaultFailMessage(this.manager)
356
+ if (message) return { reason: message }
357
+
358
+ const { entityTypePlural = "entities" } = this.manager
359
+
360
+ const { yColumnSlugs } = this
361
+ if (!yColumnSlugs.length) return { reason: "Missing variable" }
362
+ if (!this.unstackedSeries.length)
363
+ return {
364
+ reason: `No data for the selected ${entityTypePlural}`,
365
+ }
366
+ if (!this.allStackedPoints.length)
367
+ return { reason: "No matching points" }
368
+ return { reason: "" }
369
+ }
370
+ }
@@ -0,0 +1,190 @@
1
+ // @ts-nocheck
2
+ import * as _ from "lodash-es"
3
+ import * as R from "remeda"
4
+ import { Bounds, dyFromAlign, VerticalAlign } from "../../utils/index.js"
5
+ import { DualAxis } from "../axis/Axis"
6
+ import { ColorScaleBin } from "../color/ColorScaleBin"
7
+ import { TooltipState } from "../tooltip/Tooltip"
8
+ import { MarimekkoBarsForOneEntity } from "./MarimekkoBarsForOneEntity"
9
+ import { Item, PlacedItem } from "./MarimekkoChartConstants"
10
+ import { GRAPHER_FONT_SCALE_12, Patterns } from "../core/GrapherConstants"
11
+ import { SelectionArray } from "../selection/SelectionArray"
12
+
13
+ interface MarimekkoBarsProps {
14
+ dualAxis: DualAxis
15
+ focusColorBin?: ColorScaleBin
16
+ placedItems: PlacedItem[]
17
+ tooltipState?: TooltipState<{ entityName: string }>
18
+ fontSize: number
19
+ onEntityMouseOver?: (entityName: string, ev: React.MouseEvent) => void
20
+ onEntityMouseLeave?: () => void
21
+ onEntityClick?: (entityName: string) => void
22
+ x0: number
23
+ y0: number
24
+ selectionArray: SelectionArray
25
+ selectedItems: Item[]
26
+ isFocusModeActive?: boolean
27
+ }
28
+
29
+ export function MarimekkoBars(props: MarimekkoBarsProps): React.ReactElement {
30
+ const normalElements: React.ReactElement[] = []
31
+ const highlightedElements: React.ReactElement[] = [] // highlighted elements have a thicker stroke and should be drawn last to overlap others
32
+ const {
33
+ dualAxis,
34
+ focusColorBin,
35
+ placedItems,
36
+ tooltipState,
37
+ fontSize,
38
+ onEntityClick,
39
+ onEntityMouseLeave,
40
+ onEntityMouseOver,
41
+ x0,
42
+ y0,
43
+ selectionArray,
44
+ selectedItems,
45
+ isFocusModeActive,
46
+ } = props
47
+ const selectionSet = selectionArray.selectedSet
48
+ const labelYOffset = 0
49
+ const hasSelection = selectedItems.length > 0
50
+ let noDataAreaElement = undefined
51
+ let noDataLabel = undefined
52
+ const noDataHeight = Bounds.forText("no data").height + 10
53
+
54
+ const firstNanValue = placedItems.findIndex((item) => !item.bars.length)
55
+ const anyNonNanAfterFirstNan =
56
+ firstNanValue >= 0
57
+ ? placedItems
58
+ .slice(firstNanValue)
59
+ .some((item) => item.bars.length !== 0)
60
+ : false
61
+
62
+ if (anyNonNanAfterFirstNan)
63
+ console.error("Found Non-NAN values after NAN value!")
64
+
65
+ if (firstNanValue !== -1) {
66
+ const firstNanValueItem = placedItems[firstNanValue]
67
+ const lastItem = R.last(placedItems)!
68
+ const noDataRangeStartX =
69
+ firstNanValueItem.xPosition + dualAxis.horizontalAxis.place(x0)
70
+ const xValue = lastItem.xPoint?.value ?? 1
71
+ const noDataRangeEndX =
72
+ lastItem?.xPosition + dualAxis.horizontalAxis.place(xValue)
73
+ const yStart = dualAxis.verticalAxis.place(y0)
74
+
75
+ const noDataLabelX =
76
+ noDataRangeStartX + (noDataRangeEndX - noDataRangeStartX) / 2
77
+ const boundsForNoData = Bounds.forText("no data")
78
+ const noDataLabelY = yStart - boundsForNoData.width
79
+ noDataLabel = (
80
+ <text
81
+ key={`noDataArea-label`}
82
+ x={0}
83
+ transform={`rotate(-90, ${noDataLabelX}, ${noDataLabelY})
84
+ translate(${noDataLabelX}, ${noDataLabelY})`}
85
+ y={0}
86
+ width={noDataRangeEndX - noDataRangeStartX}
87
+ height={noDataHeight}
88
+ fontWeight={700}
89
+ fill="#666"
90
+ opacity={1}
91
+ fontSize={GRAPHER_FONT_SCALE_12 * fontSize}
92
+ textAnchor="middle"
93
+ dy={dyFromAlign(VerticalAlign.middle)}
94
+ style={{ pointerEvents: "none" }}
95
+ >
96
+ no data
97
+ </text>
98
+ )
99
+
100
+ noDataAreaElement = (
101
+ <rect
102
+ key="noDataArea"
103
+ x={noDataRangeStartX}
104
+ y={yStart - noDataHeight}
105
+ width={noDataRangeEndX - noDataRangeStartX}
106
+ height={noDataHeight}
107
+ fill={`url(#${Patterns.noDataPattern})`}
108
+ opacity={0.5}
109
+ ></rect>
110
+ )
111
+ }
112
+
113
+ for (const item of placedItems) {
114
+ const { entityName, bars, xPoint, entityColor } = item
115
+ const currentX = dualAxis.horizontalAxis.place(x0) + item.xPosition
116
+
117
+ const xValue = xPoint?.value ?? 1
118
+ const barWidth =
119
+ dualAxis.horizontalAxis.place(xValue) -
120
+ dualAxis.horizontalAxis.place(x0)
121
+
122
+ const isSelected = selectionSet.has(entityName)
123
+ const isHovered =
124
+ entityName === tooltipState?.target?.entityName &&
125
+ !tooltipState.fading
126
+ const isFaint =
127
+ item.focus.background ||
128
+ (focusColorBin !== undefined &&
129
+ !focusColorBin.contains(entityColor?.colorDomainValue)) ||
130
+ (focusColorBin === undefined && hasSelection && !isSelected) ||
131
+ (!isHovered &&
132
+ !isSelected &&
133
+ tooltipState?.target !== undefined &&
134
+ !tooltipState.fading)
135
+
136
+ // figure out what the minimum height in domain space has to be so
137
+ // that a bar is at least one pixel high in screen space.
138
+ const yAxisOnePixelDomainEquivalent =
139
+ dualAxis.verticalAxis.invert(dualAxis.verticalAxis.place(y0) - 1) -
140
+ dualAxis.verticalAxis.invert(dualAxis.verticalAxis.place(y0))
141
+ const adjustedBars = []
142
+ let currentY = 0
143
+ for (const bar of bars) {
144
+ const barCopy = _.cloneDeep(bar)
145
+ // we want to draw bars at least one pixel high so that they are guaranteed to have a
146
+ // visual representation in our chart (as a 1px line in this case)
147
+ barCopy.yPoint.value = Math.max(
148
+ barCopy.yPoint.value,
149
+ yAxisOnePixelDomainEquivalent
150
+ )
151
+ barCopy.yPoint.valueOffset = currentY
152
+ currentY += barCopy.yPoint.value
153
+ adjustedBars.push(barCopy)
154
+ }
155
+
156
+ const barsProps = {
157
+ entityName,
158
+ bars: adjustedBars,
159
+ xPoint,
160
+ entityColor,
161
+ isFaint,
162
+ isHovered,
163
+ isSelected,
164
+ focus: item.focus,
165
+ barWidth,
166
+ currentX,
167
+ onEntityClick,
168
+ onEntityMouseLeave,
169
+ onEntityMouseOver,
170
+ labelYOffset,
171
+ y0,
172
+ noDataHeight,
173
+ dualAxis,
174
+ }
175
+ const result = (
176
+ <MarimekkoBarsForOneEntity key={entityName} {...barsProps} />
177
+ )
178
+ if (isSelected || isHovered) highlightedElements.push(result)
179
+ else normalElements.push(result)
180
+ }
181
+
182
+ return (
183
+ <>
184
+ {noDataAreaElement}
185
+ {normalElements}
186
+ {highlightedElements}
187
+ {!isFocusModeActive && noDataLabel}
188
+ </>
189
+ )
190
+ }