@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,60 @@
1
+ import { ChartManager } from "../chart/ChartManager"
2
+ import { CoreColumn } from "../../core-table/index.js"
3
+ import { ChartSeries } from "../chart/ChartInterface"
4
+ import { Color, CoreValueType, Time } from "../../types/index.js"
5
+ import { TextWrap } from "../../components/index.js"
6
+ import { InteractionState } from "../interaction/InteractionState.js"
7
+
8
+ export interface DiscreteBarSeries extends ChartSeries {
9
+ entityName: string
10
+ shortEntityName?: string
11
+ yColumn: CoreColumn
12
+ value: number
13
+ time: Time
14
+ colorValue?: CoreValueType
15
+ annotation?: string
16
+ focus: InteractionState
17
+ }
18
+
19
+ export interface SizedDiscreteBarSeries extends DiscreteBarSeries {
20
+ label: TextWrap
21
+ annotationTextWrap?: TextWrap
22
+ }
23
+
24
+ export interface PlacedDiscreteBarSeries extends SizedDiscreteBarSeries {
25
+ // data bar
26
+ barX: number
27
+ barY: number
28
+ barWidth: number
29
+
30
+ // entity label, annotation, and value label positions
31
+ entityLabelX: number
32
+ entityLabelY: number
33
+ annotationY?: number
34
+ valueLabelX: number
35
+ }
36
+
37
+ export interface DiscreteBarChartManager extends ChartManager {
38
+ showYearLabels?: boolean
39
+ endTime?: Time
40
+ hasLineChart?: boolean // used to pick color scheme
41
+ hasSlopeChart?: boolean // used to pick color scheme
42
+ }
43
+
44
+ export interface DiscreteBarItem {
45
+ yColumn: CoreColumn
46
+ seriesName: string
47
+ value: number
48
+ time: number
49
+ colorValue?: CoreValueType
50
+ color?: Color
51
+ }
52
+
53
+ export interface FontSettings {
54
+ fontSize: number
55
+ fontWeight: number
56
+ lineHeight: number
57
+ }
58
+
59
+ export const BACKGROUND_COLOR = "#fff"
60
+ export const BAR_SPACING_FACTOR = 0.35
@@ -0,0 +1,338 @@
1
+ import * as _ from "lodash-es"
2
+ import { TextWrap, shortenWithEllipsis } from "../../components/index.js"
3
+ import { EntityName } from "../../types/index.js"
4
+ import { FontSettings } from "./DiscreteBarChartConstants.js"
5
+
6
+ const ANNOTATION_PADDING = 2
7
+
8
+ // Pattern IDs should be unique per document (!), not just per grapher instance.
9
+ // Including the color in the id guarantees that the pattern uses the correct color,
10
+ // even if it gets resolved to a striped pattern of a different grapher instance.
11
+ export function makeProjectedDataPatternId(color: string): string {
12
+ return `DiscreteBarChart_stripes_${color}`
13
+ }
14
+
15
+ /**
16
+ * Creates a TextWrap for discrete bar chart labels that fits within the bar height.
17
+ *
18
+ * Strategy:
19
+ * 1. Calculate the maximum number of lines that can fit in the bar height
20
+ * 2. Use binary search to find the minimum width that produces at most maxLines
21
+ * 3. If the label doesn't fit even at maxWidth, reduce font size until it fits
22
+ * 4. If the label still doesn't fit, truncate the label with ellipsis
23
+ */
24
+ function wrapLabelForHeight({
25
+ label,
26
+ availableHeight,
27
+ minWidth,
28
+ maxWidth,
29
+ fontSettings,
30
+ }: {
31
+ label: string
32
+ availableHeight: number
33
+ minWidth: number
34
+ maxWidth: number
35
+ fontSettings: { fontSize: number; fontWeight: number; lineHeight: number }
36
+ }): { textWrap: TextWrap; needsTruncation?: boolean } {
37
+ const originalFontSize = fontSettings.fontSize
38
+
39
+ // Drop new line characters before processing
40
+ const cleanedLabel = label.replace(/\n/g, " ").trim()
41
+
42
+ // Helper to calculate max lines that can fit in available height
43
+ const computeMaxLineCount = (
44
+ availableHeight: number,
45
+ fontSettings: FontSettings
46
+ ): number => {
47
+ const lineHeight = fontSettings.fontSize * fontSettings.lineHeight
48
+ return Math.max(1, Math.floor(availableHeight / lineHeight))
49
+ }
50
+
51
+ // Helper to create TextWrap with given width and font size
52
+ const makeTextWrap = (maxWidth: number, fontSize: number): TextWrap =>
53
+ new TextWrap({
54
+ text: cleanedLabel,
55
+ maxWidth,
56
+ ...fontSettings,
57
+ fontSize, // Overrides the original font size
58
+ })
59
+
60
+ // Calculate max lines that can fit in the bar height
61
+ const maxLines = computeMaxLineCount(availableHeight, fontSettings)
62
+
63
+ // Find the minimum width that produces at most maxLines
64
+ const optimalWidth = findMinWidthForMaxLines({
65
+ label: cleanedLabel,
66
+ maxLines,
67
+ minWidth,
68
+ maxWidth,
69
+ fontSettings,
70
+ })
71
+
72
+ // Check if it fits at the best width with original font size
73
+ const labelWrap = makeTextWrap(optimalWidth, originalFontSize)
74
+ if (labelWrap.lines.length <= maxLines) return { textWrap: labelWrap }
75
+
76
+ // If not, reduce the font size until it fits (or the minimum font size is reached)
77
+ const minFontSize = Math.max(Math.floor(originalFontSize * 0.8), 6)
78
+ const optimalFontSize = findMaxFontSizeForHeight({
79
+ label: cleanedLabel,
80
+ maxWidth,
81
+ availableHeight,
82
+ maxFontSize: originalFontSize,
83
+ minFontSize,
84
+ fontSettings,
85
+ })
86
+
87
+ // Check if the label fits or if it needs truncation
88
+ const reducedFontWrap = makeTextWrap(maxWidth, optimalFontSize)
89
+ const optimalFontSettings = { ...fontSettings, fontSize: optimalFontSize }
90
+ const maxLinesAtReducedSize = computeMaxLineCount(
91
+ availableHeight,
92
+ optimalFontSettings
93
+ )
94
+ const needsTruncation = reducedFontWrap.lines.length > maxLinesAtReducedSize
95
+
96
+ return { textWrap: reducedFontWrap, needsTruncation }
97
+ }
98
+
99
+ /** Binary search to find the minimum width that produces at most maxLines */
100
+ function findMinWidthForMaxLines({
101
+ label,
102
+ maxLines,
103
+ minWidth,
104
+ maxWidth,
105
+ fontSettings,
106
+ }: {
107
+ label: string
108
+ maxLines: number
109
+ minWidth: number
110
+ maxWidth: number
111
+ fontSettings: FontSettings
112
+ }): number {
113
+ let low = minWidth
114
+ let high = maxWidth
115
+ let bestWidth = maxWidth
116
+ const step = 1
117
+
118
+ while (low <= high) {
119
+ const mid = Math.floor((low + high) / 2)
120
+ const testWrap = new TextWrap({
121
+ text: label,
122
+ maxWidth: mid,
123
+ ...fontSettings,
124
+ })
125
+
126
+ if (testWrap.lines.length <= maxLines) {
127
+ // This width works, try smaller
128
+ bestWidth = mid
129
+ high = mid - step
130
+ } else {
131
+ // Too many lines, need larger width
132
+ low = mid + step
133
+ }
134
+ }
135
+
136
+ return bestWidth
137
+ }
138
+
139
+ /** Decrease font size until the label fits within availableHeight at maxWidth */
140
+ function findMaxFontSizeForHeight({
141
+ label,
142
+ maxWidth,
143
+ availableHeight,
144
+ maxFontSize,
145
+ minFontSize,
146
+ fontSettings,
147
+ }: {
148
+ label: string
149
+ maxWidth: number
150
+ availableHeight: number
151
+ maxFontSize: number
152
+ minFontSize: number
153
+ fontSettings: FontSettings
154
+ }): number {
155
+ const step = 0.5
156
+
157
+ let fontSize = maxFontSize
158
+
159
+ while (fontSize >= minFontSize) {
160
+ const lineHeight = fontSize * fontSettings.lineHeight
161
+ const maxLines = Math.max(1, Math.floor(availableHeight / lineHeight))
162
+
163
+ const testWrap = new TextWrap({
164
+ text: label,
165
+ maxWidth,
166
+ ...fontSettings,
167
+ fontSize,
168
+ })
169
+
170
+ if (testWrap.lines.length <= maxLines) return fontSize
171
+
172
+ fontSize -= step
173
+ }
174
+
175
+ return minFontSize
176
+ }
177
+
178
+ /** Processes series to create sized labels that fit within available height */
179
+ export function enrichSeriesWithLabels<
180
+ TSeries extends {
181
+ entityName: EntityName
182
+ shortEntityName?: string
183
+ annotation?: string
184
+ },
185
+ >({
186
+ series,
187
+ availableHeightPerSeries,
188
+ minLabelWidth,
189
+ maxLabelWidth,
190
+ fontSettings,
191
+ annotationFontSettings = {
192
+ fontSize: 13,
193
+ fontWeight: 300,
194
+ lineHeight: 1,
195
+ },
196
+ }: {
197
+ series: readonly TSeries[]
198
+ availableHeightPerSeries: number
199
+ minLabelWidth: number
200
+ maxLabelWidth: number
201
+ fontSettings: FontSettings
202
+ annotationFontSettings?: FontSettings
203
+ }): (TSeries & { label: TextWrap; annotationTextWrap?: TextWrap })[] {
204
+ // Wrap labels and annotations to fit within the available space
205
+ const wrappedLabels = series.map((series) => {
206
+ const label = series.shortEntityName ?? series.entityName
207
+
208
+ // First, wrap the label without considering annotations
209
+ const {
210
+ textWrap: labelWrap,
211
+ needsTruncation: labelWrapNeedsTruncation,
212
+ } = wrapLabelForHeight({
213
+ label,
214
+ availableHeight: availableHeightPerSeries,
215
+ minWidth: minLabelWidth,
216
+ maxWidth: maxLabelWidth,
217
+ fontSettings,
218
+ })
219
+
220
+ // If there's no annotation, we're done
221
+ if (!series.annotation) return { labelWrap, labelWrapNeedsTruncation }
222
+
223
+ // Calculate remaining height for annotation (4px extra padding to avoid crowding)
224
+ const remainingHeightForAnnotation =
225
+ availableHeightPerSeries - labelWrap.height - ANNOTATION_PADDING - 4
226
+
227
+ // If there's not enough space for even one line of annotation, skip it
228
+ const minAnnotationHeight =
229
+ annotationFontSettings.fontSize * annotationFontSettings.lineHeight
230
+ if (remainingHeightForAnnotation < minAnnotationHeight)
231
+ return { labelWrap, labelWrapNeedsTruncation }
232
+
233
+ // Wrap annotation to fit in remaining space
234
+ const annotationWrap = new TextWrap({
235
+ text: series.annotation,
236
+ // 80px extra to give annotations more room than labels
237
+ maxWidth: Math.min(maxLabelWidth, labelWrap.width + 80),
238
+ ...annotationFontSettings,
239
+ })
240
+
241
+ // Check if annotation fits in remaining height
242
+ if (annotationWrap.height > remainingHeightForAnnotation) {
243
+ // Try again with a larger max width
244
+ const annotationWrap = new TextWrap({
245
+ text: series.annotation,
246
+ maxWidth: maxLabelWidth,
247
+ ...annotationFontSettings,
248
+ })
249
+
250
+ const annotationWrapNeedsTruncation =
251
+ annotationWrap.height > remainingHeightForAnnotation
252
+
253
+ return {
254
+ labelWrap,
255
+ labelWrapNeedsTruncation,
256
+ annotationWrap,
257
+ annotationWrapNeedsTruncation,
258
+ }
259
+ }
260
+
261
+ return {
262
+ labelWrap,
263
+ annotationWrap,
264
+ labelWrapNeedsTruncation,
265
+ annotationWrapNeedsTruncation: false,
266
+ }
267
+ })
268
+
269
+ // Return early if no labels or annotations need truncation
270
+ const needsTruncation = wrappedLabels.some(
271
+ (s) => s.labelWrapNeedsTruncation || s.annotationWrapNeedsTruncation
272
+ )
273
+ if (!needsTruncation)
274
+ return series.map((series, index) => ({
275
+ ...series,
276
+ label: wrappedLabels[index].labelWrap,
277
+ annotationTextWrap: wrappedLabels[index].annotationWrap,
278
+ }))
279
+
280
+ // The target width for truncation is the max width of non-truncated labels and annotations
281
+ const nonTruncatedLabelWidths = wrappedLabels
282
+ .filter((s) => !s.labelWrapNeedsTruncation)
283
+ .map((s) => s.labelWrap.width)
284
+ const nonTruncatedAnnotationWidths = wrappedLabels
285
+ .filter(
286
+ (s) =>
287
+ s.annotationWrap !== undefined &&
288
+ !s.annotationWrapNeedsTruncation
289
+ )
290
+ .map((s) => s.annotationWrap!.width)
291
+ const targetWidth = Math.max(
292
+ _.max(nonTruncatedLabelWidths) ?? 0,
293
+ _.max(nonTruncatedAnnotationWidths) ?? 0
294
+ )
295
+
296
+ const truncatedLabels = wrappedLabels.map(
297
+ ({ labelWrap, labelWrapNeedsTruncation }) => {
298
+ if (!labelWrapNeedsTruncation) return labelWrap
299
+
300
+ const truncatedText = shortenWithEllipsis(
301
+ labelWrap.text,
302
+ targetWidth,
303
+ fontSettings
304
+ )
305
+
306
+ return new TextWrap({
307
+ text: truncatedText,
308
+ maxWidth: Infinity, // Don't wrap truncated labels
309
+ ...fontSettings,
310
+ })
311
+ }
312
+ )
313
+
314
+ const truncatedAnnotations = wrappedLabels.map(
315
+ ({ annotationWrap, annotationWrapNeedsTruncation }) => {
316
+ if (!annotationWrap || !annotationWrapNeedsTruncation)
317
+ return annotationWrap
318
+
319
+ const truncatedText = shortenWithEllipsis(
320
+ annotationWrap.text,
321
+ targetWidth,
322
+ annotationFontSettings
323
+ )
324
+
325
+ return new TextWrap({
326
+ text: truncatedText,
327
+ maxWidth: Infinity, // Don't wrap truncated labels
328
+ ...annotationFontSettings,
329
+ })
330
+ }
331
+ )
332
+
333
+ return series.map((series, index) => ({
334
+ ...series,
335
+ label: truncatedLabels[index],
336
+ annotationTextWrap: truncatedAnnotations[index],
337
+ }))
338
+ }