@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,63 @@
1
+ import {
2
+ faCircleXmark,
3
+ faMagnifyingGlass,
4
+ } from "@fortawesome/free-solid-svg-icons"
5
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
6
+ import * as React from "react"
7
+ import { forwardRef } from "react"
8
+ import cx from "classnames"
9
+ import { isTouchDevice } from "../../utils/index.js"
10
+
11
+ export const SearchField = forwardRef<
12
+ HTMLInputElement,
13
+ {
14
+ className?: string
15
+ value: string
16
+ placeholder: string
17
+ trackNote: string
18
+ onChange: (value: string) => void
19
+ onClear: () => void
20
+ onKeyDown?: (event: KeyboardEvent) => void
21
+ }
22
+ >(function SearchField(
23
+ { className, value, placeholder, trackNote, onChange, onClear, onKeyDown },
24
+ ref
25
+ ): React.ReactElement {
26
+ return (
27
+ <div
28
+ className={cx(className, "grapher-search-field", {
29
+ "grapher-search-field--empty": !value,
30
+ })}
31
+ >
32
+ <FontAwesomeIcon className="search-icon" icon={faMagnifyingGlass} />
33
+ <input
34
+ ref={ref}
35
+ type="search"
36
+ value={value}
37
+ onChange={(event) => onChange(event.currentTarget.value)}
38
+ onKeyDown={(event) => onKeyDown?.(event.nativeEvent)}
39
+ data-track-note={trackNote}
40
+ aria-label={placeholder}
41
+ // prevent auto-zoom on ios
42
+ style={{ fontSize: isTouchDevice() ? 16 : undefined }}
43
+ />
44
+ {/* We don't use the input's built-in placeholder because
45
+ we want the input text and placeholder text to have different
46
+ font sizes, which isn't well-supported across browsers.
47
+ The input text needs to be 16px to prevent auto-zoom on iOS,
48
+ but the placeholder text should have a smaller font size. */}
49
+ {!value && (
50
+ <span className="search-placeholder">{placeholder}</span>
51
+ )}
52
+ {value && (
53
+ <button
54
+ type="button"
55
+ className="clear"
56
+ onClick={() => onClear()}
57
+ >
58
+ <FontAwesomeIcon icon={faCircleXmark} />
59
+ </button>
60
+ )}
61
+ </div>
62
+ )
63
+ })
@@ -0,0 +1,191 @@
1
+ $light-stroke: $gray-20;
2
+ $dark-stroke: #2d2d2d;
3
+ $active-stroke: $blue-30;
4
+
5
+ $light-fill: $gray-30;
6
+ $active-fill: $blue-20;
7
+ $hover-fill: $gray-10;
8
+ $selected-fill: #c7ced7;
9
+
10
+ $active-switch: $blue-50;
11
+
12
+ $medium: 400;
13
+ $bold: 700;
14
+ $lato: $sans-serif-font-stack;
15
+
16
+ $indent: 15px;
17
+ $control-row-height: 32px;
18
+
19
+ @at-root .GrapherSettingsPopover {
20
+ background: white;
21
+ border-radius: 4px;
22
+ box-shadow: 0px 4px 23px 4px #0000000f;
23
+ z-index: $zindex-controls-popup;
24
+ overflow-y: auto;
25
+
26
+ // Sticky header with title and close button
27
+ .GrapherSettingsPopover__Header {
28
+ background: white;
29
+ margin: 0;
30
+ padding: 9px 15px 3px 15px;
31
+ position: sticky;
32
+ top: 0;
33
+ z-index: 1;
34
+
35
+ .overlay-header {
36
+ padding: 0;
37
+ }
38
+ }
39
+
40
+ .GrapherSettingsPopover__Content {
41
+ //
42
+ // shared button coloring & behaviors
43
+ //
44
+ button {
45
+ display: flex;
46
+ align-items: center;
47
+ color: $light-text;
48
+ background: white;
49
+ border: 1px solid $light-stroke;
50
+ font: $medium 13px/16px $lato;
51
+ letter-spacing: 0.01em;
52
+ border-radius: 4px;
53
+ padding: 7px;
54
+ height: 40px;
55
+
56
+ &:hover {
57
+ background: $hover-fill;
58
+ cursor: pointer;
59
+
60
+ &:not(.active) {
61
+ color: $dark-text;
62
+ }
63
+ }
64
+
65
+ &.active,
66
+ &:active {
67
+ background: $active-fill;
68
+ border: 1px solid $active-fill;
69
+ }
70
+
71
+ &.active {
72
+ cursor: default;
73
+ color: $active-text;
74
+ }
75
+ }
76
+
77
+ //
78
+ // each titled block of control widgets (with optional info-circle + tooltip)
79
+ //
80
+ section {
81
+ font: $medium 14px/1.2 $lato;
82
+ color: $light-text;
83
+ padding: 1em 0;
84
+ margin: 0 $indent;
85
+
86
+ .config-name {
87
+ font: $bold 14px/1.2 $lato;
88
+ color: $dark-text;
89
+ list-style: none;
90
+
91
+ svg {
92
+ color: $gray-60;
93
+ height: 13px;
94
+ padding: 0 0.333em;
95
+ }
96
+ }
97
+
98
+ .labeled-switch .labeled-switch-subtitle,
99
+ .config-subtitle {
100
+ font-size: 13px;
101
+ margin: 5px 0;
102
+ }
103
+
104
+ .config-toggle {
105
+ display: flex;
106
+ flex-wrap: wrap;
107
+ justify-content: space-between;
108
+ padding: 0.5em 0;
109
+ }
110
+
111
+ & + section {
112
+ border-top: 1px solid $light-stroke;
113
+ }
114
+ }
115
+
116
+ //
117
+ // resuable widgets
118
+ //
119
+ section {
120
+ // left/right pairs of options
121
+ .config-toggle {
122
+ label {
123
+ flex-basis: 100%;
124
+ color: $dark-text;
125
+ margin-bottom: 0.5em;
126
+ }
127
+ button {
128
+ width: calc(50% - 5px);
129
+ padding: 7px 16px;
130
+ }
131
+ }
132
+
133
+ // on/off switch with label written to the right
134
+ .labeled-switch {
135
+ margin: 14px 0;
136
+ display: block;
137
+ }
138
+
139
+ // vertical list of options (for selecting faceting mode)
140
+ .config-list {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: 8px;
144
+ padding: 7px 0;
145
+ button {
146
+ width: 100%;
147
+
148
+ .faceting-icon {
149
+ display: flex;
150
+ flex-wrap: wrap;
151
+ width: 34px;
152
+ height: 24px;
153
+ justify-content: space-between;
154
+ margin-right: 8px;
155
+ span {
156
+ // the round-rects that make up the grid
157
+ display: inline-block;
158
+ width: 100%;
159
+ height: 100%;
160
+ border-radius: 2px;
161
+ background: $light-stroke;
162
+ }
163
+ }
164
+
165
+ &.entity span {
166
+ width: 10px;
167
+ height: 10px;
168
+ }
169
+
170
+ &.metric span {
171
+ width: 10px;
172
+ height: 10px;
173
+ border-radius: 5px;
174
+ }
175
+
176
+ &.active span {
177
+ background: $blue-30;
178
+ }
179
+
180
+ &:hover:not(.active) span {
181
+ background: $light-fill;
182
+ }
183
+
184
+ &:active:not(.active) span {
185
+ background: $light-text;
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
@@ -0,0 +1,399 @@
1
+ import * as React from "react"
2
+ import { computed, action, observable, makeObservable } from "mobx"
3
+ import { observer } from "mobx-react"
4
+ import classnames from "classnames"
5
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
6
+ import { faGear } from "@fortawesome/free-solid-svg-icons"
7
+ import {
8
+ DialogTrigger,
9
+ Popover,
10
+ Dialog,
11
+ Heading,
12
+ Button,
13
+ } from "react-aria-components"
14
+ import {
15
+ EntityName,
16
+ GRAPHER_CHART_TYPES,
17
+ FacetStrategy,
18
+ GrapherChartType,
19
+ } from "../../types/index.js"
20
+ import { OverlayHeader } from "../../components/index.js"
21
+ import { SelectionArray } from "../selection/SelectionArray"
22
+ import { ChartDimension } from "../chart/ChartDimension"
23
+ import { makeSelectionArray } from "../chart/ChartUtils.js"
24
+ import { AxisConfig } from "../axis/AxisConfig"
25
+
26
+ import { AxisScaleToggle } from "./settings/AxisScaleToggle"
27
+ import { AbsRelToggle, AbsRelToggleManager } from "./settings/AbsRelToggle"
28
+ import { ZoomToggle, ZoomToggleManager } from "./settings/ZoomToggle"
29
+ import {
30
+ FacetStrategySelector,
31
+ FacetStrategySelectionManager,
32
+ } from "./settings/FacetStrategySelector"
33
+ import {
34
+ FacetYDomainToggle,
35
+ FacetYDomainToggleManager,
36
+ } from "./settings/FacetYDomainToggle"
37
+ import {
38
+ NoDataAreaToggle,
39
+ NoDataAreaToggleManager,
40
+ } from "./settings/NoDataAreaToggle"
41
+ import { GRAPHER_SETTINGS_CLASS } from "../core/GrapherConstants"
42
+
43
+ const {
44
+ LineChart,
45
+ ScatterPlot,
46
+ StackedArea,
47
+ StackedDiscreteBar,
48
+ StackedBar,
49
+ Marimekko,
50
+ SlopeChart,
51
+ } = GRAPHER_CHART_TYPES
52
+
53
+ export interface SettingsMenuManager
54
+ extends AbsRelToggleManager,
55
+ NoDataAreaToggleManager,
56
+ FacetYDomainToggleManager,
57
+ ZoomToggleManager,
58
+ FacetStrategySelectionManager {
59
+ // ArchieML directives
60
+ hideFacetControl?: boolean
61
+ hideRelativeToggle?: boolean
62
+ hideEntityControls?: boolean
63
+
64
+ // chart state
65
+ activeChartType?: GrapherChartType
66
+ isRelativeMode?: boolean
67
+ selection?: SelectionArray | EntityName[]
68
+ canChangeAddOrHighlightEntities?: boolean
69
+ filledDimensions: ChartDimension[]
70
+ xColumnSlug?: string
71
+ xOverrideTime?: number
72
+ hasTimeline?: boolean
73
+ canToggleRelativeMode: boolean
74
+ isOnChartTab?: boolean
75
+
76
+ // linear/log scales
77
+ yAxis: AxisConfig
78
+ xAxis: AxisConfig
79
+
80
+ // TODO: show intermediate scatterplot points
81
+ compareEndPointsOnly?: boolean
82
+ }
83
+
84
+ interface SettingsMenuProps {
85
+ manager: SettingsMenuManager
86
+ popoverMaxWidth?: number
87
+ popoverMaxHeight?: number
88
+ }
89
+
90
+ @observer
91
+ export class SettingsMenu extends React.Component<SettingsMenuProps> {
92
+ private active: boolean = false
93
+
94
+ constructor(props: SettingsMenuProps) {
95
+ super(props)
96
+
97
+ makeObservable<SettingsMenu, "active">(this, { active: observable.ref })
98
+ }
99
+
100
+ static shouldShow(manager: SettingsMenuManager): boolean {
101
+ const test = new SettingsMenu({ manager })
102
+ return test.showSettingsMenuToggle
103
+ }
104
+
105
+ @computed get chartType(): GrapherChartType {
106
+ return this.manager.activeChartType ?? GRAPHER_CHART_TYPES.LineChart
107
+ }
108
+
109
+ @computed get showYScaleToggle(): boolean | undefined {
110
+ if (this.manager.isRelativeMode) return false
111
+ if (
112
+ [
113
+ GRAPHER_CHART_TYPES.StackedArea,
114
+ GRAPHER_CHART_TYPES.StackedBar,
115
+ GRAPHER_CHART_TYPES.DiscreteBar,
116
+ GRAPHER_CHART_TYPES.StackedDiscreteBar,
117
+ GRAPHER_CHART_TYPES.Marimekko,
118
+ ].includes(this.chartType as any)
119
+ )
120
+ return false // We currently do not have these charts with log scale
121
+ return this.manager.yAxis.canChangeScaleType
122
+ }
123
+
124
+ @computed private get showXScaleToggle(): boolean | undefined {
125
+ if (this.manager.isRelativeMode) return false
126
+ return this.manager.xAxis.canChangeScaleType
127
+ }
128
+
129
+ @computed private get showFacetYDomainToggle(): boolean {
130
+ // don't offer to make the y range relative if the range is discrete
131
+ return (
132
+ this.manager.facetStrategy !== FacetStrategy.none &&
133
+ this.chartType !== StackedDiscreteBar
134
+ )
135
+ }
136
+
137
+ @computed get showZoomToggle(): boolean {
138
+ return (
139
+ this.chartType === ScatterPlot && this.selectionArray.hasSelection
140
+ )
141
+ }
142
+
143
+ @computed get showNoDataAreaToggle(): boolean {
144
+ return (
145
+ this.chartType === Marimekko &&
146
+ this.manager.xColumnSlug !== undefined
147
+ )
148
+ }
149
+
150
+ @computed private get showAbsRelToggle(): boolean {
151
+ const { canToggleRelativeMode, hasTimeline, xOverrideTime } =
152
+ this.manager
153
+ if (!canToggleRelativeMode) return false
154
+ if (this.chartType === ScatterPlot)
155
+ return xOverrideTime === undefined && !!hasTimeline
156
+ return [
157
+ StackedArea,
158
+ StackedBar,
159
+ StackedDiscreteBar,
160
+ ScatterPlot,
161
+ LineChart,
162
+ Marimekko,
163
+ SlopeChart,
164
+ ].includes(this.chartType as any)
165
+ }
166
+
167
+ @computed private get showFacetControl(): boolean {
168
+ const {
169
+ filledDimensions,
170
+ availableFacetStrategies,
171
+ hideFacetControl,
172
+ isOnChartTab,
173
+ } = this.manager
174
+
175
+ // if there's no choice to be made, don't display a lone button
176
+ if (availableFacetStrategies.length <= 1) return false
177
+
178
+ // heuristic: if the chart doesn't make sense unfaceted, then it probably
179
+ // also makes sense to let the user switch between entity/metric facets
180
+ if (!availableFacetStrategies.includes(FacetStrategy.none)) return true
181
+
182
+ const showFacetControlChartType = [
183
+ StackedArea,
184
+ StackedBar,
185
+ StackedDiscreteBar,
186
+ LineChart,
187
+ SlopeChart,
188
+ ].includes(this.chartType as any)
189
+
190
+ const hasProjection = filledDimensions.some(
191
+ (dim) => dim.display.isProjection
192
+ )
193
+
194
+ return (
195
+ showFacetControlChartType &&
196
+ !hideFacetControl &&
197
+ !hasProjection &&
198
+ !!isOnChartTab
199
+ )
200
+ }
201
+
202
+ @computed private get showSettingsMenuToggle(): boolean {
203
+ if (!this.manager.isOnChartTab) return false
204
+
205
+ return !!(
206
+ this.showYScaleToggle ||
207
+ this.showXScaleToggle ||
208
+ this.showFacetYDomainToggle ||
209
+ this.showZoomToggle ||
210
+ this.showNoDataAreaToggle ||
211
+ this.showFacetControl ||
212
+ this.showAbsRelToggle
213
+ )
214
+
215
+ // TODO: add a showCompareEndPointsOnlyToggle to complement compareEndPointsOnly
216
+ }
217
+
218
+ @action.bound private toggleVisibility(open?: boolean): void {
219
+ this.active = open ?? !this.active
220
+ }
221
+
222
+ @computed private get manager(): SettingsMenuManager {
223
+ return this.props.manager
224
+ }
225
+
226
+ @computed private get chartTypeLabel(): string {
227
+ return this.chartType.replace(/([A-Z])/g, " $1")
228
+ }
229
+
230
+ @computed private get selectionArray(): SelectionArray {
231
+ return makeSelectionArray(this.manager.selection)
232
+ }
233
+
234
+ @computed private get menuContentsChart(): React.ReactElement {
235
+ const {
236
+ manager,
237
+ showYScaleToggle,
238
+ showXScaleToggle,
239
+ showZoomToggle,
240
+ showNoDataAreaToggle,
241
+ showFacetControl,
242
+ showFacetYDomainToggle,
243
+ showAbsRelToggle,
244
+ } = this
245
+
246
+ const {
247
+ yAxis,
248
+ xAxis,
249
+ // compareEndPointsOnly,
250
+ filledDimensions,
251
+ isOnChartTab,
252
+ } = manager
253
+
254
+ const yLabel =
255
+ filledDimensions.find((d: ChartDimension) => d.property === "y")
256
+ ?.display.name ?? "Y axis",
257
+ xLabel =
258
+ filledDimensions.find((d: ChartDimension) => d.property === "x")
259
+ ?.display.name ?? "X axis",
260
+ omitLoneAxisLabel =
261
+ showYScaleToggle && !showXScaleToggle && yLabel === "Y axis"
262
+
263
+ return (
264
+ <>
265
+ <SettingsGroup
266
+ title="Chart view"
267
+ active={
268
+ isOnChartTab &&
269
+ (showAbsRelToggle ||
270
+ showZoomToggle ||
271
+ showNoDataAreaToggle ||
272
+ showFacetControl ||
273
+ showFacetYDomainToggle)
274
+ }
275
+ >
276
+ {showFacetControl && (
277
+ <FacetStrategySelector manager={manager} />
278
+ )}
279
+ {showFacetYDomainToggle && (
280
+ <FacetYDomainToggle manager={manager} />
281
+ )}
282
+ {showAbsRelToggle && <AbsRelToggle manager={manager} />}
283
+ {showNoDataAreaToggle && (
284
+ <NoDataAreaToggle manager={manager} />
285
+ )}
286
+ {showZoomToggle && <ZoomToggle manager={manager} />}
287
+ </SettingsGroup>
288
+ <SettingsGroup
289
+ title="Axis scale"
290
+ active={
291
+ isOnChartTab && (showYScaleToggle || showXScaleToggle)
292
+ }
293
+ >
294
+ {showYScaleToggle && (
295
+ <AxisScaleToggle
296
+ axis={yAxis!}
297
+ subtitle={omitLoneAxisLabel ? "" : yLabel}
298
+ />
299
+ )}
300
+ {showXScaleToggle && (
301
+ <AxisScaleToggle axis={xAxis!} subtitle={xLabel} />
302
+ )}
303
+ <div className="config-subtitle">
304
+ A linear scale evenly spaces values, where each
305
+ increment represents a consistent change. A logarithmic
306
+ scale uses multiples of the starting value, with each
307
+ increment representing the same percentage increase.
308
+ </div>
309
+ </SettingsGroup>
310
+ </>
311
+ )
312
+ }
313
+
314
+ @computed private get menuTitle(): string {
315
+ const { chartTypeLabel } = this
316
+ return `${chartTypeLabel} settings`
317
+ }
318
+
319
+ private renderSettingsButtonAndPopup(): React.ReactElement {
320
+ const { active } = this
321
+
322
+ return (
323
+ <div className="settings-menu">
324
+ <DialogTrigger
325
+ isOpen={this.active}
326
+ onOpenChange={this.toggleVisibility}
327
+ >
328
+ <Button
329
+ className={classnames("menu-toggle", { active })}
330
+ data-track-note="chart_settings_menu_toggle"
331
+ aria-label="Chart settings"
332
+ >
333
+ <FontAwesomeIcon icon={faGear} />
334
+ <span className="label"> Settings</span>
335
+ </Button>
336
+ <Popover
337
+ className={GRAPHER_SETTINGS_CLASS}
338
+ placement="bottom end"
339
+ style={{
340
+ maxWidth: this.props.popoverMaxWidth,
341
+ maxHeight: this.props.popoverMaxHeight,
342
+ }}
343
+ >
344
+ <Dialog>
345
+ <Heading
346
+ slot="title"
347
+ className="GrapherSettingsPopover__Header"
348
+ >
349
+ <OverlayHeader
350
+ title={this.menuTitle}
351
+ onDismiss={() =>
352
+ this.toggleVisibility(false)
353
+ }
354
+ />
355
+ </Heading>
356
+ <div className="GrapherSettingsPopover__Content">
357
+ {this.menuContentsChart}
358
+ </div>
359
+ </Dialog>
360
+ </Popover>
361
+ </DialogTrigger>
362
+ </div>
363
+ )
364
+ }
365
+
366
+ override render(): React.ReactElement | null {
367
+ const {
368
+ manager: { isOnChartTab },
369
+ showSettingsMenuToggle,
370
+ } = this
371
+
372
+ return isOnChartTab && showSettingsMenuToggle
373
+ ? this.renderSettingsButtonAndPopup()
374
+ : null
375
+ }
376
+ }
377
+
378
+ interface SettingsGroupProps {
379
+ title: string
380
+ subtitle?: string
381
+ active?: boolean
382
+ children?: React.ReactNode
383
+ }
384
+
385
+ @observer
386
+ class SettingsGroup extends React.Component<SettingsGroupProps> {
387
+ override render(): React.ReactElement | null {
388
+ const { active, title, subtitle, children } = this.props
389
+ if (!active) return null
390
+
391
+ return (
392
+ <section>
393
+ <div className="config-name">{title}</div>
394
+ {subtitle && <div className="config-subtitle">{subtitle}</div>}
395
+ {children}
396
+ </section>
397
+ )
398
+ }
399
+ }
@@ -0,0 +1,58 @@
1
+ $zindex-ControlsFooterMenu: 3;
2
+ $zindex-ControlsFooter: 2;
3
+
4
+ // hide the button that opens the embed menu on mobile
5
+ &.GrapherComponentNarrow .ShareMenu .embed {
6
+ display: none;
7
+ }
8
+
9
+ .ShareMenu {
10
+ $hover-fill: $gray-10;
11
+ $active-fill: $blue-20;
12
+
13
+ position: absolute;
14
+ bottom: $timelineHeight + 8px;
15
+ text-align: left;
16
+ background: #fff;
17
+ box-shadow: 0px 4px 40px 0px rgba(0, 0, 0, 0.06);
18
+ padding: 4px 0;
19
+ z-index: $zindex-ControlsFooterMenu;
20
+ border-radius: 4px;
21
+
22
+ h2 {
23
+ font-family: $sans-serif-font-stack;
24
+ margin: 0;
25
+ font-size: 12px;
26
+ font-weight: 700;
27
+ color: $light-text;
28
+ height: 28px;
29
+ line-height: 28px;
30
+ padding: 0 16px;
31
+ }
32
+
33
+ a {
34
+ font-size: 13px;
35
+ display: flex;
36
+ align-items: center;
37
+ text-align: left;
38
+ color: $dark-text;
39
+ text-decoration: none;
40
+ white-space: normal;
41
+ padding: 12px 16px;
42
+ letter-spacing: 0.01em;
43
+
44
+ &:hover {
45
+ background-color: $hover-fill;
46
+ }
47
+
48
+ &:active {
49
+ background-color: $active-fill;
50
+ color: $active-text;
51
+ }
52
+
53
+ > .icon {
54
+ margin-right: 6px;
55
+ flex: 0 0 16px;
56
+ }
57
+ }
58
+ }