@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,229 @@
1
+ import {
2
+ EventCategory,
3
+ GrapherErrorAction,
4
+ type EntityControlEvent,
5
+ type EntitySelectorEvent,
6
+ type GrapherImageDownloadEvent,
7
+ type GrapherInteractionEvent,
8
+ type GrapherAnalyticsContext,
9
+ type GAEvent,
10
+ } from "../../types/index.js"
11
+
12
+ const DEBUG = false
13
+
14
+ type GAEventWithClear = GAEvent & { _clear: boolean }
15
+
16
+ // Add type information for dataLayer global provided by Google Tag Manager
17
+ type WindowWithDataLayer = Window & {
18
+ dataLayer?: (GAEventWithClear | GAConsent)[]
19
+ }
20
+ declare const window: WindowWithDataLayer
21
+
22
+ // taken from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/de66435d18fbdb2684947d16b5cd3a77f876324c/types/gtag.js/index.d.ts#L151-L156
23
+ interface GAConsentParams {
24
+ ad_storage?: "granted" | "denied" | undefined
25
+ analytics_storage?: "granted" | "denied" | undefined
26
+ wait_for_update?: number | undefined
27
+ region?: string[] | undefined
28
+ }
29
+
30
+ type GAConsent = ["consent", "default" | "update", GAConsentParams]
31
+
32
+ // Note: consent-based blocking dealt with at the Google Tag Manager level.
33
+ // Events are discarded if consent not given.
34
+ export class GrapherAnalytics {
35
+ constructor(environment: string = "", version = "1.0.0") {
36
+ this.isDev = environment === "development"
37
+ this.version = version
38
+ }
39
+
40
+ private version: string // Ideally the Git hash commit
41
+ private isDev: boolean
42
+
43
+ logGrapherView(
44
+ slug: string,
45
+ ctx?: { viewConfigId?: string; narrativeChartName?: string }
46
+ ): void {
47
+ this.logToGA({
48
+ event: EventCategory.GrapherView,
49
+ grapherPath: `/grapher/${slug}`,
50
+ viewConfigId: ctx?.viewConfigId,
51
+ narrativeChartName: ctx?.narrativeChartName,
52
+ })
53
+ }
54
+
55
+ logGrapherViewError(error: Error): void {
56
+ this.logToGA({
57
+ event: EventCategory.GrapherError,
58
+ eventAction: GrapherErrorAction.GrapherViewError,
59
+ eventContext: error.message,
60
+ })
61
+ }
62
+
63
+ logEntitiesNotFoundError(entities: string[]): void {
64
+ this.logToGA({
65
+ event: EventCategory.GrapherError,
66
+ eventAction: GrapherErrorAction.EntitiesNotFound,
67
+ eventContext: JSON.stringify(entities),
68
+ })
69
+ }
70
+
71
+ logExplorerView(slug: string, view: Record<string, string>): void {
72
+ this.logToGA({
73
+ event: EventCategory.ExplorerView,
74
+ explorerPath: `/explorers/${slug}`,
75
+ explorerView: JSON.stringify(view),
76
+ })
77
+ }
78
+
79
+ /** Logs events for the globel entity selector used on country pages */
80
+ logGlobalEntitySelector(action: EntityControlEvent, note?: string): void {
81
+ this.logToGA({
82
+ event: EventCategory.GlobalEntitySelectorUsage,
83
+ eventAction: action,
84
+ eventContext: note,
85
+ })
86
+ }
87
+
88
+ /** Logs events for the explorer's entity selector */
89
+ logEntityPickerEvent(action: EntitySelectorEvent, note?: string): void {
90
+ this.logToGA({
91
+ event: EventCategory.ExplorerCountrySelector,
92
+ eventAction: action,
93
+ eventContext: note,
94
+ })
95
+ }
96
+
97
+ /** Logs events for Grapher's entity selector */
98
+ logEntitySelectorEvent(
99
+ action: EntitySelectorEvent,
100
+ ctx: GrapherAnalyticsContext & { target?: string }
101
+ ): void {
102
+ this.logToGA({
103
+ ...grapherAnalyticsContextToGAEventFields(ctx),
104
+ event: EventCategory.GrapherEntitySelector,
105
+ eventAction: action,
106
+ eventTarget: ctx.target,
107
+ })
108
+ }
109
+
110
+ logGrapherImageDownloadEvent(
111
+ action: GrapherImageDownloadEvent,
112
+ ctx: GrapherAnalyticsContext & { context?: Record<string, any> }
113
+ ): void {
114
+ this.logToGA({
115
+ ...grapherAnalyticsContextToGAEventFields(ctx),
116
+ event: EventCategory.GrapherClick,
117
+ eventAction: action,
118
+ eventContext: ctx.context ? JSON.stringify(ctx.context) : undefined,
119
+ })
120
+ }
121
+
122
+ logGrapherInteractionEvent(
123
+ action: GrapherInteractionEvent,
124
+ ctx: GrapherAnalyticsContext & { target?: string }
125
+ ): void {
126
+ this.logToGA({
127
+ ...grapherAnalyticsContextToGAEventFields(ctx),
128
+ event: EventCategory.GrapherHover,
129
+ eventAction: action,
130
+ eventTarget: ctx.target,
131
+ })
132
+ }
133
+
134
+ logGrapherClick(
135
+ action: string = "unknown-action",
136
+ ctx: {
137
+ label?: string
138
+ grapherUrl?: string
139
+ narrativeChartName?: string
140
+ }
141
+ ): void {
142
+ this.logToGA({
143
+ event: EventCategory.GrapherClick,
144
+ eventAction: action,
145
+ eventTarget: ctx.label,
146
+ grapherPath: getPathname(ctx.grapherUrl),
147
+ narrativeChartName: ctx.narrativeChartName,
148
+ })
149
+ }
150
+
151
+ logSiteClick(action: string = "unknown-action", label?: string): void {
152
+ this.logToGA({
153
+ event: EventCategory.SiteClick,
154
+ eventAction: action,
155
+ eventTarget: label,
156
+ })
157
+ }
158
+
159
+ logSiteFormSubmit(
160
+ action: "newsletter-subscribe" | "donate",
161
+ label?: string
162
+ ): void {
163
+ this.logToGA({
164
+ event: EventCategory.SiteFormSubmit,
165
+ eventAction: action,
166
+ eventTarget: label,
167
+ })
168
+ }
169
+
170
+ logKeyboardShortcut(shortcut: string, combo: string): void {
171
+ this.logToGA({
172
+ event: EventCategory.KeyboardShortcut,
173
+ eventAction: shortcut,
174
+ eventContext: combo,
175
+ })
176
+ }
177
+
178
+ protected logToGA(event: GAEvent): void {
179
+ if (DEBUG && this.isDev) {
180
+ // eslint-disable-next-line no-console
181
+ console.log("Analytics.logToGA", event)
182
+ return
183
+ }
184
+ if (typeof window !== "undefined") {
185
+ // It's very important that we clear (_clear) the data layer whenever we push an event,
186
+ // otherwise it will retain all properties from previous events which can lead to
187
+ // confusing and incorrect events data being sent.
188
+ // See https://www.simoahava.com/analytics/two-simple-data-model-tricks/.
189
+ // see also https://github.com/google/data-layer-helper/blob/4a65b385db1fac710d33bf5d1345e598e3d117fc/README.md#preventing-default-recursive-merge
190
+ window.dataLayer?.push({ ...event, _clear: true })
191
+ }
192
+ }
193
+
194
+ updateGAConsentSettings(consent: GAConsentParams): void {
195
+ function pushToDataLayer(..._args: any): void {
196
+ // Google Tag Manager is super weird here: it will not accept a normal array or object
197
+ // being pushed to dataLayer, it absolutely has to be an `Arguments` object.
198
+ // see https://stackoverflow.com/q/60400130/10670163
199
+
200
+ // eslint-disable-next-line prefer-rest-params
201
+ window.dataLayer?.push(arguments as unknown as GAConsent)
202
+ }
203
+ pushToDataLayer("consent", "update", consent)
204
+ }
205
+ }
206
+
207
+ function getPathname(url?: string): string | undefined {
208
+ // GA4 trims metadata fields down to 100 characters, so we want to be concise and only send
209
+ // the pathname, e.g. `/grapher/life-expectancy` or `/explorers/migration`
210
+ if (url === undefined) return undefined
211
+
212
+ try {
213
+ const urlObj = new URL(url)
214
+ return urlObj.pathname
215
+ } catch {
216
+ // Invalid URL, return undefined
217
+ return undefined
218
+ }
219
+ }
220
+
221
+ function grapherAnalyticsContextToGAEventFields(
222
+ ctx: GrapherAnalyticsContext
223
+ ): Partial<GAEvent> {
224
+ return {
225
+ grapherPath: ctx.slug ? `/grapher/${ctx.slug}` : undefined,
226
+ viewConfigId: ctx.viewConfigId,
227
+ narrativeChartName: ctx.narrativeChartName,
228
+ }
229
+ }
@@ -0,0 +1,173 @@
1
+ import {
2
+ EntityName,
3
+ GRAPHER_CHART_TYPES,
4
+ GrapherChartType,
5
+ } from "../../types/index.js"
6
+ import { Bounds } from "../../utils/index.js"
7
+ import { defaultGrapherConfig } from "../schema/defaultGrapherConfig.js"
8
+
9
+ export const GRAPHER_PROD_URL = "https://ourworldindata.org"
10
+
11
+ export const GRAPHER_EMBEDDED_FIGURE_ATTR = "data-grapher-src"
12
+
13
+ export const GRAPHER_NARRATIVE_CHART_CONFIG_FIGURE_ATTR =
14
+ "data-grapher-narrative-chart-config"
15
+
16
+ export const GRAPHER_ROUTE_FOLDER = "grapher"
17
+
18
+ export const GRAPHER_PAGE_BODY_CLASS = "StandaloneGrapherOrExplorerPage"
19
+ export const GRAPHER_IS_IN_IFRAME_CLASS = "IsInIframe"
20
+ export const GRAPHER_TIMELINE_CLASS = "timeline-component"
21
+ export const GRAPHER_SIDE_PANEL_CLASS = "side-panel"
22
+ export const GRAPHER_SETTINGS_CLASS = "GrapherSettingsPopover"
23
+
24
+ // The Figma plugin uses these class names to identify sections of the chart
25
+ export const GRAPHER_CHART_AREA_CLASS = "chart-area"
26
+ export const GRAPHER_HEADER_CLASS = "header"
27
+ export const GRAPHER_FOOTER_CLASS = "footer"
28
+
29
+ export const DEFAULT_GRAPHER_ENTITY_TYPE = "country or region"
30
+ export const DEFAULT_GRAPHER_ENTITY_TYPE_PLURAL = "countries and regions"
31
+
32
+ export const GRAPHER_LOADED_EVENT_NAME = "grapherLoaded"
33
+
34
+ export const DEFAULT_GRAPHER_WIDTH = 850
35
+ export const DEFAULT_GRAPHER_HEIGHT = 600
36
+
37
+ // Keep in sync with $grapher-thumbnail-width and $grapher-thumbnail-height in Grapher.scss
38
+ export const GRAPHER_THUMBNAIL_WIDTH = 300
39
+ export const GRAPHER_THUMBNAIL_HEIGHT = 160
40
+
41
+ // Image widths used for generating srcSet (1x and 2x for high-DPI displays)
42
+ export const GRAPHER_IMAGE_WIDTH_1X = 850
43
+ export const GRAPHER_IMAGE_WIDTH_2X = 1700
44
+
45
+ export const GRAPHER_SQUARE_SIZE = 540
46
+
47
+ export const DEFAULT_GRAPHER_BOUNDS = new Bounds(
48
+ 0,
49
+ 0,
50
+ DEFAULT_GRAPHER_WIDTH,
51
+ DEFAULT_GRAPHER_HEIGHT
52
+ )
53
+
54
+ export const DEFAULT_GRAPHER_BOUNDS_SQUARE = new Bounds(
55
+ 0,
56
+ 0,
57
+ GRAPHER_SQUARE_SIZE,
58
+ GRAPHER_SQUARE_SIZE
59
+ )
60
+
61
+ export const GRAPHER_FRAME_PADDING_VERTICAL = 16
62
+ export const GRAPHER_FRAME_PADDING_HORIZONTAL = 16
63
+
64
+ export const STATIC_EXPORT_DETAIL_SPACING = 8
65
+
66
+ export const GRAPHER_OPACITY_MUTE = 0.5
67
+
68
+ export const GRAPHER_AREA_OPACITY_DEFAULT = 0.8
69
+ export const GRAPHER_AREA_OPACITY_MUTE = 0.3
70
+ export const GRAPHER_AREA_OPACITY_FOCUS = 1
71
+
72
+ export const GRAPHER_TEXT_OUTLINE_FACTOR = 0.25
73
+
74
+ export const BASE_FONT_SIZE = 16
75
+
76
+ export const GRAPHER_FONT_SCALE_9_6 = 9.6 / BASE_FONT_SIZE
77
+ export const GRAPHER_FONT_SCALE_10 = 10 / BASE_FONT_SIZE
78
+ export const GRAPHER_FONT_SCALE_10_5 = 10.5 / BASE_FONT_SIZE
79
+ export const GRAPHER_FONT_SCALE_11 = 11 / BASE_FONT_SIZE
80
+ export const GRAPHER_FONT_SCALE_11_2 = 11.2 / BASE_FONT_SIZE
81
+ export const GRAPHER_FONT_SCALE_12 = 12 / BASE_FONT_SIZE
82
+ export const GRAPHER_FONT_SCALE_12_8 = 12.8 / BASE_FONT_SIZE
83
+ export const GRAPHER_FONT_SCALE_13 = 13 / BASE_FONT_SIZE
84
+ export const GRAPHER_FONT_SCALE_14 = 14 / BASE_FONT_SIZE
85
+ export const GRAPHER_FONT_SCALE_18 = 18 / BASE_FONT_SIZE
86
+
87
+ // keep in sync with $max-tooltip-width in Tooltip.scss
88
+ export const GRAPHER_MAX_TOOLTIP_WIDTH = 400
89
+
90
+ export const latestGrapherConfigSchema = defaultGrapherConfig.$schema
91
+
92
+ export enum CookieKey {
93
+ isAdmin = "isAdmin",
94
+ }
95
+
96
+ export const WORLD_ENTITY_NAME = "World"
97
+
98
+ export const isWorldEntityName = (entityName: EntityName): boolean =>
99
+ entityName === WORLD_ENTITY_NAME
100
+
101
+ export const CONTINENTS_INDICATOR_ID = 900801 // "Countries Continent"
102
+ export const POPULATION_INDICATOR_ID_USED_IN_ADMIN = 953899 // "Population (various sources, 2024-07-15)"
103
+ export const POPULATION_INDICATOR_ID_USED_IN_ENTITY_SELECTOR = 953903 // "Population (historical) (various sources, 2024-07-15)"
104
+ export const GDP_PER_CAPITA_INDICATOR_ID_USED_IN_ENTITY_SELECTOR = 900793 // "GDP per capita - Maddison Project Database (2024-04-26)"
105
+
106
+ export const isContinentsVariableId = (id: string | number): boolean =>
107
+ id.toString() === CONTINENTS_INDICATOR_ID.toString()
108
+
109
+ // ETL paths are composed of channel/namespace/version/dataset/table#columnname
110
+ // We want to identify the any version of these two columns (added whitespaces for readability):
111
+ // grapher / demography / ANY VERSION / population / population # population
112
+ // grapher / demography / ANY VERSION / population / historical # population_historical
113
+ const population_regex =
114
+ /^grapher\/demography\/[\d-]+\/population\/(population#population|historical#population_historical)$/
115
+
116
+ /**
117
+ * Manually configured list of sources that define geographic regions.
118
+ *
119
+ * By convention, entities are named with the format 'RegionName (Source)',
120
+ * such as 'Africa (UN)' or 'Africa (FAO)'.
121
+ *
122
+ * These source identifiers are used to compile group of regions for the
123
+ * filter dropdown in the entity selector and on the data tab.
124
+ *
125
+ * Ideally, all regions would be defined in the ETL's regions file,
126
+ * but currently we need to maintain this manual configuration until the
127
+ * regions file is more complete.
128
+ */
129
+ export const CUSTOM_REGION_SOURCE_IDS = [
130
+ "un",
131
+ "fao",
132
+ "ei",
133
+ "pip",
134
+ "ember",
135
+ "gcp",
136
+ "niaid",
137
+ "unicef",
138
+ "unaids",
139
+ "undp",
140
+ "wid",
141
+ "oecd",
142
+ ] as const
143
+
144
+ export const isPopulationVariableETLPath = (path: string): boolean => {
145
+ return population_regex.test(path)
146
+ }
147
+
148
+ export enum Patterns {
149
+ noDataPattern = "noDataPattern",
150
+ noDataPatternForMap = "noDataPatternForMap",
151
+ noDataPatternForGlobe = "noDataPatternForGlobe",
152
+ projectedDataPattern = "projectedDataPattern",
153
+ projectedDataPatternForLegend = "projectedDataPatternForLegend",
154
+ }
155
+
156
+ export const SVG_STYLE_PROPS: React.CSSProperties = {
157
+ fontFamily:
158
+ "Lato, 'Helvetica Neue', Helvetica, Arial, 'Liberation Sans', sans-serif",
159
+ fontFeatureSettings: '"liga", "kern", "calt", "lnum"', // keep in sync with typography.scss$default-font-features
160
+ textRendering: "geometricPrecision",
161
+ WebkitFontSmoothing: "antialiased",
162
+ }
163
+
164
+ export enum GrapherModal {
165
+ Sources = "sources",
166
+ Download = "download",
167
+ Embed = "embed",
168
+ }
169
+
170
+ export const CHART_TYPES_THAT_SHOW_ALL_ENTITIES: GrapherChartType[] = [
171
+ GRAPHER_CHART_TYPES.ScatterPlot,
172
+ GRAPHER_CHART_TYPES.Marimekko,
173
+ ]