@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,298 @@
1
+ import { trimArray } from "../../core-table/index.js"
2
+ import { imemo, isPresent } from "../../utils/index.js"
3
+
4
+ import { didYouMean, isBlankLine, isEmpty } from "./GrammarUtils.js"
5
+ import {
6
+ CellPosition,
7
+ CellDef,
8
+ CellHasErrorsClass,
9
+ MatrixLine,
10
+ MatrixProgram,
11
+ Grammar,
12
+ FrontierCellClass,
13
+ ParsedCell,
14
+ CommentCellDef,
15
+ SubTableValueCellDef,
16
+ WorkInProgressCellDef,
17
+ NothingGoesThereCellDef,
18
+ } from "./GridLangConstants.js"
19
+
20
+ export class GridCell implements ParsedCell {
21
+ private position: CellPosition
22
+ private matrix: MatrixProgram
23
+ private rootDefinition: CellDef
24
+ constructor(
25
+ matrix: MatrixProgram,
26
+ position: CellPosition,
27
+ rootDefinition: CellDef
28
+ ) {
29
+ this.position = position
30
+ this.matrix = matrix
31
+ this.rootDefinition = rootDefinition
32
+ }
33
+
34
+ private get row() {
35
+ return this.position.row
36
+ }
37
+
38
+ private get column() {
39
+ return this.position.column
40
+ }
41
+
42
+ private get line(): MatrixLine | undefined {
43
+ return this.matrix[this.row]
44
+ }
45
+
46
+ private get isCommentCell() {
47
+ const { contents } = this
48
+ return contents && CommentCellDef.regex!.test(contents)
49
+ }
50
+
51
+ private get cellTerminalTypeDefinition(): CellDef | undefined {
52
+ const { rootDefinition } = this
53
+ if (this.isCommentCell) return CommentCellDef
54
+ const grammar = rootDefinition.grammar as unknown as Grammar
55
+ if (this.column === 0) return rootDefinition as unknown as CellDef
56
+ const firstWordOnLine = this.line ? this.line[0] : undefined
57
+ const isFirstWordAKeyword =
58
+ firstWordOnLine && grammar[firstWordOnLine] !== undefined
59
+ if (this.column === 1 && firstWordOnLine && isFirstWordAKeyword)
60
+ return grammar[firstWordOnLine]
61
+
62
+ if (!isFirstWordAKeyword) return undefined
63
+
64
+ // It has a keyword but it is column >1
65
+ const def = grammar[firstWordOnLine!]
66
+ const positionalCellTypeDef =
67
+ def.positionalCellDefs && def.positionalCellDefs[this.column - 2]
68
+ if (positionalCellTypeDef) return positionalCellTypeDef
69
+ if (def.isHorizontalList && this.contents) return def // For now only return a def for lists if it is non-empty
70
+ return NothingGoesThereCellDef
71
+ }
72
+
73
+ private get parentSubTableInfo() {
74
+ const { row, matrix } = this
75
+ let pointerRow = row
76
+ let subTableHeaderRow = -1
77
+ while (pointerRow >= 0) {
78
+ const line = matrix[pointerRow]
79
+ if (!line) break
80
+ const parentKeyword = line[0]
81
+ if (parentKeyword) {
82
+ if (subTableHeaderRow === -1) return undefined
83
+ return {
84
+ parentKeyword,
85
+ parentRow: pointerRow,
86
+ subTableHeaderRow,
87
+ isCellInHeader: row === subTableHeaderRow,
88
+ headerKeyword: matrix[subTableHeaderRow][this.column],
89
+ }
90
+ }
91
+
92
+ if (!isBlankLine(line)) subTableHeaderRow = pointerRow
93
+ pointerRow--
94
+ }
95
+
96
+ return undefined
97
+ }
98
+
99
+ @imemo private get subTableParseResults() {
100
+ const { cellTerminalTypeDefinition } = this
101
+ if (cellTerminalTypeDefinition) return undefined
102
+
103
+ const info = this.parentSubTableInfo
104
+
105
+ if (!info) return undefined
106
+
107
+ const {
108
+ parentKeyword,
109
+ isCellInHeader,
110
+ subTableHeaderRow,
111
+ headerKeyword,
112
+ } = info
113
+
114
+ const subTableDef = this.rootDefinition.grammar![parentKeyword]
115
+
116
+ const headerCellDef = subTableDef && subTableDef.headerCellDef
117
+
118
+ if (!headerCellDef) return undefined
119
+
120
+ const headerGrammar = headerCellDef.grammar
121
+ const valueCellDef =
122
+ !isCellInHeader && headerGrammar
123
+ ? headerGrammar[headerKeyword]
124
+ : undefined
125
+
126
+ return {
127
+ isFrontierCell: this.isSubTableFrontierCell(
128
+ subTableHeaderRow,
129
+ subTableDef
130
+ ),
131
+ def: isCellInHeader
132
+ ? headerCellDef
133
+ : (valueCellDef ?? SubTableValueCellDef),
134
+ }
135
+ }
136
+
137
+ /**
138
+ * If a cell is:
139
+ * - to the right of the last filled cell in a line
140
+ * - and that line is indented to be part of a subtable, with options
141
+ * - and it is the first non-blank line in the subtabel
142
+ *
143
+ * Then consider is a "frontier cell"
144
+ *
145
+ */
146
+ private isSubTableFrontierCell(headerRow: number, subTableDef: CellDef) {
147
+ const { line, column, row } = this
148
+ const grammar = subTableDef.headerCellDef!.grammar
149
+ const isToTheImmediateRightOfLastFullCell =
150
+ line && trimArray(line).length === column
151
+ return (
152
+ row === headerRow &&
153
+ !isBlankLine(line) &&
154
+ isToTheImmediateRightOfLastFullCell &&
155
+ grammar &&
156
+ Object.keys(grammar).length
157
+ )
158
+ }
159
+
160
+ // If true show a +
161
+ private get isFirstCellOnFrontierRow() {
162
+ const { row, column } = this
163
+ const numRows = this.matrix.length
164
+ if (column) return false // Only first column should have a +
165
+ if (!isBlankLine(this.line)) return false // Only blank lines can be frontier
166
+ if (numRows === 1) {
167
+ if (row === 1) return !isBlankLine(this.matrix[0])
168
+ return row === 0
169
+ }
170
+ return row === numRows
171
+ }
172
+
173
+ private get suggestions() {
174
+ return []
175
+ }
176
+
177
+ private get definitionLinks(): CellPosition[] {
178
+ return []
179
+ }
180
+
181
+ private get implementationLinks(): CellPosition[] {
182
+ return []
183
+ }
184
+
185
+ @imemo get cellDef(): CellDef {
186
+ const def = this.cellTerminalTypeDefinition
187
+ if (def) return def
188
+
189
+ const subTable = this.subTableParseResults?.def
190
+ if (subTable) return subTable as unknown as CellDef
191
+
192
+ return WorkInProgressCellDef
193
+ }
194
+
195
+ get errorMessage() {
196
+ if (!this.line) return ""
197
+ const { cellDef, contents, optionKeywords } = this
198
+ const { regex, requirementsDescription, catchAllCellDef } = cellDef
199
+ const catchAllKeywordRegex = catchAllCellDef?.regex
200
+
201
+ if (contents === undefined || contents === "") return ""
202
+
203
+ const regexResult = regex
204
+ ? validate(contents, regex, requirementsDescription)
205
+ : undefined
206
+ const catchAllRegexResult = catchAllKeywordRegex
207
+ ? validate(
208
+ contents,
209
+ catchAllKeywordRegex,
210
+ catchAllCellDef!.requirementsDescription
211
+ )
212
+ : undefined
213
+
214
+ if (optionKeywords) {
215
+ if (optionKeywords.includes(contents)) return ""
216
+
217
+ if (regex) return regexResult
218
+ if (catchAllKeywordRegex) return catchAllRegexResult
219
+
220
+ const guess = didYouMean(contents, optionKeywords)
221
+ if (guess) return `Did you mean '${guess}'?`
222
+
223
+ return `Error: '${contents}' is not a valid option. Valid options are ${optionKeywords
224
+ .map((opt) => `'${opt}'`)
225
+ .join(", ")}`
226
+ }
227
+
228
+ if (regex) return regexResult
229
+ if (catchAllKeywordRegex) return catchAllRegexResult
230
+
231
+ return ""
232
+ }
233
+
234
+ get contents() {
235
+ return this.line ? this.line[this.column] : undefined
236
+ }
237
+
238
+ get comment() {
239
+ const { contents, errorMessage, cellDef } = this
240
+ if (isEmpty(contents)) return undefined
241
+ if (errorMessage) return errorMessage
242
+
243
+ if (cellDef.grammar) {
244
+ const def = cellDef.grammar[contents!] ?? cellDef.catchAllCellDef
245
+ return def.description
246
+ }
247
+
248
+ return [cellDef.description].join("\n")
249
+ }
250
+
251
+ get cssClasses() {
252
+ const { errorMessage, cellDef } = this
253
+ if (errorMessage) return [CellHasErrorsClass]
254
+ const showArrow =
255
+ this.isFirstCellOnFrontierRow ||
256
+ this.subTableParseResults?.isFrontierCell
257
+ ? FrontierCellClass
258
+ : undefined
259
+ const hasSuggestions =
260
+ this.cellDef.keyword === "table" ? "HasSuggestions" : null // todo: switch from strings to constants
261
+ return [cellDef.cssClass, hasSuggestions, showArrow].filter(isPresent)
262
+ }
263
+
264
+ get placeholder() {
265
+ const { contents, cellDef } = this
266
+ const { terminalOptions } = cellDef
267
+ const firstOption = terminalOptions && terminalOptions[0]
268
+ const firstOptionName = firstOption && firstOption.keyword
269
+ const placeholder = cellDef.valuePlaceholder ?? firstOptionName
270
+ return isEmpty(contents) && placeholder
271
+ ? `eg "${placeholder}"`
272
+ : undefined
273
+ }
274
+
275
+ get optionKeywords() {
276
+ const { cellDef } = this
277
+ const { grammar, headerCellDef, terminalOptions } = cellDef
278
+ return terminalOptions
279
+ ? terminalOptions.map((def) => def.keyword)
280
+ : grammar
281
+ ? Object.keys(grammar)
282
+ : headerCellDef
283
+ ? Object.keys(headerCellDef.grammar!)
284
+ : undefined
285
+ }
286
+ }
287
+
288
+ const validate = (value: any, regex: RegExp, requirements?: string) => {
289
+ if (typeof value !== "string") return ""
290
+ if (!regex.test(value)) {
291
+ return `Error: ${
292
+ requirements
293
+ ? requirements
294
+ : `'${value}' did not validate against ${regex}`
295
+ }`
296
+ }
297
+ return ""
298
+ }
@@ -0,0 +1,255 @@
1
+ import { GrapherInterface } from "../../types/index.js"
2
+
3
+ export const CellHasErrorsClass = "CellHasErrorsClass"
4
+
5
+ export enum GridBoolean {
6
+ true = "true",
7
+ false = "false",
8
+ }
9
+
10
+ export const GRID_NODE_DELIMITER = "\n"
11
+ export const GRID_CELL_DELIMITER = "\t"
12
+ export const GRID_EDGE_DELIMITER = "\t"
13
+
14
+ export type CellCoordinate = number // An integer >= 0
15
+
16
+ export type Grammar<TCellDef extends CellDef = CellDef> = {
17
+ [keywordSlug: string]: TCellDef
18
+ }
19
+
20
+ // A CellDef is a tuple: part keyword and the other half is the contents. The contents can be 1 cell, a list of cells, and/or a subtable.
21
+ export interface CellDef {
22
+ keyword: string
23
+ cssClass: string
24
+ description: string
25
+ grammar?: Grammar
26
+ headerCellDef?: CellDef
27
+ terminalOptions?: CellDef[]
28
+ catchAllCellDef?: CellDef // Only used by vertical grammars, this cell def, if present, will be used if a keyword is unrecognized during parsing.
29
+ regex?: RegExp // A validation regex a value must pass. todo: seems like this is overloaded and used for testing keywords and contents.
30
+ requirementsDescription?: string
31
+ valuePlaceholder?: string
32
+ positionalCellDefs?: readonly CellDef[] // Additional cell types as positional arguments.
33
+ isHorizontalList?: boolean // a list type, such as "colors\tred\torange\tgreen"
34
+ parse?: (value: any) => any
35
+ }
36
+
37
+ export interface GrapherCellDef extends CellDef {
38
+ toGrapherObject: (value: any) => GrapherInterface // map to a partial config that is a valid GrapherInterface
39
+ }
40
+
41
+ export interface ColumnCellDef extends CellDef {
42
+ display?: boolean
43
+ }
44
+
45
+ export interface ParsedCell {
46
+ errorMessage?: string
47
+ cssClasses?: string[]
48
+ optionKeywords?: string[]
49
+ comment?: string
50
+ cellDef?: CellDef
51
+ placeholder?: string
52
+ contents?: any
53
+ }
54
+
55
+ export interface CellPosition {
56
+ row: CellCoordinate
57
+ column: CellCoordinate
58
+ }
59
+
60
+ export const Origin: CellPosition = {
61
+ row: 0,
62
+ column: 0,
63
+ }
64
+
65
+ export const BooleanCellDef: CellDef = {
66
+ keyword: "",
67
+ terminalOptions: [
68
+ { keyword: GridBoolean.true, cssClass: "", description: "" },
69
+ { keyword: GridBoolean.false, cssClass: "", description: "" },
70
+ ],
71
+ cssClass: "BooleanCellDef",
72
+ description: "Boolean",
73
+ parse: (value: any) => {
74
+ // Handle already parsed boolean values (to avoid double parsing)
75
+ if (typeof value === "boolean") return value
76
+ return value === GridBoolean.true
77
+ },
78
+ }
79
+
80
+ export const StringCellDef: CellDef = {
81
+ keyword: "",
82
+ cssClass: "StringCellDef",
83
+ description: "",
84
+ parse: (value: any) => `${value}`.replace(/\\n/g, "\n"),
85
+ }
86
+
87
+ export const StringDeclarationDef: CellDef = {
88
+ keyword: "",
89
+ cssClass: "StringDeclarationDef",
90
+ description: "",
91
+ }
92
+
93
+ export const EnumCellDef: CellDef = {
94
+ keyword: "",
95
+ cssClass: "EnumCellDef",
96
+ description: "",
97
+ }
98
+
99
+ export const RootKeywordCellDef: CellDef = {
100
+ keyword: "",
101
+ cssClass: "KeywordCellDef",
102
+ description: "Keyword",
103
+ }
104
+
105
+ export const NumericCellDef: CellDef = {
106
+ keyword: "",
107
+ cssClass: "NumericCellDef",
108
+ description: "",
109
+ regex: /^-?\d+\.?\d*$/,
110
+ requirementsDescription: `Must be a number`,
111
+ valuePlaceholder: "98.6",
112
+ parse: (value: any) => parseFloat(value),
113
+ }
114
+
115
+ export const NumericOrAutoCellDef: CellDef = {
116
+ keyword: "",
117
+ cssClass: "NumericCellDef",
118
+ description: "",
119
+ regex: /^(-?\d+\.?\d*|auto)$/,
120
+ requirementsDescription: `Must be a number or "auto"`,
121
+ valuePlaceholder: "98.6",
122
+ parse: (value: any) => {
123
+ if (value === "auto") return "auto"
124
+ return parseFloat(value)
125
+ },
126
+ }
127
+
128
+ export const IntegerCellDef: CellDef = {
129
+ keyword: "",
130
+ cssClass: "IntegerCellDef",
131
+ description: "",
132
+ regex: /^-?[0-9]+$/,
133
+ requirementsDescription: `Must be an integer`,
134
+ valuePlaceholder: "12345",
135
+ parse: (value: any) => parseInt(value),
136
+ }
137
+
138
+ export const PositiveIntegersCellDef: CellDef = {
139
+ keyword: "",
140
+ cssClass: "IntegerCellDef",
141
+ description: "",
142
+ regex: /^[0-9 ]+$/,
143
+ requirementsDescription: `Must be a positive integer or a list of positive integers`,
144
+ valuePlaceholder: "12345 23456",
145
+ }
146
+
147
+ export const SubTableHeaderCellDef: CellDef = {
148
+ keyword: "",
149
+ cssClass: "SubTableHeaderCellDef",
150
+ description: "",
151
+ }
152
+
153
+ export const SubTableValueCellDef: CellDef = {
154
+ keyword: "",
155
+ cssClass: "SubTableValueCellDef",
156
+ description: "",
157
+ }
158
+
159
+ const MatchUrlsOnlyRegex =
160
+ /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/
161
+
162
+ export const UrlCellDef: CellDef = {
163
+ keyword: "",
164
+ cssClass: "UrlCellDef",
165
+ description: "",
166
+ regex: MatchUrlsOnlyRegex,
167
+ }
168
+
169
+ export const QueryStringCellDef: CellDef = {
170
+ keyword: "",
171
+ cssClass: "QueryStringCellDef",
172
+ description: "",
173
+ }
174
+
175
+ export const NothingGoesThereCellDef: CellDef = {
176
+ keyword: "",
177
+ cssClass: "NothingGoesThereType",
178
+ description:
179
+ "Nothing should be here. You can make this a comment by prepending a ##",
180
+ }
181
+
182
+ export const CommentCellDef: CellDef = {
183
+ keyword: "",
184
+ cssClass: "CommentType",
185
+ description: "Just a comment.",
186
+ regex: /^(##|💬)/,
187
+ }
188
+
189
+ export const WorkInProgressCellDef: CellDef = {
190
+ keyword: "",
191
+ cssClass: "WorkInProgressCellDef",
192
+ description: "Not a recognized statement. Treating as a work in progress.",
193
+ }
194
+
195
+ export const SlugDeclarationCellDef: CellDef = {
196
+ keyword: "",
197
+ cssClass: "SlugDeclarationType",
198
+ description: "A unique URL-friendly name.",
199
+ regex: /^[a-zA-Z0-9-_]+$/,
200
+ requirementsDescription: `Can only contain the characters a-zA-Z0-9-_`,
201
+ }
202
+
203
+ // This is the name for a cell that is on the "frontier", where the next user input is expected to go. Okay to rename if you have a better word.
204
+ export const FrontierCellClass = "ShowDropdownArrow"
205
+
206
+ export const SlugsDeclarationCellDef: CellDef = {
207
+ keyword: "",
208
+ cssClass: "SlugDeclarationType",
209
+ description: "Unique URL-friendly names.",
210
+ regex: /^[a-zA-Z0-9-_ ]+$/,
211
+ requirementsDescription: `Can only contain the characters a-zA-Z0-9-_ `,
212
+ }
213
+
214
+ export const EtlPathCellDef: CellDef = {
215
+ keyword: "",
216
+ cssClass: "IndicatorIdOrEtlPath",
217
+ description: "Path to an ETL indicator.",
218
+ regex: /^$|^[\w\d_/-]+#[\w\d_/-]+$/,
219
+ requirementsDescription: `Can only contain the characters a-zA-Z0-9-_/#`,
220
+ }
221
+
222
+ export const IndicatorIdOrEtlPathCellDef: CellDef = {
223
+ keyword: "",
224
+ cssClass: "IndicatorIdOrEtlPath",
225
+ description: "A single indicator ID or a path to an ETL indicator.",
226
+ regex: /^\d+|[\w\d_/-]+#[\w\d_/-]+$/,
227
+ requirementsDescription: `Can only contain the characters a-zA-Z0-9-_/#`,
228
+ }
229
+
230
+ export const SlugOrIndicatorIdOrEtlPathCellDef: CellDef = {
231
+ keyword: "",
232
+ cssClass: "SlugOrIndicatorIdOrEtlPath",
233
+ description: "A column slug, indicator ID, or catalog path.",
234
+ regex: /^[a-zA-Z0-9-_]+$|^\d+$|^[\w\d_/-]+#[\w\d_/-]+$/,
235
+ requirementsDescription: `Can be a slug (a-zA-Z0-9-_), an indicator ID (digits), or a catalog path (a-zA-Z0-9-_/#)`,
236
+ }
237
+
238
+ export const IndicatorIdsOrEtlPathsCellDef: CellDef = {
239
+ keyword: "",
240
+ cssClass: "IndicatorIdOrEtlPath",
241
+ description: "One or more indicator IDs or paths to an ETL indicator.",
242
+ regex: /^((\d+|[\w\d_/-]*#[\w\d_/-]+)( +|$))+$/,
243
+ requirementsDescription: `Can only contain the characters a-zA-Z0-9-_/# `,
244
+ }
245
+
246
+ export const JSONObjectCellDef: CellDef = {
247
+ keyword: "",
248
+ cssClass: "JSONObjectCellDef",
249
+ description: "JSON object",
250
+ regex: /^\{.*\}$/, // very basic validation that expression starts with { and ends with }
251
+ requirementsDescription: "Must contain a valid JSON object",
252
+ }
253
+
254
+ export type MatrixLine = string[]
255
+ export type MatrixProgram = MatrixLine[]