@jbrowse/plugin-linear-genome-view 2.2.1 → 2.2.2

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 (184) hide show
  1. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +1 -1
  2. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
  3. package/dist/LaunchLinearGenomeView/index.d.ts +3 -0
  4. package/dist/LaunchLinearGenomeView/index.js +44 -0
  5. package/dist/LaunchLinearGenomeView/index.js.map +1 -0
  6. package/dist/LinearBareDisplay/index.d.ts +6 -2
  7. package/dist/LinearBareDisplay/index.js +17 -2
  8. package/dist/LinearBareDisplay/index.js.map +1 -1
  9. package/dist/LinearBasicDisplay/components/SetMaxHeight.js +2 -15
  10. package/dist/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
  11. package/dist/LinearBasicDisplay/index.d.ts +6 -2
  12. package/dist/LinearBasicDisplay/index.js +20 -4
  13. package/dist/LinearBasicDisplay/index.js.map +1 -1
  14. package/dist/LinearBasicDisplay/model.d.ts +19 -12
  15. package/dist/LinearBasicDisplay/model.js +2 -1
  16. package/dist/LinearBasicDisplay/model.js.map +1 -1
  17. package/dist/LinearGenomeView/components/ExportSvgDialog.js +1 -19
  18. package/dist/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
  19. package/dist/LinearGenomeView/components/GetSequenceDialog.js +7 -18
  20. package/dist/LinearGenomeView/components/GetSequenceDialog.js.map +1 -1
  21. package/dist/LinearGenomeView/components/Header.js +2 -2
  22. package/dist/LinearGenomeView/components/HelpDialog.js +2 -17
  23. package/dist/LinearGenomeView/components/HelpDialog.js.map +1 -1
  24. package/dist/LinearGenomeView/components/ImportForm.js +10 -9
  25. package/dist/LinearGenomeView/components/ImportForm.js.map +1 -1
  26. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +5 -5
  27. package/dist/LinearGenomeView/components/{OverviewRubberBand.d.ts → OverviewRubberband.d.ts} +2 -2
  28. package/dist/LinearGenomeView/components/{OverviewRubberBand.js → OverviewRubberband.js} +27 -79
  29. package/dist/LinearGenomeView/components/OverviewRubberband.js.map +1 -0
  30. package/{esm/LinearGenomeView/components/OverviewScaleBar.d.ts → dist/LinearGenomeView/components/OverviewScalebar.d.ts} +2 -2
  31. package/dist/LinearGenomeView/components/{OverviewScaleBar.js → OverviewScalebar.js} +25 -24
  32. package/dist/LinearGenomeView/components/OverviewScalebar.js.map +1 -0
  33. package/dist/LinearGenomeView/components/RefNameAutocomplete.js +1 -1
  34. package/dist/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
  35. package/dist/LinearGenomeView/components/{RubberBand.d.ts → Rubberband.d.ts} +2 -2
  36. package/dist/LinearGenomeView/components/Rubberband.js +57 -0
  37. package/dist/LinearGenomeView/components/Rubberband.js.map +1 -0
  38. package/dist/LinearGenomeView/components/RubberbandSpan.d.ts +14 -0
  39. package/dist/LinearGenomeView/components/RubberbandSpan.js +90 -0
  40. package/dist/LinearGenomeView/components/RubberbandSpan.js.map +1 -0
  41. package/dist/LinearGenomeView/components/{ScaleBar.d.ts → Scalebar.d.ts} +2 -2
  42. package/dist/LinearGenomeView/components/{ScaleBar.js → Scalebar.js} +11 -11
  43. package/dist/LinearGenomeView/components/{ScaleBar.js.map → Scalebar.js.map} +1 -1
  44. package/dist/LinearGenomeView/components/SearchBox.js +6 -6
  45. package/dist/LinearGenomeView/components/SearchBox.js.map +1 -1
  46. package/dist/LinearGenomeView/components/SearchResultsDialog.js +17 -31
  47. package/dist/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
  48. package/dist/LinearGenomeView/components/SequenceSearchDialog.js +4 -19
  49. package/dist/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -1
  50. package/dist/LinearGenomeView/components/TrackContainer.js +2 -2
  51. package/dist/LinearGenomeView/components/TrackContainer.js.map +1 -1
  52. package/dist/LinearGenomeView/components/TracksContainer.js +21 -118
  53. package/dist/LinearGenomeView/components/TracksContainer.js.map +1 -1
  54. package/dist/LinearGenomeView/components/VerticalGuide.d.ts +9 -0
  55. package/dist/LinearGenomeView/components/VerticalGuide.js +29 -0
  56. package/dist/LinearGenomeView/components/VerticalGuide.js.map +1 -0
  57. package/dist/LinearGenomeView/components/hooks.d.ts +65 -0
  58. package/dist/LinearGenomeView/components/hooks.js +264 -0
  59. package/dist/LinearGenomeView/components/hooks.js.map +1 -0
  60. package/dist/LinearGenomeView/components/util.d.ts +5 -2
  61. package/dist/LinearGenomeView/components/util.js +7 -6
  62. package/dist/LinearGenomeView/components/util.js.map +1 -1
  63. package/dist/LinearGenomeView/index.d.ts +3 -534
  64. package/dist/LinearGenomeView/index.js +11 -1327
  65. package/dist/LinearGenomeView/index.js.map +1 -1
  66. package/dist/LinearGenomeView/model.d.ts +535 -0
  67. package/dist/LinearGenomeView/model.js +1357 -0
  68. package/dist/LinearGenomeView/model.js.map +1 -0
  69. package/dist/index.d.ts +2 -2
  70. package/dist/index.js +9 -72
  71. package/dist/index.js.map +1 -1
  72. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js +1 -1
  73. package/esm/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
  74. package/esm/LaunchLinearGenomeView/index.d.ts +3 -0
  75. package/esm/LaunchLinearGenomeView/index.js +42 -0
  76. package/esm/LaunchLinearGenomeView/index.js.map +1 -0
  77. package/esm/LinearBareDisplay/index.d.ts +6 -2
  78. package/esm/LinearBareDisplay/index.js +18 -2
  79. package/esm/LinearBareDisplay/index.js.map +1 -1
  80. package/esm/LinearBasicDisplay/components/SetMaxHeight.js +3 -13
  81. package/esm/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
  82. package/esm/LinearBasicDisplay/index.d.ts +6 -2
  83. package/esm/LinearBasicDisplay/index.js +19 -2
  84. package/esm/LinearBasicDisplay/index.js.map +1 -1
  85. package/esm/LinearBasicDisplay/model.d.ts +19 -12
  86. package/esm/LinearBasicDisplay/model.js +2 -1
  87. package/esm/LinearBasicDisplay/model.js.map +1 -1
  88. package/esm/LinearGenomeView/components/ExportSvgDialog.js +3 -18
  89. package/esm/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
  90. package/esm/LinearGenomeView/components/GetSequenceDialog.js +8 -19
  91. package/esm/LinearGenomeView/components/GetSequenceDialog.js.map +1 -1
  92. package/esm/LinearGenomeView/components/Header.js +2 -2
  93. package/esm/LinearGenomeView/components/HelpDialog.js +3 -18
  94. package/esm/LinearGenomeView/components/HelpDialog.js.map +1 -1
  95. package/esm/LinearGenomeView/components/ImportForm.js +10 -9
  96. package/esm/LinearGenomeView/components/ImportForm.js.map +1 -1
  97. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.js +3 -3
  98. package/esm/LinearGenomeView/components/{OverviewRubberBand.d.ts → OverviewRubberband.d.ts} +2 -2
  99. package/esm/LinearGenomeView/components/{OverviewRubberBand.js → OverviewRubberband.js} +25 -80
  100. package/esm/LinearGenomeView/components/OverviewRubberband.js.map +1 -0
  101. package/{dist/LinearGenomeView/components/OverviewScaleBar.d.ts → esm/LinearGenomeView/components/OverviewScalebar.d.ts} +2 -2
  102. package/esm/LinearGenomeView/components/{OverviewScaleBar.js → OverviewScalebar.js} +25 -24
  103. package/esm/LinearGenomeView/components/OverviewScalebar.js.map +1 -0
  104. package/esm/LinearGenomeView/components/RefNameAutocomplete.js +1 -1
  105. package/esm/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
  106. package/esm/LinearGenomeView/components/{RubberBand.d.ts → Rubberband.d.ts} +2 -2
  107. package/esm/LinearGenomeView/components/Rubberband.js +29 -0
  108. package/esm/LinearGenomeView/components/Rubberband.js.map +1 -0
  109. package/esm/LinearGenomeView/components/RubberbandSpan.d.ts +14 -0
  110. package/esm/LinearGenomeView/components/RubberbandSpan.js +65 -0
  111. package/esm/LinearGenomeView/components/RubberbandSpan.js.map +1 -0
  112. package/esm/LinearGenomeView/components/{ScaleBar.d.ts → Scalebar.d.ts} +2 -2
  113. package/esm/LinearGenomeView/components/{ScaleBar.js → Scalebar.js} +11 -11
  114. package/esm/LinearGenomeView/components/{ScaleBar.js.map → Scalebar.js.map} +1 -1
  115. package/esm/LinearGenomeView/components/SearchBox.js +6 -6
  116. package/esm/LinearGenomeView/components/SearchBox.js.map +1 -1
  117. package/esm/LinearGenomeView/components/SearchResultsDialog.js +18 -32
  118. package/esm/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
  119. package/esm/LinearGenomeView/components/SequenceSearchDialog.js +5 -17
  120. package/esm/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -1
  121. package/esm/LinearGenomeView/components/TrackContainer.js +2 -2
  122. package/esm/LinearGenomeView/components/TrackContainer.js.map +1 -1
  123. package/esm/LinearGenomeView/components/TracksContainer.js +22 -119
  124. package/esm/LinearGenomeView/components/TracksContainer.js.map +1 -1
  125. package/esm/LinearGenomeView/components/VerticalGuide.d.ts +9 -0
  126. package/esm/LinearGenomeView/components/VerticalGuide.js +24 -0
  127. package/esm/LinearGenomeView/components/VerticalGuide.js.map +1 -0
  128. package/esm/LinearGenomeView/components/hooks.d.ts +65 -0
  129. package/esm/LinearGenomeView/components/hooks.js +255 -0
  130. package/esm/LinearGenomeView/components/hooks.js.map +1 -0
  131. package/esm/LinearGenomeView/components/util.d.ts +5 -2
  132. package/esm/LinearGenomeView/components/util.js +4 -3
  133. package/esm/LinearGenomeView/components/util.js.map +1 -1
  134. package/esm/LinearGenomeView/index.d.ts +3 -534
  135. package/esm/LinearGenomeView/index.js +9 -1318
  136. package/esm/LinearGenomeView/index.js.map +1 -1
  137. package/esm/LinearGenomeView/model.d.ts +535 -0
  138. package/esm/LinearGenomeView/model.js +1322 -0
  139. package/esm/LinearGenomeView/model.js.map +1 -0
  140. package/esm/index.d.ts +2 -2
  141. package/esm/index.js +9 -72
  142. package/esm/index.js.map +1 -1
  143. package/package.json +3 -3
  144. package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +1 -1
  145. package/src/LaunchLinearGenomeView/index.ts +66 -0
  146. package/src/LinearBareDisplay/index.ts +21 -2
  147. package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +3 -28
  148. package/src/LinearBasicDisplay/index.ts +23 -2
  149. package/src/LinearBasicDisplay/model.ts +2 -1
  150. package/src/LinearGenomeView/components/ExportSvgDialog.tsx +2 -23
  151. package/src/LinearGenomeView/components/GetSequenceDialog.tsx +13 -31
  152. package/src/LinearGenomeView/components/Header.tsx +3 -3
  153. package/src/LinearGenomeView/components/HelpDialog.tsx +8 -34
  154. package/src/LinearGenomeView/components/ImportForm.tsx +10 -9
  155. package/src/LinearGenomeView/components/LinearGenomeViewSvg.tsx +3 -3
  156. package/src/LinearGenomeView/components/{OverviewRubberBand.tsx → OverviewRubberband.tsx} +32 -114
  157. package/src/LinearGenomeView/components/{OverviewScaleBar.tsx → OverviewScalebar.tsx} +26 -25
  158. package/src/LinearGenomeView/components/RefNameAutocomplete.tsx +2 -1
  159. package/src/LinearGenomeView/components/Rubberband.tsx +89 -0
  160. package/src/LinearGenomeView/components/RubberbandSpan.tsx +116 -0
  161. package/src/LinearGenomeView/components/{ScaleBar.test.tsx → Scalebar.test.tsx} +5 -5
  162. package/src/LinearGenomeView/components/{ScaleBar.tsx → Scalebar.tsx} +11 -11
  163. package/src/LinearGenomeView/components/SearchBox.tsx +6 -6
  164. package/src/LinearGenomeView/components/SearchResultsDialog.tsx +17 -44
  165. package/src/LinearGenomeView/components/SequenceSearchDialog.tsx +4 -30
  166. package/src/LinearGenomeView/components/TrackContainer.tsx +4 -2
  167. package/src/LinearGenomeView/components/TracksContainer.tsx +59 -136
  168. package/src/LinearGenomeView/components/VerticalGuide.tsx +37 -0
  169. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap +37 -39
  170. package/src/LinearGenomeView/components/hooks.ts +300 -0
  171. package/src/LinearGenomeView/components/util.ts +8 -11
  172. package/src/LinearGenomeView/index.test.ts +6 -7
  173. package/src/LinearGenomeView/index.ts +17 -0
  174. package/src/LinearGenomeView/{index.tsx → model.ts} +7 -4
  175. package/src/index.ts +13 -108
  176. package/dist/LinearGenomeView/components/OverviewRubberBand.js.map +0 -1
  177. package/dist/LinearGenomeView/components/OverviewScaleBar.js.map +0 -1
  178. package/dist/LinearGenomeView/components/RubberBand.js +0 -221
  179. package/dist/LinearGenomeView/components/RubberBand.js.map +0 -1
  180. package/esm/LinearGenomeView/components/OverviewRubberBand.js.map +0 -1
  181. package/esm/LinearGenomeView/components/OverviewScaleBar.js.map +0 -1
  182. package/esm/LinearGenomeView/components/RubberBand.js +0 -196
  183. package/esm/LinearGenomeView/components/RubberBand.js.map +0 -1
  184. package/src/LinearGenomeView/components/RubberBand.tsx +0 -308
