@genome-spy/core 0.70.0 → 0.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/bundle/index.es.js +3923 -3598
  2. package/dist/bundle/index.js +150 -143
  3. package/dist/bundle/parquetRead-BnAGCa4_.js +1663 -0
  4. package/dist/schema.json +0 -48
  5. package/dist/src/data/formats/parquet.d.ts +12 -0
  6. package/dist/src/data/formats/parquet.d.ts.map +1 -0
  7. package/dist/src/data/formats/parquet.js +29 -0
  8. package/dist/src/data/formats/parquetRead.d.ts +18 -0
  9. package/dist/src/data/formats/parquetRead.d.ts.map +1 -0
  10. package/dist/src/data/formats/parquetRead.js +326 -0
  11. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  12. package/dist/src/data/sources/urlSource.js +8 -3
  13. package/dist/src/encoder/encoder.d.ts +2 -2
  14. package/dist/src/fonts/bmFontManager.d.ts +1 -1
  15. package/dist/src/genome/genome.d.ts +1 -1
  16. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  17. package/dist/src/genomeSpy/containerUi.js +0 -1
  18. package/dist/src/genomeSpy/viewHighlight.js +2 -2
  19. package/dist/src/genomeSpy.d.ts +3 -3
  20. package/dist/src/genomeSpy.d.ts.map +1 -1
  21. package/dist/src/genomeSpy.js +29 -3
  22. package/dist/src/gl/hashTable.d.ts +78 -0
  23. package/dist/src/gl/hashTable.d.ts.map +1 -0
  24. package/dist/src/gl/hashTable.js +164 -0
  25. package/dist/src/gl/includes/common.glsl.js +1 -1
  26. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  27. package/dist/src/gl/webGLHelper.js +12 -6
  28. package/dist/src/marks/mark.d.ts +2 -2
  29. package/dist/src/marks/mark.d.ts.map +1 -1
  30. package/dist/src/marks/mark.js +2 -3
  31. package/dist/src/spec/view.d.ts +0 -10
  32. package/dist/src/utils/keyboardZoomMotion.d.ts +93 -0
  33. package/dist/src/utils/keyboardZoomMotion.d.ts.map +1 -0
  34. package/dist/src/utils/keyboardZoomMotion.js +285 -0
  35. package/dist/src/utils/radixSort.d.ts.map +1 -1
  36. package/dist/src/utils/radixSort.js +26 -1
  37. package/dist/src/view/axisGridView.d.ts +1 -1
  38. package/dist/src/view/axisGridView.js +0 -1
  39. package/dist/src/view/axisView.d.ts +1 -1
  40. package/dist/src/view/concatView.d.ts +6 -3
  41. package/dist/src/view/concatView.d.ts.map +1 -1
  42. package/dist/src/view/concatView.js +9 -2
  43. package/dist/src/view/containerMutationHelper.d.ts +6 -6
  44. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  45. package/dist/src/view/containerView.d.ts +7 -5
  46. package/dist/src/view/containerView.d.ts.map +1 -1
  47. package/dist/src/view/containerView.js +4 -1
  48. package/dist/src/view/facetView.d.ts +2 -2
  49. package/dist/src/view/flowBuilder.d.ts +1 -1
  50. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  51. package/dist/src/view/gridView/gridChild.d.ts +3 -3
  52. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  53. package/dist/src/view/gridView/gridChild.js +0 -2
  54. package/dist/src/view/gridView/gridView.d.ts +13 -11
  55. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  56. package/dist/src/view/gridView/gridView.js +17 -26
  57. package/dist/src/view/gridView/keyboardZoomController.d.ts +21 -0
  58. package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -0
  59. package/dist/src/view/gridView/keyboardZoomController.js +202 -0
  60. package/dist/src/view/gridView/scrollbar.d.ts +1 -1
  61. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  62. package/dist/src/view/gridView/scrollbar.js +0 -1
  63. package/dist/src/view/gridView/selectionRect.d.ts +1 -1
  64. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  65. package/dist/src/view/gridView/selectionRect.js +0 -1
  66. package/dist/src/view/gridView/separatorView.js +0 -1
  67. package/dist/src/view/gridView/zoomNavigationUtils.d.ts +19 -0
  68. package/dist/src/view/gridView/zoomNavigationUtils.d.ts.map +1 -0
  69. package/dist/src/view/gridView/zoomNavigationUtils.js +51 -0
  70. package/dist/src/view/layerView.d.ts +8 -5
  71. package/dist/src/view/layerView.d.ts.map +1 -1
  72. package/dist/src/view/layerView.js +6 -2
  73. package/dist/src/view/title.d.ts.map +1 -1
  74. package/dist/src/view/title.js +0 -1
  75. package/dist/src/view/unitView.d.ts +8 -5
  76. package/dist/src/view/unitView.d.ts.map +1 -1
  77. package/dist/src/view/unitView.js +5 -1
  78. package/dist/src/view/view.d.ts +13 -9
  79. package/dist/src/view/view.d.ts.map +1 -1
  80. package/dist/src/view/view.js +7 -1
  81. package/dist/src/view/viewError.d.ts +1 -1
  82. package/dist/src/view/viewError.d.ts.map +1 -1
  83. package/dist/src/view/viewFactory.d.ts +3 -44
  84. package/dist/src/view/viewFactory.d.ts.map +1 -1
  85. package/dist/src/view/viewFactory.js +28 -69
  86. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  87. package/dist/src/view/viewSelectors.js +123 -160
  88. package/dist/src/view/viewSpecGuards.d.ts +43 -0
  89. package/dist/src/view/viewSpecGuards.d.ts.map +1 -0
  90. package/dist/src/view/viewSpecGuards.js +69 -0
  91. package/dist/src/view/viewUtils.d.ts +1 -1
  92. package/dist/src/view/viewUtils.d.ts.map +1 -1
  93. package/dist/src/view/zoom.d.ts +1 -0
  94. package/dist/src/view/zoom.d.ts.map +1 -1
  95. package/dist/src/view/zoom.js +5 -1
  96. package/package.json +4 -3
  97. package/dist/src/data/collector.test.d.ts +0 -2
  98. package/dist/src/data/collector.test.d.ts.map +0 -1
  99. package/dist/src/data/dataFlow.test.d.ts +0 -2
  100. package/dist/src/data/dataFlow.test.d.ts.map +0 -1
  101. package/dist/src/data/flow.test.d.ts +0 -2
  102. package/dist/src/data/flow.test.d.ts.map +0 -1
  103. package/dist/src/data/flowInit.test.d.ts +0 -2
  104. package/dist/src/data/flowInit.test.d.ts.map +0 -1
  105. package/dist/src/data/flowNode.test.d.ts +0 -2
  106. package/dist/src/data/flowNode.test.d.ts.map +0 -1
  107. package/dist/src/data/flowOptimizer.test.d.ts +0 -2
  108. package/dist/src/data/flowOptimizer.test.d.ts.map +0 -1
  109. package/dist/src/data/formats/fasta.test.d.ts +0 -2
  110. package/dist/src/data/formats/fasta.test.d.ts.map +0 -1
  111. package/dist/src/data/keyIndex.test.d.ts +0 -2
  112. package/dist/src/data/keyIndex.test.d.ts.map +0 -1
  113. package/dist/src/data/sources/inlineSource.test.d.ts +0 -2
  114. package/dist/src/data/sources/inlineSource.test.d.ts.map +0 -1
  115. package/dist/src/data/sources/sequenceSource.test.d.ts +0 -2
  116. package/dist/src/data/sources/sequenceSource.test.d.ts.map +0 -1
  117. package/dist/src/data/transforms/aggregate.test.d.ts +0 -2
  118. package/dist/src/data/transforms/aggregate.test.d.ts.map +0 -1
  119. package/dist/src/data/transforms/clone.test.d.ts +0 -2
  120. package/dist/src/data/transforms/clone.test.d.ts.map +0 -1
  121. package/dist/src/data/transforms/coverage.test.d.ts +0 -2
  122. package/dist/src/data/transforms/coverage.test.d.ts.map +0 -1
  123. package/dist/src/data/transforms/filter.test.d.ts +0 -2
  124. package/dist/src/data/transforms/filter.test.d.ts.map +0 -1
  125. package/dist/src/data/transforms/filterScoredLabels.test.d.ts +0 -2
  126. package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +0 -1
  127. package/dist/src/data/transforms/flatten.test.d.ts +0 -2
  128. package/dist/src/data/transforms/flatten.test.d.ts.map +0 -1
  129. package/dist/src/data/transforms/flattenDelimited.test.d.ts +0 -2
  130. package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +0 -1
  131. package/dist/src/data/transforms/flattenSequence.test.d.ts +0 -2
  132. package/dist/src/data/transforms/flattenSequence.test.d.ts.map +0 -1
  133. package/dist/src/data/transforms/formula.test.d.ts +0 -2
  134. package/dist/src/data/transforms/formula.test.d.ts.map +0 -1
  135. package/dist/src/data/transforms/identifier.test.d.ts +0 -2
  136. package/dist/src/data/transforms/identifier.test.d.ts.map +0 -1
  137. package/dist/src/data/transforms/pileup.test.d.ts +0 -2
  138. package/dist/src/data/transforms/pileup.test.d.ts.map +0 -1
  139. package/dist/src/data/transforms/project.test.d.ts +0 -2
  140. package/dist/src/data/transforms/project.test.d.ts.map +0 -1
  141. package/dist/src/data/transforms/regexExtract.test.d.ts +0 -2
  142. package/dist/src/data/transforms/regexExtract.test.d.ts.map +0 -1
  143. package/dist/src/data/transforms/regexFold.test.d.ts +0 -2
  144. package/dist/src/data/transforms/regexFold.test.d.ts.map +0 -1
  145. package/dist/src/data/transforms/sample.test.d.ts +0 -2
  146. package/dist/src/data/transforms/sample.test.d.ts.map +0 -1
  147. package/dist/src/data/transforms/stack.test.d.ts +0 -2
  148. package/dist/src/data/transforms/stack.test.d.ts.map +0 -1
  149. package/dist/src/encoder/accessor.test.d.ts +0 -2
  150. package/dist/src/encoder/accessor.test.d.ts.map +0 -1
  151. package/dist/src/encoder/encoder.test.d.ts +0 -2
  152. package/dist/src/encoder/encoder.test.d.ts.map +0 -1
  153. package/dist/src/encoder/metadataChannels.test.d.ts +0 -2
  154. package/dist/src/encoder/metadataChannels.test.d.ts.map +0 -1
  155. package/dist/src/genome/genome.test.d.ts +0 -2
  156. package/dist/src/genome/genome.test.d.ts.map +0 -1
  157. package/dist/src/genome/genomes.test.d.ts +0 -2
  158. package/dist/src/genome/genomes.test.d.ts.map +0 -1
  159. package/dist/src/genome/scaleIndex.test.d.ts +0 -2
  160. package/dist/src/genome/scaleIndex.test.d.ts.map +0 -1
  161. package/dist/src/genome/scaleLocus.test.d.ts +0 -2
  162. package/dist/src/genome/scaleLocus.test.d.ts.map +0 -1
  163. package/dist/src/genomeSpy/viewDataInit.test.d.ts +0 -2
  164. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +0 -1
  165. package/dist/src/gl/colorUtils.test.d.ts +0 -2
  166. package/dist/src/gl/colorUtils.test.d.ts.map +0 -1
  167. package/dist/src/paramRuntime/expressionRef.test.d.ts +0 -2
  168. package/dist/src/paramRuntime/expressionRef.test.d.ts.map +0 -1
  169. package/dist/src/paramRuntime/graphRuntime.test.d.ts +0 -2
  170. package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +0 -1
  171. package/dist/src/paramRuntime/paramRuntime.test.d.ts +0 -2
  172. package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +0 -1
  173. package/dist/src/paramRuntime/paramStore.test.d.ts +0 -2
  174. package/dist/src/paramRuntime/paramStore.test.d.ts.map +0 -1
  175. package/dist/src/scale/scale.test.d.ts +0 -2
  176. package/dist/src/scale/scale.test.d.ts.map +0 -1
  177. package/dist/src/scale/ticks.test.d.ts +0 -2
  178. package/dist/src/scale/ticks.test.d.ts.map +0 -1
  179. package/dist/src/scales/axisResolution.test.d.ts +0 -2
  180. package/dist/src/scales/axisResolution.test.d.ts.map +0 -1
  181. package/dist/src/scales/domainPlanner.test.d.ts +0 -2
  182. package/dist/src/scales/domainPlanner.test.d.ts.map +0 -1
  183. package/dist/src/scales/scaleInstanceManager.test.d.ts +0 -2
  184. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +0 -1
  185. package/dist/src/scales/scaleInteractionController.test.d.ts +0 -2
  186. package/dist/src/scales/scaleInteractionController.test.d.ts.map +0 -1
  187. package/dist/src/scales/scaleResolution.test.d.ts +0 -2
  188. package/dist/src/scales/scaleResolution.test.d.ts.map +0 -1
  189. package/dist/src/scales/scaleRules.test.d.ts +0 -2
  190. package/dist/src/scales/scaleRules.test.d.ts.map +0 -1
  191. package/dist/src/selection/selection.test.d.ts +0 -2
  192. package/dist/src/selection/selection.test.d.ts.map +0 -1
  193. package/dist/src/tooltip/dataTooltipHandler.test.d.ts +0 -2
  194. package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +0 -1
  195. package/dist/src/tooltip/flattenDatumRows.test.d.ts +0 -2
  196. package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +0 -1
  197. package/dist/src/tooltip/tooltipContext.test.d.ts +0 -2
  198. package/dist/src/tooltip/tooltipContext.test.d.ts.map +0 -1
  199. package/dist/src/utils/addBaseUrl.test.d.ts +0 -2
  200. package/dist/src/utils/addBaseUrl.test.d.ts.map +0 -1
  201. package/dist/src/utils/binnedIndex.test.d.ts +0 -2
  202. package/dist/src/utils/binnedIndex.test.d.ts.map +0 -1
  203. package/dist/src/utils/cloner.test.d.ts +0 -2
  204. package/dist/src/utils/cloner.test.d.ts.map +0 -1
  205. package/dist/src/utils/coalesce.test.d.ts +0 -2
  206. package/dist/src/utils/coalesce.test.d.ts.map +0 -1
  207. package/dist/src/utils/concatIterables.test.d.ts +0 -2
  208. package/dist/src/utils/concatIterables.test.d.ts.map +0 -1
  209. package/dist/src/utils/deepEqual.test.d.ts +0 -2
  210. package/dist/src/utils/deepEqual.test.d.ts.map +0 -1
  211. package/dist/src/utils/domainArray.test.d.ts +0 -2
  212. package/dist/src/utils/domainArray.test.d.ts.map +0 -1
  213. package/dist/src/utils/fetchUtils.test.d.ts +0 -2
  214. package/dist/src/utils/fetchUtils.test.d.ts.map +0 -1
  215. package/dist/src/utils/indexer.test.d.ts +0 -2
  216. package/dist/src/utils/indexer.test.d.ts.map +0 -1
  217. package/dist/src/utils/interactionEvent.test.d.ts +0 -2
  218. package/dist/src/utils/interactionEvent.test.d.ts.map +0 -1
  219. package/dist/src/utils/iterateNestedMaps.test.d.ts +0 -2
  220. package/dist/src/utils/iterateNestedMaps.test.d.ts.map +0 -1
  221. package/dist/src/utils/kWayMerge.test.d.ts +0 -2
  222. package/dist/src/utils/kWayMerge.test.d.ts.map +0 -1
  223. package/dist/src/utils/mergeObjects.test.d.ts +0 -2
  224. package/dist/src/utils/mergeObjects.test.d.ts.map +0 -1
  225. package/dist/src/utils/numberExtractor.test.d.ts +0 -2
  226. package/dist/src/utils/numberExtractor.test.d.ts.map +0 -1
  227. package/dist/src/utils/propertyCacher.test.d.ts +0 -2
  228. package/dist/src/utils/propertyCacher.test.d.ts.map +0 -1
  229. package/dist/src/utils/propertyCoalescer.test.d.ts +0 -2
  230. package/dist/src/utils/propertyCoalescer.test.d.ts.map +0 -1
  231. package/dist/src/utils/radixSort.test.d.ts +0 -2
  232. package/dist/src/utils/radixSort.test.d.ts.map +0 -1
  233. package/dist/src/utils/reservationMap.test.d.ts +0 -2
  234. package/dist/src/utils/reservationMap.test.d.ts.map +0 -1
  235. package/dist/src/utils/ringBuffer.test.d.ts +0 -2
  236. package/dist/src/utils/ringBuffer.test.d.ts.map +0 -1
  237. package/dist/src/utils/throttle.test.d.ts +0 -2
  238. package/dist/src/utils/throttle.test.d.ts.map +0 -1
  239. package/dist/src/utils/topK.test.d.ts +0 -2
  240. package/dist/src/utils/topK.test.d.ts.map +0 -1
  241. package/dist/src/utils/trees.test.d.ts +0 -2
  242. package/dist/src/utils/trees.test.d.ts.map +0 -1
  243. package/dist/src/utils/ui/tooltip.test.d.ts +0 -2
  244. package/dist/src/utils/ui/tooltip.test.d.ts.map +0 -1
  245. package/dist/src/utils/url.test.d.ts +0 -2
  246. package/dist/src/utils/url.test.d.ts.map +0 -1
  247. package/dist/src/utils/variableTools.test.d.ts +0 -2
  248. package/dist/src/utils/variableTools.test.d.ts.map +0 -1
  249. package/dist/src/view/concatView.test.d.ts +0 -2
  250. package/dist/src/view/concatView.test.d.ts.map +0 -1
  251. package/dist/src/view/dataReadiness.test.d.ts +0 -2
  252. package/dist/src/view/dataReadiness.test.d.ts.map +0 -1
  253. package/dist/src/view/flowBuilder.test.d.ts +0 -2
  254. package/dist/src/view/flowBuilder.test.d.ts.map +0 -1
  255. package/dist/src/view/gridView/gridView.test.d.ts +0 -2
  256. package/dist/src/view/gridView/gridView.test.d.ts.map +0 -1
  257. package/dist/src/view/gridView/selectionRect.test.d.ts +0 -2
  258. package/dist/src/view/gridView/selectionRect.test.d.ts.map +0 -1
  259. package/dist/src/view/layerView.test.d.ts +0 -2
  260. package/dist/src/view/layerView.test.d.ts.map +0 -1
  261. package/dist/src/view/layout/flexLayout.test.d.ts +0 -2
  262. package/dist/src/view/layout/flexLayout.test.d.ts.map +0 -1
  263. package/dist/src/view/layout/grid.test.d.ts +0 -2
  264. package/dist/src/view/layout/grid.test.d.ts.map +0 -1
  265. package/dist/src/view/layout/rectangle.test.d.ts +0 -2
  266. package/dist/src/view/layout/rectangle.test.d.ts.map +0 -1
  267. package/dist/src/view/multiscale.test.d.ts +0 -2
  268. package/dist/src/view/multiscale.test.d.ts.map +0 -1
  269. package/dist/src/view/view.test.d.ts +0 -2
  270. package/dist/src/view/view.test.d.ts.map +0 -1
  271. package/dist/src/view/viewDispose.test.d.ts +0 -2
  272. package/dist/src/view/viewDispose.test.d.ts.map +0 -1
  273. package/dist/src/view/viewFactory.test.d.ts +0 -2
  274. package/dist/src/view/viewFactory.test.d.ts.map +0 -1
  275. package/dist/src/view/viewParamRuntime.test.d.ts +0 -2
  276. package/dist/src/view/viewParamRuntime.test.d.ts.map +0 -1
  277. package/dist/src/view/viewSelectors.test.d.ts +0 -2
  278. package/dist/src/view/viewSelectors.test.d.ts.map +0 -1
  279. package/dist/src/view/viewUtils.test.d.ts +0 -2
  280. package/dist/src/view/viewUtils.test.d.ts.map +0 -1
