@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
@@ -1,30 +1,19 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { observer } from 'mobx-react';
3
- import { ErrorBanner } from '../../ui/index.js';
4
3
  import FeatureDetails from './FeatureDetails.js';
5
- import FeatureWash from './FeatureWash.js';
6
- import { isEmpty } from './util.js';
4
+ import FeatureDetailsFrame from './FeatureDetailsFrame.js';
5
+ import ParentFeatureLine from './ParentFeatureLine.js';
7
6
  const BaseFeatureDetail = observer(function BaseFeatureDetail({ model, }) {
8
- const { error, featureData } = model;
7
+ const { featureData, unformattedFeatureData, parentFeature } = model;
9
8
  // annotated to shed the MST node brand types.frozen() carries on the instance
10
9
  const descriptions = model.descriptions;
11
- // A field is hidden by a formatDetails callback returning undefined (jexl
12
- // can't produce null); every detail component filters with `!= null`, so a
13
- // field set to undefined (live) or null (round-tripped through a snapshot) is
14
- // dropped identically.
15
- if (error) {
16
- return _jsx(ErrorBanner, { error: error });
17
- }
18
- else if (!featureData || isEmpty(featureData)) {
19
- return null;
20
- }
21
- else {
22
- return (_jsx(FeatureWash, { uniqueId: featureData.uniqueId, children: _jsx(FeatureDetails, { model: model, feature: featureData, descriptions: descriptions }) }));
23
- }
10
+ return (_jsx(FeatureDetailsFrame, { model: model, children: featureData ? (_jsxs(_Fragment, { children: [parentFeature ? (_jsx(ParentFeatureLine, { parentFeature: parentFeature })) : null, _jsx(FeatureDetails, { model: model, feature: featureData, unformatted: unformattedFeatureData, descriptions: descriptions })] })) : null }));
24
11
  });
25
12
  export default BaseFeatureDetail;
26
13
  export { default as BaseCard } from './BaseCard.js';
27
14
  export { default as BaseAttributes } from './BaseAttributes.js';
28
15
  export { default as BaseCoreDetails } from './BaseCoreDetails.js';
29
16
  export { default as FeatureDetails } from './FeatureDetails.js';
17
+ export { default as FeatureDetailsFrame } from './FeatureDetailsFrame.js';
30
18
  export { default as FeatureWash } from './FeatureWash.js';