@@ -9,57 +9,57 @@ exports[`<LinearGenomeView /> renders one track, one region 1`] = `
9
9
  style="position: relative;"
10
10
  >
11
11
  <div
12
- class="css-16hdnmo-rubberBandControl"
12
+ class="css-dznme2-rubberbandControl"
13
13
  role="presentation"
14
14
  >
15
15
  <div
16
- class="css-1420449-scaleBar"
16
+ class="css-16vhz0m-scalebar"
17
17
  >
18
18
  <div
19
- class="css-1i1w1rp-scaleBarVisibleRegion"
19
+ class="css-den3n5-scalebarVisibleRegion"
20
20
  style="width: 800px; left: 0px; background: rgba(66, 165, 245, 0.3); border-color: #42a5f5;"
21
21
  />
22
22
  <div
23
- class="css-z1h6g4-scaleBarContig"
23
+ class="css-osn2dd-scalebarContig"
24
24
  style="width: 0px; left: 0px; background-color: rgb(153, 153, 153);"
25
25
  />
26
26
  <div>
27
27
  <p
28
- class="MuiTypography-root MuiTypography-body1 css-6v00mp-MuiTypography-root-scaleBarRefName"
28
+ class="MuiTypography-root MuiTypography-body1 css-1hokke9-MuiTypography-root-scalebarRefName"
29
29
  style="left: 3px; color: rgb(153, 102, 0);"
30
30
  >
31
31
  ctgA
32
32
  </p>
33
33
  <div
34
- class="css-1an6zsa-scaleBarContig-scaleBarContigForward-scaleBarBorder"
34
+ class="css-c4j89u-scalebarContig-scalebarContigForward-scalebarBorder"
35
35
  style="left: 0px; width: 800px; border-color: rgb(153, 102, 0);"
36
36
  >
37
37
  <p
38
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
38
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
39
39
  style="left: 160px; pointer-events: none; color: rgb(153, 102, 0);"
40
40
  >
41
41
  20
42
42
  </p>
43
43
  <p
44
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
44
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
45
45
  style="left: 320px; pointer-events: none; color: rgb(153, 102, 0);"
46
46
  >
47
47
  40
48
48
  </p>
49
49
  <p
50
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
50
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
51
51
  style="left: 480px; pointer-events: none; color: rgb(153, 102, 0);"
52
52
  >
53
53
  60
54
54
  </p>
55
55
  <p
56
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
56
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
57
57
  style="left: 640px; pointer-events: none; color: rgb(153, 102, 0);"
58
58
  >
59
59
  80
60
60
  </p>
61
61
  <p
62
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
62
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
63
63
  style="left: 800px; pointer-events: none; color: rgb(153, 102, 0);"
64
64
  >
65
65
  100
@@ -67,7 +67,7 @@ exports[`<LinearGenomeView /> renders one track, one region 1`] = `
67
67
  </div>
