@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,147 @@
1
+ import { Color, CoreValueType } from "../../types/index.js"
2
+ import { NO_DATA_LABEL, PROJECTED_DATA_LABEL } from "./ColorScale"
3
+
4
+ interface BinProps {
5
+ color: Color
6
+ label?: string
7
+ patternRef?: string
8
+ }
9
+
10
+ interface NumericBinProps extends BinProps {
11
+ isFirst: boolean
12
+ isOpenLeft: boolean
13
+ isOpenRight: boolean
14
+ min: number
15
+ max: number
16
+ displayMin: string
17
+ displayMax: string
18
+ }
19
+
20
+ interface CategoricalBinProps extends BinProps {
21
+ index: number
22
+ value: string
23
+ label: string
24
+ isHidden?: boolean
25
+ }
26
+
27
+ abstract class AbstractColorScaleBin<T extends BinProps> {
28
+ props: T
29
+ constructor(props: T) {
30
+ this.props = props
31
+ }
32
+ get color(): string {
33
+ return this.props.color
34
+ }
35
+ get patternRef(): string | undefined {
36
+ return this.props.patternRef
37
+ }
38
+ get label(): string | undefined {
39
+ return this.props.label
40
+ }
41
+ }
42
+
43
+ export class NumericBin extends AbstractColorScaleBin<NumericBinProps> {
44
+ get min(): number {
45
+ return this.props.min
46
+ }
47
+ get max(): number {
48
+ return this.props.max
49
+ }
50
+ get minText(): string {
51
+ if (this.props.isOpenLeft) return ""
52
+ return this.props.displayMin
53
+ }
54
+ get maxText(): string {
55
+ if (this.props.isOpenRight) return ""
56
+ return this.props.displayMax
57
+ }
58
+ get text(): string {
59
+ return this.props.label || ""
60
+ }
61
+ get isHidden(): boolean {
62
+ return false
63
+ }
64
+
65
+ contains(value: CoreValueType | undefined): boolean {
66
+ if (typeof value !== "number") return false
67
+
68
+ // In looking at this code, it is important to realise that `isOpenLeft`, `isOpenRight`,
69
+ // and `isFirst` are _not_ mutually exclusive.
70
+ // For example, if both `isOpenRight` and `isFirst` are set, then we effectively want `value >= min`.
71
+
72
+ // If the bin is left-open, we just need to check the right side
73
+ if (this.props.isOpenLeft && value <= this.max) return true
74
+
75
+ // If the bin is right-open, we just need to check the left side
76
+ if (this.props.isOpenRight && value > this.min) return true
77
+
78
+ // If this is the first bin of the chart, we want to include the `min` value and thus use greater-equals
79
+ if (this.props.isFirst) {
80
+ return value >= this.min && value <= this.max
81
+ } else {
82
+ return value > this.min && value <= this.max
83
+ }
84
+ }
85
+
86
+ equals(other: ColorScaleBin): boolean {
87
+ return (
88
+ other instanceof NumericBin &&
89
+ this.min === other.min &&
90
+ this.max === other.max
91
+ )
92
+ }
93
+ }
94
+
95
+ export class CategoricalBin extends AbstractColorScaleBin<CategoricalBinProps> {
96
+ get index(): number {
97
+ return this.props.index
98
+ }
99
+ get value(): string {
100
+ return this.props.value
101
+ }
102
+ get isHidden(): boolean | undefined {
103
+ return this.props.isHidden
104
+ }
105
+
106
+ get text(): string {
107
+ return this.props.label || this.props.value
108
+ }
109
+
110
+ contains(
111
+ value: CoreValueType | undefined,
112
+ { isProjection = false } = {}
113
+ ): boolean {
114
+ return (
115
+ (value === undefined && this.props.value === NO_DATA_LABEL) ||
116
+ (value !== undefined &&
117
+ isProjection &&
118
+ this.props.value === PROJECTED_DATA_LABEL) ||
119
+ (value !== undefined && value === this.props.value)
120
+ )
121
+ }
122
+
123
+ equals(other: ColorScaleBin): boolean {
124
+ return (
125
+ other instanceof CategoricalBin &&
126
+ this.props.index === other.props.index
127
+ )
128
+ }
129
+ }
130
+
131
+ export function isCategoricalBin(bin: ColorScaleBin): bin is CategoricalBin {
132
+ return bin instanceof CategoricalBin
133
+ }
134
+
135
+ export function isNumericBin(bin: ColorScaleBin): bin is NumericBin {
136
+ return bin instanceof NumericBin
137
+ }
138
+
139
+ export function isNoDataBin(bin: ColorScaleBin): bin is CategoricalBin {
140
+ return isCategoricalBin(bin) && bin.value === NO_DATA_LABEL
141
+ }
142
+
143
+ export function isProjectedDataBin(bin: ColorScaleBin): bin is CategoricalBin {
144
+ return isCategoricalBin(bin) && bin.value === PROJECTED_DATA_LABEL
145
+ }
146
+
147
+ export type ColorScaleBin = CategoricalBin | NumericBin
@@ -0,0 +1,204 @@
1
+ import * as _ from "lodash-es"
2
+ import { observable, makeObservable } from "mobx"
3
+ import {
4
+ Color,
5
+ ColumnColorScale,
6
+ BinningStrategyIncludingManual,
7
+ ColorSchemeName,
8
+ ColorScaleConfigInterface,
9
+ MidpointMode,
10
+ } from "../../types/index.js"
11
+ import {
12
+ trimObject,
13
+ deleteRuntimeAndUnchangedProps,
14
+ objectWithPersistablesToObject,
15
+ Persistable,
16
+ updatePersistables,
17
+ } from "../../utils/index.js"
18
+
19
+ import { NO_DATA_LABEL } from "./ColorScale"
20
+
21
+ export class ColorScaleConfigDefaults implements ColorScaleConfigInterface {
22
+ // Color scheme
23
+ // ============
24
+
25
+ /** Key for a colorbrewer scheme */
26
+ baseColorScheme: ColorSchemeName | undefined = undefined
27
+
28
+ /** Reverse the order of colors in the color scheme (defined by `baseColorScheme`) */
29
+ colorSchemeInvert: boolean | undefined = undefined
30
+
31
+ // Numeric bins
32
+ // ============
33
+
34
+ /** The strategy for generating the bin boundaries */
35
+ binningStrategy: BinningStrategyIncludingManual = "auto"
36
+ createBinForMidpoint?: boolean
37
+ minValue?: number
38
+ maxValue?: number
39
+ midpoint?: number
40
+ midpointMode?: MidpointMode
41
+
42
+ /** Custom maximum brackets for each numeric bin. Only applied when strategy is `manual`. */
43
+ customNumericValues: number[] = []
44
+ /**
45
+ * Custom labels for each numeric bin. Only applied when strategy is `manual`.
46
+ * `undefined` or `null` falls back to default label.
47
+ * We need to handle `null` because JSON serializes `undefined` values
48
+ * inside arrays into `null`.
49
+ */
50
+ customNumericLabels: (string | undefined | null)[] = []
51
+
52
+ /** Whether `customNumericColors` are used to override the color scheme. */
53
+ customNumericColorsActive: boolean | undefined = undefined
54
+ /**
55
+ * Override some or all colors for the numerical color legend.
56
+ * `undefined` or `null` falls back the color scheme color.
57
+ * We need to handle `null` because JSON serializes `undefined` values
58
+ * inside arrays into `null`.
59
+ */
60
+ customNumericColors: (Color | undefined | null)[] = []
61
+
62
+ // Categorical bins
63
+ // ================
64
+
65
+ customCategoryColors: {
66
+ [key: string]: string | undefined
67
+ } = {}
68
+
69
+ customCategoryLabels: {
70
+ [key: string]: string | undefined
71
+ } = {}
72
+
73
+ // Allow hiding categories from the legend
74
+ customHiddenCategories: {
75
+ [key: string]: true | undefined
76
+ } = {}
77
+
78
+ // Other
79
+ // =====
80
+
81
+ /** A custom legend description. Only used in ScatterPlot legend titles for now. */
82
+ legendDescription: string | undefined = undefined
83
+
84
+ constructor() {
85
+ makeObservable(this, {
86
+ baseColorScheme: observable,
87
+ colorSchemeInvert: observable,
88
+ binningStrategy: observable,
89
+ customNumericValues: observable,
90
+ customNumericLabels: observable,
91
+ customNumericColorsActive: observable,
92
+ customNumericColors: observable,
93
+ customCategoryColors: observable.ref,
94
+ customCategoryLabels: observable.ref,
95
+ customHiddenCategories: observable.ref,
96
+ legendDescription: observable,
97
+ createBinForMidpoint: observable,
98
+ minValue: observable,
99
+ maxValue: observable,
100
+ midpoint: observable,
101
+ midpointMode: observable,
102
+ })
103
+ }
104
+ }
105
+
106
+ export class ColorScaleConfig
107
+ extends ColorScaleConfigDefaults
108
+ implements Persistable
109
+ {
110
+ updateFromObject(obj: Record<string, unknown>): void {
111
+ _.extend(this, obj)
112
+ }
113
+
114
+ toObject(): ColorScaleConfigInterface {
115
+ const obj: ColorScaleConfigInterface =
116
+ objectWithPersistablesToObject(this)
117
+ deleteRuntimeAndUnchangedProps(obj, new ColorScaleConfigDefaults())
118
+ return trimObject(obj)
119
+ }
120
+
121
+ constructor(obj?: Partial<ColorScaleConfig>) {
122
+ super()
123
+ updatePersistables(this, obj)
124
+ }
125
+
126
+ static fromDSL(scale: ColumnColorScale): ColorScaleConfig | undefined {
127
+ const colorSchemeInvert = scale.colorScaleInvert
128
+ const baseColorScheme = scale.colorScaleScheme as ColorSchemeName
129
+
130
+ const customNumericValues: number[] = []
131
+ const customNumericLabels: (string | undefined)[] = []
132
+ const customNumericColors: (Color | undefined)[] = []
133
+
134
+ if (scale.colorScaleNumericBins) {
135
+ customNumericValues.push(scale.colorScaleNumericMinValue ?? 0)
136
+
137
+ scale.colorScaleNumericBins
138
+ .split(INTER_BIN_DELIMITER)
139
+ .forEach((bin: string): void => {
140
+ const [value, color, ...label] = bin.split(
141
+ INTRA_BIN_DELIMITER
142
+ ) as (string | undefined)[]
143
+ if (!value) return
144
+ customNumericValues.push(parseFloat(value))
145
+ customNumericColors.push(color?.trim() || undefined)
146
+ customNumericLabels.push(
147
+ label.join(INTRA_BIN_DELIMITER).trim() || undefined
148
+ )
149
+ })
150
+ }
151
+
152
+ const customNumericColorsActive =
153
+ customNumericColors.length > 0 ? true : undefined
154
+
155
+ const customCategoryColors: {
156
+ [key: string]: string | undefined
157
+ } = {}
158
+ const customCategoryLabels: {
159
+ [key: string]: string | undefined
160
+ } = {}
161
+ scale.colorScaleCategoricalBins
162
+ ?.split(INTER_BIN_DELIMITER)
163
+ .forEach((bin: string): void => {
164
+ const [value, color, ...label] = bin.split(
165
+ INTRA_BIN_DELIMITER
166
+ ) as (string | undefined)[]
167
+ if (!value) return
168
+ customCategoryColors[value] = color?.trim() || undefined
169
+ customCategoryLabels[value] =
170
+ label.join(INTRA_BIN_DELIMITER).trim() || undefined
171
+ })
172
+ if (scale.colorScaleNoDataLabel) {
173
+ customCategoryLabels[NO_DATA_LABEL] = scale.colorScaleNoDataLabel
174
+ }
175
+
176
+ // Use user-defined binning strategy, otherwise set to manual if user has
177
+ // defined custom bins
178
+ const binningStrategy = scale.colorScaleBinningStrategy
179
+ ? (scale.colorScaleBinningStrategy as BinningStrategyIncludingManual)
180
+ : scale.colorScaleNumericBins || scale.colorScaleCategoricalBins
181
+ ? "manual"
182
+ : undefined
183
+
184
+ const legendDescription = scale.colorScaleLegendDescription
185
+
186
+ const trimmed: Partial<ColorScaleConfig> = trimObject({
187
+ colorSchemeInvert,
188
+ baseColorScheme,
189
+ binningStrategy,
190
+ customNumericValues,
191
+ customNumericColors,
192
+ customNumericColorsActive,
193
+ customNumericLabels,
194
+ customCategoryLabels,
195
+ customCategoryColors,
196
+ legendDescription,
197
+ })
198
+
199
+ return _.isEmpty(trimmed) ? undefined : new ColorScaleConfig(trimmed)
200
+ }
201
+ }
202
+
203
+ const INTER_BIN_DELIMITER = ";"
204
+ const INTRA_BIN_DELIMITER = ","
@@ -0,0 +1,137 @@
1
+ // @ts-nocheck
2
+ import * as _ from "lodash-es"
3
+ import { rgb } from "d3-color"
4
+ import { interpolate } from "d3-interpolate"
5
+ import { lastOfNonEmptyArray, Color } from "../../utils/index.js"
6
+ import { ColorSchemeInterface } from "../../types/index.js"
7
+ import { interpolateArray } from "./ColorUtils"
8
+
9
+ export class ColorScheme implements ColorSchemeInterface {
10
+ name: string
11
+ colorSets: Color[][]
12
+ singleColorScale: boolean
13
+ isDistinct: boolean
14
+ colorMap?: Record<string, Color>
15
+
16
+ constructor(
17
+ name: string,
18
+ colorSets: Color[][],
19
+ singleColorScale?: boolean,
20
+ isDistinct?: boolean,
21
+ colorMap?: Record<string, Color>
22
+ ) {
23
+ this.name = name
24
+ this.colorSets = []
25
+ this.singleColorScale = !!singleColorScale
26
+ this.isDistinct = !!isDistinct
27
+ this.colorMap = colorMap
28
+ colorSets.forEach((set) => (this.colorSets[set.length] = set))
29
+ }
30
+
31
+ improviseGradientFromShorter(
32
+ shortColors: Color[],
33
+ numColors: number
34
+ ): Color[] {
35
+ const newColors = _.clone(shortColors)
36
+
37
+ while (newColors.length < numColors) {
38
+ for (let index = newColors.length - 1; index > 0; index -= 1) {
39
+ const startColor = rgb(newColors[index - 1])
40
+ const endColor = rgb(newColors[index])
41
+ const newColor = interpolate(startColor, endColor)(0.5)
42
+ newColors.splice(index, 0, newColor)
43
+
44
+ if (newColors.length >= numColors) break
45
+ }
46
+ }
47
+
48
+ return newColors
49
+ }
50
+
51
+ improviseGradientFromLonger(
52
+ knownColors: Color[],
53
+ numColors: number
54
+ ): Color[] {
55
+ const newColors = []
56
+ const scale = interpolateArray(knownColors)
57
+ for (let index = 0; index < numColors; index++) {
58
+ newColors.push(scale(index / numColors))
59
+ }
60
+ return newColors
61
+ }
62
+
63
+ getGradientColors(numColors: number): Color[] {
64
+ const { colorSets } = this
65
+
66
+ if (colorSets[numColors]) return _.clone(colorSets[numColors])
67
+
68
+ const prevColors = colorSets
69
+ .toReversed()
70
+ .find((set) => set && set.length < numColors)
71
+ if (prevColors)
72
+ return this.improviseGradientFromShorter(prevColors, numColors)
73
+ else
74
+ return this.improviseGradientFromLonger(
75
+ colorSets.find((set) => !!set) as Color[],
76
+ numColors
77
+ )
78
+ }
79
+
80
+ getDistinctColors(numColors: number): Color[] {
81
+ const { colorSets } = this
82
+ if (colorSets.length === 0) return []
83
+ if (colorSets[numColors]) return _.clone(colorSets[numColors])
84
+
85
+ if (numColors > colorSets.length - 1) {
86
+ // If more colors are wanted than we have defined, have to improvise
87
+ const colorSet = lastOfNonEmptyArray(colorSets)
88
+ // Special case for colorSchemes with a single color where the usual interpolation would not work
89
+ if (colorSet.length === 1) return Array(numColors).fill(colorSet[0])
90
+ return this.improviseGradientFromShorter(colorSet, numColors)
91
+ }
92
+
93
+ // We have enough colors but not a specific set for this number-- improvise from the closest longer set
94
+ for (let i = numColors; i < colorSets.length; i++) {
95
+ if (colorSets[i]) {
96
+ return colorSets[i].slice(0, numColors)
97
+ }
98
+ }
99
+
100
+ return []
101
+ }
102
+
103
+ getColors(numColors: number): Color[] {
104
+ return this.isDistinct
105
+ ? this.getDistinctColors(numColors)
106
+ : this.getGradientColors(numColors)
107
+ }
108
+
109
+ getUniqValueColorMap(
110
+ uniqValues: any[],
111
+ inverseOrder?: boolean
112
+ ): Map<number, string> {
113
+ const colors = this.getColors(uniqValues.length) || []
114
+ if (inverseOrder) colors.reverse()
115
+
116
+ // We want to display same values using the same color, e.g. two values of 100 get the same shade of green
117
+ // Therefore, we create a map from all possible (unique) values to the corresponding color
118
+ const colorByValue = new Map<number, Color>()
119
+ uniqValues.forEach((value, index) =>
120
+ colorByValue.set(value, colors[index])
121
+ )
122
+ return colorByValue
123
+ }
124
+
125
+ static fromObject(
126
+ name: string,
127
+ colorSets: { [key: string]: Color[] },
128
+ singleColorScale?: boolean
129
+ ): ColorScheme {
130
+ const colorSetsArray: Color[][] = []
131
+ Object.keys(colorSets).forEach(
132
+ (numColors): string[] =>
133
+ (colorSetsArray[+numColors] = colorSets[numColors])
134
+ )
135
+ return new ColorScheme(name, colorSetsArray, singleColorScale)
136
+ }
137
+ }
@@ -0,0 +1,149 @@
1
+ import * as _ from "lodash-es"
2
+ import { CustomColorSchemes } from "./CustomSchemes"
3
+ import { ColorScheme } from "./ColorScheme"
4
+ import { match } from "ts-pattern"
5
+ import {
6
+ GRAPHER_CHART_TYPES,
7
+ ColorSchemeInterface,
8
+ ColorSchemeName,
9
+ GRAPHER_MAP_TYPE,
10
+ GrapherChartOrMapType,
11
+ } from "../../types/index.js"
12
+ import { getColorBrewerScheme } from "./ColorBrewerSchemes.js"
13
+
14
+ function getPreferredSchemesByType(
15
+ type: GrapherChartOrMapType
16
+ ): ColorSchemeName[] {
17
+ // This function could also be a Map<GrapherChartOrMapType, ColorName[]> but
18
+ // by doing it as a function usign ts-pattern.match we get compile
19
+ // time safety that all enum cases in GrapherChartOrMapType are always handled here
20
+ return match(type)
21
+ .with(GRAPHER_CHART_TYPES.DiscreteBar, () => [
22
+ ColorSchemeName.SingleColorDenim,
23
+ ColorSchemeName.SingleColorDustyCoral,
24
+ ColorSchemeName.SingleColorPurple,
25
+ ColorSchemeName.SingleColorTeal,
26
+ ColorSchemeName.SingleColorDarkCopper,
27
+ ])
28
+ .with(GRAPHER_CHART_TYPES.LineChart, () => [
29
+ ColorSchemeName.OwidDistinctLines,
30
+ ])
31
+ .with(GRAPHER_CHART_TYPES.Marimekko, () => [
32
+ ColorSchemeName.continents,
33
+ ColorSchemeName.SingleColorDenim,
34
+ ColorSchemeName.SingleColorDustyCoral,
35
+ ColorSchemeName.SingleColorPurple,
36
+ ColorSchemeName.SingleColorTeal,
37
+ ColorSchemeName.SingleColorDarkCopper,
38
+ ColorSchemeName.OwidCategoricalA,
39
+ ColorSchemeName.OwidCategoricalB,
40
+ ColorSchemeName.OwidCategoricalC,
41
+ ColorSchemeName.OwidCategoricalD,
42
+ ColorSchemeName.OwidCategoricalE,
43
+ ])
44
+ .with(GRAPHER_CHART_TYPES.ScatterPlot, () => [
45
+ ColorSchemeName.continents,
46
+ ColorSchemeName.OwidDistinctLines,
47
+ ])
48
+ .with(GRAPHER_CHART_TYPES.SlopeChart, () => [
49
+ ColorSchemeName.continents,
50
+ ColorSchemeName.OwidDistinctLines,
51
+ ])
52
+ .with(GRAPHER_CHART_TYPES.StackedArea, () => [
53
+ ColorSchemeName["owid-distinct"],
54
+ ColorSchemeName.OwidCategoricalA,
55
+ ColorSchemeName.OwidCategoricalB,
56
+ ColorSchemeName.OwidCategoricalC,
57
+ ColorSchemeName.OwidCategoricalD,
58
+ ColorSchemeName.OwidCategoricalE,
59
+ ColorSchemeName.SingleColorGradientDenim,
60
+ ColorSchemeName.SingleColorGradientTeal,
61
+ ColorSchemeName.SingleColorGradientPurple,
62
+ ColorSchemeName.SingleColorGradientDustyCoral,
63
+ ColorSchemeName.SingleColorGradientDarkCopper,
64
+ ])
65
+ .with(GRAPHER_CHART_TYPES.StackedBar, () => [
66
+ ColorSchemeName["owid-distinct"],
67
+ ColorSchemeName.OwidCategoricalA,
68
+ ColorSchemeName.OwidCategoricalB,
69
+ ColorSchemeName.OwidCategoricalC,
70
+ ColorSchemeName.OwidCategoricalD,
71
+ ColorSchemeName.OwidCategoricalE,
72
+ ColorSchemeName.SingleColorGradientDenim,
73
+ ColorSchemeName.SingleColorGradientTeal,
74
+ ColorSchemeName.SingleColorGradientPurple,
75
+ ColorSchemeName.SingleColorGradientDustyCoral,
76
+ ColorSchemeName.SingleColorGradientDarkCopper,
77
+ ])
78
+ .with(GRAPHER_CHART_TYPES.StackedDiscreteBar, () => [
79
+ ColorSchemeName["owid-distinct"],
80
+ ColorSchemeName.OwidCategoricalA,
81
+ ColorSchemeName.OwidCategoricalB,
82
+ ColorSchemeName.OwidCategoricalC,
83
+ ColorSchemeName.OwidCategoricalD,
84
+ ColorSchemeName.OwidCategoricalE,
85
+ ColorSchemeName.SingleColorGradientDenim,
86
+ ColorSchemeName.SingleColorGradientTeal,
87
+ ColorSchemeName.SingleColorGradientPurple,
88
+ ColorSchemeName.SingleColorGradientDustyCoral,
89
+ ColorSchemeName.SingleColorGradientDarkCopper,
90
+ ])
91
+ .with(GRAPHER_MAP_TYPE, () => [
92
+ ColorSchemeName.BinaryMapPaletteA,
93
+ ColorSchemeName.BinaryMapPaletteB,
94
+ ColorSchemeName.BinaryMapPaletteC,
95
+ ColorSchemeName.BinaryMapPaletteD,
96
+ ColorSchemeName.BinaryMapPaletteE,
97
+ ])
98
+ .exhaustive()
99
+ }
100
+
101
+ const initColorScheme = (scheme: ColorSchemeInterface): ColorScheme =>
102
+ new ColorScheme(
103
+ scheme.displayName ?? scheme.name,
104
+ scheme.colorSets,
105
+ scheme.singleColorScale,
106
+ scheme.isDistinct,
107
+ scheme.colorMap
108
+ )
109
+
110
+ const _colorSchemes = new Map<ColorSchemeName, ColorScheme>()
111
+
112
+ // This object has a map-like appearance from the outside (with a .get() method),
113
+ // but lazy-loads color schemes as they are requested
114
+ export const ColorSchemes = {
115
+ get: (name: ColorSchemeName): ColorScheme => {
116
+ if (!_colorSchemes.has(name)) {
117
+ const schemeRaw =
118
+ getColorBrewerScheme(name) ??
119
+ CustomColorSchemes.find((s) => s.name === name)
120
+ if (!schemeRaw) throw new Error(`Color scheme ${name} not found`)
121
+ const scheme = initColorScheme(schemeRaw)
122
+ _colorSchemes.set(name, scheme)
123
+ }
124
+ return _colorSchemes.get(name)!
125
+ },
126
+ }
127
+
128
+ const getAllColorSchemes = (): Map<ColorSchemeName, ColorScheme> => {
129
+ return new Map(
130
+ Object.keys(ColorSchemeName).map((key) => [
131
+ key as ColorSchemeName,
132
+ ColorSchemes.get(key as ColorSchemeName),
133
+ ])
134
+ )
135
+ }
136
+
137
+ export function getColorSchemeForChartType(type: GrapherChartOrMapType): {
138
+ [key in ColorSchemeName]: ColorScheme
139
+ } {
140
+ const preferred = new Set(getPreferredSchemesByType(type))
141
+ const allSchemes = getAllColorSchemes()
142
+ const [preferredSchemes, otherSchemes] = _.partition(
143
+ [...allSchemes.entries()],
144
+ (schemeKeyValue) => preferred.has(schemeKeyValue[0])
145
+ )
146
+ return Object.fromEntries([...preferredSchemes, ...otherSchemes]) as {
147
+ [key in ColorSchemeName]: ColorScheme
148
+ }
149
+ }