19
+ export { filterByValueItems, jexlFilterDisplay } from './jexlFilterActions.js';
@@ -0,0 +1,16 @@
1
+ import type { MenuItem } from '../../ui/MenuTypes.ts';
2
+ import type { JexlFilterModel } from '../../util/jexlFilters.ts';
3
+ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
4
+ export interface JexlFilterDisplay extends JexlFilterModel, IStateTreeNode {
5
+ }
6
+ export declare function isJexlFilterDisplay(thing: unknown): thing is JexlFilterDisplay;
7
+ /** The first of a track's displays that takes jexl filters. */
8
+ export declare function jexlFilterDisplay(track?: {
9
+ displays: readonly unknown[];
10
+ }): JexlFilterDisplay | undefined;
11
+ /**
12
+ * "Show only" and "Hide" items for one feature attribute's value, and "Show
13
+ * only ≥" for a number. Each appends a filter line to the display and offers
14
+ * an undo.
15
+ */
16
+ export declare function filterByValueItems(display: JexlFilterDisplay, path: string[], value: unknown): MenuItem[];
@@ -0,0 +1,49 @@
1
+ import { pathSubject, printCondition } from '@jbrowse/jexl';
2
+ import { ensureJexlPrefix } from '../../util/jexlStrings.js';
3
+ import { getNotificationSink } from '../../util/sessionServices.js';
4
+ const MAX_LABEL_VALUE = 30;
5
+ export function isJexlFilterDisplay(thing) {
6
+ return (typeof thing === 'object' &&
7
+ thing !== null &&
8
+ 'setFilter' in thing &&
9
+ 'configuredFilters' in thing);
10
+ }
11
+ /** The first of a track's displays that takes jexl filters. */
12
+ export function jexlFilterDisplay(track) {
13
+ return track?.displays.find(isJexlFilterDisplay);
14
+ }
15
+ /**
16
+ * "Show only" and "Hide" items for one feature attribute's value, and "Show
17
+ * only ≥" for a number. Each appends a filter line to the display and offers
18
+ * an undo.
19
+ */
20
+ export function filterByValueItems(display, path, value) {
21
+ if (typeof value !== 'string' && typeof value !== 'number') {
22
+ return [];
23
+ }
24
+ const field = path.join('.');
25
+ const text = String(value);
26
+ const shown = text.length > MAX_LABEL_VALUE ? `${text.slice(0, MAX_LABEL_VALUE)}…` : text;
27
+ const add = (op) => () => {
28
+ const previous = display.configuredFilters();
29
+ const line = printCondition({
30
+ subject: pathSubject('feature', path),
31
+ op,
32
+ value,
33
+ });
34
+ display.setFilter([...previous, ensureJexlPrefix(line)]);
35
+ getNotificationSink(display).notify('Filter added', 'info', {
36
+ name: 'Undo',
37
+ onClick: () => {
38
+ display.setFilter(previous);
39
+ },
40
+ });
41
+ };
42
+ return [
43
+ { label: `Show only ${field} = ${shown}`, onClick: add('==') },
44
+ { label: `Hide ${field} = ${shown}`, onClick: add('!=') },
45
+ ...(typeof value === 'number'
46
+ ? [{ label: `Show only ${field} ≥ ${shown}`, onClick: add('>=') }]
47
+ : []),
48
+ ];
49
+ }
@@ -1,11 +1,3 @@
1
1
  export declare function isEmpty(obj: Record<string, unknown>): boolean;
2
- export declare function applyFeatureFormatting<T extends {
3
- __jbrowsefmt?: Record<string, unknown>;
4
- }>(feature: T): T & {
5
- [x: string]: unknown;
6
- };
7
- export declare function isFormattedField(feature: {
8
- __jbrowsefmt?: Record<string, unknown>;
9
- }, key: string): boolean;
10
2
  export declare function generateTitle(name: unknown, id: unknown, type: unknown): string;
11
3
  export declare function accessNested(arr: string[], obj?: Record<string, unknown>): string | undefined;
@@ -1,40 +1,17 @@
1
- import { isObject } from '../../util/index.js';
1
+ import { coarseStripHTML, isObject } from '../../util/index.js';
2
2
  import { ellipses } from '../util.js';
3
3
  export function isEmpty(obj) {
4
4
  return Object.keys(obj).length === 0;
5
5
  }
6
- // The view the details panel renders: raw feature fields with the
7
- // formatDetails-callback output (`__jbrowsefmt`) merged on top, so a callback
8
- // value overrides the raw one. A field the callback sets to null/undefined then
9
- // drops out of the panel's `!= null` filters — this is how callbacks hide
10
- // fields. `__jbrowsefmt` itself is in Attributes' globalOmit, so it never
11
- // renders.
12
- export function applyFeatureFormatting(feature) {
13
- return { ...feature, ...feature.__jbrowsefmt };
14
- }
15
- // Whether a formatDetails callback named `key` at all -- including setting it
16
- // to null/undefined, which is how a callback hides a field. Lets a derived row
17
- // (e.g. Length) defer to the callback without treating "hidden" as "absent".
18
- export function isFormattedField(feature, key) {
19
- const fmt = feature.__jbrowsefmt;
20
- return fmt !== undefined && key in fmt;
21
- }
22
6
  export function generateTitle(name, id, type) {
23
- const label = name || id;
24
- return [label ? ellipses(`${label}`) : '', type ? `${type}` : '']
7
+ const label = coarseStripHTML(`${name || id || ''}`);
8
+ return [label ? ellipses(label) : '', type ? `${type}` : '']
25
9
  .filter(Boolean)
26
10
  .join(' - ');
27
11
  }
