@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,453 @@
1
+ import * as React from "react"
2
+ import { computed, action, makeObservable } from "mobx"
3
+ import { observer } from "mobx-react"
4
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
5
+ import {
6
+ faShareNodes,
7
+ faExpand,
8
+ faCompress,
9
+ faDownload,
10
+ faArrowRight,
11
+ IconDefinition,
12
+ faHeart,
13
+ } from "@fortawesome/free-solid-svg-icons"
14
+ import {
15
+ ShareMenu,
16
+ ShareMenuManager,
17
+ shareUsingShareApi,
18
+ shouldShareUsingShareApi,
19
+ } from "./ShareMenu.js"
20
+ import { Bounds, Tippy } from "../../utils/index.js"
21
+ import classNames from "classnames"
22
+ import {
23
+ DEFAULT_GRAPHER_BOUNDS,
24
+ GrapherModal,
25
+ } from "../core/GrapherConstants.js"
26
+ import { DownloadModalTabName } from "../modal/DownloadModal.js"
27
+
28
+ export interface ActionButtonsManager extends ShareMenuManager {
29
+ isAdmin?: boolean
30
+ isShareMenuActive?: boolean
31
+ hideShareButton?: boolean
32
+ hideExploreTheDataButton?: boolean
33
+ isInIFrame?: boolean
34
+ canonicalUrl?: string
35
+ isInFullScreenMode?: boolean
36
+ activeModal?: GrapherModal
37
+ activeDownloadModalTab?: DownloadModalTabName
38
+ isOnTableTab?: boolean
39
+ hideFullScreenButton?: boolean
40
+ }
41
+
42
+ // keep in sync with sass variables in ActionButtons.scss
43
+ const BUTTON_HEIGHT = 32
44
+ const PADDING_BETWEEN_BUTTONS = 8
45
+ const PADDING_BETWEEN_ICON_AND_LABEL = 8
46
+ const PADDING_X = 12
47
+
48
+ const BUTTON_WIDTH_ICON_ONLY = BUTTON_HEIGHT
49
+
50
+ interface ActionButtonsProps {
51
+ manager: ActionButtonsManager
52
+ maxWidth?: number
53
+ }
54
+
55
+ @observer
56
+ export class ActionButtons extends React.Component<ActionButtonsProps> {
57
+ constructor(props: ActionButtonsProps) {
58
+ super(props)
59
+ makeObservable(this)
60
+ }
61
+
62
+ @computed private get manager(): ActionButtonsManager {
63
+ return this.props.manager
64
+ }
65
+
66
+ @computed protected get maxWidth(): number {
67
+ return this.props.maxWidth ?? DEFAULT_GRAPHER_BOUNDS.width
68
+ }
69
+
70
+ @computed get height(): number {
71
+ return BUTTON_HEIGHT
72
+ }
73
+
74
+ @computed private get widthWithButtonLabels(): number {
75
+ const {
76
+ buttonCount,
77
+ hasDownloadButton,
78
+ hasDonateButton,
79
+ hasShareButton,
80
+ hasFullScreenButton,
81
+ hasExploreTheDataButton,
82
+ downloadButtonWithLabelWidth,
83
+ donateButtonWithLabelWidth,
84
+ shareButtonWithLabelWidth,
85
+ fullScreenButtonWithLabelWidth,
86
+ exploreTheDataButtonWithLabelWidth,
87
+ } = this
88
+
89
+ let width = 0
90
+ if (hasDownloadButton) {
91
+ width += downloadButtonWithLabelWidth
92
+ }
93
+ if (hasShareButton) {
94
+ width += shareButtonWithLabelWidth
95
+ }
96
+ if (hasFullScreenButton) {
97
+ width += fullScreenButtonWithLabelWidth
98
+ }
99
+ if (hasDonateButton) {
100
+ width += donateButtonWithLabelWidth
101
+ }
102
+ if (hasExploreTheDataButton) {
103
+ width += exploreTheDataButtonWithLabelWidth
104
+ }
105
+
106
+ return width + (buttonCount - 1) * PADDING_BETWEEN_BUTTONS
107
+ }
108
+
109
+ @computed get widthWithIconsOnly(): number {
110
+ const {
111
+ buttonCount,
112
+ hasExploreTheDataButton,
113
+ exploreTheDataButtonWidth,
114
+ } = this
115
+
116
+ let width = 0
117
+ let remainingButtonCount = buttonCount
118
+
119
+ // When shown, the explore the data button always has a label
120
+ if (hasExploreTheDataButton) {
121
+ width += exploreTheDataButtonWidth
122
+ remainingButtonCount--
123
+ }
124
+ width += remainingButtonCount * BUTTON_WIDTH_ICON_ONLY
125
+ width += (buttonCount - 1) * PADDING_BETWEEN_BUTTONS
126
+
127
+ return width
128
+ }
129
+
130
+ @computed get showButtonLabels(): boolean {
131
+ const { maxWidth, widthWithButtonLabels } = this
132
+ return widthWithButtonLabels <= maxWidth
133
+ }
134
+
135
+ @computed get width(): number {
136
+ const { showButtonLabels, widthWithButtonLabels, widthWithIconsOnly } =
137
+ this
138
+ return showButtonLabels ? widthWithButtonLabels : widthWithIconsOnly
139
+ }
140
+
141
+ private static computeButtonWidth(label: string): number {
142
+ const labelWidth = Bounds.forText(label, { fontSize: 13 }).width
143
+ return (
144
+ 2 * PADDING_X +
145
+ 12 + // icon width
146
+ PADDING_BETWEEN_ICON_AND_LABEL +
147
+ labelWidth
148
+ )
149
+ }
150
+
151
+ @computed private get downloadButtonWithLabelWidth(): number {
152
+ return ActionButtons.computeButtonWidth("Download")
153
+ }
154
+
155
+ @computed private get shareButtonWithLabelWidth(): number {
156
+ return ActionButtons.computeButtonWidth("Share")
157
+ }
158
+
159
+ @computed private get fullScreenButtonLabel(): string {
160
+ const { isInFullScreenMode } = this.manager
161
+ return isInFullScreenMode ? "Exit full-screen" : "Enter full-screen"
162
+ }
163
+
164
+ @computed private get fullScreenButtonWithLabelWidth(): number {
165
+ return ActionButtons.computeButtonWidth(this.fullScreenButtonLabel)
166
+ }
167
+
168
+ @computed private get donateButtonWithLabelWidth(): number {
169
+ return ActionButtons.computeButtonWidth("Donate")
170
+ }
171
+
172
+ @computed private get exploreTheDataButtonWithLabelWidth(): number {
173
+ return ActionButtons.computeButtonWidth("Explore the data")
174
+ }
175
+
176
+ @computed private get downloadButtonWidth(): number {
177
+ const {
178
+ hasDownloadButton,
179
+ showButtonLabels,
180
+ downloadButtonWithLabelWidth,
181
+ } = this
182
+ if (!hasDownloadButton) return 0
183
+ if (!showButtonLabels) return BUTTON_WIDTH_ICON_ONLY
184
+ return downloadButtonWithLabelWidth
185
+ }
186
+
187
+ @computed private get shareButtonWidth(): number {
188
+ const { hasShareButton, showButtonLabels, shareButtonWithLabelWidth } =
189
+ this
190
+ if (!hasShareButton) return 0
191
+ if (!showButtonLabels) return BUTTON_WIDTH_ICON_ONLY
192
+ return shareButtonWithLabelWidth
193
+ }
194
+
195
+ @computed private get fullScreenButtonWidth(): number {
196
+ const {
197
+ hasFullScreenButton,
198
+ showButtonLabels,
199
+ fullScreenButtonWithLabelWidth,
200
+ } = this
201
+ if (!hasFullScreenButton) return 0
202
+ if (!showButtonLabels) return BUTTON_WIDTH_ICON_ONLY
203
+ return fullScreenButtonWithLabelWidth
204
+ }
205
+
206
+ @computed private get donateButtonWidth(): number {
207
+ const {
208
+ hasDonateButton,
209
+ showButtonLabels,
210
+ donateButtonWithLabelWidth,
211
+ } = this
212
+ if (!hasDonateButton) return 0
213
+ if (!showButtonLabels) return BUTTON_WIDTH_ICON_ONLY
214
+ return donateButtonWithLabelWidth
215
+ }
216
+
217
+ // the "Explore the data" button is never shown without a label
218
+ @computed private get exploreTheDataButtonWidth(): number {
219
+ const { hasExploreTheDataButton, exploreTheDataButtonWithLabelWidth } =
220
+ this
221
+ if (!hasExploreTheDataButton) return 0
222
+ return exploreTheDataButtonWithLabelWidth
223
+ }
224
+
225
+ @action.bound toggleShareMenu(): void {
226
+ if (shouldShareUsingShareApi(this.manager)) {
227
+ void shareUsingShareApi(this.manager)
228
+ return
229
+ }
230
+ this.manager.isShareMenuActive = !this.manager.isShareMenuActive
231
+ }
232
+
233
+ @action.bound toggleFullScreenMode(): void {
234
+ this.manager.isInFullScreenMode = !this.manager.isInFullScreenMode
235
+ }
236
+
237
+ @action.bound openDownloadModal(): void {
238
+ this.manager.activeModal = GrapherModal.Download
239
+
240
+ // Open the Data tab when opening from the table view, otherwise open the Vis tab
241
+ if (this.manager.isOnTableTab) {
242
+ this.manager.activeDownloadModalTab = DownloadModalTabName.Data
243
+ } else {
244
+ this.manager.activeDownloadModalTab = DownloadModalTabName.Vis
245
+ }
246
+ }
247
+
248
+ @computed private get hasDownloadButton(): boolean {
249
+ return true
250
+ }
251
+
252
+ @computed private get hasDonateButton(): boolean {
253
+ return !!this.manager.isInIFrame && !this.manager.isAdmin
254
+ }
255
+
256
+ @computed private get hasShareButton(): boolean {
257
+ return (
258
+ !this.manager.hideShareButton && ShareMenu.shouldShow(this.manager)
259
+ )
260
+ }
261
+
262
+ @computed private get hasFullScreenButton(): boolean {
263
+ return !this.manager.hideFullScreenButton && !this.manager.isInIFrame
264
+ }
265
+
266
+ @computed private get hasExploreTheDataButton(): boolean {
267
+ const { manager } = this
268
+ return !manager.hideExploreTheDataButton || !!manager.isInIFrame
269
+ }
270
+
271
+ @computed private get buttonCount(): number {
272
+ let count = 0
273
+ if (this.hasDownloadButton) count += 1
274
+ if (this.hasShareButton) count += 1
275
+ if (this.hasFullScreenButton) count += 1
276
+ if (this.hasDonateButton) count += 1
277
+ if (this.hasExploreTheDataButton) count += 1
278
+ return count
279
+ }
280
+
281
+ private renderShareMenu(): React.ReactElement {
282
+ // distance between the right edge of the share button and the inner border of the frame
283
+ let right = 0
284
+ if (this.hasFullScreenButton)
285
+ right += PADDING_BETWEEN_BUTTONS + this.fullScreenButtonWidth
286
+ if (this.hasExploreTheDataButton)
287
+ right += PADDING_BETWEEN_BUTTONS + this.exploreTheDataButtonWidth
288
+
289
+ return (
290
+ <ShareMenu
291
+ manager={this.manager}
292
+ onDismiss={this.toggleShareMenu}
293
+ right={right}
294
+ />
295
+ )
296
+ }
297
+
298
+ override render(): React.ReactElement {
299
+ const { manager } = this
300
+ const { isShareMenuActive } = manager
301
+
302
+ return (
303
+ <div
304
+ className="ActionButtons"
305
+ style={{ height: this.height, width: this.width }}
306
+ >
307
+ <ul>
308
+ {this.hasDownloadButton && (
309
+ <li style={{ width: this.downloadButtonWidth }}>
310
+ <ActionButton
311
+ label="Download"
312
+ dataTrackNote="chart_click_download"
313
+ showLabel={this.showButtonLabels}
314
+ icon={faDownload}
315
+ onClick={action((e): void => {
316
+ this.openDownloadModal()
317
+ e.stopPropagation()
318
+ })}
319
+ />
320
+ </li>
321
+ )}
322
+ {this.hasShareButton && (
323
+ <li style={{ width: this.shareButtonWidth }}>
324
+ <ActionButton
325
+ label="Share"
326
+ dataTrackNote="chart_click_share"
327
+ showLabel={this.showButtonLabels}
328
+ icon={faShareNodes}
329
+ onClick={action((e): void => {
330
+ this.toggleShareMenu()
331
+ e.stopPropagation()
332
+ })}
333
+ isActive={this.manager.isShareMenuActive}
334
+ />
335
+ {isShareMenuActive && this.renderShareMenu()}
336
+ </li>
337
+ )}
338
+ {this.hasFullScreenButton && (
339
+ <li style={{ width: this.fullScreenButtonWidth }}>
340
+ <ActionButton
341
+ label={this.fullScreenButtonLabel}
342
+ dataTrackNote="chart_click_fullscreen"
343
+ showLabel={this.showButtonLabels}
344
+ icon={
345
+ manager.isInFullScreenMode
346
+ ? faCompress
347
+ : faExpand
348
+ }
349
+ onClick={this.toggleFullScreenMode}
350
+ />
351
+ </li>
352
+ )}
353
+ {this.hasDonateButton && (
354
+ <li style={{ width: this.donateButtonWidth }}>
355
+ <ActionButton
356
+ className="ActionButton--donate"
357
+ label="Donate"
358
+ dataTrackNote="chart_click_donate"
359
+ showLabel={this.showButtonLabels}
360
+ icon={faHeart}
361
+ href="https://ourworldindata.org/donate"
362
+ />
363
+ </li>
364
+ )}
365
+ {this.hasExploreTheDataButton && (
366
+ <li style={{ width: this.exploreTheDataButtonWidth }}>
367
+ <ActionButton
368
+ label="Explore the data"
369
+ dataTrackNote="chart_click_exploredata"
370
+ icon={faArrowRight}
371
+ iconPlacement="right"
372
+ href={manager.canonicalUrl}
373
+ className="ActionButton--exploreData"
374
+ showLabel={true}
375
+ />
376
+ </li>
377
+ )}
378
+ </ul>
379
+ </div>
380
+ )
381
+ }
382
+ }
383
+
384
+ export function ActionButton(props: {
385
+ label: string
386
+ icon: IconDefinition
387
+ iconPlacement?: "left" | "right"
388
+ href?: string
389
+ width?: number
390
+ dataTrackNote?: string
391
+ onClick?: React.MouseEventHandler<HTMLDivElement>
392
+ onMouseDown?: React.MouseEventHandler<HTMLDivElement>
393
+ showLabel?: boolean
394
+ isActive?: boolean
395
+ style?: React.CSSProperties
396
+ className?: string
397
+ }): React.ReactElement {
398
+ const buttonClassnames = classNames({
399
+ active: props.isActive,
400
+ "icon-only": !props.showLabel,
401
+ })
402
+
403
+ const iconPlacement = props.iconPlacement ?? "left"
404
+
405
+ const buttonContents = (
406
+ <>
407
+ {iconPlacement === "left" && <FontAwesomeIcon icon={props.icon} />}
408
+ {props.showLabel && <span className="label">{props.label}</span>}
409
+ {iconPlacement === "right" && <FontAwesomeIcon icon={props.icon} />}
410
+ </>
411
+ )
412
+
413
+ return (
414
+ <Tippy
415
+ content={props.label}
416
+ theme="grapher-dark"
417
+ placement="top"
418
+ arrow={false}
419
+ offset={[0, 4]}
420
+ trigger="mouseenter"
421
+ touch={false}
422
+ disabled={props.showLabel}
423
+ >
424
+ <div
425
+ className={classNames("ActionButton", props.className)}
426
+ style={props.style}
427
+ data-track-note={props.dataTrackNote}
428
+ onClick={props.onClick}
429
+ onMouseDown={props.onMouseDown}
430
+ >
431
+ {props.href ? (
432
+ <a
433
+ href={props.href}
434
+ className={buttonClassnames}
435
+ aria-label={props.label}
436
+ target="_blank"
437
+ rel="noopener"
438
+ >
439
+ {buttonContents}
440
+ </a>
441
+ ) : (
442
+ <button
443
+ className={buttonClassnames}
444
+ aria-label={props.label}
445
+ type="button"
446
+ >
447
+ {buttonContents}
448
+ </button>
449
+ )}
450
+ </div>
451
+ </Tippy>
452
+ )
453
+ }
@@ -0,0 +1,50 @@
1
+ @use "sass:color";
2
+
3
+ $linkColor: #0645ad;
4
+
5
+ .CommandPalette {
6
+ position: fixed;
7
+ top: 30px;
8
+ left: 30px;
9
+ font-size: 0.8em;
10
+ background: white;
11
+ z-index: 1000;
12
+ opacity: 0.95;
13
+ padding: 14px;
14
+ border-radius: 2px;
15
+ box-shadow:
16
+ rgba(0, 0, 0, 0.1) 0px 0px 2px 0px,
17
+ rgba(0, 0, 0, 0.25) 0px 2px 2px 0px;
18
+
19
+ .paletteTitle {
20
+ font-size: 1.2em;
21
+ font-weight: bold;
22
+ }
23
+
24
+ .commandCategory {
25
+ font-weight: bold;
26
+ margin-top: 1.4em;
27
+ }
28
+
29
+ .commandCombo {
30
+ width: 5em;
31
+ display: inline-block;
32
+ }
33
+
34
+ .commandCategory,
35
+ .commandOption {
36
+ line-height: 1.4em;
37
+ }
38
+
39
+ a {
40
+ color: $linkColor;
41
+
42
+ &:hover {
43
+ color: color.adjust($color: $linkColor, $lightness: +20%);
44
+ }
45
+
46
+ &:active {
47
+ color: color.adjust($color: $linkColor, $lightness: +40%);
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,74 @@
1
+ // @ts-nocheck
2
+ import * as _ from "lodash-es"
3
+ import { BodyPortal } from "../../components/index.js"
4
+ import { observer } from "mobx-react"
5
+ import * as React from "react"
6
+
7
+ declare type keyboardCombo = string
8
+
9
+ export interface Command {
10
+ combo: keyboardCombo
11
+ fn: () => void
12
+ title?: string
13
+ category?: string
14
+ }
15
+
16
+ const CommandPaletteClassName = "CommandPalette"
17
+
18
+ interface CommandPaletteProps {
19
+ commands: Command[]
20
+ display: "none" | "block"
21
+ }
22
+
23
+ @observer
24
+ export class CommandPalette extends React.Component<CommandPaletteProps> {
25
+ static togglePalette(): void {
26
+ const element = document.getElementsByClassName(
27
+ CommandPaletteClassName
28
+ )[0] as HTMLElement
29
+ if (element)
30
+ element.style.display =
31
+ element.style.display === "none" ? "block" : "none"
32
+ }
33
+
34
+ override render(): React.ReactElement {
35
+ const style: any = {
36
+ display: this.props.display,
37
+ }
38
+ let lastCat = ""
39
+ const commands = this.props.commands.filter(
40
+ (command) => command.title && command.category
41
+ )
42
+ const sortedCommands = _.sortBy(commands, "category").map(
43
+ (command, index) => {
44
+ let cat = undefined
45
+ if (command.category !== lastCat) {
46
+ lastCat = command.category!
47
+ cat = <div className="commandCategory">{lastCat}</div>
48
+ }
49
+ return (
50
+ <div key={`command${index}`}>
51
+ {cat}
52
+ <div className="commandOption">
53
+ <span className="commandCombo">
54
+ {command.combo}
55
+ </span>
56
+ <a onClick={(): void => command.fn()}>
57
+ {command.title}
58
+ </a>
59
+ </div>
60
+ </div>
61
+ )
62
+ }
63
+ )
64
+
65
+ return (
66
+ <BodyPortal>
67
+ <div className={CommandPaletteClassName} style={style}>
68
+ <div className="paletteTitle">Keyboard Shortcuts</div>
69
+ {sortedCommands}
70
+ </div>
71
+ </BodyPortal>
72
+ )
73
+ }
74
+ }
@@ -0,0 +1,93 @@
1
+ $active-icon: $blue-50;
2
+
3
+ @at-root {
4
+ .ContentSwitchers__OverflowMenu {
5
+ border-radius: 4px;
6
+ background-color: #fff;
7
+ box-shadow: 0px 4px 40px 0px rgba(0, 0, 0, 0.06);
8
+ }
9
+
10
+ .ContentSwitchers__OverflowMenuItem {
11
+ @include grapher_label-2-medium;
12
+
13
+ margin: 4px 0;
14
+ padding: 0 16px;
15
+ height: $controlRowHeight;
16
+ display: flex;
17
+ align-items: center;
18
+ color: $light-text;
19
+ cursor: pointer;
20
+ width: 100%;
21
+ background-color: #fff;
22
+
23
+ &:hover {
24
+ background-color: $gray-10;
25
+ }
26
+
27
+ &:focus-visible {
28
+ color: $active-text;
29
+ background-color: $active-fill;
30
+
31
+ svg {
32
+ color: $active-icon;
33
+ }
34
+ }
35
+ }
36
+
37
+ .Tabs.ContentSwitchers .Tabs__Tab,
38
+ .ContentSwitchers__OverflowMenuItem {
39
+ $icon-width: 13px;
40
+ $icon-padding: 6px;
41
+
42
+ .label {
43
+ margin-left: $icon-padding;
44
+ }
45
+
46
+ svg {
47
+ color: $gray-60;
48
+
49
+ &.custom-icon {
50
+ --size: $icon-width;
51
+
52
+ display: inline-block;
53
+ height: var(--size);
54
+ width: var(--size);
55
+ vertical-align: -1.625px;
56
+
57
+ &.scatter,
58
+ &.marimekko,
59
+ &.slope {
60
+ --size: 14px;
61
+ }
62
+ }
63
+ }
64
+
65
+ &[data-selected] {
66
+ svg {
67
+ color: $active-icon;
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ .Tabs.ContentSwitchers {
74
+ .Tabs__Tab.ContentSwitchers__OverflowMenuButton {
75
+ // Make the +X tab a bit narrower
76
+ padding: 0 8px;
77
+
78
+ // Don't show as 'active' when clicked
79
+ &[data-selected] {
80
+ background: #fff;
81
+ color: $light-text;
82
+ }
83
+ }
84
+
85
+ .Tabs__Tab.active {
86
+ color: $active-text;
87
+ background-color: $active-fill;
88
+
89
+ svg {
90
+ color: $active-icon;
91
+ }
92
+ }
93
+ }