@genome-spy/core 0.70.0 → 0.71.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 (259) hide show
  1. package/dist/bundle/index.es.js +3865 -3631
  2. package/dist/bundle/index.js +80 -80
  3. package/dist/schema.json +0 -48
  4. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  5. package/dist/src/genomeSpy/containerUi.js +0 -1
  6. package/dist/src/genomeSpy/viewHighlight.js +2 -2
  7. package/dist/src/genomeSpy.d.ts +3 -3
  8. package/dist/src/genomeSpy.d.ts.map +1 -1
  9. package/dist/src/genomeSpy.js +27 -3
  10. package/dist/src/marks/mark.d.ts +1 -1
  11. package/dist/src/marks/mark.d.ts.map +1 -1
  12. package/dist/src/spec/view.d.ts +0 -10
  13. package/dist/src/utils/keyboardZoomMotion.d.ts +93 -0
  14. package/dist/src/utils/keyboardZoomMotion.d.ts.map +1 -0
  15. package/dist/src/utils/keyboardZoomMotion.js +285 -0
  16. package/dist/src/view/axisGridView.d.ts +1 -1
  17. package/dist/src/view/axisGridView.js +0 -1
  18. package/dist/src/view/axisView.d.ts +1 -1
  19. package/dist/src/view/concatView.d.ts +6 -3
  20. package/dist/src/view/concatView.d.ts.map +1 -1
  21. package/dist/src/view/concatView.js +9 -2
  22. package/dist/src/view/containerMutationHelper.d.ts +6 -6
  23. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  24. package/dist/src/view/containerView.d.ts +7 -5
  25. package/dist/src/view/containerView.d.ts.map +1 -1
  26. package/dist/src/view/containerView.js +4 -1
  27. package/dist/src/view/facetView.d.ts +1 -1
  28. package/dist/src/view/flowBuilder.d.ts +1 -1
  29. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  30. package/dist/src/view/gridView/gridChild.d.ts +3 -3
  31. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  32. package/dist/src/view/gridView/gridChild.js +0 -2
  33. package/dist/src/view/gridView/gridView.d.ts +13 -11
  34. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  35. package/dist/src/view/gridView/gridView.js +17 -26
  36. package/dist/src/view/gridView/keyboardZoomController.d.ts +21 -0
  37. package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -0
  38. package/dist/src/view/gridView/keyboardZoomController.js +202 -0
  39. package/dist/src/view/gridView/scrollbar.d.ts +1 -1
  40. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  41. package/dist/src/view/gridView/scrollbar.js +0 -1
  42. package/dist/src/view/gridView/selectionRect.d.ts +1 -1
  43. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  44. package/dist/src/view/gridView/selectionRect.js +0 -1
  45. package/dist/src/view/gridView/separatorView.js +0 -1
  46. package/dist/src/view/gridView/zoomNavigationUtils.d.ts +19 -0
  47. package/dist/src/view/gridView/zoomNavigationUtils.d.ts.map +1 -0
  48. package/dist/src/view/gridView/zoomNavigationUtils.js +51 -0
  49. package/dist/src/view/layerView.d.ts +8 -5
  50. package/dist/src/view/layerView.d.ts.map +1 -1
  51. package/dist/src/view/layerView.js +6 -2
  52. package/dist/src/view/title.d.ts.map +1 -1
  53. package/dist/src/view/title.js +0 -1
  54. package/dist/src/view/unitView.d.ts +7 -4
  55. package/dist/src/view/unitView.d.ts.map +1 -1
  56. package/dist/src/view/unitView.js +5 -1
  57. package/dist/src/view/view.d.ts +13 -9
  58. package/dist/src/view/view.d.ts.map +1 -1
  59. package/dist/src/view/view.js +7 -1
  60. package/dist/src/view/viewError.d.ts +1 -1
  61. package/dist/src/view/viewError.d.ts.map +1 -1
  62. package/dist/src/view/viewFactory.d.ts +3 -44
  63. package/dist/src/view/viewFactory.d.ts.map +1 -1
  64. package/dist/src/view/viewFactory.js +28 -69
  65. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  66. package/dist/src/view/viewSelectors.js +123 -160
  67. package/dist/src/view/viewSpecGuards.d.ts +43 -0
  68. package/dist/src/view/viewSpecGuards.d.ts.map +1 -0
  69. package/dist/src/view/viewSpecGuards.js +69 -0
  70. package/dist/src/view/viewUtils.d.ts +1 -1
  71. package/dist/src/view/viewUtils.d.ts.map +1 -1
  72. package/dist/src/view/zoom.d.ts +1 -0
  73. package/dist/src/view/zoom.d.ts.map +1 -1
  74. package/dist/src/view/zoom.js +5 -1
  75. package/package.json +3 -3
  76. package/dist/src/data/collector.test.d.ts +0 -2
  77. package/dist/src/data/collector.test.d.ts.map +0 -1
  78. package/dist/src/data/dataFlow.test.d.ts +0 -2
  79. package/dist/src/data/dataFlow.test.d.ts.map +0 -1
  80. package/dist/src/data/flow.test.d.ts +0 -2
  81. package/dist/src/data/flow.test.d.ts.map +0 -1
  82. package/dist/src/data/flowInit.test.d.ts +0 -2
  83. package/dist/src/data/flowInit.test.d.ts.map +0 -1
  84. package/dist/src/data/flowNode.test.d.ts +0 -2
  85. package/dist/src/data/flowNode.test.d.ts.map +0 -1
  86. package/dist/src/data/flowOptimizer.test.d.ts +0 -2
  87. package/dist/src/data/flowOptimizer.test.d.ts.map +0 -1
  88. package/dist/src/data/formats/fasta.test.d.ts +0 -2
  89. package/dist/src/data/formats/fasta.test.d.ts.map +0 -1
  90. package/dist/src/data/keyIndex.test.d.ts +0 -2
  91. package/dist/src/data/keyIndex.test.d.ts.map +0 -1
  92. package/dist/src/data/sources/inlineSource.test.d.ts +0 -2
  93. package/dist/src/data/sources/inlineSource.test.d.ts.map +0 -1
  94. package/dist/src/data/sources/sequenceSource.test.d.ts +0 -2
  95. package/dist/src/data/sources/sequenceSource.test.d.ts.map +0 -1
  96. package/dist/src/data/transforms/aggregate.test.d.ts +0 -2
  97. package/dist/src/data/transforms/aggregate.test.d.ts.map +0 -1
  98. package/dist/src/data/transforms/clone.test.d.ts +0 -2
  99. package/dist/src/data/transforms/clone.test.d.ts.map +0 -1
  100. package/dist/src/data/transforms/coverage.test.d.ts +0 -2
  101. package/dist/src/data/transforms/coverage.test.d.ts.map +0 -1
  102. package/dist/src/data/transforms/filter.test.d.ts +0 -2
  103. package/dist/src/data/transforms/filter.test.d.ts.map +0 -1
  104. package/dist/src/data/transforms/filterScoredLabels.test.d.ts +0 -2
  105. package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +0 -1
  106. package/dist/src/data/transforms/flatten.test.d.ts +0 -2
  107. package/dist/src/data/transforms/flatten.test.d.ts.map +0 -1
  108. package/dist/src/data/transforms/flattenDelimited.test.d.ts +0 -2
  109. package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +0 -1
  110. package/dist/src/data/transforms/flattenSequence.test.d.ts +0 -2
  111. package/dist/src/data/transforms/flattenSequence.test.d.ts.map +0 -1
  112. package/dist/src/data/transforms/formula.test.d.ts +0 -2
  113. package/dist/src/data/transforms/formula.test.d.ts.map +0 -1
  114. package/dist/src/data/transforms/identifier.test.d.ts +0 -2
  115. package/dist/src/data/transforms/identifier.test.d.ts.map +0 -1
  116. package/dist/src/data/transforms/pileup.test.d.ts +0 -2
  117. package/dist/src/data/transforms/pileup.test.d.ts.map +0 -1
  118. package/dist/src/data/transforms/project.test.d.ts +0 -2
  119. package/dist/src/data/transforms/project.test.d.ts.map +0 -1
  120. package/dist/src/data/transforms/regexExtract.test.d.ts +0 -2
  121. package/dist/src/data/transforms/regexExtract.test.d.ts.map +0 -1
  122. package/dist/src/data/transforms/regexFold.test.d.ts +0 -2
  123. package/dist/src/data/transforms/regexFold.test.d.ts.map +0 -1
  124. package/dist/src/data/transforms/sample.test.d.ts +0 -2
  125. package/dist/src/data/transforms/sample.test.d.ts.map +0 -1
  126. package/dist/src/data/transforms/stack.test.d.ts +0 -2
  127. package/dist/src/data/transforms/stack.test.d.ts.map +0 -1
  128. package/dist/src/encoder/accessor.test.d.ts +0 -2
  129. package/dist/src/encoder/accessor.test.d.ts.map +0 -1
  130. package/dist/src/encoder/encoder.test.d.ts +0 -2
  131. package/dist/src/encoder/encoder.test.d.ts.map +0 -1
  132. package/dist/src/encoder/metadataChannels.test.d.ts +0 -2
  133. package/dist/src/encoder/metadataChannels.test.d.ts.map +0 -1
  134. package/dist/src/genome/genome.test.d.ts +0 -2
  135. package/dist/src/genome/genome.test.d.ts.map +0 -1
  136. package/dist/src/genome/genomes.test.d.ts +0 -2
  137. package/dist/src/genome/genomes.test.d.ts.map +0 -1
  138. package/dist/src/genome/scaleIndex.test.d.ts +0 -2
  139. package/dist/src/genome/scaleIndex.test.d.ts.map +0 -1
  140. package/dist/src/genome/scaleLocus.test.d.ts +0 -2
  141. package/dist/src/genome/scaleLocus.test.d.ts.map +0 -1
  142. package/dist/src/genomeSpy/viewDataInit.test.d.ts +0 -2
  143. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +0 -1
  144. package/dist/src/gl/colorUtils.test.d.ts +0 -2
  145. package/dist/src/gl/colorUtils.test.d.ts.map +0 -1
  146. package/dist/src/paramRuntime/expressionRef.test.d.ts +0 -2
  147. package/dist/src/paramRuntime/expressionRef.test.d.ts.map +0 -1
  148. package/dist/src/paramRuntime/graphRuntime.test.d.ts +0 -2
  149. package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +0 -1
  150. package/dist/src/paramRuntime/paramRuntime.test.d.ts +0 -2
  151. package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +0 -1
  152. package/dist/src/paramRuntime/paramStore.test.d.ts +0 -2
  153. package/dist/src/paramRuntime/paramStore.test.d.ts.map +0 -1
  154. package/dist/src/scale/scale.test.d.ts +0 -2
  155. package/dist/src/scale/scale.test.d.ts.map +0 -1
  156. package/dist/src/scale/ticks.test.d.ts +0 -2
  157. package/dist/src/scale/ticks.test.d.ts.map +0 -1
  158. package/dist/src/scales/axisResolution.test.d.ts +0 -2
  159. package/dist/src/scales/axisResolution.test.d.ts.map +0 -1
  160. package/dist/src/scales/domainPlanner.test.d.ts +0 -2
  161. package/dist/src/scales/domainPlanner.test.d.ts.map +0 -1
  162. package/dist/src/scales/scaleInstanceManager.test.d.ts +0 -2
  163. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +0 -1
  164. package/dist/src/scales/scaleInteractionController.test.d.ts +0 -2
  165. package/dist/src/scales/scaleInteractionController.test.d.ts.map +0 -1
  166. package/dist/src/scales/scaleResolution.test.d.ts +0 -2
  167. package/dist/src/scales/scaleResolution.test.d.ts.map +0 -1
  168. package/dist/src/scales/scaleRules.test.d.ts +0 -2
  169. package/dist/src/scales/scaleRules.test.d.ts.map +0 -1
  170. package/dist/src/selection/selection.test.d.ts +0 -2
  171. package/dist/src/selection/selection.test.d.ts.map +0 -1
  172. package/dist/src/tooltip/dataTooltipHandler.test.d.ts +0 -2
  173. package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +0 -1
  174. package/dist/src/tooltip/flattenDatumRows.test.d.ts +0 -2
  175. package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +0 -1
  176. package/dist/src/tooltip/tooltipContext.test.d.ts +0 -2
  177. package/dist/src/tooltip/tooltipContext.test.d.ts.map +0 -1
  178. package/dist/src/utils/addBaseUrl.test.d.ts +0 -2
  179. package/dist/src/utils/addBaseUrl.test.d.ts.map +0 -1
  180. package/dist/src/utils/binnedIndex.test.d.ts +0 -2
  181. package/dist/src/utils/binnedIndex.test.d.ts.map +0 -1
  182. package/dist/src/utils/cloner.test.d.ts +0 -2
  183. package/dist/src/utils/cloner.test.d.ts.map +0 -1
  184. package/dist/src/utils/coalesce.test.d.ts +0 -2
  185. package/dist/src/utils/coalesce.test.d.ts.map +0 -1
  186. package/dist/src/utils/concatIterables.test.d.ts +0 -2
  187. package/dist/src/utils/concatIterables.test.d.ts.map +0 -1
  188. package/dist/src/utils/deepEqual.test.d.ts +0 -2
  189. package/dist/src/utils/deepEqual.test.d.ts.map +0 -1
  190. package/dist/src/utils/domainArray.test.d.ts +0 -2
  191. package/dist/src/utils/domainArray.test.d.ts.map +0 -1
  192. package/dist/src/utils/fetchUtils.test.d.ts +0 -2
  193. package/dist/src/utils/fetchUtils.test.d.ts.map +0 -1
  194. package/dist/src/utils/indexer.test.d.ts +0 -2
  195. package/dist/src/utils/indexer.test.d.ts.map +0 -1
  196. package/dist/src/utils/interactionEvent.test.d.ts +0 -2
  197. package/dist/src/utils/interactionEvent.test.d.ts.map +0 -1
  198. package/dist/src/utils/iterateNestedMaps.test.d.ts +0 -2
  199. package/dist/src/utils/iterateNestedMaps.test.d.ts.map +0 -1
  200. package/dist/src/utils/kWayMerge.test.d.ts +0 -2
  201. package/dist/src/utils/kWayMerge.test.d.ts.map +0 -1
  202. package/dist/src/utils/mergeObjects.test.d.ts +0 -2
  203. package/dist/src/utils/mergeObjects.test.d.ts.map +0 -1
  204. package/dist/src/utils/numberExtractor.test.d.ts +0 -2
  205. package/dist/src/utils/numberExtractor.test.d.ts.map +0 -1
  206. package/dist/src/utils/propertyCacher.test.d.ts +0 -2
  207. package/dist/src/utils/propertyCacher.test.d.ts.map +0 -1
  208. package/dist/src/utils/propertyCoalescer.test.d.ts +0 -2
  209. package/dist/src/utils/propertyCoalescer.test.d.ts.map +0 -1
  210. package/dist/src/utils/radixSort.test.d.ts +0 -2
  211. package/dist/src/utils/radixSort.test.d.ts.map +0 -1
  212. package/dist/src/utils/reservationMap.test.d.ts +0 -2
  213. package/dist/src/utils/reservationMap.test.d.ts.map +0 -1
  214. package/dist/src/utils/ringBuffer.test.d.ts +0 -2
  215. package/dist/src/utils/ringBuffer.test.d.ts.map +0 -1
  216. package/dist/src/utils/throttle.test.d.ts +0 -2
  217. package/dist/src/utils/throttle.test.d.ts.map +0 -1
  218. package/dist/src/utils/topK.test.d.ts +0 -2
  219. package/dist/src/utils/topK.test.d.ts.map +0 -1
  220. package/dist/src/utils/trees.test.d.ts +0 -2
  221. package/dist/src/utils/trees.test.d.ts.map +0 -1
  222. package/dist/src/utils/ui/tooltip.test.d.ts +0 -2
  223. package/dist/src/utils/ui/tooltip.test.d.ts.map +0 -1
  224. package/dist/src/utils/url.test.d.ts +0 -2
  225. package/dist/src/utils/url.test.d.ts.map +0 -1
  226. package/dist/src/utils/variableTools.test.d.ts +0 -2
  227. package/dist/src/utils/variableTools.test.d.ts.map +0 -1
  228. package/dist/src/view/concatView.test.d.ts +0 -2
  229. package/dist/src/view/concatView.test.d.ts.map +0 -1
  230. package/dist/src/view/dataReadiness.test.d.ts +0 -2
  231. package/dist/src/view/dataReadiness.test.d.ts.map +0 -1
  232. package/dist/src/view/flowBuilder.test.d.ts +0 -2
  233. package/dist/src/view/flowBuilder.test.d.ts.map +0 -1
  234. package/dist/src/view/gridView/gridView.test.d.ts +0 -2
  235. package/dist/src/view/gridView/gridView.test.d.ts.map +0 -1
  236. package/dist/src/view/gridView/selectionRect.test.d.ts +0 -2
  237. package/dist/src/view/gridView/selectionRect.test.d.ts.map +0 -1
  238. package/dist/src/view/layerView.test.d.ts +0 -2
  239. package/dist/src/view/layerView.test.d.ts.map +0 -1
  240. package/dist/src/view/layout/flexLayout.test.d.ts +0 -2
  241. package/dist/src/view/layout/flexLayout.test.d.ts.map +0 -1
  242. package/dist/src/view/layout/grid.test.d.ts +0 -2
  243. package/dist/src/view/layout/grid.test.d.ts.map +0 -1
  244. package/dist/src/view/layout/rectangle.test.d.ts +0 -2
  245. package/dist/src/view/layout/rectangle.test.d.ts.map +0 -1
  246. package/dist/src/view/multiscale.test.d.ts +0 -2
  247. package/dist/src/view/multiscale.test.d.ts.map +0 -1
  248. package/dist/src/view/view.test.d.ts +0 -2
  249. package/dist/src/view/view.test.d.ts.map +0 -1
  250. package/dist/src/view/viewDispose.test.d.ts +0 -2
  251. package/dist/src/view/viewDispose.test.d.ts.map +0 -1
  252. package/dist/src/view/viewFactory.test.d.ts +0 -2
  253. package/dist/src/view/viewFactory.test.d.ts.map +0 -1
  254. package/dist/src/view/viewParamRuntime.test.d.ts +0 -2
  255. package/dist/src/view/viewParamRuntime.test.d.ts.map +0 -1
  256. package/dist/src/view/viewSelectors.test.d.ts +0 -2
  257. package/dist/src/view/viewSelectors.test.d.ts.map +0 -1
  258. package/dist/src/view/viewUtils.test.d.ts +0 -2
  259. 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