68
68
  </div>
69
69
  <div
70
- class="css-z1h6g4-scaleBarContig"
70
+ class="css-osn2dd-scalebarContig"
71
71
  style="width: 0px; left: 800px; background-color: rgb(153, 153, 153);"
72
72
  />
73
73
  </div>
@@ -381,20 +381,19 @@ exports[`<LinearGenomeView /> renders one track, one region 1`] = `
381
381
  </div>
382
382
  </div>
383
383
  <div
384
- class="css-16hdnmo-rubberBandControl"
385
- data-testid="rubberBand_controls"
386
- role="presentation"
384
+ class="css-dznme2-rubberbandControl"
385
+ data-testid="rubberband_controls"
387
386
  >
388
387
  <div
389
- class="MuiPaper-root MuiPaper-outlined MuiPaper-rounded css-1gfu64w-MuiPaper-root-scaleBarContainer"
388
+ class="MuiPaper-root MuiPaper-outlined MuiPaper-rounded css-1coqp07-MuiPaper-root-scalebarContainer"
390
389
  data-resizer="true"
391
390
  style="height: 17px; box-sizing: border-box;"
392
391
  >
393
392
  <div
394
- class="css-17t6jej-scaleBarZoomContainer"
393
+ class="css-khofof-scalebarZoomContainer"
395
394
  >
396
395
  <div
397
- class="css-1u2dss8-scaleBar"
396
+ class="css-y3821b-scalebar"
398
397
  style="left: -801px; width: 1700px; height: 17px; box-sizing: border-box;"
399
398
  >
400
399
  <div
@@ -554,73 +553,73 @@ exports[`<LinearGenomeView /> renders two tracks, two regions 1`] = `
554
553
  style="position: relative;"
