@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,97 @@
1
+ /*
2
+ * Vector utility class
3
+ * Partly based on the Unity vector: https://docs.unity3d.com/ScriptReference/Vector2.html
4
+ * Wraps the Victor library, mainly so we can do type hinting
5
+ *
6
+ * @project Our World In Data
7
+ * @author Jaiden Mispy
8
+ * @created 2017-03-15
9
+ */
10
+
11
+ export class PointVector {
12
+ x: number
13
+ y: number
14
+
15
+ constructor(x: number, y: number) {
16
+ this.x = x
17
+ this.y = y
18
+ }
19
+
20
+ subtract(v: PointVector): PointVector {
21
+ return new PointVector(this.x - v.x, this.y - v.y)
22
+ }
23
+
24
+ add(v: PointVector): PointVector {
25
+ return new PointVector(this.x + v.x, this.y + v.y)
26
+ }
27
+
28
+ times(n: number): PointVector {
29
+ return new PointVector(this.x * n, this.y * n)
30
+ }
31
+
32
+ get magnitude(): number {
33
+ return Math.sqrt(this.x ** 2 + this.y ** 2)
34
+ }
35
+
36
+ normalize(): PointVector {
37
+ const magnitude = this.magnitude
38
+ if (magnitude > 1e-5)
39
+ return new PointVector(this.x / magnitude, this.y / magnitude)
40
+
41
+ return new PointVector(0, 0)
42
+ }
43
+
44
+ normals(): [PointVector, PointVector] {
45
+ return [
46
+ new PointVector(-this.y, this.x),
47
+ new PointVector(this.y, -this.x),
48
+ ]
49
+ }
50
+
51
+ toString(): string {
52
+ return `PointVector<${this.x}, ${this.y}>`
53
+ }
54
+
55
+ static up = new PointVector(0, -1)
56
+ static zero = new PointVector(0, 0)
57
+
58
+ static distanceSq(a: PointVector, b: PointVector): number {
59
+ return (b.x - a.x) ** 2 + (b.y - a.y) ** 2
60
+ }
61
+
62
+ static distance(a: PointVector, b: PointVector): number {
63
+ return Math.sqrt(PointVector.distanceSq(a, b))
64
+ }
65
+
66
+ static angle(a: PointVector, b: PointVector): number {
67
+ return (
68
+ Math.acos(
69
+ Math.max(
70
+ Math.min(PointVector.dot(a.normalize(), b.normalize()), 1),
71
+ -1
72
+ )
73
+ ) * 57.29578 // this is 180/pi, used to convert radians to degrees
74
+ )
75
+ }
76
+
77
+ private static dot(lhs: PointVector, rhs: PointVector): number {
78
+ return lhs.x * rhs.x + lhs.y * rhs.y
79
+ }
80
+
81
+ // From: http://stackoverflow.com/a/1501725/1983739
82
+ static distanceFromPointToLineSegmentSq(
83
+ p: PointVector,
84
+ v: PointVector, // start of line segment
85
+ w: PointVector // end of line segment
86
+ ): number {
87
+ const l2 = PointVector.distanceSq(v, w)
88
+ if (l2 === 0) return PointVector.distanceSq(p, v)
89
+
90
+ let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2
91
+ t = Math.max(0, Math.min(1, t))
92
+ return PointVector.distanceSq(
93
+ p,
94
+ new PointVector(v.x + t * (w.x - v.x), v.y + t * (w.y - v.y))
95
+ )
96
+ }
97
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Prevents creating multiple promises for a single key.
3
+ *
4
+ * If an existing promise for a key is pending, that promise will be returned without
5
+ * creating a new one.
6
+ *
7
+ * If a promise throws an error, it will be discarded, and a new one created the next
8
+ * time a key is requested.
9
+ *
10
+ * For now it only supports primitive value keys, but we can extend it if necessary.
11
+ */
12
+ export class PromiseCache<Key extends string | number | undefined, Result> {
13
+ constructor(private createPromiseFromKey: (key: Key) => Promise<Result>) {}
14
+
15
+ private promisesByKey = new Map<Key, Promise<Result>>()
16
+
17
+ get(key: Key): Promise<Result> {
18
+ if (!this.promisesByKey.has(key)) {
19
+ this.promisesByKey.set(
20
+ key,
21
+ // Make sure to attach .catch() _before_ adding it to the cache.
22
+ // Otherwise external logic would be able to attach a catch() that
23
+ // could make this one unreachable.
24
+ this.createPromiseFromKey(key).catch((error) => {
25
+ this.promisesByKey.delete(key)
26
+ throw error
27
+ })
28
+ )
29
+ }
30
+ return this.promisesByKey.get(key)!
31
+ }
32
+
33
+ has(key: Key): boolean {
34
+ return this.promisesByKey.has(key)
35
+ }
36
+ }
@@ -0,0 +1,52 @@
1
+ interface PromiseSelectorArg<Result> {
2
+ onResolve?: (result: Result) => void
3
+ onReject?: (error: any) => void
4
+ }
5
+
6
+ /**
7
+ * An alternative to cancellable promises. Allows set()-ing a single promise,
8
+ * discarding the results of any previous ones, regardless whether they
9
+ * resolve or reject.
10
+ *
11
+ * The problem it solves:
12
+ *
13
+ * 1. User interacts with UI
14
+ * 2. Request sent to fetch required data: `getViewData().then((data) => updateView(data))`
15
+ * 3. But now what if the user navigates away? When the promise completes, it will
16
+ * update the view regardless.
17
+ *
18
+ * In order to solve this, we use `switcher = PromiseSwitcher({ onResolve: updateView })`
19
+ * And then send off requests with `switcher.set(getViewData())`
20
+ * If set() is called with a new Promise while the previous is still pending, the
21
+ * pending promise is ignored – it doesn't call `onResolve` or `onReject`.
22
+ *
23
+ */
24
+ export class PromiseSwitcher<Result> {
25
+ private pendingPromise: Promise<Result> | undefined
26
+
27
+ private onResolve?: (result: Result) => void
28
+ private onReject?: (error: any) => void
29
+
30
+ constructor(arg: PromiseSelectorArg<Result>) {
31
+ this.onResolve = arg.onResolve
32
+ this.onReject = arg.onReject
33
+ }
34
+
35
+ async set(promise: Promise<Result>): Promise<void> {
36
+ this.pendingPromise = promise
37
+ try {
38
+ const result = await promise
39
+ if (this.pendingPromise === promise) {
40
+ this.onResolve?.(result)
41
+ }
42
+ } catch (error) {
43
+ if (this.pendingPromise === promise) {
44
+ this.onReject?.(error)
45
+ }
46
+ }
47
+ }
48
+
49
+ clear(): void {
50
+ this.pendingPromise = undefined
51
+ }
52
+ }
@@ -0,0 +1,130 @@
1
+ import {
2
+ EPOCH_DATE,
3
+ Time,
4
+ TimeBound,
5
+ TimeBoundValue,
6
+ TimeBoundValueStr,
7
+ } from "../types/index.js"
8
+ import {
9
+ parseIntOrUndefined,
10
+ diffDateISOStringInDays,
11
+ formatDay,
12
+ isNegativeInfinity,
13
+ isPositiveInfinity,
14
+ } from "./Util.js"
15
+ import * as R from "remeda"
16
+
17
+ export const timeFromTimebounds = (
18
+ timeBound: TimeBound,
19
+ minTime: Time,
20
+ maxTime: Time
21
+ ): number => {
22
+ switch (timeBound) {
23
+ case -Infinity:
24
+ return minTime
25
+ case Infinity:
26
+ return maxTime
27
+ default:
28
+ return timeBound
29
+ }
30
+ }
31
+
32
+ const hasAnInfinity = (timeBound: TimeBound): timeBound is TimeBoundValue =>
33
+ isNegativeInfinity(timeBound) || isPositiveInfinity(timeBound)
34
+
35
+ const formatTimeBound = (timeBound: TimeBound): string => {
36
+ if (isNegativeInfinity(timeBound)) return TimeBoundValueStr.unboundedLeft
37
+ if (isPositiveInfinity(timeBound)) return TimeBoundValueStr.unboundedRight
38
+ return `${timeBound}`
39
+ }
40
+
41
+ const parseTimeBound = (str: string): TimeBound | undefined => {
42
+ if (str === TimeBoundValueStr.unboundedLeft)
43
+ return TimeBoundValue.negativeInfinity
44
+
45
+ if (str === TimeBoundValueStr.unboundedRight)
46
+ return TimeBoundValue.positiveInfinity
47
+
48
+ return parseIntOrUndefined(str)
49
+ }
50
+
51
+ // Use this to not repeat logic
52
+ const fromJSON = (value: TimeBound | string | undefined): number | undefined =>
53
+ R.isString(value) ? parseTimeBound(value) : value
54
+
55
+ const toJSON = (
56
+ bound: TimeBound | undefined
57
+ ): TimeBoundValueStr | number | undefined => {
58
+ if (bound === undefined) return undefined
59
+ if (isNegativeInfinity(bound)) return TimeBoundValueStr.unboundedLeft
60
+ if (isPositiveInfinity(bound)) return TimeBoundValueStr.unboundedRight
61
+ return bound
62
+ }
63
+
64
+ export const minTimeBoundFromJSONOrNegativeInfinity = (
65
+ minTime: TimeBound | string | undefined
66
+ ): TimeBound => fromJSON(minTime) ?? TimeBoundValue.negativeInfinity
67
+
68
+ export const maxTimeBoundFromJSONOrPositiveInfinity = (
69
+ maxTime: TimeBound | string | undefined
70
+ ): TimeBound => fromJSON(maxTime) ?? TimeBoundValue.positiveInfinity
71
+
72
+ export const minTimeToJSON = toJSON
73
+ export const maxTimeToJSON = toJSON
74
+
75
+ const reISODateComponent = new RegExp("\\d{4}-[01]\\d-[0-3]\\d")
76
+ const reISODate = new RegExp(`^(${reISODateComponent.source})$`)
77
+
78
+ export const timeBoundToTimeBoundString = (
79
+ timeBound: TimeBound,
80
+ isDate: boolean
81
+ ): string => {
82
+ if (hasAnInfinity(timeBound)) return formatTimeBound(timeBound)
83
+ return isDate
84
+ ? formatDay(timeBound, { format: "YYYY-MM-DD" })
85
+ : `${timeBound}`
86
+ }
87
+
88
+ const parseTimeURIComponent = (param: string): TimeBound | undefined =>
89
+ reISODate.test(param)
90
+ ? diffDateISOStringInDays(param, EPOCH_DATE)
91
+ : parseTimeBound(param)
92
+
93
+ const upgradeLegacyTimeString = (time: string): string => {
94
+ // In the past we supported unbounded time parameters like time=2015.. which would be
95
+ // equivalent to time=2015..latest. We don't actively generate these kinds of URL any
96
+ // more because URLs ending with dots are not interpreted correctly by many services
97
+ // (Twitter, Facebook and others) - but we still want to recognize incoming requests
98
+ // for these "legacy" URLs!
99
+ if (time === "..") return "earliest..latest"
100
+ return time.endsWith("..")
101
+ ? time + "latest"
102
+ : time.startsWith("..")
103
+ ? "earliest" + time
104
+ : time
105
+ }
106
+
107
+ export const getTimeDomainFromQueryString = (
108
+ time: string
109
+ ): [number, number] => {
110
+ time = upgradeLegacyTimeString(time)
111
+
112
+ const reIntComponent = new RegExp("\\-?\\d+")
113
+ const reIntRange = new RegExp(
114
+ `^(${reIntComponent.source}|earliest)\\.\\.(${reIntComponent.source}|latest)$`
115
+ )
116
+ const reDateRange = new RegExp(
117
+ `^(${reISODateComponent.source}|earliest)\\.\\.(${reISODateComponent.source}|latest)$`
118
+ )
119
+ if (reIntRange.test(time) || reDateRange.test(time)) {
120
+ const [start, end] = time.split("..")
121
+ return [
122
+ parseTimeURIComponent(start) ?? TimeBoundValue.negativeInfinity,
123
+ parseTimeURIComponent(end) ?? TimeBoundValue.positiveInfinity,
124
+ ]
125
+ }
126
+
127
+ const timebound =
128
+ parseTimeURIComponent(time) ?? TimeBoundValue.positiveInfinity
129
+ return [timebound, timebound]
130
+ }
@@ -0,0 +1,57 @@
1
+ import * as React from "react"
2
+ import { default as OriginalTippy, TippyProps } from "@tippyjs/react"
3
+
4
+ interface CustomTippyProps extends TippyProps {
5
+ lazy?: boolean
6
+ }
7
+
8
+ export const Tippy = (props: CustomTippyProps): React.ReactElement => {
9
+ const { lazy, ...tippyProps } = props
10
+
11
+ const TippyInstance = lazy ? LazyTippy : OriginalTippy
12
+ return <TippyInstance theme="light" {...tippyProps} />
13
+ }
14
+
15
+ // A Tippy instance that only evaluates `content` when the tooltip is shown.
16
+ // Taken from https://gist.github.com/atomiks/520f4b0c7b537202a23a3059d4eec908
17
+ // This will hopefully become supported in Tippy itself someday: See https://github.com/atomiks/tippyjs-react/issues/209
18
+ export const LazyTippy = (props: TippyProps): React.ReactElement => {
19
+ const [mounted, setMounted] = React.useState(false)
20
+
21
+ const lazyPlugin = {
22
+ fn: (): { onMount: () => void; onHidden: () => void } => ({
23
+ onMount: (): void => setMounted(true),
24
+ onHidden: (): void => setMounted(false),
25
+ }),
26
+ }
27
+
28
+ const computedProps = { ...props }
29
+
30
+ computedProps.plugins = [lazyPlugin, ...(props.plugins || [])]
31
+
32
+ if (props.render) {
33
+ const render = props.render // let TypeScript safely derive that render is not undefined
34
+ computedProps.render = (...args): React.ReactNode =>
35
+ mounted ? render(...args) : ""
36
+ } else {
37
+ computedProps.content = mounted ? props.content : ""
38
+ }
39
+
40
+ return <Tippy {...computedProps} />
41
+ }
42
+
43
+ interface TippyIfInteractiveProps extends CustomTippyProps {
44
+ isInteractive: boolean
45
+ }
46
+
47
+ // We sometimes need a conditional Tippy instance, i.e. a Tippy that is only hooked up to
48
+ // interactive charts (and not in static SVG exports etc.). This is that: If `isInteractive=false`,
49
+ // then it bypasses Tippy and just renders the children.
50
+ export const TippyIfInteractive = (
51
+ props: TippyIfInteractiveProps
52
+ ): React.ReactElement => {
53
+ const { isInteractive, ...tippyProps } = props
54
+
55
+ if (isInteractive) return <Tippy {...tippyProps} />
56
+ else return <>{props.children}</>
57
+ }