@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11

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 (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -30,6 +30,19 @@ export declare function cap(options: Option[]): Option[];
30
30
  */
31
31
  export declare function getRefNameOptions(assembly: RefNameMatchSource | undefined, inputValue: string): Option[];
32
32
  export declare function getDeduplicatedResult(results: BaseResult[]): Option[];
33
+ /**
34
+ * The muted line under a row: a sequence's length, where a hit goes and the
35
+ * track it came from, or how many places share the row. A row sharing its name
36
+ * with a sequence is about the sequence, since an annotation's region feature
37
+ * names it too. A row whose hits all go to one place says where, without a
38
+ * track, since the pick lands through whichever of them the view has open. A
39
+ * row standing for many regions needs none.
40
+ */
41
+ export declare function optionDetail(result: BaseResult, lookups: {
42
+ trackNameOf: (trackId: string) => string | undefined;
43
+ lengthOf: (refName: string) => number | undefined;
44
+ placesOf: (results: BaseResult[]) => BaseResult[][];
45
+ }): string | undefined;
33
46
  export declare function coerceToResult(option: string | Option): BaseResult;
34
47
  export declare function getOptionLabel(option: string | Option): string;
35
48
  /**
@@ -1,5 +1,5 @@
1
1
  import BaseResult, { RefSequenceResult } from '../../TextSearch/BaseResults.js';
2
- import { measureText } from '../../util/index.js';
2
+ import { getBpDisplayStr, measureText, toLocale } from '../../util/index.js';
3
3
  import { MAX_GLOB_REGIONS, matchRefNames, } from '../../util/selectNamedRegions.js';
4
4
  // Above the 13.71px the TextField renders at, and left there deliberately. The
5
5
  // table is Helvetica's and the box draws in Roboto, so measuring the value at 14
@@ -134,6 +134,47 @@ export function getDeduplicatedResult(results) {
134
134
  }),
135
135
  });
136
136
  }
137
+ function formatLocString(locString) {
138
+ const match = /^(.+):(\d+)\.\.(\d+)$/.exec(locString);
139
+ return match
140
+ ? `${match[1]}:${toLocale(Number(match[2]))}-${toLocale(Number(match[3]))}`
141
+ : locString;
142
+ }
143
+ /**
144
+ * The muted line under a row: a sequence's length, where a hit goes and the
145
+ * track it came from, or how many places share the row. A row sharing its name
146
+ * with a sequence is about the sequence, since an annotation's region feature
147
+ * names it too. A row whose hits all go to one place says where, without a
148
+ * track, since the pick lands through whichever of them the view has open. A
149
+ * row standing for many regions needs none.
150
+ */
151
+ export function optionDetail(result, lookups) {
152
+ const { trackNameOf, lengthOf, placesOf } = lookups;
153
+ const locString = result.getLocation();
154
+ const trackId = result.getTrackId();
155
+ const sequence = result.results?.find(r => r instanceof RefSequenceResult);
156
+ if (sequence) {
157
+ return optionDetail(sequence, lookups);
158
+ }
159
+ else if (result.results?.length) {
160
+ const places = placesOf(result.results);
161
+ const only = places.length === 1 ? places[0][0].getLocation() : undefined;
162
+ return only === undefined
163
+ ? `${places.length} matches`
164
+ : formatLocString(only);
165
+ }
166
+ else if (!locString || /\s/.test(locString)) {
167
+ return undefined;
168
+ }
169
+ else if (result instanceof RefSequenceResult) {
170
+ const length = lengthOf(locString);
171
+ return length === undefined ? undefined : getBpDisplayStr(length);
172
+ }
173
+ else {
174
+ const trackName = trackId === undefined ? undefined : trackNameOf(trackId);
175
+ return [formatLocString(locString), trackName].filter(Boolean).join(' · ');
176
+ }
177
+ }
137
178
  // MUI freeSolo hands back the raw typed string when nothing in the list is
138
179
  // selected; wrap it so callers always get a BaseResult
139
180
  export function coerceToResult(option) {
@@ -1,10 +1,12 @@
1
1
  import type React from 'react';
2
- declare function ResizeHandle({ onDrag, onDragStart, onDragEnd, vertical, bar, gain, className: originalClassName, onPointerDown, ...props }: {
2
+ declare function ResizeHandle({ onDrag, onDragStart, onDragEnd, vertical, bar, grip, gain, className: originalClassName, onPointerDown, ...props }: {
3
3
  onDrag: (distance: number) => void;
4
4
  onDragStart?: () => void;
5
5
  onDragEnd?: () => void;
6
6
  vertical?: boolean;
7
7
  bar?: boolean;
8
+ /** An opaque `bar` with a grip pill, for the bottom edge of a view */
9
+ grip?: boolean | 'hover';
8
10
  /**
9
11
  * How many px this handle moves per px of the value it drags — see
10
12
  * `useResizeDrag`. Pass it when the value is shared by several stacked bands
@@ -1,16 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cx, makeStyles } from '../util/tss-react/index.js';
3
3
  import { useResizeDrag } from '../util/useResizeDrag.js';
4
- // Two kinds of handle, one ladder of weight between them. A handle that draws
4
+ const layer = (color) => `linear-gradient(${color}, ${color})`;
5
+ // Three kinds of handle, one ladder of weight between them. A handle that draws
5
6
  // nothing at rest reveals itself under the pointer at exactly the weight a
6
7
  // visible one rests at (`action.disabled`); a visible one then goes past that,
7
8
  // to `action.active` — the same resting/hover pair `VerticalScrollbar`'s thumb
8
- // uses.
9
- //
10
- // `action.selected` (0.08 light / 0.16 dark) used to be the hover for both, and
11
- // was too faint to answer "is this the thing I grab?" over a dense pileup — and
12
- // on a `bar`, which rests at 0.26, it made the handle go *fainter* under the
13
- // pointer, since `:hover` beats the plain class whatever the source order.
9
+ // uses. A `grip` bar sits on an opaque paper fill so a view's gridlines stop at
10
+ // it, and a centred pill marks it as something to grab. `grip="hover"` draws
11
+ // that grip only under the pointer or mid-drag.
14
12
  const useStyles = makeStyles()(theme => ({
15
13
  horizontalHandle: {
16
14
  cursor: 'row-resize',
@@ -18,21 +16,48 @@ const useStyles = makeStyles()(theme => ({
18
16
  // stop the browser turning a touch-drag into a scroll/pan gesture so the
19
17
  // pointer stream reaches us
20
18
  touchAction: 'none',
21
- '&:hover': { background: theme.palette.action.disabled },
19
+ '&:hover': { backgroundColor: theme.palette.action.disabled },
22
20
  },
23
21
  verticalHandle: {
24
22
  cursor: 'col-resize',
25
23
  height: '100%',
26
24
  touchAction: 'none',
27
- '&:hover': { background: theme.palette.action.disabled },
25
+ '&:hover': { backgroundColor: theme.palette.action.disabled },
28
26
  },
29
27
  // `bar` opt-in: the standard always-visible resize divider used at the bottom
30
28
  // (or side) of views and tracks. Other call sites stay invisible until hover.
31
29
  bar: { '&:hover': { background: theme.palette.action.active } },
32
30
  horizontalBar: { height: 4, background: theme.palette.action.disabled },
33
31
  verticalBar: { width: 4, background: theme.palette.action.disabled },
32
+ grip: {
33
+ backgroundColor: theme.palette.background.paper,
34
+ backgroundImage: `${layer(theme.palette.text.disabled)}, ${layer(theme.palette.action.disabled)}`,
35
+ backgroundPosition: 'center',
36
+ backgroundRepeat: 'no-repeat',
37
+ '&:hover': {
38
+ backgroundColor: theme.palette.background.paper,
39
+ backgroundImage: `${layer(theme.palette.text.secondary)}, ${layer(theme.palette.text.disabled)}`,
40
+ },
41
+ },
42
+ gripOnHover: {
43
+ '&:not(:hover):not(:active)': {
44
+ backgroundColor: 'transparent',
45
+ backgroundImage: 'none',
46
+ borderColor: 'transparent',
47
+ },
48
+ },
49
+ horizontalGrip: {
50
+ height: 6,
51
+ backgroundSize: '24px 3px, auto',
52
+ borderTop: `1px solid ${theme.palette.text.disabled}`,
53
+ },
54
+ verticalGrip: {
55
+ width: 6,
56
+ backgroundSize: '3px 24px, auto',
57
+ borderLeft: `1px solid ${theme.palette.text.disabled}`,
58
+ },
34
59
  }));
35
- function ResizeHandle({ onDrag, onDragStart, onDragEnd, vertical = false, bar = false, gain, className: originalClassName, onPointerDown, ...props }) {
60
+ function ResizeHandle({ onDrag, onDragStart, onDragEnd, vertical = false, bar = false, grip = false, gain, className: originalClassName, onPointerDown, ...props }) {
36
61
  const { classes } = useStyles();
37
62
  // The gesture, including the per-frame coalescing, the delta measurement and
38
63
  // the `data-gesture-owner` marker that keeps ancestor drags (the LGV
@@ -46,7 +71,15 @@ function ResizeHandle({ onDrag, onDragStart, onDragEnd, vertical = false, bar =
46
71
  vertical,
47
72
  gain,
48
73
  });
49
- return (_jsx("div", { ...props, className: cx(originalClassName, vertical ? classes.verticalHandle : classes.horizontalHandle, bar && classes.bar, bar && (vertical ? classes.verticalBar : classes.horizontalBar)), ...handleProps, onPointerDown: event => {
74
+ return (_jsx("div", { ...props, className: cx(originalClassName, vertical ? classes.verticalHandle : classes.horizontalHandle, grip && [
75
+ classes.grip,
76
+ vertical ? classes.verticalGrip : classes.horizontalGrip,
77
+ grip === 'hover' && classes.gripOnHover,
78
+ ], bar &&
79
+ !grip && [
80
+ classes.bar,
81
+ vertical ? classes.verticalBar : classes.horizontalBar,
82
+ ]), ...handleProps, onPointerDown: event => {
50
83
  handleProps.onPointerDown(event);
51
84
  onPointerDown?.(event);
52
85
  } }));
@@ -0,0 +1,13 @@
1
+ import type { VirtualScrollModel } from '../util/useVirtualScrollWheel.ts';
2
+ /**
3
+ * The chrome a virtually scrolled display mounts over its viewport: the edge
4
+ * shadow saying content is hidden, and the scrollbar to reach it. Renders
5
+ * nothing when the content fits.
6
+ */
7
+ export default function ScrollChrome({ model, controlsId, top, }: {
8
+ model: VirtualScrollModel;
9
+ /** `id` of the scrolled viewport element, for `aria-controls`. */
10
+ controlsId: string;
11
+ /** Viewport offset from the top, for a display with a sticky band above it. */
12
+ top?: number;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import ScrollEdgeShadow from './ScrollEdgeShadow.js';
3
+ import VerticalScrollbar from './VerticalScrollbar.js';
4
+ /**
5
+ * The chrome a virtually scrolled display mounts over its viewport: the edge
6
+ * shadow saying content is hidden, and the scrollbar to reach it. Renders
7
+ * nothing when the content fits.
8
+ */
9
+ export default function ScrollChrome({ model, controlsId, top = 0, }) {
10
+ return (_jsxs(_Fragment, { children: [_jsx(ScrollEdgeShadow, { model: model, top: top }), _jsx(VerticalScrollbar, { model: model, controlsId: controlsId, top: top })] }));
11
+ }
@@ -1,7 +1,7 @@
1
+ import type { VirtualScrollModel } from '../util/useVirtualScrollWheel.ts';
1
2
  /**
2
3
  * The "there is more content this way" edge shadow for a display that scrolls
3
- * its content virtually — the same displays that mount `VerticalScrollbar`,
4
- * drawn from the same three numbers.
4
+ * its content virtually, mounted beside `VerticalScrollbar` by `ScrollChrome`.
5
5
  *
6
6
  * It answers a question the scrollbar technically also answers and in practice
7
7
  * does not: **is this track showing me all of its features?** A 6px thumb on a
@@ -33,12 +33,9 @@
33
33
  * — autogrow/fit, and the truncation warning for features that were dropped
34
34
  * rather than merely scrolled away). This says *that*; that says *what to do*.
35
35
  */
36
- export default function ScrollEdgeShadow({ scrollTop, viewportHeight, contentHeight, top, }: {
37
- scrollTop: number;
38
- /** the visible viewport height */
39
- viewportHeight: number;
40
- /** the full scrollable content height */
41
- contentHeight: number;
36
+ declare const ScrollEdgeShadow: ({ model, top, }: {
37
+ model: VirtualScrollModel;
42
38
  /** viewport offset from the top, for a display with a sticky band above it */
43
39
  top?: number;
44
- }): import("react").JSX.Element | null;
40
+ }) => import("react").JSX.Element | null;
41
+ export default ScrollEdgeShadow;
@@ -1,34 +1,19 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { observer } from 'mobx-react';
2
3
  import { clamp } from '../util/numericUtils.js';
3
4
  import { makeStyles } from '../util/tss-react/index.js';
4
- /**
5
- * How deep each edge fade is. Enough to read as a soft edge under the content
6
- * rather than as a rule, not so deep that it dims a whole row (the shortest row
7
- * a display draws is ~7px in its most compact mode).
8
- */
9
- const SHADOW_HEIGHT = 16;
10
- /**
11
- * Sub-pixel slack before an edge counts as scrolled away from. A fit/grow mode
12
- * scale leaves float epsilon in `contentHeight`, and without this a track that
13
- * exactly fits draws a permanent bottom fade — the one thing this must never
14
- * do, since "nothing is hidden" is the state it exists to distinguish.
15
- *
16
- * `VerticalScrollbar` has no equivalent and so still draws a full-height thumb
17
- * on that same sub-pixel overflow. Deliberately not lifted there: a thumb
18
- * filling its track reads as "nothing to scroll", where a permanent fade reads
19
- * as "something is hidden" — the wrong answer rather than a redundant one.
20
- */
5
+ // deep enough to read as a soft edge rather than a rule
6
+ const SHADOW_HEIGHT = 10;
7
+ // Slack at each edge, so a float residue in `scrollTop` doesn't mark one.
21
8
  const EPSILON = 0.5;
22
9
  const useStyles = makeStyles()(theme => {
23
10
  // The ink flips with the theme, and has to: a black shadow is invisible on
24
11
  // the dark theme's #121212 canvas, which is the same trap the scrollbar thumb
25
12
  // hit before it became theme-aware.
26
13
  const ink = theme.palette.mode === 'dark' ? '255,255,255' : '0,0,0';
27
- // 0.18, down from the 0.3 this shipped at: over a dense pileup the deep end
28
- // of the ramp read as a band of its own and drew the eye before the features
29
- // did, which inverts what it is for. It only has to be findable when someone
30
- // asks "is that everything?", not noticeable when nobody asked.
31
- const from = `rgba(${ink},0.18)`;
14
+ // findable when someone asks "is that everything?", not noticeable when
15
+ // nobody asked
16
+ const from = `rgba(${ink},0.1)`;
32
17
  // NOT the `transparent` keyword, which is transparent BLACK: interpolating to
33
18
  // it puts a grey cast through the middle of the ramp, and on the dark theme's
34
19
  // white ink that is the whole ramp.
@@ -46,8 +31,7 @@ const useStyles = makeStyles()(theme => {
46
31
  });
47
32
  /**
48
33
  * The "there is more content this way" edge shadow for a display that scrolls
49
- * its content virtually — the same displays that mount `VerticalScrollbar`,
50
- * drawn from the same three numbers.
34
+ * its content virtually, mounted beside `VerticalScrollbar` by `ScrollChrome`.
51
35
  *
52
36
  * It answers a question the scrollbar technically also answers and in practice
53
37
  * does not: **is this track showing me all of its features?** A 6px thumb on a
@@ -79,20 +63,15 @@ const useStyles = makeStyles()(theme => {
79
63
  * — autogrow/fit, and the truncation warning for features that were dropped
80
64
  * rather than merely scrolled away). This says *that*; that says *what to do*.
81
65
  */
82
- export default function ScrollEdgeShadow({ scrollTop, viewportHeight, contentHeight, top = 0, }) {
66
+ const ScrollEdgeShadow = observer(function ScrollEdgeShadow({ model, top = 0, }) {
83
67
  const { classes, cx } = useStyles();
84
- const scrollableHeight = Math.max(0, contentHeight - viewportHeight);
68
+ const { scrollableHeight, scrollViewportHeight: viewportHeight } = model;
85
69
  if (scrollableHeight <= 0) {
86
70
  return null;
87
71
  }
88
- const clamped = clamp(scrollTop, 0, scrollableHeight);
89
- // never deeper than the viewport itself: the bottom edge is placed by
90
- // subtracting this from the viewport's floor, so an unclamped SHADOW_HEIGHT
91
- // on a viewport shorter than it puts the ink above the viewport's own top,
92
- // over whatever pinned band the display stacked there. Reachable both ways —
93
- // the variants displays floor availableHeight at 0 because lineZoneHeight can
94
- // exceed the display height on its own, and the pileup's coverage band drags
95
- // up to the same place.
72
+ const clamped = clamp(model.scrollTop, 0, scrollableHeight);
73
+ // never deeper than the viewport, or the bottom edge inks the band above it
96
74
  const height = Math.min(SHADOW_HEIGHT, viewportHeight);
97
75
  return (_jsxs(_Fragment, { children: [clamped > EPSILON ? (_jsx("div", { "data-testid": "scroll-edge-shadow-top", className: cx(classes.edge, classes.top), style: { top, height } })) : null, clamped < scrollableHeight - EPSILON ? (_jsx("div", { "data-testid": "scroll-edge-shadow-bottom", className: cx(classes.edge, classes.bottom), style: { top: top + viewportHeight - height, height } })) : null] }));
98
- }
76
+ });
77
+ export default ScrollEdgeShadow;
@@ -1,35 +1,12 @@
1
- /**
2
- * What a view reads and writes to offer scroll-to-zoom. Duck-typed rather than
3
- * a model, like the rest of the wheel-zoom layer — every view here delegates
4
- * both to the session, which is where the preference lives.
5
- */
6
1
  export interface ScrollZoomToggleModel {
7
2
  scrollZoom: boolean;
8
3
  setScrollZoom: (flag: boolean) => void;
9
4
  }
10
5
  /**
11
- * The persistent control for scroll-to-zoom, shared by every view that has one.
12
- *
13
- * **Carries its own label.** Scroll-to-zoom is off by default, so a wheel over
14
- * the tracks does nothing until someone finds this — and the words in the header
15
- * are the whole of how they find it. An icon alone is not findable, whichever
16
- * icon: the glyph says "zoom" at best and nothing at all about the wheel. The
17
- * tooltip is where ctrl/⌘+scroll, which zooms whatever the preference says, is
18
- * named.
19
- *
20
- * **And it pulses when the preference changes.** The other ways to write it are
21
- * somewhere else on the screen — a view menu, the Preferences dialog — so the
22
- * moment the setting is learned is also the moment this button is not being
23
- * looked at. The ring is what connects the two: it says the thing you just
24
- * turned on lives *here*, which is what a user who wants it back off has to
25
- * know. Its own click pulses too — the answer to "where is this" should not
26
- * depend on which of the several places wrote it, and the other views' copies
27
- * of this button pulse with it, which is the preference being session-wide made
28
- * visible.
29
- *
30
- * `iconOnly` is for a header where this sits inside a run of icon buttons (the
31
- * comparative views), where a single labelled button reads as a mistake rather
32
- * than as emphasis. The tooltip carries the same words either way.
6
+ * The header control for scroll-to-zoom, shared by every view that has one: a
7
+ * labelled checkbox, or with `iconOnly` a button that fills when on. It rings
8
+ * whenever the preference changes, including from a menu or the Preferences
9
+ * dialog, so the user sees where the setting lives.
33
10
  */
34
11
  declare const ScrollZoomToggle: ({ model, iconOnly, }: {
35
12
  model: ScrollZoomToggleModel;
@@ -1,39 +1,43 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import ZoomInMapIcon from '@mui/icons-material/ZoomInMap';
4
- import { ToggleButton, Tooltip } from '@mui/material';
4
+ import { Checkbox, FormControlLabel, ToggleButton, Tooltip, } from '@mui/material';
5
5
  import { observer } from 'mobx-react';
6
6
  import { keyframes, makeStyles } from '../util/tss-react/index.js';
7
7
  import { alpha } from './palette.js';
8
8
  import { SCROLL_ZOOM_HELP, SCROLL_ZOOM_LABEL } from './scrollZoomLabels.js';
9
- // Two beats: one is a blink that a peripheral eye can miss, three outstays a
10
- // confirmation.
11
9
  const PULSE_MS = 550;
12
10
  const PULSE_COUNT = 2;
13
11
  const useStyles = makeStyles()(theme => {
14
- // The accent, not `primary`: JBrowse's primary is a near-black navy, and a
15
- // ring in it reads as a drop shadow rather than as something asking to be
16
- // looked at.
17
- const ringColor = alpha(theme.palette.secondary.main, 0.7);
18
- // Grows outward from the button's own edge, which is what carries the eye to
19
- // it — a ring drawn at its final size only appears there.
12
+ const { palette } = theme;
13
+ const ringBase = palette.mode === 'dark' ? palette.accent : palette.tertiary.main;
14
+ const ringColor = alpha(ringBase, 0.7);
20
15
  const ring = keyframes `
21
16
  from { box-shadow: 0 0 0 0 ${ringColor}; }
22
- to { box-shadow: 0 0 0 9px ${alpha(theme.palette.secondary.main, 0)}; }
17
+ to { box-shadow: 0 0 0 9px ${alpha(ringBase, 0)}; }
23
18
  `;
24
- // What the same cue looks like for someone who asked for less motion: the
25
- // ring is there at one size and fades. Reduced motion is about movement, not
26
- // about being told less.
27
19
  const steadyRing = keyframes `
28
20
  from { box-shadow: 0 0 0 4px ${ringColor}; }
29
- to { box-shadow: 0 0 0 4px ${alpha(theme.palette.secondary.main, 0)}; }
21
+ to { box-shadow: 0 0 0 4px ${alpha(ringBase, 0)}; }
30
22
  `;
31
23
  return {
32
- button: {
33
- border: 'none',
34
- textTransform: 'none',
24
+ label: {
25
+ position: 'relative',
26
+ marginLeft: 0,
27
+ marginRight: 0,
28
+ paddingRight: 8,
29
+ borderRadius: 4,
35
30
  whiteSpace: 'nowrap',
36
- gap: 4,
31
+ },
32
+ checkbox: {
33
+ padding: 6,
34
+ },
35
+ iconButton: {
36
+ border: 'none',
37
+ '&.Mui-selected, &.Mui-selected:hover': {
38
+ backgroundColor: palette.accent,
39
+ color: palette.background.paper,
40
+ },
37
41
  },
38
42
  pulse: {
39
43
  position: 'absolute',
@@ -48,45 +52,24 @@ const useStyles = makeStyles()(theme => {
48
52
  };
49
53
  });
50
54
  /**
51
- * The persistent control for scroll-to-zoom, shared by every view that has one.
52
- *
53
- * **Carries its own label.** Scroll-to-zoom is off by default, so a wheel over
54
- * the tracks does nothing until someone finds this — and the words in the header
55
- * are the whole of how they find it. An icon alone is not findable, whichever
56
- * icon: the glyph says "zoom" at best and nothing at all about the wheel. The
57
- * tooltip is where ctrl/⌘+scroll, which zooms whatever the preference says, is
58
- * named.
59
- *
60
- * **And it pulses when the preference changes.** The other ways to write it are
61
- * somewhere else on the screen — a view menu, the Preferences dialog — so the
62
- * moment the setting is learned is also the moment this button is not being
63
- * looked at. The ring is what connects the two: it says the thing you just
64
- * turned on lives *here*, which is what a user who wants it back off has to
65
- * know. Its own click pulses too — the answer to "where is this" should not
66
- * depend on which of the several places wrote it, and the other views' copies
67
- * of this button pulse with it, which is the preference being session-wide made
68
- * visible.
69
- *
70
- * `iconOnly` is for a header where this sits inside a run of icon buttons (the
71
- * comparative views), where a single labelled button reads as a mistake rather
72
- * than as emphasis. The tooltip carries the same words either way.
55
+ * The header control for scroll-to-zoom, shared by every view that has one: a
56
+ * labelled checkbox, or with `iconOnly` a button that fills when on. It rings
57
+ * whenever the preference changes, including from a menu or the Preferences
58
+ * dialog, so the user sees where the setting lives.
73
59
  */
74
60
  const ScrollZoomToggle = observer(function ScrollZoomToggle({ model, iconOnly, }) {
75
61
  const { classes } = useStyles();
76
62
  const { scrollZoom } = model;
77
- // `count` doubles as the restart key — a class alone won't replay a CSS
78
- // animation that is already on the element, which is the toggle flipped twice
79
- // in a row. Adjusted during render rather than from an effect, so a
80
- // StrictMode host's doubled mount effect can't pulse a button nobody touched.
63
+ // `count` doubles as the restart key, since a class alone won't replay a
64
+ // running CSS animation
81
65
  const [pulse, setPulse] = useState({ shownFor: scrollZoom, count: 0 });
82
66
  if (pulse.shownFor !== scrollZoom) {
83
67
  setPulse({ shownFor: scrollZoom, count: pulse.count + 1 });
84
68
  }
85
- // `describeChild` once the label is visible: MUI's default puts the title on
86
- // the child as its `aria-label`, which would replace the words on the button
87
- // with a paragraph that doesn't contain them. Described, not named.
88
- return (_jsx(Tooltip, { title: SCROLL_ZOOM_HELP, describeChild: !iconOnly, children: _jsxs(ToggleButton, { value: "scrollZoom", selected: scrollZoom, onChange: () => {
89
- model.setScrollZoom(!scrollZoom);
90
- }, className: classes.button, size: "small", children: [_jsx(ZoomInMapIcon, { fontSize: "small" }), iconOnly ? null : SCROLL_ZOOM_LABEL, pulse.count ? (_jsx("span", { className: classes.pulse, "data-testid": "scroll-zoom-pulse" }, pulse.count)) : null] }) }));
69
+ const ring = pulse.count ? (_jsx("span", { className: classes.pulse, "data-testid": "scroll-zoom-pulse" }, pulse.count)) : null;
70
+ const flip = () => {
71
+ model.setScrollZoom(!scrollZoom);
72
+ };
73
+ return iconOnly ? (_jsx(Tooltip, { title: SCROLL_ZOOM_HELP, children: _jsxs(ToggleButton, { "data-testid": "scroll-zoom-toggle", value: "scrollZoom", selected: scrollZoom, onChange: flip, className: classes.iconButton, size: "small", children: [_jsx(ZoomInMapIcon, { fontSize: "small" }), ring] }) })) : (_jsx(Tooltip, { title: SCROLL_ZOOM_HELP, describeChild: true, children: _jsx(FormControlLabel, { "data-testid": "scroll-zoom-toggle", className: classes.label, control: _jsx(Checkbox, { size: "small", checked: scrollZoom, onChange: flip, className: classes.checkbox }), label: _jsxs(_Fragment, { children: [SCROLL_ZOOM_LABEL, ring] }), slotProps: { typography: { variant: 'body2' } } }) }));
91
74
  });
92
75
  export default ScrollZoomToggle;
@@ -0,0 +1,3 @@
1
+ export default function SessionJsonPanel({ session }: {
2
+ session: unknown;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import LabeledCheckbox from './LabeledCheckbox.js';
4
+ import MonospaceTextField from './MonospaceTextField.js';
5
+ // The session a share or export dialog is about to hand over, as indented JSON
6
+ // behind a checkbox, so the sender can read what they are sending whichever
7
+ // link carries it. Shared by jbrowse-web's ShareDialog and jbrowse-desktop's
8
+ // ExportToWebDialog.
9
+ export default function SessionJsonPanel({ session }) {
10
+ const [show, setShow] = useState(false);
11
+ return (_jsxs(_Fragment, { children: [_jsx(LabeledCheckbox, { checked: show, onChange: val => {
12
+ setShow(val);
13
+ }, label: "Show readable JSON" }), show ? (_jsx(MonospaceTextField, { label: "Session JSON", value: JSON.stringify(session, null, 2), readOnly: true, fullWidth: true, maxRows: 20 })) : null] }));
14
+ }
@@ -1,4 +1,5 @@
1
1
  import type { TrackConfigChange } from '../util/trackConfigDelta.ts';
2
+ export declare function formatSettingValue(value: unknown): string;
2
3
  /**
3
4
  * Shared three-column diff table (Setting / Default / Current) used by both the
4
5
  * per-track "changes" dialog and the global preferences-reset dialog, so the two
@@ -16,21 +16,59 @@ const useStyles = makeStyles()(theme => ({
16
16
  color: theme.palette.text.secondary,
17
17
  },
18
18
  }));
19
- // Many config values are `{ type: 'x' }` discriminated unions (colorBy,
20
- // groupBy, sortedBy, ...). Show just the type when that is the whole object so
21
- // the table reads "methylation" rather than `{"type":"methylation"}`; richer
19
+ // Many config values are `{ type: 'x' }` discriminated unions (sortedBy,
20
+ // ...). Show just the type when that is the whole object so
21
+ // the table reads "basePair" rather than `{"type":"basePair"}`; richer
22
22
  // objects keep full JSON so no detail is hidden.
23
23
  function isSoleTypeObject(v) {
24
24
  return ('type' in v && typeof v.type === 'string' && Object.keys(v).length === 1);
25
25
  }
26
- function formatSettingValue(value) {
27
- return value === undefined
28
- ? '(default)'
29
- : typeof value === 'string'
30
- ? value
31
- : typeof value === 'object' && value !== null && isSoleTypeObject(value)
32
- ? value.type
33
- : JSON.stringify(value);
26
+ // Past this many entries a list or a map is summarised by its count and its
27
+ // first few members: a row order names every sample of a cohort, and a label
28
+ // map every one the reader renamed, and a 2,500-name cell says nothing a
29
+ // count and a glimpse do not.
30
+ const LISTED_ENTRIES = 6;
31
+ // Past this many characters a string is a cluster tree's newick or a jexl
32
+ // callback, and the head is what tells them apart.
33
+ const STRING_HEAD = 80;
34
+ function summarizeList(values) {
35
+ const head = values
36
+ .slice(0, LISTED_ENTRIES)
37
+ .map(v => (typeof v === 'string' ? v : JSON.stringify(v)))
38
+ .join(', ');
39
+ return `${values.length} values: ${head}, …`;
40
+ }
41
+ function summarizeMap(entries) {
42
+ const head = entries
43
+ .slice(0, LISTED_ENTRIES)
44
+ .map(([k, v]) => `${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`)
45
+ .join(', ');
46
+ return `${entries.length} entries: ${head}, …`;
47
+ }
48
+ export function formatSettingValue(value) {
49
+ if (value === undefined) {
50
+ return '(default)';
51
+ }
52
+ if (typeof value === 'string') {
53
+ return value.length > STRING_HEAD
54
+ ? `${value.slice(0, STRING_HEAD)}… (${value.length} characters)`
55
+ : value;
56
+ }
57
+ if (Array.isArray(value)) {
58
+ return value.length > LISTED_ENTRIES
59
+ ? summarizeList(value)
60
+ : JSON.stringify(value);
61
+ }
62
+ if (typeof value === 'object' && value !== null) {
63
+ if (isSoleTypeObject(value)) {
64
+ return value.type;
65
+ }
66
+ const entries = Object.entries(value);
67
+ return entries.length > LISTED_ENTRIES
68
+ ? summarizeMap(entries)
69
+ : JSON.stringify(value);
70
+ }
71
+ return JSON.stringify(value);
34
72
  }
35
73
  /**
36
74
  * Shared three-column diff table (Setting / Default / Current) used by both the
@@ -1,6 +1,4 @@
1
- import type { ReactNode } from 'react';
2
- export default function ShareLinkField({ value, label, action, }: {
1
+ export default function ShareLinkField({ value, label, }: {
3
2
  value: string;
4
3
  label?: string;
5
- action?: ReactNode;
6
4
  }): import("react").JSX.Element;