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