+ }
@@ -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
@@ -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" },
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @param {View} view
3
3
  */
4
- export function isClippedChildren(view: import("../view.js").default): boolean;
4
+ export function isClippedChildren(view: import("../view.js").default<import("../../spec/view.js").ViewSpec>): boolean;
5
5
  /**
6
6
  *
7
7
  * @param {import("../layout/rectangle.js").default} coords
@@ -24,11 +24,14 @@ export function translateAxisCoords(coords: import("../layout/rectangle.js").def
24
24
  * - Zoom / pan
25
25
  * - Scrollable viewports (with scrollbars)
26
26
  * - And later on, brushing, legend(?)
27
+ *
28
+ * @template {import("../../spec/view.js").AnyConcatSpec} [TSpec=import("../../spec/view.js").AnyConcatSpec]
29
+ * @extends {ContainerView<TSpec>}
27
30
  */
28
- export default class GridView extends ContainerView {
31
+ export default class GridView<TSpec extends import("../../spec/view.js").AnyConcatSpec = import("../../spec/view.js").AnyConcatSpec> extends ContainerView<TSpec> {
29
32
  /**
30
33
  *
31
- * @param {import("../../spec/view.js").AnyConcatSpec} spec
34
+ * @param {TSpec} spec
32
35
  * @param {import("../../types/viewContext.js").default} context
33
36
  * @param {ContainerView} layoutParent
34
37
  * @param {View} dataParent
@@ -36,13 +39,12 @@ export default class GridView extends ContainerView {
36
39
  * @param {number} columns
37
40
  * @param {import("../view.js").ViewOptions} [options]
38
41
  */
39
- constructor(spec: import("../../spec/view.js").AnyConcatSpec, context: import("../../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("../view.js").default, name: string, columns: number, options?: import("../view.js").ViewOptions);
40
- spec: import("../../spec/view.js").AnyConcatSpec;
42
+ constructor(spec: TSpec, context: import("../../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("../view.js").default<import("../../spec/view.js").ViewSpec>, name: string, columns: number, options?: import("../view.js").ViewOptions);
41
43
  wrappingFacet: boolean;
42
44
  /**
43
45
  * @param {View} view
44
46
  */
45
- appendChild(view: import("../view.js").default): void;
47
+ appendChild(view: import("../view.js").default<import("../../spec/view.js").ViewSpec>): void;
46
48
  /**
47
49
  * Appends a child view without initializing dataflow or axes.
48
50
  * Intended for ConcatView when building the initial hierarchy.
@@ -50,7 +52,7 @@ export default class GridView extends ContainerView {
50
52
  * @param {View} view
51
53
  * @returns {GridChild}
52
54
  */
53
- appendChildView(view: import("../view.js").default): GridChild;
55
+ appendChildView(view: import("../view.js").default<import("../../spec/view.js").ViewSpec>): GridChild;
54
56
  /**
55
57
  * Inserts a child view without initializing dataflow or axes.
56
58
  * Callers should create axes, initialize subtree data, and request layout.
@@ -59,14 +61,14 @@ export default class GridView extends ContainerView {
59
61
  * @param {number} index
60
62
  * @returns {GridChild}
61
63
  */
62
- insertChildViewAt(view: import("../view.js").default, index: number): GridChild;
64
+ insertChildViewAt(view: import("../view.js").default<import("../../spec/view.js").ViewSpec>, index: number): GridChild;
63
65
  /**
64
66
  * Removes a child by instance and disposes its subtree.
65
67
  * Callers should sync shared axes and request layout.
66
68
  *
67
69
  * @param {View} view
68
70
  */
69
- removeChildView(view: import("../view.js").default): void;
71
+ removeChildView(view: import("../view.js").default<import("../../spec/view.js").ViewSpec>): void;
70
72
  /**
71
73
  * Removes a child by index and disposes its subtree.
72
74
  * Callers should sync shared axes and request layout.
@@ -77,11 +79,11 @@ export default class GridView extends ContainerView {
77
79
  /**
78
80
  * @param {View[]} views
79
81
  */
80
- setChildren(views: import("../view.js").default[]): void;
82
+ setChildren(views: import("../view.js").default<import("../../spec/view.js").ViewSpec>[]): void;
81
83
  /**
82
84
  * Read-only view to children
83
85
  */
84
- get children(): import("../view.js").default[];
86
+ get children(): import("../view.js").default<import("../../spec/view.js").ViewSpec>[];
85
87
  get childCount(): number;
86
88
  /**
87
89
  * @protected
@@ -1 +1 @@
1
- {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAg9BA;;GAEG;AACH,+EAUC;AAmBD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AAn/BD;;;;;;;;;;;;;;;GAeG;AACH;IAuCI;;;;;;;;;OASG;IACH,kBARW,OAAO,oBAAoB,EAAE,aAAa,WAC1C,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,kDAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAkC1C;IAtBG,iDAAgB;IAOhB,uBAA0B;IAiB9B;;OAEG;IACH,sDAEC;IAED;;;;;;OAMG;IACH,qDAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,6DAHW,MAAM,GACJ,SAAS,CASrB;IAED;;;;;OAKG;IACH,0DAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAUhB;IAeD;;OAEG;IACH,mBAFW,8BAAM,QAWhB;IAYD;;OAEG;IACH,+CAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CAupBJ;qBAz6B0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAIzB,gBAAgB"}
1
+ {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAu8BA;;GAEG;AACH,sHAUC;AAmBD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AAx+BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAH2D,KAAK,SAAnD,OAAQ,oBAAoB,EAAE,aAAc;IA6CrD;;;;;;;;;OASG;IACH,kBARW,KAAK,WACL,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,yFAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAyC1C;IAtBG,uBAA0B;IAwB9B;;OAEG;IACH,6FAEC;IAED;;;;;;OAMG;IACH,4FAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,oGAHW,MAAM,GACJ,SAAS,CASrB;IAED;;;;;OAKG;IACH,iGAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAUhB;IAeD;;OAEG;IACH,mBAFW,qEAAM,QAWhB;IAYD;;OAEG;IACH,sFAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CAwpBJ;qBAz7B0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAIzB,gBAAgB"}