555
554
  >
556
555
  <div
557
- class="css-16hdnmo-rubberBandControl"
556
+ class="css-dznme2-rubberbandControl"
558
557
  role="presentation"
559
558
  >
560
559
  <div
561
- class="css-1420449-scaleBar"
560
+ class="css-16vhz0m-scalebar"
562
561
  >
563
562
  <div
564
- class="css-1i1w1rp-scaleBarVisibleRegion"
563
+ class="css-den3n5-scalebarVisibleRegion"
565
564
  style="width: 580px; left: 0px; background: rgba(66, 165, 245, 0.3); border-color: #42a5f5;"
566
565
  />
567
566
  <div
568
- class="css-z1h6g4-scaleBarContig"
567
+ class="css-osn2dd-scalebarContig"
569
568
  style="width: 0px; left: 0px; background-color: rgb(153, 153, 153);"
570
569
  />
571
570
  <div>
572
571
  <p
573
- class="MuiTypography-root MuiTypography-body1 css-6v00mp-MuiTypography-root-scaleBarRefName"
572
+ class="MuiTypography-root MuiTypography-body1 css-1hokke9-MuiTypography-root-scalebarRefName"
574
573
  style="left: 3px; color: rgb(153, 102, 0);"
575
574
  >
576
575
  ctgA
577
576
  </p>
578
577
  <div
579
- class="css-1an6zsa-scaleBarContig-scaleBarContigForward-scaleBarBorder"
578
+ class="css-c4j89u-scalebarContig-scalebarContigForward-scalebarBorder"
580
579
  style="left: 0px; width: 72.72727272727273px; border-color: rgb(153, 102, 0);"
581
580
  />
582
581
  </div>
583
582
  <div
584
- class="css-z1h6g4-scaleBarContig"
583
+ class="css-osn2dd-scalebarContig"
585
584
  style="width: 0px; left: 72.72727272727273px; background-color: rgb(153, 153, 153);"
586
585
  />
587
586
  <div>
588
587
  <p