@@ -0,0 +1,285 @@
1
+ /**
2
+ * @typedef {"KeyW" | "KeyA" | "KeyS" | "KeyD"} NavigationKeyCode
3
+ */
4
+
5
+ /**
6
+ * @typedef {object} AxisProfile
7
+ * @prop {number} baseSpeed Target speed reached rapidly after key press.
8
+ * @prop {number} maxExtraSpeed Additional speed gained during sustained hold.
9
+ * @prop {number} pressHalfLifeMs Half-life for accelerating toward target speed.
10
+ * @prop {number} releaseHalfLifeMs Half-life for braking velocity after release.
11
+ * @prop {number} holdGrowthHalfLifeMs Half-life for hold-time extra acceleration.
12
+ * @prop {number} stopVelocity Velocity threshold below which motion snaps to zero.
13
+ */
14
+
15
+ /**
16
+ * @typedef {object} AxisState
17
+ * @prop {number} velocity
18
+ * @prop {number} holdMs
19
+ * @prop {-1 | 0 | 1} direction
20
+ */
21
+
22
+ /**
23
+ * @typedef {object} MotionStep
24
+ * @prop {number} panDelta
25
+ * @prop {number} zoomDelta
26
+ * @prop {boolean} active
27
+ */
28
+
29
+ /**
30
+ * Tuned for fast key-tap response, one-second-ish braking, and gradual
31
+ * acceleration during long key holds.
32
+ */
33
+ export const DEFAULT_KEYBOARD_ZOOM_MOTION_CONFIG = {
34
+ pan: {
35
+ baseSpeed: 1,
36
+ maxExtraSpeed: 3,
37
+ pressHalfLifeMs: 30,
38
+ releaseHalfLifeMs: 100,
39
+ holdGrowthHalfLifeMs: 800,
40
+ stopVelocity: 0.01,
41
+ },
42
+ zoom: {
43
+ baseSpeed: 3,
44
+ maxExtraSpeed: 15,
45
+ pressHalfLifeMs: 10,
46
+ releaseHalfLifeMs: 100,
47
+ holdGrowthHalfLifeMs: 600,
48
+ stopVelocity: 0.01,
49
+ },
50
+ };
51
+
52
+ /**
53
+ * Handles smooth WASD navigation motion with acceleration and braking.
54
+ */
55
+ export default class KeyboardZoomMotion {
56
+ /** @type {Record<NavigationKeyCode, boolean>} */
57
+ #pressed;
58
+
59
+ /** @type {AxisState} */
60
+ #pan;
61
+
62
+ /** @type {AxisState} */
63
+ #zoom;
64
+
65
+ #panProfile;
66
+
67
+ #zoomProfile;
68
+
69
+ /**
70
+ * @param {typeof DEFAULT_KEYBOARD_ZOOM_MOTION_CONFIG} [config]
71
+ */
72
+ constructor(config = DEFAULT_KEYBOARD_ZOOM_MOTION_CONFIG) {
73
+ this.#panProfile = config.pan;
74
+ this.#zoomProfile = config.zoom;
75
+
76
+ this.#pressed = {
77
+ KeyW: false,
78
+ KeyA: false,
79
+ KeyS: false,
80
+ KeyD: false,
81
+ };
82
+
83
+ this.#pan = {
84
+ velocity: 0,
85
+ holdMs: 0,
86
+ direction: 0,
87
+ };
88
+
89
+ this.#zoom = {
90
+ velocity: 0,
91
+ holdMs: 0,
92
+ direction: 0,
93
+ };
94
+ }
95
+
96
+ /**
97
+ * @param {string} code
98
+ */
99
+ isNavigationKey(code) {
100
+ return (
101
+ code === "KeyW" ||
102
+ code === "KeyA" ||
103
+ code === "KeyS" ||
104
+ code === "KeyD"
105
+ );
106
+ }
107
+
108
+ /**
109
+ * @param {string} code
110
+ * @returns {boolean} true if the key state changed
111
+ */
112
+ handleKeyDown(code) {
113
+ return this.#setPressed(code, true);
114
+ }
115
+
116
+ /**
117
+ * @param {string} code
118
+ * @returns {boolean} true if the key state changed
119
+ */
120
+ handleKeyUp(code) {
121
+ return this.#setPressed(code, false);
122
+ }
123
+
124
+ reset() {
125
+ this.#pressed.KeyW = false;
126
+ this.#pressed.KeyA = false;
127
+ this.#pressed.KeyS = false;
128
+ this.#pressed.KeyD = false;
129
+
130
+ this.#pan.velocity = 0;
131
+ this.#pan.holdMs = 0;
132
+ this.#pan.direction = 0;
133
+
134
+ this.#zoom.velocity = 0;
135
+ this.#zoom.holdMs = 0;
136
+ this.#zoom.direction = 0;
137
+ }
138
+
139
+ /**
140
+ * @param {number} dtMs
141
+ * @returns {MotionStep}
142
+ */
143
+ step(dtMs) {
144
+ if (dtMs <= 0) {
145
+ return {
146
+ panDelta: 0,
147
+ zoomDelta: 0,
148
+ active: this.isActive(),
149
+ };
150
+ } else {
151
+ const panDirection = axisDirection(
152
+ this.#pressed.KeyD,
153
+ this.#pressed.KeyA
154
+ );
155
+ const zoomDirection = axisDirection(
156
+ this.#pressed.KeyW,
157
+ this.#pressed.KeyS
158
+ );
159
+
160
+ const panVelocity = updateAxis(
161
+ this.#pan,
162
+ panDirection,
163
+ dtMs,
164
+ this.#panProfile
165
+ );
166
+ const zoomVelocity = updateAxis(
167
+ this.#zoom,
168
+ zoomDirection,
169
+ dtMs,
170
+ this.#zoomProfile
171
+ );
172
+
173
+ const dtSeconds = dtMs / 1000;
174
+
175
+ return {
176
+ panDelta: panVelocity * dtSeconds,
177
+ zoomDelta: zoomVelocity * dtSeconds,
178
+ active: this.isActive(),
179
+ };
180
+ }
181
+ }
182
+
183
+ isActive() {
184
+ if (
185
+ this.#pressed.KeyW ||
186
+ this.#pressed.KeyA ||
187
+ this.#pressed.KeyS ||
188
+ this.#pressed.KeyD
189
+ ) {
190
+ return true;
191
+ } else {
192
+ return this.#pan.velocity !== 0 || this.#zoom.velocity !== 0;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * @param {string} code
198
+ * @param {boolean} pressed
199
+ * @returns {boolean}
200
+ */
201
+ #setPressed(code, pressed) {
202
+ if (!this.isNavigationKey(code)) {
203
+ return false;
204
+ } else {
205
+ const keyCode = /** @type {NavigationKeyCode} */ (code);
206
+ const previous = this.#pressed[keyCode];
207
+ if (previous === pressed) {
208
+ return false;
209
+ } else {
210
+ this.#pressed[keyCode] = pressed;
211
+ return true;
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ /**
218
+ * @param {boolean} negative
219
+ * @param {boolean} positive
220
+ * @returns {-1 | 0 | 1}
221
+ */
222
+ function axisDirection(negative, positive) {
223
+ if (negative === positive) {
224
+ return 0;
225
+ } else if (positive) {
226
+ return 1;
227
+ } else {
228
+ return -1;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * @param {AxisState} axis
234
+ * @param {-1 | 0 | 1} direction
235
+ * @param {number} dtMs
236
+ * @param {AxisProfile} profile
237
+ * @returns {number}
238
+ */
239
+ function updateAxis(axis, direction, dtMs, profile) {
240
+ if (direction !== 0) {
241
+ if (axis.direction !== direction) {
242
+ axis.holdMs = 0;
243
+ }
244
+
245
+ axis.holdMs += dtMs;
246
+
247
+ const extraSpeed =
248
+ profile.maxExtraSpeed *
249
+ (1 - Math.pow(2, -axis.holdMs / profile.holdGrowthHalfLifeMs));
250
+
251
+ const target = direction * (profile.baseSpeed + extraSpeed);
252
+
253
+ axis.velocity = smoothApproach(
254
+ axis.velocity,
255
+ target,
256
+ dtMs,
257
+ profile.pressHalfLifeMs
258
+ );
259
+ } else {
260
+ axis.holdMs = 0;
261
+ axis.velocity = smoothApproach(
262
+ axis.velocity,
263
+ 0,
264
+ dtMs,
265
+ profile.releaseHalfLifeMs
266
+ );
267
+
268
+ if (Math.abs(axis.velocity) < profile.stopVelocity) {
269
+ axis.velocity = 0;
270
+ }
271
+ }
272
+
273
+ axis.direction = direction;
274
+ return axis.velocity;
275
+ }
276
+
277
+ /**
278
+ * @param {number} current
279
+ * @param {number} target
280
+ * @param {number} dtMs
281
+ * @param {number} halfLifeMs
282
+ */
283
+ function smoothApproach(current, target, dtMs, halfLifeMs) {
284
+ return target + (current - target) * Math.pow(2, -dtMs / halfLifeMs);
285
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"radixSort.d.ts","sourceRoot":"","sources":["../../../src/utils/radixSort.js"],"names":[],"mappings":"AAKA;;GAEG;AACH,uCAFW,MAAM,EAAE,YAyDlB;AAaD;;GAEG;AACH,8CAFW,MAAM,EAAE,YAoDlB"}
1
+ {"version":3,"file":"radixSort.d.ts","sourceRoot":"","sources":["../../../src/utils/radixSort.js"],"names":[],"mappings":"AAiBA;;GAEG;AACH,uCAFW,MAAM,EAAE,YA8DlB;AAeD;;GAEG;AACH,8CAFW,MAAM,EAAE,YA0DlB"}
@@ -3,12 +3,29 @@ const MAX_INTEGER_DIGIT = getDigits([MAX_INTEGER]);
3
3
 
4
4
  // TODO: Optimize more! Some ideas: https://travisdowns.github.io/blog/2019/05/22/sorting.html
5
5
 
6
+ /**
7
+ * @param {number[]} arr An array of unsigned integers
8
+ */
9
+ function checkIfSorted(arr) {
10
+ for (let i = 1; i < arr.length; i++) {
11
+ if (arr[i] < arr[i - 1]) {
12
+ return false;
13
+ }
14
+ }
15
+ return true;
16
+ }
17
+
6
18
  /**
7
19
  * @param {number[]} arr An array of unsigned integers
8
20
  */
9
21
  export default function radixSort(arr) {
10
22
  const maxDigits = getDigits(arr);
11
23
 
24
+ // Early exit if already sorted
25
+ if (checkIfSorted(arr)) {
26
+ return arr;
27
+ }
28
+
12
29
  let buffer = new Array(arr.length);
13
30
  let bufferPtr = buffer;
14
31
  const counts = new Array(16);
@@ -69,7 +86,9 @@ export default function radixSort(arr) {
69
86
  function getDigits(arr) {
70
87
  let max = 0;
71
88
  for (let i = 0, n = arr.length; i < n; i++) {
72
- max = Math.max(max, arr[i]);
89
+ if (arr[i] > max) {
90
+ max = arr[i];
91
+ }
73
92
  }
74
93
  return Math.floor(Math.log2(max) / 4) + 1;
75
94
  }
@@ -80,6 +99,12 @@ function getDigits(arr) {
80
99
  export function radixSortIntoLookupArray(arr) {
81
100
  const maxDigits = getDigits(arr);
82
101
  let indexes = Array.from({ length: arr.length }, (_, i) => i);
102
+
103
+ // Early exit if already sorted
104
+ if (checkIfSorted(arr)) {
105
+ return indexes;
106
+ }
107
+
83
108
  let buffer = new Array(arr.length);
84
109
  const counts = new Array(16);
85
110
 
@@ -9,7 +9,7 @@
9
9
  * @typedef {import("../spec/axis.js").Axis} Axis
10
10
  * @typedef {import("../spec/axis.js").GenomeAxis} GenomeAxis
11
11
  */
12
- export default class AxisGridView extends LayerView {
12
+ export default class AxisGridView extends LayerView<import("../spec/view.js").LayerSpec> {
13
13
  /**
14
14
  * @param {Axis} axisProps
15
15
  * @param {import("../types/viewContext.js").default} context
@@ -253,7 +253,6 @@ function createAxisGrid(axisProps, type) {
253
253
 
254
254
  return {
255
255
  name: "grid_layers",
256
- configurableVisibility: false,
257
256
  resolve: {
258
257
  scale: {
259
258
  [orient2channel(axisProps.orient)]: "forced",
@@ -22,7 +22,7 @@ export const ORIENT_CHANNELS: Record<import("../spec/axis.js").AxisOrient, impor
22
22
  * TODO: Implement grid
23
23
  *
24
24
  */
25
- export default class AxisView extends LayerView {
25
+ export default class AxisView extends LayerView<import("../spec/view.js").LayerSpec> {
26
26
  /**
27
27
  *
28
28
  * @typedef {import("../spec/view.js").LayerSpec} LayerSpec
@@ -1,16 +1,19 @@
1
1
  /**
2
2
  * Creates a vertically or horizontally concatenated layout for children.
3
+ *
4
+ * @template {import("../spec/view.js").AnyConcatSpec} [TSpec=import("../spec/view.js").AnyConcatSpec]
5
+ * @extends {GridView<TSpec>}
3
6
  */
4
- export default class ConcatView extends GridView {
7
+ export default class ConcatView<TSpec extends import("../spec/view.js").AnyConcatSpec = import("../spec/view.js").AnyConcatSpec> extends GridView<TSpec> {
5
8
  /**
6
9
  *
7
- * @param {import("../spec/view.js").AnyConcatSpec} spec
10
+ * @param {TSpec} spec
8
11
  * @param {import("../types/viewContext.js").default} context
9
12
  * @param {import("./containerView.js").default} layoutParent
10
13
  * @param {import("./view.js").default} dataParent
11
14
  * @param {string} name
12
15
  */
13
- constructor(spec: import("../spec/view.js").AnyConcatSpec, context: import("../types/viewContext.js").default, layoutParent: import("./containerView.js").default, dataParent: import("./view.js").default, name: string);
16
+ constructor(spec: TSpec, context: import("../types/viewContext.js").default, layoutParent: import("./containerView.js").default, dataParent: import("./view.js").default, name: string);
14
17
  /**
15
18
  * Adds a child spec dynamically. Intended for post-initialization updates.
16
19
  *
@@ -1 +1 @@
1
- {"version":3,"file":"concatView.d.ts","sourceRoot":"","sources":["../../../src/view/concatView.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IACI;;;;;;;OAOG;IACH,kBANW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,EAiBhB;IA6BD;;;;;;;;;OASG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,UAClC,MAAM,GACJ,OAAO,CAAC,OAAO,WAAW,EAAE,OAAO,CAAC,CAIhD;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAIhB;;CA2EJ;qBA3JoB,wBAAwB"}
1
+ {"version":3,"file":"concatView.d.ts","sourceRoot":"","sources":["../../../src/view/concatView.js"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,gCAHwD,KAAK,SAAhD,OAAQ,iBAAiB,EAAE,aAAc;IAIlD;;;;;;;OAOG;IACH,kBANW,KAAK,WACL,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,EAiBhB;IA6BD;;;;;;;;;OASG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,UAClC,MAAM,GACJ,OAAO,CAAC,OAAO,WAAW,EAAE,OAAO,CAAC,CAIhD;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAIhB;;CA2EJ;qBA9JoB,wBAAwB"}
@@ -1,14 +1,21 @@
1
- import { isConcatSpec, isHConcatSpec, isVConcatSpec } from "./viewFactory.js";
1
+ import {
2
+ isConcatSpec,
3
+ isHConcatSpec,
4
+ isVConcatSpec,
5
+ } from "./viewSpecGuards.js";
2
6
  import GridView from "./gridView/gridView.js";
3
7
  import ContainerMutationHelper from "./containerMutationHelper.js";
4
8
 
5
9
  /**
6
10
  * Creates a vertically or horizontally concatenated layout for children.
11
+ *
12
+ * @template {import("../spec/view.js").AnyConcatSpec} [TSpec=import("../spec/view.js").AnyConcatSpec]
13
+ * @extends {GridView<TSpec>}
7
14
  */
8
15
  export default class ConcatView extends GridView {
9
16
  /**
10
17
  *
11
- * @param {import("../spec/view.js").AnyConcatSpec} spec
18
+ * @param {TSpec} spec
12
19
  * @param {import("../types/viewContext.js").default} context
13
20
  * @param {import("./containerView.js").default} layoutParent
14
21
  * @param {import("./view.js").default} dataParent
@@ -35,23 +35,23 @@ export default class ContainerMutationHelper {
35
35
  insertAt: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => void;
36
36
  removeAt: (index: number) => void;
37
37
  };
38
- insertView: (view: import("./view.js").default, index: number) => any;
38
+ insertView: (view: import("./view.js").default<import("../spec/view.js").ViewSpec>, index: number) => any;
39
39
  removeView: (index: number) => void;
40
- prepareView?: (view: import("./view.js").default, index: number, insertionResult: any) => Promise<void>;
40
+ prepareView?: (view: import("./view.js").default<import("../spec/view.js").ViewSpec>, index: number, insertionResult: any) => Promise<void>;
41
41
  afterRemove?: (index: number) => Promise<void>;
42
42
  defaultName?: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => string;
43
43
  requestLayout?: boolean;
44
44
  });
45
- container: import("./containerView.js").default;
45
+ container: import("./containerView.js").default<import("../spec/view.js").ContainerSpec>;
46
46
  options: {
47
47
  getChildSpecs: () => {
48
48
  specs: (import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec)[];
49
49
  insertAt: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => void;
50
50
  removeAt: (index: number) => void;
51
51
  };
52
- insertView: (view: import("./view.js").default, index: number) => any;
52
+ insertView: (view: import("./view.js").default<import("../spec/view.js").ViewSpec>, index: number) => any;
53
53
  removeView: (index: number) => void;
54
- prepareView?: (view: import("./view.js").default, index: number, insertionResult: any) => Promise<void>;
54
+ prepareView?: (view: import("./view.js").default<import("../spec/view.js").ViewSpec>, index: number, insertionResult: any) => Promise<void>;
55
55
  afterRemove?: (index: number) => Promise<void>;
56
56
  defaultName?: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => string;
57
57
  requestLayout?: boolean;
@@ -63,7 +63,7 @@ export default class ContainerMutationHelper {
63
63
  * @param {number} [index]
64
64
  * @returns {Promise<View>}
65
65
  */
66
- addChildSpec(childSpec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, index?: number): Promise<import("./view.js").default>;
66
+ addChildSpec(childSpec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, index?: number): Promise<import("./view.js").default<import("../spec/view.js").ViewSpec>>;
67
67
  /**
68
68
  * Removes a child by index and updates the backing spec list.
69
69
  *
@@ -1 +1 @@
1
- {"version":3,"file":"containerMutationHelper.d.ts","sourceRoot":"","sources":["../../../src/view/containerMutationHelper.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH;IACI;;;;;;;;;;OAUG;IAEH;;;;;;;;;;OAUG;IAEH;;;OAGG;IACH,uBAHW,OAAO,oBAAoB,EAAE,OAAO;uBAX3B;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;OAW3B;IAFG,gDAA0B;IAC1B;uBAhBgB;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;MAUF;IAG1B;;;;;;OAMG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,UACzE,MAAM,GACJ,OAAO,6BAAM,CA8CzB;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAehB;CACJ"}
1
+ {"version":3,"file":"containerMutationHelper.d.ts","sourceRoot":"","sources":["../../../src/view/containerMutationHelper.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH;IACI;;;;;;;;;;OAUG;IAEH;;;;;;;;;;OAUG;IAEH;;;OAGG;IACH,uBAHW,OAAO,oBAAoB,EAAE,OAAO;uBAX3B;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,iEAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,iEAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;OAW3B;IAFG,yFAA0B;IAC1B;uBAhBgB;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,iEAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,iEAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;MAUF;IAG1B;;;;;;OAMG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,UACzE,MAAM,GACJ,OAAO,iEAAM,CA8CzB;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAehB;CACJ"}
@@ -1,18 +1,20 @@
1
1
  /**
2
2
  * Compositor view represents a non-leaf node in the view hierarchy.
3
+ *
4
+ * @template {import("../spec/view.js").ContainerSpec} [TSpec=import("../spec/view.js").ContainerSpec]
5
+ * @extends {View<TSpec>}
3
6
  */
4
- export default class ContainerView extends View {
7
+ export default class ContainerView<TSpec extends import("../spec/view.js").ContainerSpec = import("../spec/view.js").ContainerSpec> extends View<TSpec> {
5
8
  /**
6
9
  *
7
- * @param {import("../spec/view.js").ContainerSpec} spec
10
+ * @param {TSpec} spec
8
11
  * @param {import("../types/viewContext.js").default} context
9
12
  * @param {ContainerView} layoutParent
10
13
  * @param {import("./view.js").default} dataParent
11
14
  * @param {string} name
12
15
  * @param {import("./view.js").ViewOptions} [options]
13
16
  */
14
- constructor(spec: import("../spec/view.js").ContainerSpec, context: import("../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("./view.js").default, name: string, options?: import("./view.js").ViewOptions);
15
- spec: import("../spec/view.js").ContainerSpec;
17
+ constructor(spec: TSpec, context: import("../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("./view.js").default, name: string, options?: import("./view.js").ViewOptions);
16
18
  initializeChildren(): Promise<void>;
17
19
  /**
18
20
  * Generates an auto name that is guaranteed to be unique within this container
@@ -31,7 +33,7 @@ export default class ContainerView extends View {
31
33
  *
32
34
  * @param {string} name
33
35
  */
34
- findDescendantByName(name: string): View;
36
+ findDescendantByName(name: string): View<import("../spec/view.js").ViewSpec>;
35
37
  /**
36
38
  * @returns {IterableIterator<View>}
37
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"containerView.d.ts","sourceRoot":"","sources":["../../../src/view/containerView.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;IAII;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAMzC;IADG,8CAAgB;IAGpB,oCAEC;IAED;;;;;;OAMG;IACH,wBAHW,MAAM,GACJ,MAAM,CAMlB;IAsDD;;;OAGG;IACH,2BAHW,MAAM,EAAE,GACN,IAAI,CAsBhB;IAaD;;;OAGG;IACH,2BAFW,MAAM,QAchB;IAzGD;;OAEG;IACH,qBAFa,gBAAgB,CAAC,IAAI,CAAC,CAIlC;;CA8GJ;iBA5J4C,WAAW"}
1
+ {"version":3,"file":"containerView.d.ts","sourceRoot":"","sources":["../../../src/view/containerView.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,mCAHwD,KAAK,SAAhD,OAAQ,iBAAiB,EAAE,aAAc;IAOlD;;;;;;;;OAQG;IACH,kBAPW,KAAK,WACL,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAMzC;IAED,oCAEC;IAED;;;;;;OAMG;IACH,wBAHW,MAAM,GACJ,MAAM,CAMlB;IAsDD;;;OAGG;IACH,2BAHW,MAAM,EAAE,GACN,IAAI,CAsBhB;IAaD;;;OAGG;IACH,2BAFW,MAAM,4CAchB;IAzGD;;OAEG;IACH,qBAFa,gBAAgB,CAAC,IAAI,CAAC,CAIlC;;CA8GJ;iBA/J4C,WAAW"}
@@ -2,6 +2,9 @@ import View, { VISIT_STOP, VISIT_SKIP } from "./view.js";
2
2
 
3
3
  /**
4
4
  * Compositor view represents a non-leaf node in the view hierarchy.
5
+ *
6
+ * @template {import("../spec/view.js").ContainerSpec} [TSpec=import("../spec/view.js").ContainerSpec]
7
+ * @extends {View<TSpec>}
5
8
  */
6
9
  export default class ContainerView extends View {
7
10
  /** @type {Map<string, number>} */
@@ -9,7 +12,7 @@ export default class ContainerView extends View {
9
12
 
10
13
  /**
11
14
  *
12
- * @param {import("../spec/view.js").ContainerSpec} spec
15
+ * @param {TSpec} spec
13
16
  * @param {import("../types/viewContext.js").default} context
14
17
  * @param {ContainerView} layoutParent
15
18
  * @param {import("./view.js").default} dataParent
@@ -13,7 +13,7 @@
13
13
  * @prop {FacetFieldDef} facetFieldDef
14
14
  *
15
15
  */
16
- export default class FacetView extends ContainerView {
16
+ export default class FacetView extends ContainerView<import("../spec/view.js").ContainerSpec> {
17
17
  /**
18
18
  * @typedef {import("./view.js").default} View
19
19
  * @typedef {import("./layerView.js").default} LayerView
@@ -48,7 +48,7 @@ export default class FacetView extends ContainerView {
48
48
  getAccessor(channel: "row" | "column"): any;
49
49
  updateFacets(): void;
50
50
  updateLabels(): void;
51
- getFacetGroups(): string[] | number[] | boolean[];
51
+ getFacetGroups(): number[] | boolean[] | string[];
52
52
  /**
53
53
  * @param {import("./renderingContext/viewRenderingContext.js").default} context
54
54
  * @param {import("./layout/rectangle.js").default} coords
@@ -5,7 +5,7 @@
5
5
  * @param {(view: View) => boolean} [viewFilter]
6
6
  * @param {(view: View) => boolean} [viewInitializationPredicate]
7
7
  */
8
- export function buildDataFlow(root: import("./view.js").default, existingFlow?: DataFlow, viewFilter?: (view: import("./view.js").default) => boolean, viewInitializationPredicate?: (view: import("./view.js").default) => boolean): DataFlow;
8
+ export function buildDataFlow(root: import("./view.js").default<import("../spec/view.js").ViewSpec>, existingFlow?: DataFlow, viewFilter?: (view: import("./view.js").default<import("../spec/view.js").ViewSpec>) => boolean, viewInitializationPredicate?: (view: import("./view.js").default<import("../spec/view.js").ViewSpec>) => boolean): DataFlow;
9
9
  /**
10
10
  * Changes the ChromPos channelDefs into FieldDefs and returns
11
11
  * LinearizeGenomicCoordinate transform(s) that should be inserted into
@@ -1 +1 @@
1
- {"version":3,"file":"flowBuilder.d.ts","sourceRoot":"","sources":["../../../src/view/flowBuilder.js"],"names":[],"mappings":"AAyBA;;;;;;GAMG;AACH,gFALW,QAAQ,eAER,CAAC,IAAI,6BAAM,KAAK,OAAO,gCACvB,CAAC,IAAI,6BAAM,KAAK,OAAO,YAoPjC;AAuBD;;;;;;GAMG;AACH,2CAFW,OAAO,eAAe,EAAE,OAAO;;;IAoH5B;;;OAGG;;EAYhB;AAgCD;;;;;;GAMG;AACH,4BAFwB,CAAC,SAAZ,qCAAU,cAFZ,CAAC,iBACA,uCAAW;;;0BAwBG,OAAO,CAAC,QAAQ,CAAC,OAAO,qBAAqB,EAAE,KAAK,CAAC,CAAC;EAkB/E;qBAxfoB,qBAAqB;sBAPpB,sBAAsB"}
1
+ {"version":3,"file":"flowBuilder.d.ts","sourceRoot":"","sources":["../../../src/view/flowBuilder.js"],"names":[],"mappings":"AAyBA;;;;;;GAMG;AACH,oHALW,QAAQ,eAER,CAAC,IAAI,iEAAM,KAAK,OAAO,gCACvB,CAAC,IAAI,iEAAM,KAAK,OAAO,YAoPjC;AAuBD;;;;;;GAMG;AACH,2CAFW,OAAO,eAAe,EAAE,OAAO;;;IAoH5B;;;OAGG;;EAYhB;AAgCD;;;;;;GAMG;AACH,4BAFwB,CAAC,SAAZ,qCAAU,cAFZ,CAAC,iBACA,uCAAW;;;0BAwBG,OAAO,CAAC,QAAQ,CAAC,OAAO,qBAAqB,EAAE,KAAK,CAAC,CAAC;EAkB/E;qBAxfoB,qBAAqB;sBAPpB,sBAAsB"}
@@ -22,8 +22,8 @@ export default class GridChild {
22
22
  * @param {number} serial
23
23
  */
24
24
  constructor(view: import("../view.js").default, layoutParent: import("../containerView.js").default, serial: number);
25
- layoutParent: import("../containerView.js").default;
26
- view: import("../view.js").default;
25
+ layoutParent: import("../containerView.js").default<import("../../spec/view.js").ContainerSpec>;
26
+ view: import("../view.js").default<import("../../spec/view.js").ViewSpec>;
27
27
  serial: number;
28
28
  /** @type {UnitView} */
29
29
  background: UnitView;
@@ -41,7 +41,7 @@ export default class GridChild {
41
41
  title: UnitView;
42
42
  /** @type {Rectangle} */
43
43
  coords: Rectangle;
44
- getChildren(): Generator<import("../view.js").default, void, unknown>;
44
+ getChildren(): Generator<import("../view.js").default<import("../../spec/view.js").ViewSpec>, void, unknown>;
45
45
  /**
46
46
  * Create view decorations, grid lines, axes, etc.
47
47
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gridChild.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridChild.js"],"names":[],"mappings":"AAysBA;;;GAGG;AACH,iDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA8BjD;AAED;;;GAGG;AACH,uDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA6CjD;AAtwBD;IACI;;;;;;OAMG;IAEH;;;;OAIG;IACH,kBAJW,OAAO,YAAY,EAAE,OAAO,gBAC5B,OAAO,qBAAqB,EAAE,OAAO,UACrC,MAAM,EAgGhB;IA7FG,oDAAgC;IAChC,mCAAgB;IAChB,eAAoB;IAEpB,uBAAuB;IACvB,YADW,QAAQ,CACQ;IAE3B,uBAAuB;IACvB,kBADW,QAAQ,CACc;IAEjC,sFAAsF;IACtF,MADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAC/D;IAEd,+FAA+F;IAC/F,WADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAC9D;IAEnB,mFAAmF;IACnF,YADW,OAAO,CAAC,MAAM,CAAC,OAAO,gBAAgB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC,CAC3D;IAEpB,4BAA4B;IAC5B,eADW,aAAa,CACM;IAE9B,uBAAuB;IACvB,OADW,QAAQ,CACG;IAEtB,wBAAwB;IACxB,QADW,SAAS,CACQ;IAgahC,sEAiBC;IAED;;OAEG;IACH,4BAwKC;IAED;;OAEG;IACH,yBAWC;IAED,uBAqBC;IAED,iCAEC;;CACJ;qBAxrBoB,gBAAgB;qBANK,gBAAgB;yBADjC,oBAAoB;sBASvB,gBAAgB;0BACZ,oBAAoB;sBALxB,wBAAwB;oBAF1B,sBAAsB"}
1
+ {"version":3,"file":"gridChild.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridChild.js"],"names":[],"mappings":"AAysBA;;;GAGG;AACH,iDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA6BjD;AAED;;;GAGG;AACH,uDAHW,OAAO,oBAAoB,EAAE,cAAc,GACzC,OAAO,oBAAoB,EAAE,QAAQ,CA4CjD;AApwBD;IACI;;;;;;OAMG;IAEH;;;;OAIG;IACH,kBAJW,OAAO,YAAY,EAAE,OAAO,gBAC5B,OAAO,qBAAqB,EAAE,OAAO,UACrC,MAAM,EAgGhB;IA7FG,gGAAgC;IAChC,0EAAgB;IAChB,eAAoB;IAEpB,uBAAuB;IACvB,YADW,QAAQ,CACQ;IAE3B,uBAAuB;IACvB,kBADW,QAAQ,CACc;IAEjC,sFAAsF;IACtF,MADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAC/D;IAEd,+FAA+F;IAC/F,WADW,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAC9D;IAEnB,mFAAmF;IACnF,YADW,OAAO,CAAC,MAAM,CAAC,OAAO,gBAAgB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC,CAC3D;IAEpB,4BAA4B;IAC5B,eADW,aAAa,CACM;IAE9B,uBAAuB;IACvB,OADW,QAAQ,CACG;IAEtB,wBAAwB;IACxB,QADW,SAAS,CACQ;IAgahC,6GAiBC;IAED;;OAEG;IACH,4BAwKC;IAED;;OAEG;IACH,yBAWC;IAED,uBAqBC;IAED,iCAEC;;CACJ;qBAxrBoB,gBAAgB;qBANK,gBAAgB;yBADjC,oBAAoB;sBASvB,gBAAgB;0BACZ,oBAAoB;sBALxB,wBAAwB;oBAF1B,sBAAsB"}
@@ -725,7 +725,6 @@ export function createBackground(viewBackground) {
725
725
  }
726
726
 
727
727
  return {
728
- configurableVisibility: false,
729
728
  data: { values: [{}] },
730
729
  mark: {
731
730
  color: viewBackground.fill,
@@ -763,7 +762,6 @@ export function createBackgroundStroke(viewBackground) {
763
762
  // We are not using a rect mark because it is not optimized for outlines.
764
763
  // TODO: Implement "hollow" mesh for non-filled rectangles
765
764
  return {
766
- configurableVisibility: false,
767
765
  resolve: {
768
766
  scale: { x: "excluded", y: "excluded" },
769
767
  axis: { x: "excluded", y: "excluded" },