@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,184 @@
1
+ import {
2
+ FacetAxisDomain,
3
+ GrapherInterface,
4
+ GrapherQueryParams,
5
+ TimeBoundValueStr,
6
+ } from "../../types/index.js"
7
+ import {
8
+ generateFocusedSeriesNamesParam,
9
+ generateSelectedEntityNamesParam,
10
+ } from "./EntityUrlBuilder.js"
11
+ import { match } from "ts-pattern"
12
+ import { GrapherState } from "./GrapherState.js"
13
+ import * as R from "remeda"
14
+ import {
15
+ DEFAULT_GLOBE_ROTATION,
16
+ DEFAULT_GLOBE_ZOOM,
17
+ } from "../mapCharts/MapChartConstants.js"
18
+
19
+ // This function converts a (potentially partial) GrapherInterface to the query params this translates to.
20
+ // This is helpful for when we have a patch config to a parent chart, and we want to know which query params we need to get the parent chart as close as possible to the patched child chart.
21
+ // Note that some settings cannot be set in the config, so they are always set to undefined.
22
+ export const grapherConfigToQueryParams = (
23
+ config: GrapherInterface
24
+ ): GrapherQueryParams => {
25
+ const { minTime, maxTime } = config // can be a number, or "earliest" or "latest"
26
+
27
+ // Note that this code will never format dates in yyyy-mm-dd format.
28
+ // For us to know that we're working with daily data, we need to have a DayColumn instance, which we only have when we have a grapher instance.
29
+ // Instead, we just serialize a date as a number - which also works fine for query params.
30
+ const timeParam =
31
+ minTime === maxTime
32
+ ? minTime // This case also covers the case where both are undefined, in which case the result is also undefined
33
+ : `${minTime ?? TimeBoundValueStr.unboundedLeft}..${maxTime ?? TimeBoundValueStr.unboundedRight}`
34
+
35
+ const paramsRaw: Record<
36
+ keyof GrapherQueryParams,
37
+ string | number | boolean | undefined
38
+ > = {
39
+ tab: config.tab,
40
+ xScale: config.xAxis?.scaleType,
41
+ yScale: config.yAxis?.scaleType,
42
+ stackMode: config.stackMode,
43
+ zoomToSelection: config.zoomToSelection,
44
+ endpointsOnly: config.compareEndPointsOnly,
45
+ time: timeParam,
46
+ region: config.map?.region,
47
+ facet: config.selectedFacetStrategy,
48
+ uniformYAxis: match(config.yAxis?.facetDomain)
49
+ .with(FacetAxisDomain.shared, () => 0)
50
+ .with(FacetAxisDomain.independent, () => 1)
51
+ .with(undefined, () => undefined)
52
+ .exhaustive(),
53
+ showNoDataArea: match(config.showNoDataArea)
54
+ .when(
55
+ (s) => typeof s === "boolean",
56
+ (s) => Number(s) // 1 or 0
57
+ )
58
+ .with(undefined, () => undefined)
59
+ .exhaustive(),
60
+ country: config.selectedEntityNames
61
+ ? generateSelectedEntityNamesParam(config.selectedEntityNames)
62
+ : undefined,
63
+ focus: config.focusedSeriesNames
64
+ ? generateFocusedSeriesNamesParam(config.focusedSeriesNames)
65
+ : undefined,
66
+ mapSelect: config.map?.selectedEntityNames
67
+ ? generateSelectedEntityNamesParam(config.map.selectedEntityNames)
68
+ : undefined,
69
+ globe: config.map?.globe?.isActive ? 1 : undefined,
70
+ globeRotation: configGlobeRotationToQueryParam(
71
+ config.map?.globe?.rotation
72
+ ),
73
+ globeZoom: configGlobeZoomToQueryParam(config.map?.globe?.zoom),
74
+
75
+ // These cannot be specified in config, so we always set them to undefined
76
+ showSelectionOnlyInTable: undefined,
77
+ overlay: undefined,
78
+ tableFilter: undefined,
79
+ tableSearch: undefined,
80
+ }
81
+
82
+ // Drop undefined values and convert all to string
83
+ const params = Object.entries(paramsRaw).reduce(
84
+ (acc, [currKey, currVal]) => {
85
+ if (currVal !== undefined)
86
+ acc[currKey as keyof GrapherQueryParams] = currVal.toString()
87
+ return acc
88
+ },
89
+ {} as GrapherQueryParams
90
+ )
91
+ return params
92
+ }
93
+
94
+ export const grapherObjectToQueryParams = (
95
+ grapher: GrapherState
96
+ ): GrapherQueryParams => {
97
+ const params: GrapherQueryParams = {
98
+ tab: grapher.mapGrapherTabToQueryParam(grapher.activeTab),
99
+ xScale: grapher.xAxis?.scaleType,
100
+ yScale: grapher.yAxis?.scaleType,
101
+ stackMode: grapher.stackMode,
102
+ zoomToSelection: grapher.zoomToSelection ? "true" : undefined,
103
+ endpointsOnly: grapher.compareEndPointsOnly ? "1" : "0",
104
+ time: grapher.timeParam,
105
+ region: grapher.map.region,
106
+ facet: grapher.selectedFacetStrategy,
107
+ uniformYAxis:
108
+ grapher.yAxis.facetDomain === FacetAxisDomain.independent
109
+ ? "0"
110
+ : "1",
111
+ showNoDataArea: grapher.showNoDataArea ? "1" : "0",
112
+ country: grapher.areSelectedEntitiesDifferentThanAuthors
113
+ ? generateSelectedEntityNamesParam(
114
+ grapher.selection.selectedEntityNames
115
+ )
116
+ : undefined,
117
+ focus: grapher.areFocusedSeriesNamesDifferentThanAuthors
118
+ ? generateFocusedSeriesNamesParam(grapher.focusArray.seriesNames)
119
+ : undefined,
120
+ mapSelect: generateSelectedEntityNamesParam(
121
+ grapher.mapConfig.selection.selectedEntityNames
122
+ ),
123
+ globe: grapher.mapConfig.globe.isActive ? "1" : "0",
124
+ globeRotation: !R.isDeepEqual(
125
+ grapher.mapConfig.globe.rotation,
126
+ DEFAULT_GLOBE_ROTATION
127
+ )
128
+ ? stringifyGlobeRotation(grapher.mapConfig.globe.rotation)
129
+ : undefined,
130
+ globeZoom:
131
+ grapher.mapConfig.globe.zoom !== DEFAULT_GLOBE_ZOOM
132
+ ? R.round(grapher.mapConfig.globe.zoom, 2).toString()
133
+ : undefined,
134
+ tableFilter: grapher.dataTableConfig.filter,
135
+ tableSearch: grapher.dataTableConfig.search,
136
+ overlay: grapher.overlayParam,
137
+ }
138
+ return params
139
+ }
140
+
141
+ /**
142
+ * Maps the globe rotation given in a config, which is [lat, lon], to a query param
143
+ * which is [lat, lon] as well. The default globe rotation is not persisted.
144
+ */
145
+ function configGlobeRotationToQueryParam(
146
+ configGlobeRotationLatLon?: [number, number]
147
+ ): string | undefined {
148
+ if (!configGlobeRotationLatLon) return undefined
149
+
150
+ // don't persist the default globe rotation
151
+ const isDefaultRotation = R.isDeepEqual(
152
+ configGlobeRotationLatLon,
153
+ // we use [lon, lat] internally, but here we are given [lat, lon]
154
+ R.reverse(DEFAULT_GLOBE_ROTATION)
155
+ )
156
+ if (isDefaultRotation) return undefined
157
+
158
+ return configGlobeRotationLatLon.map((r) => R.round(r, 2)).join(",")
159
+ }
160
+
161
+ function configGlobeZoomToQueryParam(zoom?: number): string | undefined {
162
+ if (!zoom) return undefined
163
+
164
+ // don't persist the default zoom level
165
+ if (zoom === DEFAULT_GLOBE_ZOOM) return undefined
166
+
167
+ return zoom.toString()
168
+ }
169
+
170
+ export function parseGlobeRotation(latLon: string): [number, number] {
171
+ // we use [lon, lat] internally and [lat, lon] in the URL
172
+ const [lat, lon] = latLon
173
+ .split(",")
174
+ .map((s) => +s)
175
+ .slice(0, 2) as [number, number]
176
+ return [lon, lat]
177
+ }
178
+
179
+ function stringifyGlobeRotation(lonLat: number[]): string {
180
+ // we use [lon, lat] internally and [lat, lon] in the URL
181
+ const lon = R.round(lonLat[0], 2)
182
+ const lat = R.round(lonLat[1], 2)
183
+ return [lat, lon].join(",")
184
+ }
@@ -0,0 +1,29 @@
1
+ import {
2
+ QueryParams,
3
+ Url,
4
+ UrlMigration,
5
+ performUrlMigrations,
6
+ } from "../../utils/index.js"
7
+ import { migrateSelectedEntityNamesParam } from "./EntityUrlBuilder"
8
+
9
+ export const grapherUrlMigrations: UrlMigration[] = [
10
+ (url: Url): Url => {
11
+ const { year, time } = url.queryParams
12
+ if (!year) return url
13
+ return url.updateQueryParams({
14
+ year: undefined,
15
+ time: time ?? year,
16
+ })
17
+ },
18
+ migrateSelectedEntityNamesParam,
19
+ ]
20
+
21
+ export const legacyToCurrentGrapherUrl = (url: Url): Url =>
22
+ performUrlMigrations(grapherUrlMigrations, url)
23
+
24
+ export const legacyToCurrentGrapherQueryParams = (
25
+ queryStr: string
26
+ ): QueryParams => {
27
+ const url = Url.fromQueryStr(queryStr)
28
+ return legacyToCurrentGrapherUrl(url).queryParams
29
+ }
@@ -0,0 +1,147 @@
1
+ import * as React from "react"
2
+
3
+ import { Bounds } from "../../utils/index.js"
4
+ import { debounce } from "lodash-es"
5
+ import { GrapherProgrammaticInterface } from "../index.js"
6
+ import { FetchingGrapher } from "./FetchingGrapher.js"
7
+ import {
8
+ ArchiveContext,
9
+ OwidVariableDataMetadataDimensions,
10
+ OwidVariableId,
11
+ } from "../../types/index.js"
12
+ import { loadVariableDataAndMetadata } from "./loadVariable.js"
13
+ import { createRoot } from "react-dom/client"
14
+
15
+ /**
16
+ * Simple error boundary component to catch rendering errors
17
+ */
18
+ class ChartErrorBoundary extends React.Component<
19
+ { children: React.ReactNode },
20
+ { hasError: boolean; error?: Error }
21
+ > {
22
+ constructor(props: { children: React.ReactNode }) {
23
+ super(props)
24
+ this.state = { hasError: false }
25
+ }
26
+
27
+ static getDerivedStateFromError(error: Error): { hasError: boolean; error: Error } {
28
+ return { hasError: true, error }
29
+ }
30
+
31
+ override componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {
32
+ console.error("Chart rendering error:", error, errorInfo)
33
+ }
34
+
35
+ override render(): React.ReactNode {
36
+ if (this.state.hasError) {
37
+ return (
38
+ <div style={{ padding: "20px", textAlign: "center" }}>
39
+ <p>Something went wrong loading this chart.</p>
40
+ <p style={{ fontSize: "12px", color: "#666" }}>
41
+ {this.state.error?.message}
42
+ </p>
43
+ </div>
44
+ )
45
+ }
46
+ return this.props.children
47
+ }
48
+ }
49
+
50
+ export function renderGrapherIntoContainer(
51
+ config: GrapherProgrammaticInterface,
52
+ containerNode: Element,
53
+ dataApiUrl: string,
54
+ {
55
+ archiveContext,
56
+ noCache,
57
+ }: { archiveContext?: ArchiveContext; noCache?: boolean } = {}
58
+ ): void {
59
+ const reactRoot = createRoot(containerNode)
60
+
61
+ const setBoundsFromContainerAndRender = (
62
+ entries: ResizeObserverEntry[]
63
+ ): void => {
64
+ const entry = entries?.[0] // We always observe exactly one element
65
+ if (!entry)
66
+ throw new Error(
67
+ "Couldn't resize grapher, expected exactly one ResizeObserverEntry"
68
+ )
69
+
70
+ // Don't bother rendering if the container is hidden
71
+ // see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent
72
+ if ((entry.target as HTMLElement).offsetParent === null) return
73
+
74
+ const grapherConfigWithBounds = {
75
+ ...config,
76
+ additionalDataLoaderFn: (
77
+ varId: OwidVariableId
78
+ ): Promise<OwidVariableDataMetadataDimensions> =>
79
+ loadVariableDataAndMetadata(varId, dataApiUrl, { noCache }),
80
+ }
81
+
82
+ reactRoot.render(
83
+ <ChartErrorBoundary>
84
+ <FetchingGrapher
85
+ config={grapherConfigWithBounds}
86
+ dataApiUrl={dataApiUrl}
87
+ archiveContext={archiveContext}
88
+ externalBounds={Bounds.fromRect(entry.contentRect)}
89
+ queryStr={grapherConfigWithBounds.queryStr}
90
+ noCache={noCache}
91
+ />
92
+ </ChartErrorBoundary>
93
+ )
94
+ }
95
+
96
+ if (typeof window !== "undefined" && "ResizeObserver" in window) {
97
+ const resizeObserver = new ResizeObserver(
98
+ // Use a leading debounce to render immediately upon first load, and also immediately upon orientation change on mobile
99
+ debounce(setBoundsFromContainerAndRender, 400, {
100
+ leading: true,
101
+ })
102
+ )
103
+ resizeObserver.observe(containerNode)
104
+ } else if (typeof window === "object" && typeof document === "object") {
105
+ // only show the warning when we're in something that roughly resembles a browser
106
+ console.warn(
107
+ "ResizeObserver not available; grapher will not be able to render"
108
+ )
109
+ }
110
+ }
111
+
112
+ export function renderSingleGrapherOnGrapherPage(
113
+ jsonConfig: GrapherProgrammaticInterface,
114
+ dataApiUrl: string,
115
+ {
116
+ archiveContext,
117
+ noCache,
118
+ queryParams,
119
+ }: {
120
+ archiveContext?: ArchiveContext
121
+ noCache?: boolean
122
+ queryParams?: URLSearchParams
123
+ } = {}
124
+ ): void {
125
+ const container = document.getElementsByTagName("figure")[0]
126
+ const queryStrValue = queryParams
127
+ ? `?${queryParams.toString()}`
128
+ : window.location.search
129
+ try {
130
+ renderGrapherIntoContainer(
131
+ {
132
+ ...jsonConfig,
133
+ bindUrlToWindow: true,
134
+ enableKeyboardShortcuts: true,
135
+ queryStr: queryStrValue,
136
+ archiveContext,
137
+ },
138
+ container,
139
+ dataApiUrl,
140
+ { archiveContext, noCache }
141
+ )
142
+ } catch (err) {
143
+ container.innerHTML = `<p>Unable to load interactive visualization</p>`
144
+ container.setAttribute("id", "fallback")
145
+ throw err
146
+ }
147
+ }