589
- class="MuiTypography-root MuiTypography-body1 css-6v00mp-MuiTypography-root-scaleBarRefName"
588
+ class="MuiTypography-root MuiTypography-body1 css-1hokke9-MuiTypography-root-scalebarRefName"
590
589
  style="left: 75.72727272727273px;"
591
590
  >
592
591
  ctgB
593
592
  </p>
594
593
  <div
595
- class="css-1an6zsa-scaleBarContig-scaleBarContigForward-scaleBarBorder"
594
+ class="css-c4j89u-scalebarContig-scalebarContigForward-scalebarBorder"
596
595
  style="left: 72.72727272727273px; width: 727.2727272727273px;"
597
596
  >
598
597
  <p
599
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
598
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
600
599
  style="left: 145.0909090909091px; pointer-events: none;"
601
600
  >
602
601
  1,200
603
602
  </p>
604
603
  <p
605
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
604
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
606
605
  style="left: 290.1818181818182px; pointer-events: none;"
607
606
  >
608
607
  1,400
609
608
  </p>
610
609
  <p
611
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
610
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
612
611
  style="left: 435.27272727272725px; pointer-events: none;"
613
612
  >
614
613
  1,600
615
614
  </p>
616
615
  <p
617
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
616
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
618
617
  style="left: 580.3636363636364px; pointer-events: none;"
619
618
  >
620
619
  1,800
621
620
  </p>
622
621
  <p
623
- class="MuiTypography-root MuiTypography-body2 css-23pkd3-MuiTypography-root-scaleBarLabel"
622
+ class="MuiTypography-root MuiTypography-body2 css-7mggk8-MuiTypography-root-scalebarLabel"
624
623
  style="left: 725.4545454545454px; pointer-events: none;"
625
624
  >
626
625
  2,000
@@ -628,7 +627,7 @@ exports[`<LinearGenomeView /> renders two tracks, two regions 1`] = `
628
627
  </div>
629
628
  </div>
630
629
  <div
631
- class="css-z1h6g4-scaleBarContig"
630
+ class="css-osn2dd-scalebarContig"
632
631
  style="width: 0px; left: 800px; background-color: rgb(153, 153, 153);"
633
632
  />
634
633
  </div>
@@ -1117,20 +1116,19 @@ exports[`<LinearGenomeView /> renders two tracks, two regions 1`] = `
1117
1116
  </div>
1118
1117
  </div>
1119
1118
  <div
1120
- class="css-16hdnmo-rubberBandControl"
1121
- data-testid="rubberBand_controls"
1122
- role="presentation"
1119
+ class="css-dznme2-rubberbandControl"
1120
+ data-testid="rubberband_controls"
1123
1121
  >
1124
1122
  <div
1125
- class="MuiPaper-root MuiPaper-outlined MuiPaper-rounded css-1gfu64w-MuiPaper-root-scaleBarContainer"
1123
+ class="MuiPaper-root MuiPaper-outlined MuiPaper-rounded css-1coqp07-MuiPaper-root-scalebarContainer"
1126
1124
  data-resizer="true"
1127
1125
  style="height: 17px; box-sizing: border-box;"
1128
1126
  >
1129
1127
  <div
1130
- class="css-17t6jej-scaleBarZoomContainer"
1128
+ class="css-khofof-scalebarZoomContainer"
1131
1129
  >
1132
1130
  <div
1133
- class="css-1u2dss8-scaleBar"
1131
+ class="css-y3821b-scalebar"
1134
1132
  style="left: -801px; width: 1702px; height: 17px; box-sizing: border-box;"
1135
1133
  >
1136
1134
  <div
