@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,33 @@
1
+ import { PartialBy, PointVector } from "../../utils/index.js"
2
+ import { EntityName, OwidVariableRow } from "../../types/index.js"
3
+ import { ChartSeries } from "../chart/ChartInterface"
4
+ import { CoreColumn } from "../../core-table/index.js"
5
+ import { ChartManager } from "../chart/ChartManager"
6
+ import { InteractionState } from "../interaction/InteractionState"
7
+
8
+ export interface SlopeChartManager extends ChartManager {
9
+ canSelectMultipleEntities?: boolean // used to pick an appropriate series name
10
+ hasTimeline?: boolean // used to filter the table for the entity selector
11
+ hideNoDataSection?: boolean
12
+ }
13
+
14
+ export interface SlopeChartSeries extends ChartSeries {
15
+ column: CoreColumn
16
+ entityName: EntityName
17
+ displayName: string
18
+ start: Pick<OwidVariableRow<number>, "value" | "originalTime">
19
+ end: Pick<OwidVariableRow<number>, "value" | "originalTime">
20
+ annotation?: string
21
+ focus: InteractionState
22
+ }
23
+
24
+ export type RawSlopeChartSeries = PartialBy<SlopeChartSeries, "start" | "end">
25
+
26
+ export interface PlacedSlopeChartSeries extends SlopeChartSeries {
27
+ startPoint: PointVector
28
+ endPoint: PointVector
29
+ }
30
+
31
+ export interface RenderSlopeChartSeries extends PlacedSlopeChartSeries {
32
+ hover: InteractionState
33
+ }
@@ -0,0 +1,73 @@
1
+ import * as _ from "lodash-es"
2
+ import {
3
+ AxisConfigInterface,
4
+ PointVector,
5
+ ScaleType,
6
+ SeriesName,
7
+ } from "../../utils/index.js"
8
+ import { VerticalAxis } from "../axis/Axis"
9
+ import {
10
+ PlacedSlopeChartSeries,
11
+ RenderSlopeChartSeries,
12
+ SlopeChartSeries,
13
+ } from "./SlopeChartConstants"
14
+ import {
15
+ byHoverThenFocusState,
16
+ getHoverStateForSeries,
17
+ } from "../chart/ChartUtils"
18
+
19
+ export function getYAxisConfigDefaults(
20
+ config?: AxisConfigInterface
21
+ ): AxisConfigInterface {
22
+ return { nice: config?.scaleType !== ScaleType.log }
23
+ }
24
+
25
+ export function toPlacedSlopeChartSeries(
26
+ series: SlopeChartSeries[],
27
+ {
28
+ yAxis,
29
+ startX,
30
+ endX,
31
+ }: { yAxis: VerticalAxis; startX: number; endX: number }
32
+ ): PlacedSlopeChartSeries[] {
33
+ return series.map((series) => {
34
+ const startY = yAxis.place(series.start.value)
35
+ const endY = yAxis.place(series.end.value)
36
+
37
+ const startPoint = new PointVector(startX, startY)
38
+ const endPoint = new PointVector(endX, endY)
39
+
40
+ return { ...series, startPoint, endPoint }
41
+ })
42
+ }
43
+
44
+ export function toRenderSlopeChartSeries(
45
+ placedSeries: PlacedSlopeChartSeries[],
46
+ {
47
+ isFocusModeActive = false,
48
+ isHoverModeActive = false,
49
+ hoveredSeriesNames = [],
50
+ }: {
51
+ isFocusModeActive?: boolean
52
+ isHoverModeActive?: boolean
53
+ hoveredSeriesNames?: SeriesName[]
54
+ }
55
+ ): RenderSlopeChartSeries[] {
56
+ const series: RenderSlopeChartSeries[] = placedSeries.map((series) => {
57
+ return {
58
+ ...series,
59
+ hover: getHoverStateForSeries(series, {
60
+ isHoverModeActive,
61
+ hoveredSeriesNames,
62
+ }),
63
+ }
64
+ })
65
+
66
+ // Sort by interaction state so that foreground series
67
+ // are drawn on top of background series
68
+ if (isHoverModeActive || isFocusModeActive) {
69
+ return _.sortBy(series, byHoverThenFocusState)
70
+ }
71
+
72
+ return series
73
+ }
@@ -0,0 +1,392 @@
1
+ import { computed, makeObservable } from "mobx"
2
+ import { ChartState } from "../chart/ChartInterface"
3
+ import {
4
+ SlopeChartManager,
5
+ RawSlopeChartSeries,
6
+ SlopeChartSeries,
7
+ } from "./SlopeChartConstants"
8
+ import { OwidTable, CoreColumn } from "../../core-table/index.js"
9
+ import { SelectionArray } from "../selection/SelectionArray"
10
+ import { FocusArray } from "../focus/FocusArray"
11
+ import {
12
+ ColumnSlug,
13
+ ScaleType,
14
+ MissingDataStrategy,
15
+ SeriesStrategy,
16
+ FacetStrategy,
17
+ Time,
18
+ EntityName,
19
+ ColorSchemeName,
20
+ ChartErrorInfo,
21
+ } from "../../types/index.js"
22
+ import {
23
+ autoDetectSeriesStrategy,
24
+ autoDetectYColumnSlugs,
25
+ getDefaultFailMessage,
26
+ getShortNameForEntity,
27
+ makeSelectionArray,
28
+ } from "../chart/ChartUtils"
29
+ import { ColorScheme } from "../color/ColorScheme"
30
+ import { ColorSchemes } from "../color/ColorSchemes"
31
+ import { CategoricalColorAssigner } from "../color/CategoricalColorAssigner"
32
+ import {
33
+ AnnotationsMap,
34
+ getAnnotationsForSeries,
35
+ getAnnotationsMap,
36
+ getColorKey,
37
+ getDisplayName,
38
+ getSeriesName,
39
+ } from "../lineCharts/LineChartHelpers"
40
+ import { domainExtent } from "../../utils/index.js"
41
+ import { AxisConfig } from "../axis/AxisConfig"
42
+ import { VerticalAxis } from "../axis/Axis"
43
+
44
+ export class SlopeChartState implements ChartState {
45
+ manager: SlopeChartManager
46
+
47
+ defaultBaseColorScheme = ColorSchemeName.OwidDistinctLines
48
+
49
+ constructor({ manager }: { manager: SlopeChartManager }) {
50
+ this.manager = manager
51
+ makeObservable(this)
52
+ }
53
+
54
+ @computed get inputTable(): OwidTable {
55
+ return this.manager.table
56
+ }
57
+
58
+ @computed get transformedTableFromGrapher(): OwidTable {
59
+ return (
60
+ this.manager.transformedTable ??
61
+ this.transformTable(this.inputTable)
62
+ )
63
+ }
64
+
65
+ @computed get transformedTable(): OwidTable {
66
+ let table = this.transformedTableFromGrapher
67
+ // The % growth transform cannot be applied in transformTable() because it will filter out
68
+ // any rows before startTime and change the timeline bounds.
69
+ const { startTime } = this.manager
70
+ if (this.isRelativeMode && startTime !== undefined) {
71
+ table = table.toTotalGrowthForEachColumnComparedToStartTime(
72
+ startTime,
73
+ this.yColumnSlugs ?? []
74
+ )
75
+ }
76
+ return table
77
+ }
78
+
79
+ transformTable(table: OwidTable) {
80
+ table = table.filterByEntityNames(
81
+ this.selectionArray.selectedEntityNames
82
+ )
83
+
84
+ // TODO: remove this filter once we don't have mixed type columns in datasets
85
+ table = table.replaceNonNumericCellsWithErrorValues(this.yColumnSlugs)
86
+
87
+ if (this.isLogScale)
88
+ table = table.replaceNonPositiveCellsForLogScale(this.yColumnSlugs)
89
+
90
+ this.yColumnSlugs.forEach((slug) => {
91
+ table = table.interpolateColumnWithTolerance(slug)
92
+ })
93
+
94
+ return table
95
+ }
96
+
97
+ transformTableForSelection(table: OwidTable): OwidTable {
98
+ table = table.replaceNonNumericCellsWithErrorValues(this.yColumnSlugs)
99
+
100
+ this.yColumnSlugs.forEach((slug) => {
101
+ table = table.interpolateColumnWithTolerance(slug)
102
+ })
103
+
104
+ // if time selection is disabled, then filter all entities that
105
+ // don't have data for the current time period
106
+ if (!this.manager.hasTimeline && this.startTime !== this.endTime) {
107
+ table = table
108
+ .filterByTargetTimes([this.startTime, this.endTime])
109
+ .dropEntitiesThatHaveSomeMissingOrErrorValueInAllColumns(
110
+ this.yColumnSlugs
111
+ )
112
+ }
113
+
114
+ // if entities with partial data are not plotted,
115
+ // make sure they don't show up in the entity selector
116
+ if (this.missingDataStrategy === MissingDataStrategy.hide) {
117
+ table = table.dropEntitiesThatHaveNoDataInSomeColumn(
118
+ this.yColumnSlugs
119
+ )
120
+ }
121
+
122
+ return table
123
+ }
124
+
125
+ @computed get selectionArray(): SelectionArray {
126
+ return makeSelectionArray(this.manager.selection)
127
+ }
128
+
129
+ @computed get focusArray(): FocusArray {
130
+ return this.manager.focusArray ?? new FocusArray()
131
+ }
132
+
133
+ @computed get isFocusModeActive(): boolean {
134
+ return this.focusArray.hasFocusedSeries
135
+ }
136
+
137
+ @computed get yColumnSlugs(): ColumnSlug[] {
138
+ return autoDetectYColumnSlugs(this.manager)
139
+ }
140
+
141
+ @computed get yColumns(): CoreColumn[] {
142
+ return this.yColumnSlugs.map((slug) => this.transformedTable.get(slug))
143
+ }
144
+
145
+ @computed get formatColumn(): CoreColumn {
146
+ return this.yColumns[0]
147
+ }
148
+
149
+ @computed get isRelativeMode(): boolean {
150
+ return !!this.manager.isRelativeMode
151
+ }
152
+
153
+ @computed get isLogScale(): boolean {
154
+ return this.manager.yAxisConfig?.scaleType === ScaleType.log
155
+ }
156
+
157
+ @computed get missingDataStrategy(): MissingDataStrategy {
158
+ return this.manager.missingDataStrategy || MissingDataStrategy.auto
159
+ }
160
+
161
+ @computed get yScaleType(): ScaleType {
162
+ return this.manager.yAxisConfig?.scaleType ?? ScaleType.linear
163
+ }
164
+
165
+ @computed get colorScheme(): ColorScheme {
166
+ return (
167
+ (this.manager.baseColorScheme
168
+ ? ColorSchemes.get(this.manager.baseColorScheme)
169
+ : null) ?? ColorSchemes.get(this.defaultBaseColorScheme)
170
+ )
171
+ }
172
+
173
+ @computed get startTime(): Time {
174
+ return this.transformedTable.minTime ?? 0
175
+ }
176
+
177
+ @computed get endTime(): Time {
178
+ return this.transformedTable.maxTime ?? 0
179
+ }
180
+
181
+ @computed get seriesStrategy(): SeriesStrategy {
182
+ return autoDetectSeriesStrategy(this.manager, true)
183
+ }
184
+
185
+ @computed get availableFacetStrategies(): FacetStrategy[] {
186
+ const strategies: FacetStrategy[] = [FacetStrategy.none]
187
+
188
+ if (this.selectionArray.numSelectedEntities > 1)
189
+ strategies.push(FacetStrategy.entity)
190
+
191
+ if (this.yColumns.length > 1) strategies.push(FacetStrategy.metric)
192
+
193
+ return strategies
194
+ }
195
+
196
+ @computed get categoricalColorAssigner(): CategoricalColorAssigner {
197
+ return new CategoricalColorAssigner({
198
+ colorScheme: this.colorScheme,
199
+ invertColorScheme: this.manager.invertColorScheme,
200
+ colorMap:
201
+ this.seriesStrategy === SeriesStrategy.entity
202
+ ? this.inputTable.entityNameColorIndex
203
+ : this.inputTable.columnDisplayNameToColorMap,
204
+ autoColorMapCache: this.manager.seriesColorMap,
205
+ })
206
+ }
207
+
208
+ @computed get annotationsMap(): AnnotationsMap | undefined {
209
+ return getAnnotationsMap(this.inputTable, this.yColumnSlugs[0])
210
+ }
211
+
212
+ private constructSingleSeries(
213
+ entityName: EntityName,
214
+ column: CoreColumn
215
+ ): RawSlopeChartSeries {
216
+ const { startTime, endTime, seriesStrategy } = this
217
+ const { canSelectMultipleEntities } = this.manager
218
+ const { availableEntityNames } = this.transformedTable
219
+
220
+ const columnName = column.nonEmptyDisplayName
221
+ const hasMultipleEntitiesSelected = availableEntityNames.length > 1
222
+ const seriesName = getSeriesName({
223
+ entityName,
224
+ columnName,
225
+ seriesStrategy,
226
+ hasMultipleEntitiesSelected,
227
+ allowsMultiEntitySelection: canSelectMultipleEntities,
228
+ })
229
+ const shortEntityName = getShortNameForEntity(entityName)
230
+ const displayName = getDisplayName({
231
+ entityName: shortEntityName ?? entityName,
232
+ columnName,
233
+ seriesStrategy,
234
+ hasMultipleEntitiesSelected,
235
+ })
236
+
237
+ const owidRowByTime = column.owidRowByEntityNameAndTime.get(entityName)
238
+ const start = owidRowByTime?.get(startTime)
239
+ const end = owidRowByTime?.get(endTime)
240
+
241
+ const colorKey = getColorKey({
242
+ entityName,
243
+ columnName,
244
+ seriesStrategy,
245
+ hasMultipleEntitiesSelected,
246
+ })
247
+ const color = this.categoricalColorAssigner.assign(colorKey)
248
+
249
+ const annotation = getAnnotationsForSeries(
250
+ this.annotationsMap,
251
+ seriesName
252
+ )
253
+
254
+ const focus = this.focusArray.state(seriesName)
255
+
256
+ return {
257
+ column,
258
+ seriesName,
259
+ entityName,
260
+ displayName,
261
+ color,
262
+ start,
263
+ end,
264
+ annotation,
265
+ focus,
266
+ }
267
+ }
268
+
269
+ isSeriesValid(series: RawSlopeChartSeries): series is SlopeChartSeries {
270
+ const {
271
+ start,
272
+ end,
273
+ column: { tolerance },
274
+ } = series
275
+
276
+ // if the start or end value is missing, we can't draw the slope
277
+ if (start?.value === undefined || end?.value === undefined) return false
278
+
279
+ // sanity check (might happen if tolerance is enabled)
280
+ if (start.originalTime >= end.originalTime) return false
281
+
282
+ const isToleranceAppliedToStartValue =
283
+ start.originalTime !== this.startTime
284
+ const isToleranceAppliedToEndValue = end.originalTime !== this.endTime
285
+
286
+ // if tolerance has been applied to one of the values, then we require
287
+ // a minimal distance between the original times
288
+ if (isToleranceAppliedToStartValue || isToleranceAppliedToEndValue) {
289
+ return end.originalTime - start.originalTime >= tolerance
290
+ }
291
+
292
+ return true
293
+ }
294
+
295
+ // Usually we drop rows with missing data in the transformTable function.
296
+ // But if we did that for slope charts, we wouldn't know whether a slope
297
+ // has been dropped because it actually had no data or a sibling slope had
298
+ // no data. But we need that information for the "No data" section. That's
299
+ // why the filtering happens here, so that the noDataSeries can be populated
300
+ // correctly.
301
+ private shouldSeriesBePlotted(
302
+ series: RawSlopeChartSeries
303
+ ): series is SlopeChartSeries {
304
+ if (!this.isSeriesValid(series)) return false
305
+
306
+ // when the missing data strategy is set to "hide", we might
307
+ // choose not to plot a valid series
308
+ if (
309
+ this.seriesStrategy === SeriesStrategy.column &&
310
+ this.missingDataStrategy === MissingDataStrategy.hide
311
+ ) {
312
+ const allSeriesForEntity = this.rawSeriesByEntityName.get(
313
+ series.entityName
314
+ )
315
+ return !!allSeriesForEntity?.every((series) =>
316
+ this.isSeriesValid(series)
317
+ )
318
+ }
319
+
320
+ return true
321
+ }
322
+
323
+ @computed get rawSeries(): RawSlopeChartSeries[] {
324
+ return this.yColumns.flatMap((column) =>
325
+ this.selectionArray.selectedEntityNames.map((entityName) =>
326
+ this.constructSingleSeries(entityName, column)
327
+ )
328
+ )
329
+ }
330
+
331
+ @computed get rawSeriesByEntityName(): Map<
332
+ EntityName,
333
+ RawSlopeChartSeries[]
334
+ > {
335
+ const map = new Map<EntityName, RawSlopeChartSeries[]>()
336
+ this.rawSeries.forEach((series) => {
337
+ const { entityName } = series
338
+ if (!map.has(entityName)) map.set(entityName, [])
339
+ map.get(entityName)!.push(series)
340
+ })
341
+ return map
342
+ }
343
+
344
+ @computed get series(): SlopeChartSeries[] {
345
+ return this.rawSeries.filter((series) =>
346
+ this.shouldSeriesBePlotted(series)
347
+ )
348
+ }
349
+
350
+ @computed get allYValues(): number[] {
351
+ return this.series.flatMap((series) => [
352
+ series.start.value,
353
+ series.end.value,
354
+ ])
355
+ }
356
+
357
+ @computed get xDomain(): [number, number] {
358
+ return [this.startTime, this.endTime]
359
+ }
360
+
361
+ @computed get yDomainDefault(): [number, number] {
362
+ const defaultDomain: [number, number] = [Infinity, -Infinity]
363
+ return domainExtent(this.allYValues, this.yScaleType) ?? defaultDomain
364
+ }
365
+
366
+ toVerticalAxis(
367
+ config: AxisConfig,
368
+ {
369
+ yDomain,
370
+ yRange,
371
+ }: { yDomain: [number, number]; yRange: [number, number] }
372
+ ): VerticalAxis {
373
+ const axis = config.toVerticalAxis()
374
+ axis.domain = yDomain
375
+ axis.range = yRange
376
+ axis.formatColumn = this.yColumns[0]
377
+ axis.label = ""
378
+ return axis
379
+ }
380
+
381
+ @computed get errorInfo(): ChartErrorInfo {
382
+ const message = getDefaultFailMessage(this.manager)
383
+ if (message) return { reason: message }
384
+
385
+ const { entityTypePlural = "entities" } = this.manager
386
+ if (this.series.length === 0)
387
+ return {
388
+ reason: `No data for the selected ${entityTypePlural}`,
389
+ }
390
+ return { reason: "" }
391
+ }
392
+ }