@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,220 @@
1
+ import * as _ from "lodash-es"
2
+ import React from "react"
3
+ import { computed, makeObservable } from "mobx"
4
+ import { observer } from "mobx-react"
5
+ import { ChartInterface } from "../chart/ChartInterface"
6
+ import { StackedBarChartState } from "./StackedBarChartState.js"
7
+ import { type StackedBarChartProps } from "./StackedBarChart.js"
8
+ import { ChartManager } from "../chart/ChartManager"
9
+ import {
10
+ BASE_FONT_SIZE,
11
+ DEFAULT_GRAPHER_BOUNDS,
12
+ GRAPHER_FONT_SCALE_12,
13
+ } from "../core/GrapherConstants"
14
+ import { Bounds, excludeUndefined } from "../../utils/index.js"
15
+ import { AxisConfig, AxisManager } from "../axis/AxisConfig"
16
+ import { DualAxis, HorizontalAxis, VerticalAxis } from "../axis/Axis"
17
+ import {
18
+ getXAxisConfigDefaultsForStackedBar,
19
+ resolveCollision,
20
+ } from "./StackedUtils"
21
+ import {
22
+ HorizontalAxisComponent,
23
+ VerticalAxisZeroLine,
24
+ } from "../axis/AxisViews"
25
+ import { StackedBars } from "./StackedBars"
26
+ import {
27
+ InitialVerticalLabelsSeries,
28
+ VerticalLabelsState,
29
+ } from "../verticalLabels/VerticalLabelsState"
30
+ import { VerticalLabels } from "../verticalLabels/VerticalLabels"
31
+ import { NoDataModal } from "../noDataModal/NoDataModal"
32
+
33
+ const LEGEND_PADDING = 4
34
+
35
+ @observer
36
+ export class StackedBarChartThumbnail
37
+ extends React.Component<StackedBarChartProps>
38
+ implements ChartInterface, AxisManager
39
+ {
40
+ constructor(props: StackedBarChartProps) {
41
+ super(props)
42
+ makeObservable(this)
43
+ }
44
+
45
+ @computed get chartState(): StackedBarChartState {
46
+ return this.props.chartState
47
+ }
48
+
49
+ @computed get manager(): ChartManager {
50
+ return this.chartState.manager
51
+ }
52
+
53
+ @computed get fontSize(): number {
54
+ return this.manager.fontSize ?? BASE_FONT_SIZE
55
+ }
56
+
57
+ @computed private get bounds(): Bounds {
58
+ return this.props.bounds ?? DEFAULT_GRAPHER_BOUNDS
59
+ }
60
+
61
+ @computed private get innerBounds(): Bounds {
62
+ return this.bounds.padRight(this.paddedLabelsWidth)
63
+ }
64
+
65
+ @computed private get xAxisConfig(): AxisConfig {
66
+ const { xAxisConfig } = this.manager
67
+ const defaults = getXAxisConfigDefaultsForStackedBar(this.chartState)
68
+ const custom = { labelPadding: 0 }
69
+ return new AxisConfig({ ...custom, ...defaults, ...xAxisConfig }, this)
70
+ }
71
+
72
+ @computed private get yAxisConfig(): AxisConfig {
73
+ const { yAxisConfig } = this.manager
74
+ const custom = { nice: true, hideAxis: true }
75
+ return new AxisConfig({ ...custom, ...yAxisConfig }, this)
76
+ }
77
+
78
+ @computed private get horizontalAxisPart(): HorizontalAxis {
79
+ return this.chartState.toHorizontalAxis(this.xAxisConfig)
80
+ }
81
+
82
+ @computed private get verticalAxisPart(): VerticalAxis {
83
+ return this.chartState.toVerticalAxis(this.yAxisConfig)
84
+ }
85
+
86
+ @computed private get dualAxis(): DualAxis {
87
+ const { horizontalAxisPart, verticalAxisPart } = this
88
+ return new DualAxis({
89
+ bounds: this.innerBounds,
90
+ horizontalAxis: horizontalAxisPart,
91
+ verticalAxis: verticalAxisPart,
92
+ })
93
+ }
94
+
95
+ @computed get xAxis(): HorizontalAxis {
96
+ return this.dualAxis.horizontalAxis
97
+ }
98
+
99
+ @computed get yAxis(): VerticalAxis {
100
+ return this.dualAxis.verticalAxis
101
+ }
102
+
103
+ @computed private get labelFontSize(): number {
104
+ return Math.floor(GRAPHER_FONT_SCALE_12 * this.fontSize)
105
+ }
106
+
107
+ // Same as dualAxis.verticalAxis, but doesn't depend on innerBounds
108
+ @computed get outerBoundsVerticalAxis(): VerticalAxis {
109
+ const yAxis = this.verticalAxisPart.clone()
110
+ yAxis.range = this.bounds.yRange()
111
+ return yAxis
112
+ }
113
+
114
+ @computed private get labelsRange(): [number, number] {
115
+ const {
116
+ horizontalAxisPart,
117
+ manager: { chartAreaPadding = 0 },
118
+ } = this
119
+
120
+ return this.bounds
121
+ .expand({
122
+ top: chartAreaPadding,
123
+ bottom: chartAreaPadding + horizontalAxisPart.height,
124
+ })
125
+ .yRange()
126
+ }
127
+
128
+ @computed private get verticalLabelsState():
129
+ | VerticalLabelsState
130
+ | undefined {
131
+ if (
132
+ !this.manager.showLegend ||
133
+ this.manager.isDisplayedAlongsideComplementaryTable
134
+ )
135
+ return undefined
136
+
137
+ const series = excludeUndefined(
138
+ this.chartState.series.map((series, seriesIndex) => {
139
+ const { seriesName, color, focus } = series
140
+
141
+ // Don't label background series
142
+ if (focus?.background) return undefined
143
+
144
+ const value = this.chartState.midpoints[seriesIndex]
145
+
146
+ const yPosition = this.outerBoundsVerticalAxis.place(value)
147
+ const label = seriesName
148
+
149
+ return { series, seriesName, value, label, yPosition, color }
150
+ })
151
+ )
152
+
153
+ return new VerticalLabelsState(series, {
154
+ fontSize: this.labelFontSize,
155
+ fontWeight: 500,
156
+ maxWidth: 0.25 * this.bounds.width,
157
+ yRange: this.labelsRange,
158
+ resolveCollision: (
159
+ s1: InitialVerticalLabelsSeries,
160
+ s2: InitialVerticalLabelsSeries
161
+ ): InitialVerticalLabelsSeries => {
162
+ const series1 = this.chartState.seriesByName.get(s1.seriesName)
163
+ const series2 = this.chartState.seriesByName.get(s2.seriesName)
164
+
165
+ if (!series1 || !series2) return s1 // no preference
166
+
167
+ const picked = resolveCollision(series1, series2)
168
+ if (picked?.seriesName === s1.seriesName) return s1
169
+ if (picked?.seriesName === s2.seriesName) return s2
170
+
171
+ return s1 // no preference
172
+ },
173
+ })
174
+ }
175
+
176
+ @computed private get labelsWidth(): number {
177
+ return this.verticalLabelsState?.width ?? 0
178
+ }
179
+
180
+ @computed private get paddedLabelsWidth(): number {
181
+ return this.labelsWidth ? this.labelsWidth + LEGEND_PADDING : 0
182
+ }
183
+
184
+ override render(): React.ReactElement {
185
+ if (this.chartState.errorInfo.reason)
186
+ return (
187
+ <NoDataModal
188
+ manager={this.manager}
189
+ bounds={this.props.bounds}
190
+ message={this.chartState.errorInfo.reason}
191
+ />
192
+ )
193
+
194
+ return (
195
+ <>
196
+ <VerticalAxisZeroLine
197
+ verticalAxis={this.dualAxis.verticalAxis}
198
+ bounds={this.dualAxis.innerBounds}
199
+ />
200
+ <HorizontalAxisComponent
201
+ axis={this.dualAxis.horizontalAxis}
202
+ bounds={this.dualAxis.bounds}
203
+ showEndpointsOnly
204
+ />
205
+ <StackedBars
206
+ dualAxis={this.dualAxis}
207
+ series={this.chartState.series}
208
+ formatColumn={this.chartState.formatColumn}
209
+ />
210
+ {this.verticalLabelsState && (
211
+ <VerticalLabels
212
+ state={this.verticalLabelsState}
213
+ yAxis={this.dualAxis.verticalAxis}
214
+ x={this.innerBounds.right + LEGEND_PADDING}
215
+ />
216
+ )}
217
+ </>
218
+ )
219
+ }
220
+ }
@@ -0,0 +1,87 @@
1
+ import * as _ from "lodash-es"
2
+ import * as React from "react"
3
+ import { computed, action, observable, makeObservable } from "mobx"
4
+ import { observer } from "mobx-react"
5
+ import { Time } from "../../utils/index.js"
6
+ import { BAR_OPACITY, StackedPoint, StackedSeries } from "./StackedConstants"
7
+ import { VerticalAxis } from "../axis/Axis"
8
+
9
+ interface StackedBarSegmentProps extends React.SVGAttributes<SVGGElement> {
10
+ id: string
11
+ bar: StackedPoint<Time>
12
+ series: StackedSeries<Time>
13
+ color: string
14
+ opacity: number
15
+ yAxis: VerticalAxis
16
+ xOffset: number
17
+ barWidth: number
18
+ onBarMouseOver?: (
19
+ bar: StackedPoint<Time>,
20
+ series: StackedSeries<Time>
21
+ ) => void
22
+ onBarMouseLeave?: () => void
23
+ }
24
+
25
+ @observer
26
+ export class StackedBarSegment extends React.Component<StackedBarSegmentProps> {
27
+ base = React.createRef<SVGRectElement>()
28
+
29
+ constructor(props: StackedBarSegmentProps) {
30
+ super(props)
31
+
32
+ makeObservable(this, {
33
+ mouseOver: observable,
34
+ })
35
+ }
36
+
37
+ mouseOver: boolean = false
38
+
39
+ @computed get yPos(): number {
40
+ const { bar, yAxis } = this.props
41
+ // The top position of a bar
42
+ return bar.value < 0
43
+ ? yAxis.place(bar.valueOffset)
44
+ : yAxis.place(bar.value + bar.valueOffset)
45
+ }
46
+
47
+ @computed get barHeight(): number {
48
+ const { bar, yAxis } = this.props
49
+ return bar.value < 0
50
+ ? yAxis.place(bar.valueOffset + bar.value) - this.yPos
51
+ : yAxis.place(bar.valueOffset) - this.yPos
52
+ }
53
+
54
+ @computed get trueOpacity(): number {
55
+ return this.mouseOver ? BAR_OPACITY.FOCUS : this.props.opacity
56
+ }
57
+
58
+ @action.bound onBarMouseOver(): void {
59
+ this.mouseOver = true
60
+ this.props.onBarMouseOver?.(this.props.bar, this.props.series)
61
+ }
62
+
63
+ @action.bound onBarMouseLeave(): void {
64
+ this.mouseOver = false
65
+ this.props.onBarMouseLeave?.()
66
+ }
67
+
68
+ override render(): React.ReactElement {
69
+ const { color, xOffset, barWidth } = this.props
70
+ const { yPos, barHeight, trueOpacity } = this
71
+
72
+ return (
73
+ <rect
74
+ id={this.props.id}
75
+ ref={this.base}
76
+ x={xOffset}
77
+ y={yPos}
78
+ width={barWidth}
79
+ height={barHeight}
80
+ fill={color}
81
+ opacity={trueOpacity}
82
+ onMouseOver={this.onBarMouseOver}
83
+ onMouseLeave={this.onBarMouseLeave}
84
+ />
85
+ )
86
+ }
87
+ }
@@ -0,0 +1,102 @@
1
+ import * as React from "react"
2
+ import { makeObservable } from "mobx"
3
+ import { observer } from "mobx-react"
4
+ import { SeriesName, Time } from "../../types/index.js"
5
+ import { DualAxis } from "../axis/Axis"
6
+ import { BAR_OPACITY, StackedPoint, StackedSeries } from "./StackedConstants"
7
+ import {
8
+ makeIdForHumanConsumption,
9
+ makeSafeForCSS,
10
+ } from "../../utils/index.js"
11
+ import { StackedBarSegment } from "./StackedBarSegment"
12
+ import { CoreColumn } from "../../core-table/index.js"
13
+
14
+ interface StackedBarsProps {
15
+ dualAxis: DualAxis
16
+ series: readonly StackedSeries<Time>[]
17
+ formatColumn: CoreColumn
18
+ hoveredSeriesNames?: SeriesName[]
19
+ hoveredBar?: StackedPoint<Time>
20
+ onBarMouseOver?: (
21
+ bar: StackedPoint<Time>,
22
+ series: StackedSeries<Time>
23
+ ) => void
24
+ onBarMouseLeave?: () => void
25
+ }
26
+
27
+ @observer
28
+ export class StackedBars extends React.Component<StackedBarsProps> {
29
+ constructor(props: StackedBarsProps) {
30
+ super(props)
31
+ makeObservable(this)
32
+ }
33
+
34
+ override render(): React.ReactElement {
35
+ const {
36
+ dualAxis,
37
+ series,
38
+ formatColumn,
39
+ hoveredSeriesNames = [],
40
+ hoveredBar,
41
+ onBarMouseOver,
42
+ onBarMouseLeave,
43
+ } = this.props
44
+
45
+ const { verticalAxis, horizontalAxis } = dualAxis
46
+
47
+ const barWidth = (horizontalAxis.bandWidth ?? 0) * 0.8
48
+
49
+ return (
50
+ <>
51
+ {series.map((series, index) => {
52
+ const isLegendHovered = hoveredSeriesNames.includes(
53
+ series.seriesName
54
+ )
55
+ const opacity =
56
+ (isLegendHovered || hoveredSeriesNames.length === 0) &&
57
+ !series.focus?.background
58
+ ? BAR_OPACITY.DEFAULT
59
+ : BAR_OPACITY.MUTE
60
+
61
+ return (
62
+ <g
63
+ key={index}
64
+ id={makeIdForHumanConsumption(series.seriesName)}
65
+ className={
66
+ makeSafeForCSS(series.seriesName) + "-segments"
67
+ }
68
+ >
69
+ {series.points.map((bar, index) => {
70
+ const xPos =
71
+ horizontalAxis.place(bar.position) -
72
+ barWidth / 2
73
+ const barOpacity =
74
+ bar === hoveredBar || series.focus?.active
75
+ ? BAR_OPACITY.FOCUS
76
+ : opacity
77
+
78
+ return (
79
+ <StackedBarSegment
80
+ key={index}
81
+ id={makeIdForHumanConsumption(
82
+ formatColumn.formatTime(bar.time)
83
+ )}
84
+ bar={bar}
85
+ color={bar.color ?? series.color}
86
+ xOffset={xPos}
87
+ opacity={barOpacity}
88
+ yAxis={verticalAxis}
89
+ series={series}
90
+ onBarMouseOver={onBarMouseOver}
91
+ onBarMouseLeave={onBarMouseLeave}
92
+ barWidth={barWidth}
93
+ />
94
+ )
95
+ })}
96
+ </g>
97
+ )
98
+ })}
99
+ </>
100
+ )
101
+ }
102
+ }
@@ -0,0 +1,109 @@
1
+ import {
2
+ Color,
3
+ EntityName,
4
+ OwidVariableRow,
5
+ SeriesName,
6
+ } from "../../types/index.js"
7
+ import { ChartSeries } from "../chart/ChartInterface"
8
+ import {
9
+ GRAPHER_AREA_OPACITY_DEFAULT,
10
+ GRAPHER_AREA_OPACITY_FOCUS,
11
+ GRAPHER_AREA_OPACITY_MUTE,
12
+ } from "../core/GrapherConstants"
13
+ import { TextWrap } from "../../components/index.js"
14
+ import { InteractionState } from "../interaction/InteractionState.js"
15
+ import { LegendStyleConfig } from "../legend/LegendInteractionState"
16
+
17
+ export const AREA_OPACITY = {
18
+ DEFAULT: GRAPHER_AREA_OPACITY_DEFAULT,
19
+ FOCUS: GRAPHER_AREA_OPACITY_FOCUS,
20
+ MUTE: GRAPHER_AREA_OPACITY_MUTE,
21
+ } as const
22
+
23
+ export const BAR_OPACITY = AREA_OPACITY
24
+
25
+ export const BORDER_OPACITY = {
26
+ DEFAULT: 0.7,
27
+ FOCUS: 1,
28
+ MUTE: 0.3,
29
+ } as const
30
+
31
+ export const BORDER_WIDTH = {
32
+ DEFAULT: 0.5,
33
+ FOCUS: 1.5,
34
+ } as const
35
+
36
+ export const LEGEND_STYLE_FOR_STACKED_CHARTS: LegendStyleConfig = {
37
+ marker: {
38
+ default: { opacity: AREA_OPACITY.DEFAULT },
39
+ focused: { opacity: AREA_OPACITY.FOCUS },
40
+ muted: { opacity: AREA_OPACITY.MUTE },
41
+ },
42
+ text: {
43
+ muted: { opacity: AREA_OPACITY.MUTE },
44
+ },
45
+ }
46
+
47
+ export type StackedPointPositionType = string | number
48
+
49
+ export type StackedPlacedPoint = [number, number]
50
+
51
+ // PositionType can be categorical (e.g. country names), or ordinal (e.g. years).
52
+ export interface StackedPoint<PositionType extends StackedPointPositionType> {
53
+ position: PositionType
54
+ value: number
55
+ valueOffset: number
56
+ time: number
57
+ interpolated?: boolean
58
+ fake?: boolean
59
+ color?: string
60
+ }
61
+
62
+ export interface StackedSeries<PositionType extends StackedPointPositionType>
63
+ extends ChartSeries {
64
+ points: StackedPoint<PositionType>[]
65
+ columnSlug?: string
66
+ isProjection?: boolean
67
+ isAllZeros?: boolean
68
+ shortEntityName?: string
69
+ focus?: InteractionState
70
+ }
71
+
72
+ export interface StackedPlacedSeries<
73
+ PositionType extends StackedPointPositionType,
74
+ > extends StackedSeries<PositionType> {
75
+ placedPoints: Array<StackedPlacedPoint>
76
+ }
77
+
78
+ export interface StackedRawSeries<
79
+ PositionType extends StackedPointPositionType,
80
+ > {
81
+ seriesName: SeriesName
82
+ isProjection?: boolean
83
+ rows: OwidVariableRow<PositionType>[]
84
+ focus: InteractionState
85
+ shortEntityName?: string
86
+ }
87
+
88
+ export interface Bar {
89
+ color: Color
90
+ seriesName: string
91
+ columnSlug: string
92
+ point: StackedPoint<EntityName>
93
+ }
94
+
95
+ export interface Item {
96
+ entityName: string
97
+ shortEntityName?: string
98
+ bars: Bar[]
99
+ totalValue: number
100
+ focus: InteractionState
101
+ }
102
+
103
+ export interface SizedItem extends Item {
104
+ label: TextWrap
105
+ }
106
+
107
+ export interface PlacedItem extends SizedItem {
108
+ yPosition: number
109
+ }