@@ -0,0 +1,300 @@
1
+ import React, { useRef, useEffect, useState } from 'react'
2
+ import normalizeWheel from 'normalize-wheel'
3
+
4
+ // locals
5
+ import { LinearGenomeViewModel } from '..'
6
+ import { getRelativeX } from './util'
7
+
8
+ type LGV = LinearGenomeViewModel
9
+ type Timer = ReturnType<typeof setTimeout>
10
+
11
+ export function useSideScroll(model: LGV) {
12
+ const [mouseDragging, setMouseDragging] = useState(false)
13
+ // refs are to store these variables to avoid repeated rerenders associated
14
+ // with useState/setState
15
+ const scheduled = useRef(false)
16
+
17
+ const prevX = useRef<number>(0)
18
+
19
+ useEffect(() => {
20
+ let cleanup = () => {}
21
+
22
+ function globalMouseMove(event: MouseEvent) {
23
+ event.preventDefault()
24
+ const currX = event.clientX
25
+ const distance = currX - prevX.current
26
+ if (distance) {
27
+ // use rAF to make it so multiple event handlers aren't fired per-frame
28
+ // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/
29
+ if (!scheduled.current) {
30
+ scheduled.current = true
31
+ window.requestAnimationFrame(() => {
32
+ model.horizontalScroll(-distance)
33
+ scheduled.current = false
34
+ prevX.current = event.clientX
35
+ })
36
+ }
37
+ }
38
+ }
39
+
40
+ function globalMouseUp() {
41
+ prevX.current = 0
42
+ if (mouseDragging) {
43
+ setMouseDragging(false)
44
+ }
45
+ }
46
+
47
+ if (mouseDragging) {
48
+ window.addEventListener('mousemove', globalMouseMove, true)
49
+ window.addEventListener('mouseup', globalMouseUp, true)
50
+ cleanup = () => {
51
+ window.removeEventListener('mousemove', globalMouseMove, true)
52
+ window.removeEventListener('mouseup', globalMouseUp, true)
53
+ }
54
+ }
55
+ return cleanup
56
+ }, [model, mouseDragging, prevX])
57
+
58
+ function mouseDown(event: React.MouseEvent) {
59
+ if (event.shiftKey) {
60
+ return
61
+ }
62
+ // check if clicking a draggable element or a resize handle
63
+ const target = event.target as HTMLElement
64
+ if (target.draggable || target.dataset.resizer) {
65
+ return
66
+ }
67
+
68
+ // otherwise do click and drag scroll
69
+ if (event.button === 0) {
70
+ prevX.current = event.clientX
71
+ setMouseDragging(true)
72
+ }
73
+ }
74
+
75
+ // this local mouseup is used in addition to the global because sometimes
76
+ // the global add/remove are not called in time, resulting in issue #533
77
+ function mouseUp(event: React.MouseEvent) {
78
+ event.preventDefault()
79
+ setMouseDragging(false)
80
+ }
81
+ return { mouseDown, mouseUp }
82
+ }
83
+
84
+ interface AnchorPosition {
85
+ offsetX: number
86
+ clientX: number
87
+ clientY: number
88
+ }
89
+
90
+ export function useRangeSelect(
91
+ ref: React.RefObject<HTMLDivElement>,
92
+ model: LGV,
93
+ shiftOnly?: boolean,
94
+ ) {
95
+ const [startX, setStartX] = useState<number>()
96
+ const [currentX, setCurrentX] = useState<number>()
97
+
98
+ // clientX and clientY used for anchorPosition for menu
99
+ // offsetX used for calculations about width of selection
100
+ const [anchorPosition, setAnchorPosition] = useState<AnchorPosition>()
101
+ const [guideX, setGuideX] = useState<number>()
102
+ const mouseDragging = startX !== undefined && anchorPosition === undefined
103
+
104
+ useEffect(() => {
105
+ function computeOffsets(offsetX: number) {
106
+ if (startX === undefined) {
107
+ return
108
+ }
109
+ const leftPx = Math.min(startX, offsetX)
110
+ const rightPx = Math.max(startX, offsetX)
111
+ return {
112
+ leftOffset: model.pxToBp(leftPx),
113
+ rightOffset: model.pxToBp(rightPx),
114
+ }
115
+ }
116
+
117
+ function globalMouseMove(event: MouseEvent) {
118
+ if (ref.current && mouseDragging) {
119
+ const relativeX = getRelativeX(event, ref.current)
120
+ setCurrentX(relativeX)
121
+ }
122
+ }
123
+
124
+ function globalMouseUp(event: MouseEvent) {
125
+ if (startX !== undefined && ref.current) {
126
+ const { clientX, clientY } = event
127
+ const offsetX = getRelativeX(event, ref.current)
128
+ // as stated above, store both clientX/Y and offsetX for different
129
+ // purposes
130
+ setAnchorPosition({
131
+ offsetX,
132
+ clientX,
133
+ clientY,
134
+ })
135
+ const args = computeOffsets(offsetX)
136
+ if (args) {
137
+ model.setOffsets(args.leftOffset, args.rightOffset)
138
+ }
139
+ setGuideX(undefined)
140
+ }
141
+ }
142
+ if (mouseDragging) {
143
+ window.addEventListener('mousemove', globalMouseMove)
144
+ window.addEventListener('mouseup', globalMouseUp)
145
+ return () => {
146
+ window.removeEventListener('mousemove', globalMouseMove)
147
+ window.removeEventListener('mouseup', globalMouseUp)
148
+ }
149
+ }
150
+ return () => {}
151
+ }, [startX, mouseDragging, anchorPosition, model, ref])
152
+
153
+ useEffect(() => {
154
+ if (
155
+ !mouseDragging &&
156
+ currentX !== undefined &&
157
+ startX !== undefined &&
158
+ Math.abs(currentX - startX) <= 3
159
+ ) {
160
+ handleClose()
161
+ }
162
+ }, [mouseDragging, currentX, startX])
163
+
164
+ function mouseDown(event: React.MouseEvent<HTMLDivElement>) {
165
+ if (shiftOnly && !event.shiftKey) {
166
+ return
167
+ }
168
+
169
+ event.preventDefault()
170
+ event.stopPropagation()
171
+ const relativeX = getRelativeX(event, ref.current)
172
+ setStartX(relativeX)
173
+ setCurrentX(relativeX)
174
+ }
175
+
176
+ function mouseMove(event: React.MouseEvent<HTMLDivElement>) {
177
+ if (shiftOnly) {
178
+ if (event.shiftKey) {
179
+ setGuideX(getRelativeX(event, ref.current))
180
+ } else {
181
+ setGuideX(undefined)
182
+ }
183
+ } else {
184
+ setGuideX(getRelativeX(event, ref.current))
185
+ }
186
+ }
187
+
188
+ function mouseOut() {
189
+ setGuideX(undefined)
190
+ model.setOffsets(undefined, undefined)
191
+ }
192
+
193
+ function handleClose() {
194
+ setAnchorPosition(undefined)
195
+ setStartX(undefined)
196
+ setCurrentX(undefined)
197
+ }
198
+
199
+ function handleMenuItemClick(_: unknown, callback: Function) {
200
+ callback()
201
+ handleClose()
202
+ }
203
+
204
+ const open = Boolean(anchorPosition)
205
+ if (startX === undefined) {
206
+ return {
207
+ open,
208
+ guideX,
209
+ mouseDown,
210
+ mouseMove,
211
+ mouseOut,
212
+ handleMenuItemClick,
213
+ }
214
+ } else {
215
+ const right = anchorPosition ? anchorPosition.offsetX : currentX || 0
216
+ const left = right < startX ? right : startX
217
+ const width = Math.abs(right - startX)
218
+ const leftBpOffset = model.pxToBp(left)
219
+ const rightBpOffset = model.pxToBp(left + width)
220
+ const numOfBpSelected = Math.ceil(width * model.bpPerPx)
221
+
222
+ return {
223
+ open,
224
+ rubberbandOn: true,
225
+ mouseDown,
226
+ mouseMove,
227
+ mouseOut,
228
+ handleClose,
229
+ handleMenuItemClick,
230
+ leftBpOffset,
231
+ rightBpOffset,
232
+ anchorPosition,
233
+ numOfBpSelected,
234
+ width,
235
+ left,
236
+ }
237
+ }
238
+ }
239
+
240
+ export function useWheelScroll(
241
+ ref: React.RefObject<HTMLDivElement>,
242
+ model: LGV,
243
+ ) {
244
+ const delta = useRef(0)
245
+ const timeout = useRef<Timer>()
246
+ const scheduled = useRef(false)
247
+ useEffect(() => {
248
+ const curr = ref.current
249
+
250
+ // if ctrl is held down, zoom in with y-scroll
251
+ // else scroll horizontally with x-scroll
252
+ function onWheel(origEvent: WheelEvent) {
253
+ const event = normalizeWheel(origEvent)
254
+ if (origEvent.ctrlKey === true) {
255
+ origEvent.preventDefault()
256
+ delta.current += event.pixelY / 500
257
+ model.setScaleFactor(
258
+ delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current),
259
+ )
260
+ if (timeout.current) {
261
+ clearTimeout(timeout.current)
262
+ }
263
+ timeout.current = setTimeout(() => {
264
+ model.setScaleFactor(1)
265
+ model.zoomTo(
266
+ delta.current > 0
267
+ ? model.bpPerPx * (1 + delta.current)
268
+ : model.bpPerPx / (1 - delta.current),
269
+ )
270
+ delta.current = 0
271
+ }, 300)
272
+ } else {
273
+ // this is needed to stop the event from triggering "back button
274
+ // action" on MacOSX etc. but is a heuristic to avoid preventing the
275
+ // inner-track scroll behavior
276
+ if (Math.abs(event.pixelX) > Math.abs(2 * event.pixelY)) {
277
+ origEvent.preventDefault()
278
+ }
279
+ delta.current += event.pixelX
280
+ if (!scheduled.current) {
281
+ // use rAF to make it so multiple event handlers aren't fired per-frame
282
+ // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/
283
+ scheduled.current = true
284
+ window.requestAnimationFrame(() => {
285
+ model.horizontalScroll(delta.current)
286
+ delta.current = 0
287
+ scheduled.current = false
288
+ })
289
+ }
290
+ }
291
+ }
292
+ if (curr) {
293
+ curr.addEventListener('wheel', onWheel)
294
+ return () => {
295
+ curr.removeEventListener('wheel', onWheel)
296
+ }
297
+ }
298
+ return () => {}
299
+ }, [model, ref])
300
+ }
@@ -1,17 +1,8 @@
1
1
  import { Assembly } from '@jbrowse/core/assemblyManager/assembly'