28
- // pick using a path from an object, similar to _.get from lodash with special
29
- // logic for Descriptions from e.g. VCF headers
30
- //
31
- // @param arr example ['a','b'], obj = {a:{b:'hello}}
32
- // @returns hello (with special addition to grab description also)
33
- //
34
- // A path that runs out of objects before it runs out of elements has no
35
- // description: walking ['INFO','ANN'] into `{INFO: 'a string'}` used to stop at
36
- // the string and hand it back, so every subfield of an object-valued attribute
37
- // inherited its parent's description.
12
+ // the description at `arr` in a descriptions tree: a string there, or the
13
+ // `Description` of the object there, as a VCF header entry carries. A path
14
+ // that runs out of objects early has none
38
15
  export function accessNested(arr, obj = {}) {
39
16
  let obj2 = obj;
40
17
  for (const elt of arr) {
@@ -1,42 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { observer } from 'mobx-react';
3
- import { getGeneticCode, parseTranslTable, relativizeTranslExcept, } from '../../util/geneticCodes.js';
3
+ import { getGeneticCode } from '../../util/geneticCodes.js';
4
+ import SimpleFeature from '../../util/simpleFeature.js';
5
+ import { transcriptGeneticCodeId, transcriptTranslExcept, } from '../../util/translateTranscript.js';
4
6
  import { modeHasUpDownstream, modeSupportsRevcomp, resolveShowCoordinates, } from './featureTypeUtil.js';
5
7
  import CDNASequence from './seqtypes/CDNASequence.js';
6
8
  import CDSSequence from './seqtypes/CDSSequence.js';
7
9
  import GenomicSequence from './seqtypes/GenomicSequence.js';
8
10
  import ProteinSequence from './seqtypes/ProteinSequence.js';
9
11
  import { getSequenceData } from './useSequenceData.js';
10
- function findCdsSubfeature(feature) {
11
- return feature.subfeatures?.find(f => f.type?.toLowerCase() === 'cds');
12
- }
13
- // CDS-bound translation reads `transl_table` off the CDS subfeature (or the
14
- // feature itself), so e.g. a mitochondrial gene translates with table 2 rather
15
- // than the standard code. When the feature carries no transl_table (e.g. UCSC
16
- // genePred-derived GFFs), fall back to the assembly-configured code for the
17
- // contig. Undefined falls back to the standard code.
18
- function proteinGeneticCode(feature, assemblyGeneticCodeId) {
19
- const cds = findCdsSubfeature(feature);
20
- const id = parseTranslTable(feature.transl_table) ??
21
- parseTranslTable(cds?.transl_table) ??
22
- assemblyGeneticCodeId;
23
- return getGeneticCode(id);
24
- }
25
- // Parses transl_except from the feature or its CDS subfeature into the coordinate
26
- // system used by convertCodingSequenceToPeptides (feature-relative, reversed for
27
- // minus-strand genes).
28
- function featureTranslExcept(feature) {
29
- const cds = findCdsSubfeature(feature);
30
- const raw = feature.transl_except ?? cds?.transl_except;
31
- return raw
32
- ? relativizeTranslExcept({
33
- raw,
34
- featureStart: feature.start,
35
- featureLength: feature.end - feature.start,
36
- strand: feature.strand,
37
- })
38
- : [];
39
- }
40
12
  // Dispatches to the renderer for the current sequence type. An observer because
41
13
  // it reads showCoordinatesSetting: that setting moving relative<->genomic
42
14
  // leaves the coarse showCoordinates boolean every other observer here reads
@@ -60,9 +32,10 @@ const SequenceContents = observer(function SequenceContents({ mode, feature, seq
60
32
  case 'cds':
61
33
  return _jsx(CDSSequence, { model: model, cds: cds, sequence: seq });
62
34
  case 'protein': {
63
- const translExcept = featureTranslExcept(feature);
64
- const code = proteinGeneticCode(feature, assemblyGeneticCodeId);
65
- return (_jsx(ProteinSequence, { model: model, cds: cds, sequence: seq, codonTable: code.codonTable, starts: code.starts, translExcept: translExcept.length ? translExcept : undefined }));
35
+ const transcript = new SimpleFeature(feature);
36
+ const translExcept = transcriptTranslExcept(transcript);
37
+ const code = getGeneticCode(transcriptGeneticCodeId(transcript, assemblyGeneticCodeId));
38
+ return (_jsx(ProteinSequence, { model: model, cds: cds, sequence: seq, codonTable: code.codonTable, starts: code.starts, translExcept: translExcept?.length ? translExcept : undefined }));
66
39
  }
67
40
  // cdna and the gene_* variants all render the spliced transcript; introns
68
41
  // and up/downstream flanks are toggled by the mode name
@@ -1,7 +1,7 @@
1
1
  import type { SimpleFeatureSerialized } from '../../util/index.ts';
2
- import type { BaseFeatureWidgetModel } from '../stateModelFactory.ts';
2
+ import type { FeatureDetailsModel } from '../types.tsx';
3
3
  declare const SequenceFeaturePanel: ({ model, feature, }: {
4
- model: BaseFeatureWidgetModel;
4
+ model: FeatureDetailsModel;
5
5
  feature: SimpleFeatureSerialized;
6
6
  }) => import("react").JSX.Element;
7
7
  export default SequenceFeaturePanel;
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { observer } from 'mobx-react';
3
- import { toLocale } from '../../util/index.js';
3
+ import { coarseStripHTML, toLocale } from '../../util/index.js';
4
4
  import { getStrandStr } from '../util.js';
5
5
  import { modeHasUpDownstream, modeSupportsRevcomp } from './featureTypeUtil.js';
6
6
  const SequenceName = observer(function SequenceName({ mode, model, revcomp, feature, }) {
7
7
  return (_jsx("div", { children: `>${[
8
8
  [
9
- feature.name || feature.id,
9
+ coarseStripHTML(`${feature.name || feature.id || ''}`),
10
10
  mode,
11
11
  revcomp && modeSupportsRevcomp(mode) ? 'revcomp' : '',
12
12
  ]
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { FormControl, MenuItem, Select } from '@mui/material';
3
+ import { coarseStripHTML } from '../../../util/index.js';
3
4
  import { makeStyles } from '../../../util/tss-react/index.js';
4
5
  const useStyles = makeStyles()({
5
6
  formControl: {
@@ -14,5 +15,6 @@ export default function TranscriptSelector({ transcripts, transcriptIndex, setTr
14
15
  const { classes } = useStyles();
15
16
  return (_jsx(FormControl, { className: classes.formControl, children: _jsx(Select, { size: "small", value: transcriptIndex, onChange: event => {
16
17
  setTranscriptIndex(Number(event.target.value));
17
- }, "aria-label": "Transcript", children: transcripts.map((transcript, idx) => (_jsx(MenuItem, { value: idx, "data-testid": `transcript_${idx}`, children: transcript.name || transcript.id || `Transcript ${idx + 1}` }, transcript.uniqueId))) }) }));
18
+ }, "aria-label": "Transcript", children: transcripts.map((transcript, idx) => (_jsx(MenuItem, { value: idx, "data-testid": `transcript_${idx}`, children: coarseStripHTML(`${transcript.name || transcript.id || ''}`) ||
19
+ `Transcript ${idx + 1}` }, transcript.uniqueId))) }) }));
18
20
  }
@@ -10,6 +10,18 @@ export interface SequenceHoverTarget {
10
10
  setSequenceHoverPosition: (pos: SequenceHoverPosition | undefined) => void;
11
11
  }
12
12
  export type SequenceDisplayMode = 'gene' | 'gene_collapsed_intron' | 'gene_updownstream' | 'gene_updownstream_collapsed_intron' | 'cdna' | 'cds' | 'genomic' | 'genomic_sequence_updownstream' | 'protein';
13
+ /**
14
+ * #stateModel SequenceFeatureDetails
15
+ * #category Widget
16
+ * User preferences for the sequence readout under a feature's details, seeded
17
+ * from and written straight back to localStorage. Nothing here is snapshotted
18
+ * or reads the tree, so an instance is cheap and needs no lifecycle: a holder
19
+ * that only sometimes shows a panel (e.g. a track's right-click dialog) creates
20
+ * one when it opens rather than carrying it around.
21
+ *
22
+ * `BaseFeatureWidget` holds one as `sequenceFeatureDetails`, which is where a
23
+ * caller changing the readout reaches these actions.
24
+ */
13
25
  export declare function SequenceFeatureDetailsF(): import("@jbrowse/mobx-state-tree").IModelType<{}, {
14
26
  /**
15
27
  * #volatile
@@ -9,11 +9,18 @@ const p = 'sequenceFeatureDetails';
9
9
  function clampCharactersPerRow(n) {
10
10
  return Math.max(1, Math.floor(n));
11
11
  }
12
- // User preferences for the sequence readout, seeded from and written straight
13
- // back to localStorage. Nothing here is snapshotted or reads the tree, so an
14
- // instance is cheap and needs no lifecycle: a holder that only sometimes shows
15
- // a panel (e.g. a track's right-click dialog) creates one when it opens rather
16
- // than carrying it around.
12
+ /**
13
+ * #stateModel SequenceFeatureDetails
14
+ * #category Widget
15
+ * User preferences for the sequence readout under a feature's details, seeded
16
+ * from and written straight back to localStorage. Nothing here is snapshotted
17
+ * or reads the tree, so an instance is cheap and needs no lifecycle: a holder
18
+ * that only sometimes shows a panel (e.g. a track's right-click dialog) creates
19
+ * one when it opens rather than carrying it around.
20
+ *
21
+ * `BaseFeatureWidget` holds one as `sequenceFeatureDetails`, which is where a
22
+ * caller changing the readout reaches these actions.
23
+ */
17
24
  export function SequenceFeatureDetailsF() {
18
25
  return types
19
26
  .model('SequenceFeatureDetails')
@@ -18,13 +18,16 @@ function processFeatureData(children, feature) {
18
18
  // translations if included)
19
19
  const featureType = feature.type?.toLowerCase();
20
20
  const isMatureProteinRegion = featureType === 'mature_protein_region_of_cds';
21
+ const ofType = (type) => children.filter(sub => sub.type?.toLowerCase() === type);
22
+ // A frameshift polyprotein's CDS carries its reading frames as CDS rows beside
23
+ // its cleavage products; a single-frame one has only the products.
24
+ const codingRows = ofType('cds');
21
25
  const cds = isMatureProteinRegion
22
26
  ? [{ start: 0, end: feature.end - feature.start, type: 'CDS' }]
23
- : filterSuccessiveElementsWithSameStartAndEndCoord(children.filter(sub => {
24
- const type = sub.type?.toLowerCase();
25
- return type === 'cds' || type === 'mature_protein_region_of_cds';
26
- }));
27
- const exons = filterSuccessiveElementsWithSameStartAndEndCoord(children.filter(sub => sub.type?.toLowerCase() === 'exon'));
27
+ : filterSuccessiveElementsWithSameStartAndEndCoord(codingRows.length > 0
28
+ ? codingRows
29
+ : ofType('mature_protein_region_of_cds'));
30
+ const exons = filterSuccessiveElementsWithSameStartAndEndCoord(ofType('exon'));
28
31
  // annotated UTRs are deliberately not read: a UTR is just the exonic sequence
29
32
  // outside the CDS, so the renderer derives the split from cds+exons. Trusting
30
33
  // the annotation meant a transcript that named only one of its UTRs lost the
@@ -1,2 +1,2 @@
1
- declare const configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined>>;
1
+ declare const configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined, undefined, import("../configuration/requirements.ts").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string>, any>>;
2
2
  export { configSchema };
@@ -1,38 +1,22 @@
1
1
  import type { AnyConfigurationModel } from '../configuration/index.ts';
2
2
  import type { SimpleFeatureSerialized } from '../util/index.ts';
3
- import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
4
3
  /**
5
- * Anything carrying a `formatDetails` sub-schema: the session (whose
6
- * `configuration.formatDetails` applies to every track) and the clicked
7
- * feature's track. The track is absent when the widget was opened without one,
8
- * or outlived the one it had -- it is a `safeReference` -- and the session-wide
9
- * tier still has to run in that case.
4
+ * The two config nodes carrying a `formatDetails` sub-schema. The session's
5
+ * applies to every track; the track's is absent when the widget was opened
6
+ * without one. The track's object spreads over the session's, and its numbers
7
+ * win.
10
8
  */
11
- export interface FormatDetailsHolder extends IStateTreeNode {
12
- configuration: AnyConfigurationModel;
13
- }
14
9
  export interface FormatDetailsTiers {
15
- session: FormatDetailsHolder;
16
- track?: FormatDetailsHolder;
10
+ session: AnyConfigurationModel;
11
+ track?: AnyConfigurationModel;
17
12
  }
18
- /**
19
- * `depth` or `maxDepth`: the track's value when the track sets one, else the
20
- * session's, else unset.
21
- *
22
- * These override rather than merge, unlike the callback objects. That is only
23
- * expressible because both are `maybeNumber` slots with no `defaultValue` --
24
- * given a schema default the track reported a value whether or not anyone set
25
- * one, so the session-wide tier could never apply to a track, and every real
26
- * config has a track.
27
- */
13
+ /** `depth` or `maxDepth`: the track's value when set, else the session's. */
28
14
  export declare function formatDetailsNumber(tiers: FormatDetailsTiers, slot: string): number | undefined;
29
15
  /**
30
- * A copy of the feature with each tier's callback output merged onto it (and
31
- * onto its subfeatures, down to `depth`) as `__jbrowsefmt`, which the detail
32
- * components spread over the raw fields at render.
33
- *
34
- * `__jbrowsefmt` is attached only where a callback produced something, so a
35
- * config with no `formatDetails` at all leaves the feature exactly as it came
36
- * in rather than stamping empty objects through the persisted snapshot.
16
+ * The feature as the details panel shows it: each tier's `feature` callback
17
+ * output spread over the clicked feature, and `subfeatures` output over each
18
+ * subfeature down to `depth`. A key set to null or undefined hides that row,
19
+ * since every detail component filters with `!= null`. A config declaring no
20
+ * callback gets the input back untouched.
37
21
  */
38
- export declare function applyFormatDetails(tiers: FormatDetailsTiers, featureData: SimpleFeatureSerialized): SimpleFeatureSerialized;
22
+ export declare function applyFormatDetails(tiers: FormatDetailsTiers, feature: SimpleFeatureSerialized): SimpleFeatureSerialized;
@@ -1,63 +1,43 @@
1
- /**
2
- * @module
3
- * Resolving the `formatDetails` config hook across its two tiers, on behalf of
4
- * the feature-details widget's autorun. Plain functions rather than model
5
- * members: an MST action runs untracked, so folding these into one would leave
6
- * the autorun with no observable reads and fire it exactly once.
7
- */
8
- import { DEFAULT_FORMAT_DETAILS_DEPTH, getConf, mergeFormatCallbacks, } from '../configuration/index.js';
9
- import { isObject } from '../util/index.js';
10
- import { isEmpty } from './BaseFeatureDetail/util.js';
11
- import { formatSubfeatures } from './util.js';
12
- /** Both tiers of one slot, session first, so a spread puts the track on top. */
13
- function readTiers({ session, track }, slot, args) {
14
- return [
15
- getConf(session, ['formatDetails', slot], args),
16
- track ? getConf(track, ['formatDetails', slot], args) : undefined,
17
- ];
1
+ import { DEFAULT_FORMAT_DETAILS_DEPTH, mergeFormatCallbacks, readConfObject, } from '../configuration/index.js';
2
+ import { isPlainObject } from '../util/objectUtils.js';
3
+ function readCallback(conf, where, slot, args) {
4
+ try {
5
+ const fields = mergeFormatCallbacks(readConfObject(conf, ['formatDetails', slot], args));
6
+ if (fields.subfeatures != null) {
7
+ throw new Error('a callback can hide subfeatures but not replace them; reshape each one with the subfeatures callback');
8
+ }
9
+ return fields;
10
+ }
11
+ catch (e) {
12
+ throw new Error(`formatDetails.${slot} of ${where}: ${e}`, { cause: e });
13
+ }
14
+ }
15
+ function readCallbacks({ session, track }, slot, args) {
16
+ return mergeFormatCallbacks(readCallback(session, 'the session configuration', slot, args), track
17
+ ? readCallback(track, `track "${readConfObject(track, 'trackId')}"`, slot, args)
18
+ : undefined);
18
19
  }
19
20
  /**
20
- * Whether either tier **declares** a callback for `slot`, read RAW off the
21
- * config node.
22
- *
23
- * Deliberately not `readTiers`: "is anything configured here" and "what does
24
- * this produce for this feature" are different questions, and an arg-less read
25
- * of a `jexl:` slot answers the second one badly — it evaluates the user's
26
- * expression against a context where `feature` is undefined (see
27
- * `configuration/CLAUDE.md`), which is a throw or a junk value, per tier, just
28
- * to find out the slot exists.
29
- *
30
- * Both callback slots default to `{}`, so a config that never mentions
31
- * `formatDetails` answers false for both and `applyFormatDetails` can hand the
32
- * feature straight back. That is the whole point of asking: the walk it skips
33
- * is proportional to the subfeature tree, and the tree can be very large (a
34
- * RefSeq BRCA1 is 368 transcripts, ~16k nodes) while the config that formats
35
- * none of it is the overwhelmingly common one.
21
+ * Whether either tier sets `slot`, read raw off the node: an arg-less read of
22
+ * a `jexl:` slot evaluates it against an empty context just to find out it
23
+ * exists. Both callback slots default to `{}`, so a config that never mentions
24
+ * `formatDetails` answers false and the walk below is skipped entirely, which
25
+ * matters on a RefSeq gene with 16k nested nodes.
36
26
  */
37
27
  function declaresCallback({ session, track }, slot) {
38
- return [session, track].some(holder => {
39
- // raw property access, not a reader: see above
40
- const sub = holder?.configuration.formatDetails;
41
- const value = sub?.[slot];
42
- // a `jexl:` slot is a string; a plain-object slot counts only when it has
43
- // keys, since `{}` is the schema default and merges to nothing
28
+ return [session, track].some(conf => {
29
+ const value = conf?.formatDetails?.[slot];
44
30
  return typeof value === 'string'
45
31
  ? value !== ''
46
- : isObject(value) && !isEmpty(value);
32
+ : isPlainObject(value) && Object.keys(value).length > 0;
47
33
  });
48
34
  }
49
- /**
50
- * `depth` or `maxDepth`: the track's value when the track sets one, else the
51
- * session's, else unset.
52
- *
53
- * These override rather than merge, unlike the callback objects. That is only
54
- * expressible because both are `maybeNumber` slots with no `defaultValue` --
55
- * given a schema default the track reported a value whether or not anyone set
56
- * one, so the session-wide tier could never apply to a track, and every real
57
- * config has a track.
58
- */
35
+ /** `depth` or `maxDepth`: the track's value when set, else the session's. */
59
36
  export function formatDetailsNumber(tiers, slot) {
60
- const [fromSession, fromTrack] = readTiers(tiers, slot);
37
+ const fromSession = readConfObject(tiers.session, ['formatDetails', slot]);
38
+ const fromTrack = tiers.track
39
+ ? readConfObject(tiers.track, ['formatDetails', slot])
40
+ : undefined;
61
41
  return typeof fromTrack === 'number'
62
42
  ? fromTrack
63
43
  : typeof fromSession === 'number'
@@ -65,39 +45,38 @@ export function formatDetailsNumber(tiers, slot) {
65
45
  : undefined;
66
46
  }
67
47
  /**
68
- * A copy of the feature with each tier's callback output merged onto it (and
69
- * onto its subfeatures, down to `depth`) as `__jbrowsefmt`, which the detail
70
- * components spread over the raw fields at render.
71
- *
72
- * `__jbrowsefmt` is attached only where a callback produced something, so a
73
- * config with no `formatDetails` at all leaves the feature exactly as it came
74
- * in rather than stamping empty objects through the persisted snapshot.
48
+ * The feature as the details panel shows it: each tier's `feature` callback
49
+ * output spread over the clicked feature, and `subfeatures` output over each
50
+ * subfeature down to `depth`. A key set to null or undefined hides that row,
51
+ * since every detail component filters with `!= null`. A config declaring no
52
+ * callback gets the input back untouched.
75
53
  */
76
- export function applyFormatDetails(tiers, featureData) {
77
- const hasFeature = declaresCallback(tiers, 'feature');
78
- const hasSubfeatures = declaresCallback(tiers, 'subfeatures');
79
- // Nothing declared by either tier: the result is the input, so return the
80
- // input. The clone and the per-node walk below are both proportional to the
81
- // subfeature tree and both produce nothing here, and this is the default
82
- // config -- most tracks never set `formatDetails` at all.
83
- if (!hasFeature && !hasSubfeatures) {
84
- return featureData;
85
- }
86
- const feature = structuredClone(featureData);
87
- if (hasFeature) {
88
- const fmt = mergeFormatCallbacks(...readTiers(tiers, 'feature', { feature }));
89
- if (!isEmpty(fmt)) {
90
- feature.__jbrowsefmt = fmt;
91
- }
54
+ export function applyFormatDetails(tiers, feature) {
55
+ const formatsFeature = declaresCallback(tiers, 'feature');
56
+ const formatsSubfeatures = declaresCallback(tiers, 'subfeatures');
57
+ if (!formatsFeature && !formatsSubfeatures) {
58
+ return feature;
92
59
  }
93
- if (hasSubfeatures) {
94
- const depth = formatDetailsNumber(tiers, 'depth') ?? DEFAULT_FORMAT_DETAILS_DEPTH;
95
- formatSubfeatures(feature, depth, sub => {
96
- const subFmt = mergeFormatCallbacks(...readTiers(tiers, 'subfeatures', { feature: sub }));
97
- if (!isEmpty(subFmt)) {
98
- sub.__jbrowsefmt = subFmt;
99
- }
100
- });
60
+ const depth = formatsSubfeatures
61
+ ? (formatDetailsNumber(tiers, 'depth') ?? DEFAULT_FORMAT_DETAILS_DEPTH)
62
+ : 0;
63
+ const track = tiers.track ? readConfObject(tiers.track) : undefined;
64
+ function format(node, level, fmt) {
65
+ const { subfeatures } = node;
66
+ return {
67
+ ...node,
68
+ ...(subfeatures && level < depth
69
+ ? {
70
+ subfeatures: subfeatures.map(sub => format(sub, level + 1, readCallbacks(tiers, 'subfeatures', {
71
+ feature: sub,
72
+ parent: node,
73
+ depth: level + 1,
74
+ track,
75
+ }))),
76
+ }
77
+ : {}),
78
+ ...fmt,
79
+ };
101
80
  }
102
- return feature;
81
+ return format(feature, 0, formatsFeature ? readCallbacks(tiers, 'feature', { feature, track }) : {});
103
82
  }
@@ -1,5 +1,6 @@
1
1
  export { configSchema } from './configSchema.ts';
2
- export type { Descriptors, MaybeSerializedFeat } from './types.tsx';
2
+ export type { Descriptors, FeatureDetailsModel, MaybeSerializedFeat, } from './types.tsx';
3
3
  export type { SequenceHoverPosition, ShowCoordinatesMode, } from './SequenceFeatureDetails/model.ts';
4
+ export type { FormatDetailsTiers } from './formatDetails.ts';
4
5
  export { stateModelFactory } from './stateModelFactory.ts';
5
6
  export type { BaseFeatureWidgetModel, BaseFeatureWidgetStateModel, } from './stateModelFactory.ts';