@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,439 @@
1
+ import * as _ from "lodash-es"
2
+ import { PointVector } from "./PointVector.js"
3
+ import pixelWidth from "string-pixel-width"
4
+ import {
5
+ Box,
6
+ GridParameters,
7
+ Position,
8
+ PositionMap,
9
+ } from "../types/index.js"
10
+
11
+ // Important utility class for all visualizations
12
+ // Since we want to be able to render charts headlessly and functionally, we
13
+ // can't rely on the DOM to do these calculations for us, and instead must
14
+ // calculate using geometry and first principles
15
+
16
+ type PadObject = PositionMap<number>
17
+
18
+ export interface GridBounds {
19
+ col: number
20
+ row: number
21
+ cellEdges: Set<Position>
22
+ bounds: Bounds
23
+ }
24
+
25
+ export enum FontFamily {
26
+ "andale mono" = "andale mono",
27
+ "arial" = "arial",
28
+ "avenir next" = "avenir next",
29
+ "avenir" = "avenir",
30
+ "comic sans ms" = "comic sans ms",
31
+ "courier new" = "courier new",
32
+ "georgia" = "georgia",
33
+ "impact" = "impact",
34
+ "open sans" = "open sans",
35
+ "tahoma" = "tahoma",
36
+ "times new roman" = "times new roman",
37
+ "trebuchet ms" = "trebuchet ms",
38
+ "verdana" = "verdana",
39
+ "webdings" = "webdings",
40
+ }
41
+
42
+ export class Bounds {
43
+ static ctx: CanvasRenderingContext2D
44
+
45
+ static fromProps(props: Box): Bounds {
46
+ const { x, y, width, height } = props
47
+ return new Bounds(x, y, width, height)
48
+ }
49
+
50
+ static fromBBox(bbox: Box): Bounds {
51
+ return this.fromProps(bbox)
52
+ }
53
+
54
+ static fromRect(rect: ClientRect): Bounds {
55
+ return new Bounds(rect.left, rect.top, rect.width, rect.height)
56
+ }
57
+
58
+ static fromElement(el: HTMLElement): Bounds {
59
+ return Bounds.fromRect(el.getBoundingClientRect())
60
+ }
61
+
62
+ static fromCorners(p1: PointVector, p2: PointVector): Bounds {
63
+ const x1 = Math.min(p1.x, p2.x)
64
+ const x2 = Math.max(p1.x, p2.x)
65
+ const y1 = Math.min(p1.y, p2.y)
66
+ const y2 = Math.max(p1.y, p2.y)
67
+
68
+ return new Bounds(x1, y1, x2 - x1, y2 - y1)
69
+ }
70
+
71
+ // Merge a collection of bounding boxes into a single encompassing Bounds
72
+ static merge(boundsList: Bounds[]): Bounds {
73
+ let x1 = Infinity,
74
+ y1 = Infinity,
75
+ x2 = -Infinity,
76
+ y2 = -Infinity
77
+ for (const b of boundsList) {
78
+ x1 = Math.min(x1, b.x)
79
+ y1 = Math.min(y1, b.y)
80
+ x2 = Math.max(x2, b.x + b.width)
81
+ y2 = Math.max(y2, b.y + b.height)
82
+ }
83
+ return Bounds.fromCorners(
84
+ new PointVector(x1, y1),
85
+ new PointVector(x2, y2)
86
+ )
87
+ }
88
+
89
+ static empty(): Bounds {
90
+ return new Bounds(0, 0, 0, 0)
91
+ }
92
+
93
+ static forText(
94
+ str: string = "",
95
+ {
96
+ x = 0,
97
+ y = 0,
98
+ fontSize = 16,
99
+ fontWeight = 400,
100
+ fontFamily = FontFamily.arial,
101
+ isItalic = false,
102
+ }: {
103
+ x?: number
104
+ y?: number
105
+ fontSize?: number
106
+ fontWeight?: number
107
+ fontFamily?: FontFamily
108
+ isItalic?: boolean
109
+ } = {}
110
+ ): Bounds {
111
+ // Collapse contiguous spaces into one
112
+ str = str.replace(/ +/g, " ")
113
+
114
+ const isBold = fontWeight >= 600
115
+
116
+ const height = fontSize
117
+ let bounds = new Bounds(x, y - height, 0, height)
118
+ if (str) {
119
+ // pixelWidth uses a precomputed character width table to quickly give a
120
+ // rough estimate of string width based on characters in a string - it is probably not
121
+ // worth caching further
122
+ const width = pixelWidth(str, {
123
+ font: fontFamily,
124
+ size: fontSize,
125
+ bold: isBold,
126
+ italic: isItalic,
127
+ })
128
+ bounds = bounds.set({ width })
129
+ }
130
+
131
+ return bounds
132
+ }
133
+
134
+ readonly x: number
135
+ readonly y: number
136
+ readonly width: number
137
+ readonly height: number
138
+
139
+ constructor(x: number, y: number, width: number, height: number) {
140
+ this.x = x
141
+ this.y = y
142
+ this.width = Math.max(width, 0)
143
+ this.height = Math.max(height, 0)
144
+ }
145
+
146
+ get left(): number {
147
+ return this.x
148
+ }
149
+ get top(): number {
150
+ return this.y
151
+ }
152
+ get right(): number {
153
+ return this.x + this.width
154
+ }
155
+ get bottom(): number {
156
+ return this.y + this.height
157
+ }
158
+ get centerX(): number {
159
+ return this.x + this.width / 2
160
+ }
161
+ get centerY(): number {
162
+ return this.y + this.height / 2
163
+ }
164
+ get centerPos(): PointVector {
165
+ return new PointVector(this.centerX, this.centerY)
166
+ }
167
+ get area(): number {
168
+ return this.width * this.height
169
+ }
170
+
171
+ get topLeft(): PointVector {
172
+ return new PointVector(this.left, this.top)
173
+ }
174
+ get topRight(): PointVector {
175
+ return new PointVector(this.right, this.top)
176
+ }
177
+ get bottomLeft(): PointVector {
178
+ return new PointVector(this.left, this.bottom)
179
+ }
180
+ get bottomRight(): PointVector {
181
+ return new PointVector(this.right, this.bottom)
182
+ }
183
+
184
+ padLeft(amount: number): Bounds {
185
+ return new Bounds(
186
+ this.x + amount,
187
+ this.y,
188
+ this.width - amount,
189
+ this.height
190
+ )
191
+ }
192
+
193
+ padRight(amount: number): Bounds {
194
+ return new Bounds(this.x, this.y, this.width - amount, this.height)
195
+ }
196
+
197
+ padBottom(amount: number): Bounds {
198
+ return new Bounds(this.x, this.y, this.width, this.height - amount)
199
+ }
200
+
201
+ padTop(amount: number): Bounds {
202
+ return new Bounds(
203
+ this.x,
204
+ this.y + amount,
205
+ this.width,
206
+ this.height - amount
207
+ )
208
+ }
209
+
210
+ padWidth(amount: number): Bounds {
211
+ return new Bounds(
212
+ this.x + amount,
213
+ this.y,
214
+ this.width - amount * 2,
215
+ this.height
216
+ )
217
+ }
218
+
219
+ padHeight(amount: number): Bounds {
220
+ return new Bounds(
221
+ this.x,
222
+ this.y + amount,
223
+ this.width,
224
+ this.height - amount * 2
225
+ )
226
+ }
227
+
228
+ fromLeft(amount: number): Bounds {
229
+ return this.padRight(this.width - amount)
230
+ }
231
+
232
+ fromBottom(amount: number): Bounds {
233
+ return this.padTop(this.height - amount)
234
+ }
235
+
236
+ pad(amount: number | PadObject): Bounds {
237
+ if (_.isNumber(amount)) {
238
+ return new Bounds(
239
+ this.x + amount,
240
+ this.y + amount,
241
+ this.width - amount * 2,
242
+ this.height - amount * 2
243
+ )
244
+ }
245
+ return this.padTop(amount.top ?? 0)
246
+ .padRight(amount.right ?? 0)
247
+ .padBottom(amount.bottom ?? 0)
248
+ .padLeft(amount.left ?? 0)
249
+ }
250
+
251
+ expand(amount: number | PadObject): Bounds {
252
+ if (_.isNumber(amount)) return this.pad(-amount)
253
+ return this.pad(
254
+ _.mapValues(amount, (v) => (v !== undefined ? -v : undefined))
255
+ )
256
+ }
257
+
258
+ set(props: {
259
+ x?: number
260
+ y?: number
261
+ width?: number
262
+ height?: number
263
+ }): Bounds {
264
+ return Bounds.fromProps({ ...this, ...props })
265
+ }
266
+
267
+ scale(scale: number): Bounds {
268
+ return new Bounds(
269
+ this.x * scale,
270
+ this.y * scale,
271
+ this.width * scale,
272
+ this.height * scale
273
+ )
274
+ }
275
+
276
+ intersects(otherBounds: Bounds): boolean {
277
+ const r2 = otherBounds
278
+ return !(
279
+ r2.left > this.right ||
280
+ r2.right < this.left ||
281
+ r2.top > this.bottom ||
282
+ r2.bottom < this.top
283
+ )
284
+ }
285
+
286
+ hasVerticalOverlap(otherBounds: Bounds): boolean {
287
+ const r2 = otherBounds
288
+ return !(r2.top > this.bottom || r2.bottom < this.top)
289
+ }
290
+
291
+ hasHorizontalOverlap(otherBounds: Bounds): boolean {
292
+ const r2 = otherBounds
293
+ return !(r2.left > this.right || r2.right < this.left)
294
+ }
295
+
296
+ lines(): PointVector[][] {
297
+ return [
298
+ [this.topLeft, this.topRight],
299
+ [this.topRight, this.bottomRight],
300
+ [this.bottomRight, this.bottomLeft],
301
+ [this.bottomLeft, this.topLeft],
302
+ ]
303
+ }
304
+
305
+ boundedPoint(p: PointVector): PointVector {
306
+ return new PointVector(
307
+ Math.max(Math.min(p.x, this.right), this.left),
308
+ Math.max(Math.min(p.y, this.bottom), this.top)
309
+ )
310
+ }
311
+
312
+ containsPoint(x: number, y: number): boolean {
313
+ return (
314
+ x >= this.left &&
315
+ x <= this.right &&
316
+ y >= this.top &&
317
+ y <= this.bottom
318
+ )
319
+ }
320
+
321
+ contains(p: PointVector): boolean {
322
+ return this.containsPoint(p.x, p.y)
323
+ }
324
+
325
+ encloses(bounds: Bounds): boolean {
326
+ return (
327
+ this.containsPoint(bounds.left, bounds.top) &&
328
+ this.containsPoint(bounds.left, bounds.bottom) &&
329
+ this.containsPoint(bounds.right, bounds.top) &&
330
+ this.containsPoint(bounds.right, bounds.bottom)
331
+ )
332
+ }
333
+
334
+ toCSS(): { left: string; top: string; width: string; height: string } {
335
+ return {
336
+ left: `${this.left}px`,
337
+ top: `${this.top}px`,
338
+ width: `${this.width}px`,
339
+ height: `${this.height}px`,
340
+ }
341
+ }
342
+
343
+ toProps(): { x: number; y: number; width: number; height: number } {
344
+ return { x: this.x, y: this.y, width: this.width, height: this.height }
345
+ }
346
+
347
+ toArray(): [[number, number], [number, number]] {
348
+ return [
349
+ [this.left, this.top],
350
+ [this.right, this.bottom],
351
+ ]
352
+ }
353
+
354
+ xRange(): [number, number] {
355
+ return [this.left, this.right]
356
+ }
357
+
358
+ grid(
359
+ gridParams: GridParameters,
360
+ padding: SplitBoundsPadding = {}
361
+ ): GridBounds[] {
362
+ const { columns, rows, count } = gridParams
363
+ const { columnPadding = 0, rowPadding = 0, outerPadding = 0 } = padding
364
+
365
+ const contentWidth =
366
+ this.width - columnPadding * (columns - 1) - outerPadding * 2
367
+ const contentHeight =
368
+ this.height - rowPadding * (rows - 1) - outerPadding * 2
369
+ const boxWidth = Math.floor(contentWidth / columns)
370
+ const boxHeight = Math.floor(contentHeight / rows)
371
+
372
+ const hasCell = (row: number, col: number): boolean => {
373
+ if (row < 0 || row >= rows) return false
374
+ if (col < 0 || col >= columns) return false
375
+ const index = row * columns + col
376
+ if (index >= count) return false
377
+ return true
378
+ }
379
+
380
+ const grid = _.range(0, count).map((index: number) => {
381
+ const col = index % columns
382
+ const row = Math.floor(index / columns)
383
+
384
+ // edges around the existing cells
385
+ const cellEdges = new Set<Position>()
386
+ if (!hasCell(row, col - 1)) cellEdges.add(Position.left)
387
+ if (!hasCell(row, col + 1)) cellEdges.add(Position.right)
388
+ if (!hasCell(row - 1, col)) cellEdges.add(Position.top)
389
+ if (!hasCell(row + 1, col)) cellEdges.add(Position.bottom)
390
+
391
+ return {
392
+ row,
393
+ col,
394
+ cellEdges,
395
+ bounds: new Bounds(
396
+ this.x + outerPadding + col * (boxWidth + columnPadding),
397
+ this.y + outerPadding + row * (boxHeight + rowPadding),
398
+ boxWidth,
399
+ boxHeight
400
+ ),
401
+ }
402
+ })
403
+
404
+ return grid
405
+ }
406
+
407
+ yRange(): [number, number] {
408
+ return [this.bottom, this.top]
409
+ }
410
+
411
+ equals(bounds: Bounds): boolean {
412
+ return (
413
+ this.x === bounds.x &&
414
+ this.y === bounds.y &&
415
+ this.width === bounds.width &&
416
+ this.height === bounds.height
417
+ )
418
+ }
419
+
420
+ // Calculate squared distance between a given point and the closest border of the bounds
421
+ // If the point is within the bounds, returns 0
422
+ private distanceToPointSq(p: PointVector): number {
423
+ if (this.contains(p)) return 0
424
+
425
+ const cx = Math.max(Math.min(p.x, this.x + this.width), this.x)
426
+ const cy = Math.max(Math.min(p.y, this.y + this.height), this.y)
427
+ return (p.x - cx) * (p.x - cx) + (p.y - cy) * (p.y - cy)
428
+ }
429
+
430
+ distanceToPoint(p: PointVector): number {
431
+ return Math.sqrt(this.distanceToPointSq(p))
432
+ }
433
+ }
434
+
435
+ export interface SplitBoundsPadding {
436
+ columnPadding?: number
437
+ rowPadding?: number
438
+ outerPadding?: number
439
+ }
@@ -0,0 +1,12 @@
1
+ export const isAndroid = (): boolean => {
2
+ return /Android/i.test(navigator.userAgent)
3
+ }
4
+
5
+ export const isIOS = (): boolean => {
6
+ return (
7
+ /iPhone|iPad|iPod/.test(navigator.userAgent) ||
8
+ // iPadOS 13+ reports itself as Macintosh, see https://stackoverflow.com/a/9039885
9
+ (navigator.userAgent.includes("Intel Mac OS X") &&
10
+ navigator.maxTouchPoints > 1)
11
+ )
12
+ }
@@ -0,0 +1,74 @@
1
+ import { PrimitiveType } from "../types/index.js"
2
+ import * as _ from "lodash-es"
3
+ import fuzzysort from "fuzzysort"
4
+
5
+ export class FuzzySearch<T> {
6
+ strings: Fuzzysort.Prepared[]
7
+ datamap: Record<string, T[]>
8
+ uniqByFn: ((obj: T) => PrimitiveType) | undefined
9
+ opts: Fuzzysort.Options | undefined
10
+
11
+ private constructor(
12
+ datamap: Record<string, T[]>,
13
+ uniqByFn?: (obj: T) => PrimitiveType,
14
+ opts?: Fuzzysort.Options
15
+ ) {
16
+ const rawStrings = Object.keys(datamap)
17
+ this.strings = rawStrings.map((s) => fuzzysort.prepare(s))
18
+ this.datamap = datamap
19
+ this.uniqByFn = uniqByFn
20
+ this.opts = opts
21
+ }
22
+
23
+ static withKey<T>(
24
+ data: T[],
25
+ keyFn: (obj: T) => string,
26
+ opts?: Fuzzysort.Options
27
+ ): FuzzySearch<T> {
28
+ const datamap = _.groupBy(data, keyFn)
29
+ return new FuzzySearch(datamap, undefined, opts)
30
+ }
31
+
32
+ // Allows for multiple keys per object, e.g. aliases:
33
+ // [
34
+ // { name: "Netherlands", "keys": ["Netherlands", "Nederland"] },
35
+ // { name: "Spain", "keys": ["Spain", "España"] },
36
+ // ]
37
+ static withKeyArray<T>(
38
+ data: T[],
39
+ keysFn: (obj: T) => string[],
40
+ uniqByFn?: (obj: T) => PrimitiveType,
41
+ opts?: Fuzzysort.Options
42
+ ): FuzzySearch<T> {
43
+ const datamap: Record<string, T[]> = {}
44
+ data.forEach((d) => {
45
+ keysFn(d).forEach((key) => {
46
+ if (!datamap[key]) datamap[key] = [d]
47
+ else datamap[key].push(d)
48
+ })
49
+ })
50
+ return new FuzzySearch(datamap, uniqByFn, opts)
51
+ }
52
+
53
+ search(input: string): T[] {
54
+ const results = fuzzysort
55
+ .go(input, this.strings, this.opts)
56
+ .flatMap((result) => this.datamap[result.target])
57
+
58
+ if (this.uniqByFn) {
59
+ return _.uniqBy(results, this.uniqByFn)
60
+ }
61
+ return results
62
+ }
63
+
64
+ searchResults(input: string): Fuzzysort.Results {
65
+ return fuzzysort.go(input, this.strings, this.opts)
66
+ }
67
+
68
+ single(input: string, target: string): Fuzzysort.Result | null {
69
+ return fuzzysort.single(input, target)
70
+ }
71
+ }
72
+
73
+ type FuzzySearchResult = Fuzzysort.Result
74
+ export { type FuzzySearchResult }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Stub for MultiDimDataPageConfig.
3
+ * Multi-dimensional data page configurations are specific to OWID's data pages.
4
+ */
5
+
6
+ export interface MultiDimDataPageConfigRaw {
7
+ views?: unknown[]
8
+ dimensions?: unknown[]
9
+ [key: string]: unknown
10
+ }
11
+
12
+ export class MultiDimDataPageConfig {
13
+ constructor(_config: MultiDimDataPageConfigRaw) {}
14
+
15
+ static fromObject(_obj: MultiDimDataPageConfigRaw): MultiDimDataPageConfig {
16
+ return new MultiDimDataPageConfig(_obj)
17
+ }
18
+ }
19
+
20
+ export function extractMultiDimChoicesFromSearchParams(
21
+ _searchParams: URLSearchParams
22
+ ): Record<string, string> {
23
+ return {}
24
+ }
25
+
26
+ export function searchParamsToMultiDimView(
27
+ _searchParams: URLSearchParams,
28
+ _config: MultiDimDataPageConfig
29
+ ): unknown {
30
+ return null
31
+ }
@@ -0,0 +1,82 @@
1
+ // todo: remove file
2
+
3
+ import { observable, makeObservable } from "mobx"
4
+ import {
5
+ Persistable,
6
+ updatePersistables,
7
+ objectWithPersistablesToObject,
8
+ deleteRuntimeAndUnchangedProps,
9
+ } from "./persistable/Persistable.js"
10
+ import {
11
+ OwidVariableDataTableConfigInterface,
12
+ OwidVariableDisplayConfigInterface,
13
+ OwidVariableRoundingMode,
14
+ } from "../types/index.js"
15
+
16
+ class OwidVariableDisplayConfigDefaults {
17
+ name: string | undefined = undefined
18
+ unit: string | undefined = undefined
19
+ shortUnit: string | undefined = undefined
20
+ isProjection: boolean | undefined = undefined
21
+ conversionFactor: number | undefined = undefined
22
+ roundingMode: OwidVariableRoundingMode | undefined = undefined
23
+ numDecimalPlaces: number | undefined = undefined
24
+ numSignificantFigures: number | undefined = undefined
25
+ tolerance: number | undefined = undefined
26
+ yearIsDay: boolean | undefined = undefined
27
+ zeroDay: string | undefined = undefined
28
+ entityAnnotationsMap: string | undefined = undefined
29
+ includeInTable: boolean | undefined = true
30
+ tableDisplay: OwidVariableDataTableConfigInterface | undefined = undefined
31
+ color: string | undefined = undefined
32
+ plotMarkersOnlyInLineChart: boolean | undefined = undefined
33
+
34
+ constructor() {
35
+ makeObservable(this, {
36
+ name: observable,
37
+ unit: observable,
38
+ shortUnit: observable,
39
+ isProjection: observable,
40
+ conversionFactor: observable,
41
+ roundingMode: observable,
42
+ numDecimalPlaces: observable,
43
+ numSignificantFigures: observable,
44
+ tolerance: observable,
45
+ yearIsDay: observable,
46
+ zeroDay: observable,
47
+ entityAnnotationsMap: observable,
48
+ includeInTable: observable,
49
+ tableDisplay: observable,
50
+ color: observable,
51
+ plotMarkersOnlyInLineChart: observable,
52
+ })
53
+ }
54
+ }
55
+
56
+ export class OwidVariableDisplayConfig
57
+ extends OwidVariableDisplayConfigDefaults
58
+ implements Persistable
59
+ {
60
+ updateFromObject(obj?: Partial<OwidVariableDisplayConfigInterface>): void {
61
+ if (obj) updatePersistables(this, obj)
62
+ }
63
+
64
+ toObject(): OwidVariableDisplayConfigDefaults {
65
+ return deleteRuntimeAndUnchangedProps(
66
+ objectWithPersistablesToObject(this),
67
+ new OwidVariableDisplayConfigDefaults()
68
+ )
69
+ }
70
+
71
+ constructor(obj?: Partial<OwidVariableDisplayConfigInterface>) {
72
+ super()
73
+ if (obj) this.updateFromObject(obj)
74
+ }
75
+ }
76
+
77
+ // export interface OwidVariablesAndEntityKey {
78
+ // variables: {
79
+ // [id: string]: OwidVariableWithDataAndSource
80
+ // }
81
+ // entityKey: OwidEntityKey
82
+ // }