2
2
  import { SearchType } from '@jbrowse/core/data_adapters/BaseAdapter'
3
- import BaseResult from '@jbrowse/core/TextSearch/BaseResults'
4
3
  import { SearchScope } from '@jbrowse/core/TextSearch/TextSearchManager'
5
- import { TextSearchManager } from '@jbrowse/core/util'
6
-
7
- export function dedupe(
8
- results: BaseResult[] = [],
9
- cb: (result: BaseResult) => string,
10
- ) {
11
- return results.filter(
12
- (elt, idx, self) => idx === self.findIndex(t => cb(t) === cb(elt)),
13
- )
14
- }
4
+ import { dedupe, TextSearchManager } from '@jbrowse/core/util'
5
+ import BaseResult from '@jbrowse/core/TextSearch/BaseResults'
15
6
 
16
7
  export async function fetchResults({
17
8
  queryString,
@@ -63,3 +54,9 @@ export function splitLast(str: string, split: string): [string, string] {
63
54
  return [before, after]
64
55
  }
65
56
  }
57
+
58
+ export function getRelativeX<
59
+ T extends { clientX: number; target: EventTarget | null },
60
+ >(event: T, element: HTMLElement | null) {
61
+ return event.clientX - (element?.getBoundingClientRect().left || 0)
62
+ }
@@ -947,16 +947,16 @@ test('navToLocString with human assembly', async () => {
947
947
  view.setDisplayedRegions(hg38Regions.slice(0, 1))
948
948
  const w = view.width
949
949
 
950
- view.navToLocString('2')
950
+ await view.navToLocString('2')
951
951
  await waitFor(() => expect(view.bpPerPx).toBe(hg38Regions[1].end / w))
952
952
 
953
- view.navToLocString('chr3')
953
+ await view.navToLocString('chr3')
954
954
  await waitFor(() => expect(view.bpPerPx).toBe(hg38Regions[2].end / w))
955
955
 
956
- view.navToLocString('chr3:1,000,000,000-1,100,000,000')
956
+ await view.navToLocString('chr3:1,000,000,000-1,100,000,000')
957
957
  await waitFor(() => expect(view.bpPerPx).toBe(0.02))
958
958
  await waitFor(() => expect(view.offsetPx).toBe(9914777550))
959
- view.navToLocString('chr3:-1,100,000,000..-1,000,000,000')
959
+ await view.navToLocString('chr3:-1,100,000,000..-1,000,000,000')
960
960
  })
961
961
 
962
962
  test('multi region', async () => {
@@ -972,7 +972,7 @@ test('multi region', async () => {
972
972
  model.setWidth(800)
973
973
  model.setDisplayedRegions(volvoxDisplayedRegions.slice(0, 1))
974
974
 
975
- model.navToLocString('ctgA ctgB')
975
+ await model.navToLocString('ctgA ctgB')
976
976
  await waitFor(() => expect(model.displayedRegions[0].refName).toBe('ctgA'))
977
977
  await waitFor(() => expect(model.displayedRegions[1].refName).toBe('ctgB'))
978
978
  })
@@ -990,8 +990,7 @@ test('space separated locstring', async () => {
990
990
  model.setWidth(800)
991
991
  model.setDisplayedRegions(volvoxDisplayedRegions.slice(0, 1))
992
992
 
993
- model.navToLocString('ctgA 0 100')
994
-
993
+ await model.navToLocString('ctgA 0 100')
995
994
  await waitFor(() => expect(model.offsetPx).toBe(0))
996
995
  await waitFor(() => expect(model.bpPerPx).toBe(0.125))
997
996
  })
@@ -0,0 +1,17 @@
1
+ import { lazy } from 'react'
2
+ import PluginManager from '@jbrowse/core/PluginManager'
3
+ import { ViewType } from '@jbrowse/core/pluggableElementTypes'
4
+ import { stateModelFactory } from './model'
5
+
6
+ export default (pluginManager: PluginManager) => {
7
+ pluginManager.addViewType(
8
+ () =>
9
+ new ViewType({
10
+ name: 'LinearGenomeView',
11
+ stateModel: stateModelFactory(pluginManager),
12
+ ReactComponent: lazy(() => import('./components/LinearGenomeView')),
13
+ }),
14
+ )
15
+ }
16
+
17
+ export * from './model'
@@ -22,7 +22,7 @@ import { BlockSet, BaseBlock } from '@jbrowse/core/util/blockTypes'
22
22
  import calculateDynamicBlocks from '@jbrowse/core/util/calculateDynamicBlocks'
23
23
  import calculateStaticBlocks from '@jbrowse/core/util/calculateStaticBlocks'
24
24
  import { getParentRenderProps } from '@jbrowse/core/util/tracks'
25
- import { transaction, autorun } from 'mobx'
25
+ import { when, transaction, autorun } from 'mobx'
26
26
  import {
27
27
  addDisposer,
28
28
  cast,
@@ -902,7 +902,7 @@ export function stateModelFactory(pluginManager: PluginManager) {
902
902
  * this "clears the view" and makes the view return to the import form
903
903
  */
904
904
  clearView() {
905
- self.displayedRegions.clear()
905
+ this.setDisplayedRegions([])
906
906
  self.tracks.clear()
907
907
  // it is necessary to run these after setting displayed regions empty
908
908
  // or else model.offsetPx gets set to Infinity and breaks
@@ -1267,6 +1267,7 @@ export function stateModelFactory(pluginManager: PluginManager) {
1267
1267
  const { assemblyNames } = self
1268
1268
  const { assemblyManager } = getSession(self)
1269
1269
  const { isValidRefName } = assemblyManager
1270
+ await when(() => self.volatileWidth !== undefined)
1270
1271
  const assemblyName = optAssemblyName || assemblyNames[0]
1271
1272
  let parsedLocStrings
1272
1273
  const inputs = locString
@@ -1281,8 +1282,8 @@ export function stateModelFactory(pluginManager: PluginManager) {
1281
1282
  // first try interpreting as a whitespace-separated sequence of
1282
1283
  // multiple locstrings
1283
1284
  try {
1284
- parsedLocStrings = inputs.map(l =>
1285
- parseLocString(l, ref => isValidRefName(ref, assemblyName)),
1285
+ parsedLocStrings = inputs.map(loc =>
1286
+ parseLocString(loc, ref => isValidRefName(ref, assemblyName)),
1286
1287
  )
1287
1288
  } catch (e) {
1288
1289
  // if this fails, try interpreting as a whitespace-separated refname,
@@ -1584,6 +1585,8 @@ export {
1584
1585
  ZoomControls,
1585
1586
  LinearGenomeView,
1586
1587
  }
1588
+
1587
1589
  export type LinearGenomeViewStateModel = ReturnType<typeof stateModelFactory>
1588
1590
  export type LinearGenomeViewModel = Instance<LinearGenomeViewStateModel>
1591
+
1589
1592
  export { default as ReactComponent } from './components/LinearGenomeView'