react-msaview 5.4.1 → 5.6.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 (180) hide show
  1. package/LICENSE +21 -0
  2. package/bundle/index.js +487 -149
  3. package/bundle/index.js.map +7 -1
  4. package/dist/colorSchemes.js +11 -7
  5. package/dist/colorSchemes.js.map +1 -1
  6. package/dist/components/ConservationTrack.js +20 -26
  7. package/dist/components/ConservationTrack.js.map +1 -1
  8. package/dist/components/MSAViewer.d.ts +13 -1
  9. package/dist/components/MSAViewer.js +13 -7
  10. package/dist/components/MSAViewer.js.map +1 -1
  11. package/dist/components/SequenceTextArea.js +1 -1
  12. package/dist/components/SequenceTextArea.js.map +1 -1
  13. package/dist/components/TextTrack.js +20 -27
  14. package/dist/components/TextTrack.js.map +1 -1
  15. package/dist/components/Track.js +9 -6
  16. package/dist/components/Track.js.map +1 -1
  17. package/dist/components/dialogs/FeatureDialog.js +27 -23
  18. package/dist/components/dialogs/FeatureDialog.js.map +1 -1
  19. package/dist/components/dialogs/TrackInfoDialog.js +1 -1
  20. package/dist/components/dialogs/TrackInfoDialog.js.map +1 -1
  21. package/dist/components/header/ColorSchemeMenu.js +1 -1
  22. package/dist/components/header/ColorSchemeMenu.js.map +1 -1
  23. package/dist/components/header/FileMenu.js +1 -16
  24. package/dist/components/header/FileMenu.js.map +1 -1
  25. package/dist/components/header/Header.js +6 -5
  26. package/dist/components/header/Header.js.map +1 -1
  27. package/dist/components/header/HeaderInfoArea.js +1 -1
  28. package/dist/components/header/HeaderInfoArea.js.map +1 -1
  29. package/dist/components/header/HeaderStatusArea.js +1 -1
  30. package/dist/components/header/HeaderStatusArea.js.map +1 -1
  31. package/dist/components/header/MSASettingsMenu.js +1 -1
  32. package/dist/components/header/MSASettingsMenu.js.map +1 -1
  33. package/dist/components/header/MultiAlignmentSelector.js +0 -0
  34. package/dist/components/header/MultiAlignmentSelector.js.map +1 -1
  35. package/dist/components/header/TreeSettingsMenu.js +1 -1
  36. package/dist/components/header/TreeSettingsMenu.js.map +1 -1
  37. package/dist/components/header/ZoomControls.js +14 -12
  38. package/dist/components/header/ZoomControls.js.map +1 -1
  39. package/dist/components/header/ZoomMenu.js +1 -10
  40. package/dist/components/header/ZoomMenu.js.map +1 -1
  41. package/dist/components/header/settingsMenuItems.js +9 -1
  42. package/dist/components/header/settingsMenuItems.js.map +1 -1
  43. package/dist/components/{header/HeaderMenu.d.ts → msa/ColumnStats.d.ts} +3 -3
  44. package/dist/components/msa/ColumnStats.js +42 -0
  45. package/dist/components/msa/ColumnStats.js.map +1 -0
  46. package/dist/components/msa/DomainLegend.d.ts +6 -0
  47. package/dist/components/msa/DomainLegend.js +41 -0
  48. package/dist/components/msa/DomainLegend.js.map +1 -0
  49. package/dist/components/msa/MSACanvasBlock.js +41 -29
  50. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  51. package/dist/components/msa/MSAMouseoverCanvas.js +6 -12
  52. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
  53. package/dist/components/msa/MSAPanel.js +3 -1
  54. package/dist/components/msa/MSAPanel.js.map +1 -1
  55. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +60 -14
  56. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  57. package/dist/components/msa/renderMSABlock.js +3 -3
  58. package/dist/components/msa/renderMSABlock.js.map +1 -1
  59. package/dist/components/msa/renderMSAMouseover.js +33 -6
  60. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  61. package/dist/components/overlayColors.d.ts +3 -0
  62. package/dist/components/overlayColors.js +11 -0
  63. package/dist/components/overlayColors.js.map +1 -0
  64. package/dist/components/renderCtx.d.ts +1 -1
  65. package/dist/components/tracks/renderTracksSvg.d.ts +6 -3
  66. package/dist/components/tracks/renderTracksSvg.js +20 -11
  67. package/dist/components/tracks/renderTracksSvg.js.map +1 -1
  68. package/dist/components/tree/TreeCanvas.js +31 -38
  69. package/dist/components/tree/TreeCanvas.js.map +1 -1
  70. package/dist/components/tree/TreeCanvasBlock.js +12 -47
  71. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  72. package/dist/components/tree/clickMap.d.ts +24 -0
  73. package/dist/components/tree/clickMap.js +33 -0
  74. package/dist/components/tree/clickMap.js.map +1 -0
  75. package/dist/components/tree/renderTreeCanvas.d.ts +1 -21
  76. package/dist/components/tree/renderTreeCanvas.js +8 -7
  77. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  78. package/dist/constants.d.ts +4 -0
  79. package/dist/constants.js +17 -0
  80. package/dist/constants.js.map +1 -1
  81. package/dist/createPaletteMap.d.ts +5 -2
  82. package/dist/createPaletteMap.js +15 -5
  83. package/dist/createPaletteMap.js.map +1 -1
  84. package/dist/fetchUtils.d.ts +2 -1
  85. package/dist/fetchUtils.js +3 -2
  86. package/dist/fetchUtils.js.map +1 -1
  87. package/dist/index.d.ts +1 -1
  88. package/dist/launchInterProScan.d.ts +2 -0
  89. package/dist/launchInterProScan.js.map +1 -1
  90. package/dist/model/msaModel.d.ts +25 -2
  91. package/dist/model/msaModel.js +15 -3
  92. package/dist/model/msaModel.js.map +1 -1
  93. package/dist/model/treeModel.d.ts +46 -5
  94. package/dist/model/treeModel.js +20 -7
  95. package/dist/model/treeModel.js.map +1 -1
  96. package/dist/model.d.ts +641 -133
  97. package/dist/model.js +191 -77
  98. package/dist/model.js.map +1 -1
  99. package/dist/propertyConservation.d.ts +7 -0
  100. package/dist/propertyConservation.js +66 -0
  101. package/dist/propertyConservation.js.map +1 -0
  102. package/dist/renderToSvg.js +104 -74
  103. package/dist/renderToSvg.js.map +1 -1
  104. package/dist/types.d.ts +4 -1
  105. package/dist/{webpack.js → umd.js} +1 -1
  106. package/dist/umd.js.map +1 -0
  107. package/dist/useCanvasAutorun.d.ts +2 -0
  108. package/dist/useCanvasAutorun.js +23 -0
  109. package/dist/useCanvasAutorun.js.map +1 -0
  110. package/dist/version.d.ts +1 -1
  111. package/dist/version.js +1 -1
  112. package/package.json +7 -8
  113. package/src/colorSchemes.docs.test.ts +55 -0
  114. package/src/colorSchemes.ts +12 -7
  115. package/src/columnStats.test.ts +94 -0
  116. package/src/components/ConservationTrack.tsx +17 -15
  117. package/src/components/MSAViewer.tsx +42 -18
  118. package/src/components/SequenceTextArea.tsx +1 -1
  119. package/src/components/TextTrack.tsx +7 -11
  120. package/src/components/Track.tsx +9 -6
  121. package/src/components/dialogs/FeatureDialog.tsx +62 -48
  122. package/src/components/dialogs/TrackInfoDialog.tsx +1 -1
  123. package/src/components/header/ColorSchemeMenu.tsx +1 -0
  124. package/src/components/header/FileMenu.tsx +1 -15
  125. package/src/components/header/Header.tsx +11 -8
  126. package/src/components/header/HeaderInfoArea.tsx +1 -1
  127. package/src/components/header/HeaderStatusArea.tsx +1 -1
  128. package/src/components/header/MSASettingsMenu.tsx +1 -0
  129. package/src/components/header/MultiAlignmentSelector.tsx +0 -0
  130. package/src/components/header/TreeSettingsMenu.tsx +1 -0
  131. package/src/components/header/ZoomControls.tsx +24 -17
  132. package/src/components/header/ZoomMenu.tsx +1 -10
  133. package/src/components/header/settingsMenuItems.ts +9 -1
  134. package/src/components/msa/ColumnStats.tsx +54 -0
  135. package/src/components/msa/DomainLegend.tsx +78 -0
  136. package/src/components/msa/MSACanvasBlock.tsx +46 -25
  137. package/src/components/msa/MSAMouseoverCanvas.tsx +10 -13
  138. package/src/components/msa/MSAPanel.tsx +2 -0
  139. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +75 -17
  140. package/src/components/msa/renderMSABlock.ts +3 -3
  141. package/src/components/msa/renderMSAMouseover.ts +34 -6
  142. package/src/components/overlayColors.ts +12 -0
  143. package/src/components/renderCtx.ts +1 -0
  144. package/src/components/tracks/renderTracksSvg.ts +25 -11
  145. package/src/components/tree/TreeCanvas.tsx +47 -54
  146. package/src/components/tree/TreeCanvasBlock.tsx +10 -68
  147. package/src/components/tree/clickMap.ts +55 -0
  148. package/src/components/tree/renderTreeCanvas.ts +10 -34
  149. package/src/constants.ts +19 -0
  150. package/src/createPaletteMap.ts +18 -5
  151. package/src/fetchUtils.ts +6 -3
  152. package/src/index.ts +1 -1
  153. package/src/launchInterProScan.ts +3 -1
  154. package/src/model/msaModel.ts +21 -3
  155. package/src/model/treeModel.ts +21 -7
  156. package/src/model.ts +221 -119
  157. package/src/propertyConservation.test.ts +47 -0
  158. package/src/propertyConservation.ts +73 -0
  159. package/src/renderDomainLegendSvg.test.tsx +134 -0
  160. package/src/renderToSvg.tsx +210 -147
  161. package/src/segmentOverlay.test.ts +70 -0
  162. package/src/stripDefaultSnapshot.test.ts +54 -0
  163. package/src/types.ts +7 -1
  164. package/src/useCanvasAutorun.ts +28 -0
  165. package/src/version.ts +1 -1
  166. package/bundle/index.js.LICENSE.txt +0 -100
  167. package/dist/components/dialogs/SettingsDialog.d.ts +0 -7
  168. package/dist/components/dialogs/SettingsDialog.js +0 -100
  169. package/dist/components/dialogs/SettingsDialog.js.map +0 -1
  170. package/dist/components/header/HeaderMenu.js +0 -27
  171. package/dist/components/header/HeaderMenu.js.map +0 -1
  172. package/dist/components/util.d.ts +0 -1
  173. package/dist/components/util.js +0 -7
  174. package/dist/components/util.js.map +0 -1
  175. package/dist/webpack.js.map +0 -1
  176. package/src/components/dialogs/SettingsDialog.tsx +0 -234
  177. package/src/components/header/HeaderMenu.tsx +0 -38
  178. package/src/components/util.ts +0 -9
  179. /package/dist/{webpack.d.ts → umd.d.ts} +0 -0
  180. /package/src/{webpack.ts → umd.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
+ import { makeStyles } from '@jbrowse/core/util/tss-react';
2
3
  import { Typography } from '@mui/material';
3
4
  import { observer } from 'mobx-react';
4
- import { makeStyles } from 'tss-react/mui';
5
5
  const useStyles = makeStyles()({
6
6
  container: {
7
7
  display: 'flex',
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderInfoArea.js","sourceRoot":"","sources":["../../../src/components/header/HeaderInfoArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI1C,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC7B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,EAAE;KACf;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,UAAU;QACxB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,CAAC;KACZ;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,CAAC;KACd;CACF,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IAC1E,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;IAC/B,IAAI,CAAC,gBAAgB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnD,MAAM,GAAG,GAAG,KAAK,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IACtE,OAAO,CACL,oBAAC,UAAU,IACT,SAAS,EAAC,KAAK,EACf,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,KAAK,EAAE,gBAAgB;QAEvB,8BAAM,SAAS,EAAE,OAAO,CAAC,SAAS,IAC/B,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAC1B;QACP,8BAAM,SAAS,EAAE,OAAO,CAAC,QAAQ;YAC9B,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;;YAAG,GAAG;;YAAI,MAAM;gBACvC,CACI,CACd,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"HeaderInfoArea.js","sourceRoot":"","sources":["../../../src/components/header/HeaderInfoArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC7B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,EAAE;KACf;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,UAAU;QACxB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,CAAC;KACZ;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,CAAC;KACd;CACF,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IAC1E,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;IAC/B,IAAI,CAAC,gBAAgB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnD,MAAM,GAAG,GAAG,KAAK,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IACtE,OAAO,CACL,oBAAC,UAAU,IACT,SAAS,EAAC,KAAK,EACf,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,KAAK,EAAE,gBAAgB;QAEvB,8BAAM,SAAS,EAAE,OAAO,CAAC,SAAS,IAC/B,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAC1B;QACP,8BAAM,SAAS,EAAE,OAAO,CAAC,QAAQ;YAC9B,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;;YAAG,GAAG;;YAAI,MAAM;gBACvC,CACI,CACd,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,cAAc,CAAA"}
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { LoadingEllipses } from '@jbrowse/core/ui';
3
+ import { makeStyles } from '@jbrowse/core/util/tss-react';
3
4
  import { Button, Typography } from '@mui/material';
4
5
  import { observer } from 'mobx-react';
5
- import { makeStyles } from 'tss-react/mui';
6
6
  const useStyles = makeStyles()({
7
7
  margin: {
8
8
  margin: 'auto',
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderStatusArea.js","sourceRoot":"","sources":["../../../src/components/header/HeaderStatusArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI1C,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,EAAE;KACf;CACF,CAAC,CAAA;AAEF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAA2B,EAAE,EAAE;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;IAC/B,OAAO,MAAM,CAAC,CAAC,CAAC,CACd,oBAAC,UAAU,IAAC,SAAS,EAAE,OAAO,CAAC,MAAM;QACnC,oBAAC,eAAe,IAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAC,MAAM,GAAG;QAAC,GAAG;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CACZ,2BAAG,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,YAAY,eAEjD,CACL,CAAC,CAAC,CAAC,IAAI;QAAE,GAAG;QACZ,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjB,oBAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,aAE9C,CACV,CAAC,CAAC,CAAC,IAAI,CACG,CACd,CAAC,CAAC,CAAC,IAAI,CAAA;AACV,CAAC,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"HeaderStatusArea.js","sourceRoot":"","sources":["../../../src/components/header/HeaderStatusArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,EAAE;KACf;CACF,CAAC,CAAA;AAEF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAA2B,EAAE,EAAE;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;IAC/B,OAAO,MAAM,CAAC,CAAC,CAAC,CACd,oBAAC,UAAU,IAAC,SAAS,EAAE,OAAO,CAAC,MAAM;QACnC,oBAAC,eAAe,IAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAC,MAAM,GAAG;QAAC,GAAG;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CACZ,2BAAG,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,YAAY,eAEjD,CACL,CAAC,CAAC,CAAC,IAAI;QAAE,GAAG;QACZ,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjB,oBAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,aAE9C,CACV,CAAC,CAAC,CAAC,IAAI,CACG,CACd,CAAC,CAAC,CAAC,IAAI,CAAA;AACV,CAAC,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}
@@ -4,7 +4,7 @@ import Tune from '@mui/icons-material/Tune';
4
4
  import { observer } from 'mobx-react';
5
5
  import { msaSettingsMenuItems } from "./settingsMenuItems.js";
6
6
  const MSASettingsMenu = observer(function ({ model }) {
7
- return (React.createElement(CascadingMenuButton, { "data-testid": "msa_settings_menu", closeAfterItemClick: false, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, menuItems: msaSettingsMenuItems(model) },
7
+ return (React.createElement(CascadingMenuButton, { "data-testid": "msa_settings_menu", tooltip: "Alignment settings", closeAfterItemClick: false, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, menuItems: msaSettingsMenuItems(model) },
8
8
  React.createElement(Tune, null)));
9
9
  });
10
10
  export default MSASettingsMenu;
@@ -1 +1 @@
1
- {"version":3,"file":"MSASettingsMenu.js","sourceRoot":"","sources":["../../../src/components/header/MSASettingsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,IAAI,MAAM,0BAA0B,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAI7D,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IAC3E,OAAO,CACL,oBAAC,mBAAmB,mBACN,mBAAmB,EAC/B,mBAAmB,EAAE,KAAK,EAC1B,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;QAEtC,oBAAC,IAAI,OAAG,CACY,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"MSASettingsMenu.js","sourceRoot":"","sources":["../../../src/components/header/MSASettingsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,IAAI,MAAM,0BAA0B,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAI7D,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IAC3E,OAAO,CACL,oBAAC,mBAAmB,mBACN,mBAAmB,EAC/B,OAAO,EAAC,oBAAoB,EAC5B,mBAAmB,EAAE,KAAK,EAC1B,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;QAEtC,oBAAC,IAAI,OAAG,CACY,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,eAAe,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"MultiAlignmentSelector.js","sourceRoot":"","sources":["../../../src/components/header/MultiAlignmentSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,UAAU,EAChD,KAAK,GAGN;IACC,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;IAClD,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjC,oBAAC,SAAS,IACR,MAAM,QACN,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAC,OAAO,EACZ,QAAQ,EAAE,KAAK,CAAC,EAAE;YAChB,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC9C,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACnB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC,IAEA,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CACrC,oBAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,IAC9C,MAAM,CACE,CACZ,CAAC,CACQ,CACb,CAAC,CAAC,CAAC,IAAI,CAAA;AACV,CAAC,CAAC,CAAA;AACF,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"MultiAlignmentSelector.js","sourceRoot":"","sources":["../../../src/components/header/MultiAlignmentSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,UAAU,EAChD,KAAK,GAGN;IACC,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;IAClD,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;IACtC,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjC,oBAAC,SAAS,IACR,MAAM,QACN,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAC,OAAO,EACZ,QAAQ,EAAE,KAAK,CAAC,EAAE;YAChB,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC9C,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACnB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC,IAEA,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACvB,OAAO,CACL,oBAAC,QAAQ,IAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,IAC7D,MAAM,CACE,CACZ,CAAA;IACH,CAAC,CAAC,CACQ,CACb,CAAC,CAAC,CAAC,IAAI,CAAA;AACV,CAAC,CAAC,CAAA;AACF,eAAe,sBAAsB,CAAA"}
@@ -5,7 +5,7 @@ import { observer } from 'mobx-react';
5
5
  import { treeSettingsMenuItems } from "./settingsMenuItems.js";
6
6
  const TreeSettingsMenu = observer(function ({ model, }) {
7
7
  const { rows } = model;
8
- return (React.createElement(CascadingMenuButton, { "data-testid": "tree_settings_menu", closeAfterItemClick: false, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, menuItems: [
8
+ return (React.createElement(CascadingMenuButton, { "data-testid": "tree_settings_menu", tooltip: "Tree settings", closeAfterItemClick: false, anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, menuItems: [
9
9
  ...treeSettingsMenuItems(model),
10
10
  ...(rows.length >= 2
11
11
  ? [
@@ -1 +1 @@
1
- {"version":3,"file":"TreeSettingsMenu.js","sourceRoot":"","sources":["../../../src/components/header/TreeSettingsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,WAAW,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAI9D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAC1C,KAAK,GAGN;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IACtB,OAAO,CACL,oBAAC,mBAAmB,mBACN,oBAAoB,EAChC,mBAAmB,EAAE,KAAK,EAC1B,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,SAAS,EAAE;YACT,GAAG,qBAAqB,CAAC,KAAK,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;gBAClB,CAAC,CAAC;oBACE;wBACE,KAAK,EAAE,UAAU;wBACjB,IAAI,EAAE,SAAkB;wBACxB,OAAO,EAAE;4BACP;gCACE,KAAK,EAAE,4CAA4C;gCACnD,OAAO,EAAE,GAAG,EAAE;oCACZ,IAAI,CAAC;wCACH,KAAK,CAAC,mCAAmC,EAAE,CAAA;oCAC7C,CAAC;oCAAC,OAAO,CAAC,EAAE,CAAC;wCACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;wCAChD,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;oCACnB,CAAC;gCACH,CAAC;6BACF;yBACF;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;QAED,oBAAC,WAAW,OAAG,CACK,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"TreeSettingsMenu.js","sourceRoot":"","sources":["../../../src/components/header/TreeSettingsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,WAAW,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAI9D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAC1C,KAAK,GAGN;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IACtB,OAAO,CACL,oBAAC,mBAAmB,mBACN,oBAAoB,EAChC,OAAO,EAAC,eAAe,EACvB,mBAAmB,EAAE,KAAK,EAC1B,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EACxD,SAAS,EAAE;YACT,GAAG,qBAAqB,CAAC,KAAK,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;gBAClB,CAAC,CAAC;oBACE;wBACE,KAAK,EAAE,UAAU;wBACjB,IAAI,EAAE,SAAkB;wBACxB,OAAO,EAAE;4BACP;gCACE,KAAK,EAAE,4CAA4C;gCACnD,OAAO,EAAE,GAAG,EAAE;oCACZ,IAAI,CAAC;wCACH,KAAK,CAAC,mCAAmC,EAAE,CAAA;oCAC7C,CAAC;oCAAC,OAAO,CAAC,EAAE,CAAC;wCACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;wCAChD,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;oCACnB,CAAC;gCACH,CAAC;6BACF;yBACF;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;QAED,oBAAC,WAAW,OAAG,CACK,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}
@@ -1,23 +1,25 @@
1
1
  import React from 'react';
2
+ import Mouse from '@mui/icons-material/Mouse';
2
3
  import ZoomIn from '@mui/icons-material/ZoomIn';
3
- import ZoomInMap from '@mui/icons-material/ZoomInMap';
4
4
  import ZoomOut from '@mui/icons-material/ZoomOut';
5
- import { IconButton, ToggleButton } from '@mui/material';
5
+ import { IconButton, ToggleButton, Tooltip } from '@mui/material';
6
6
  import { observer } from 'mobx-react';
7
7
  const ZoomControls = observer(function ZoomControls({ model, }) {
8
8
  return (React.createElement(React.Fragment, null,
9
- React.createElement(IconButton, { onClick: () => {
10
- model.zoomIn();
11
- } },
12
- React.createElement(ZoomIn, null)),
13
- React.createElement(IconButton, { onClick: () => {
14
- model.zoomOut();
15
- } },
16
- React.createElement(ZoomOut, null)),
17
- React.createElement(ToggleButton, { value: "scrollZoom", selected: model.scrollZoom, title: "Toggle scroll-to-zoom (zoom on plain mouse wheel; ctrl+wheel always zooms)", size: "small", sx: { border: 'none' }, onChange: () => {
9
+ React.createElement(Tooltip, { title: "Zoom in" },
10
+ React.createElement(IconButton, { "aria-label": "Zoom in", onClick: () => {
11
+ model.zoomIn();
12
+ } },
13
+ React.createElement(ZoomIn, null))),
14
+ React.createElement(Tooltip, { title: "Zoom out" },
15
+ React.createElement(IconButton, { "aria-label": "Zoom out", onClick: () => {
16
+ model.zoomOut();
17
+ } },
18
+ React.createElement(ZoomOut, null))),
19
+ React.createElement(ToggleButton, { value: "scrollZoom", selected: model.scrollZoom, "aria-label": "Toggle scroll-to-zoom", title: "Toggle scroll-to-zoom (zoom on plain mouse wheel; ctrl+wheel always zooms)", size: "small", sx: { border: 'none' }, onChange: () => {
18
20
  model.setScrollZoom(!model.scrollZoom);
19
21
  } },
20
- React.createElement(ZoomInMap, null))));
22
+ React.createElement(Mouse, null))));
21
23
  });
22
24
  export default ZoomControls;
23
25
  //# sourceMappingURL=ZoomControls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ZoomControls.js","sourceRoot":"","sources":["../../../src/components/header/ZoomControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,MAAM,MAAM,4BAA4B,CAAA;AAC/C,OAAO,SAAS,MAAM,+BAA+B,CAAA;AACrD,OAAO,OAAO,MAAM,6BAA6B,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,YAAY,CAAC,EAClD,KAAK,GAGN;IACC,OAAO,CACL;QACE,oBAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,MAAM,EAAE,CAAA;YAChB,CAAC;YAED,oBAAC,MAAM,OAAG,CACC;QACb,oBAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,OAAO,EAAE,CAAA;YACjB,CAAC;YAED,oBAAC,OAAO,OAAG,CACA;QACb,oBAAC,YAAY,IACX,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAE,KAAK,CAAC,UAAU,EAC1B,KAAK,EAAC,4EAA4E,EAClF,IAAI,EAAC,OAAO,EACZ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,GAAG,EAAE;gBACb,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACxC,CAAC;YAED,oBAAC,SAAS,OAAG,CACA,CACd,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AACF,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"ZoomControls.js","sourceRoot":"","sources":["../../../src/components/header/ZoomControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,MAAM,2BAA2B,CAAA;AAC7C,OAAO,MAAM,MAAM,4BAA4B,CAAA;AAC/C,OAAO,OAAO,MAAM,6BAA6B,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,YAAY,CAAC,EAClD,KAAK,GAGN;IACC,OAAO,CACL;QACE,oBAAC,OAAO,IAAC,KAAK,EAAC,SAAS;YACtB,oBAAC,UAAU,kBACE,SAAS,EACpB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,MAAM,EAAE,CAAA;gBAChB,CAAC;gBAED,oBAAC,MAAM,OAAG,CACC,CACL;QACV,oBAAC,OAAO,IAAC,KAAK,EAAC,UAAU;YACvB,oBAAC,UAAU,kBACE,UAAU,EACrB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,OAAO,EAAE,CAAA;gBACjB,CAAC;gBAED,oBAAC,OAAO,OAAG,CACA,CACL;QACV,oBAAC,YAAY,IACX,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAE,KAAK,CAAC,UAAU,gBACf,uBAAuB,EAClC,KAAK,EAAC,4EAA4E,EAClF,IAAI,EAAC,OAAO,EACZ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,GAAG,EAAE;gBACb,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACxC,CAAC;YAED,oBAAC,KAAK,OAAG,CACI,CACd,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AACF,eAAe,YAAY,CAAA"}
@@ -4,7 +4,7 @@ import MoreVert from '@mui/icons-material/MoreVert';
4
4
  import RestartAlt from '@mui/icons-material/RestartAlt';
5
5
  import { observer } from 'mobx-react';
6
6
  const ZoomMenu = observer(function ({ model }) {
7
- return (React.createElement(CascadingMenuButton, { menuItems: [
7
+ return (React.createElement(CascadingMenuButton, { tooltip: "Fit / zoom options", menuItems: [
8
8
  {
9
9
  label: 'Fit both vertically/horizontally',
10
10
  onClick: () => {
@@ -30,15 +30,6 @@ const ZoomMenu = observer(function ({ model }) {
30
30
  model.resetZoom();
31
31
  },
32
32
  },
33
- {
34
- label: 'Scroll zoom',
35
- type: 'checkbox',
36
- checked: model.scrollZoom,
37
- onClick: () => {
38
- model.setScrollZoom(!model.scrollZoom);
39
- },
40
- helpText: 'When enabled, scrolling the mouse wheel zooms in and out without holding ctrl. Hold shift to pan instead. Ctrl/⌘+wheel always zooms.',
41
- },
42
33
  ] },
43
34
  React.createElement(MoreVert, null)));
44
35
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ZoomMenu.js","sourceRoot":"","sources":["../../../src/components/header/ZoomMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,QAAQ,MAAM,8BAA8B,CAAA;AACnD,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACpE,OAAO,CACL,oBAAC,mBAAmB,IAClB,SAAS,EAAE;YACT;gBACE,KAAK,EAAE,kCAAkC;gBACzC,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,GAAG,EAAE,CAAA;gBACb,CAAC;aACF;YACD;gBACE,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,aAAa,EAAE,CAAA;gBACvB,CAAC;aACF;YACD;gBACE,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,eAAe,EAAE,CAAA;gBACzB,CAAC;aACF;YAED;gBACE,KAAK,EAAE,uBAAuB;gBAC9B,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,SAAS,EAAE,CAAA;gBACnB,CAAC;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,KAAK,CAAC,UAAU;gBACzB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;gBACxC,CAAC;gBACD,QAAQ,EACN,sIAAsI;aACzI;SACF;QAED,oBAAC,QAAQ,OAAG,CACQ,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"ZoomMenu.js","sourceRoot":"","sources":["../../../src/components/header/ZoomMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,QAAQ,MAAM,8BAA8B,CAAA;AACnD,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACpE,OAAO,CACL,oBAAC,mBAAmB,IAClB,OAAO,EAAC,oBAAoB,EAC5B,SAAS,EAAE;YACT;gBACE,KAAK,EAAE,kCAAkC;gBACzC,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,GAAG,EAAE,CAAA;gBACb,CAAC;aACF;YACD;gBACE,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,aAAa,EAAE,CAAA;gBACvB,CAAC;aACF;YACD;gBACE,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,eAAe,EAAE,CAAA;gBACzB,CAAC;aACF;YAED;gBACE,KAAK,EAAE,uBAAuB;gBAC9B,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,SAAS,EAAE,CAAA;gBACnB,CAAC;aACF;SACF;QAED,oBAAC,QAAQ,OAAG,CACQ,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
@@ -1,6 +1,14 @@
1
1
  export function msaSettingsMenuItems(model) {
2
- const { drawMsaLetters, hideGaps, bgColor } = model;
2
+ const { drawMsaLetters, hideGaps, bgColor, showColumnStats } = model;
3
3
  return [
4
+ {
5
+ label: 'Show column statistics on hover',
6
+ type: 'checkbox',
7
+ checked: showColumnStats,
8
+ onClick: () => {
9
+ model.setShowColumnStats(!showColumnStats);
10
+ },
11
+ },
4
12
  {
5
13
  label: 'Draw letters',
6
14
  type: 'checkbox',
@@ -1 +1 @@
1
- {"version":3,"file":"settingsMenuItems.js","sourceRoot":"","sources":["../../../src/components/header/settingsMenuItems.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IACnD,OAAO;QACL;YACE,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAA;YAC1C,CAAC;SACF;QACD;YACE,KAAK,EAAE,8CAA8C;YACrD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,CAAC,OAAO;YACjB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;SACF;QACD;YACE,KAAK,EAAE,8BAA8B;YACrC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAmB;IACvD,MAAM,EACJ,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,GAAG,KAAK,CAAA;IACT,OAAO;QACL;YACE,KAAK,EAAE,oBAAoB;YAC3B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAA;YACxC,CAAC;SACF;QACD;YACE,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;SACF;QACD;YACE,KAAK,EAAE,yCAAyC;YAChD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAA;YAC5C,CAAC;SACF;QACD;YACE,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAAC,CAAA;YAC9C,CAAC;SACF;QACD;YACE,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,CAAA;YAClC,CAAC;SACF;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"settingsMenuItems.js","sourceRoot":"","sources":["../../../src/components/header/settingsMenuItems.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,CAAA;IACpE,OAAO;QACL;YACE,KAAK,EAAE,iCAAiC;YACxC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAA;YAC5C,CAAC;SACF;QACD;YACE,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAA;YAC1C,CAAC;SACF;QACD;YACE,KAAK,EAAE,8CAA8C;YACrD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,CAAC,OAAO;YACjB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;SACF;QACD;YACE,KAAK,EAAE,8BAA8B;YACrC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAmB;IACvD,MAAM,EACJ,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,GAAG,KAAK,CAAA;IACT,OAAO;QACL;YACE,KAAK,EAAE,oBAAoB;YAC3B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAA;YACxC,CAAC;SACF;QACD;YACE,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;SACF;QACD;YACE,KAAK,EAAE,yCAAyC;YAChD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAA;YAC5C,CAAC;SACF;QACD;YACE,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAAC,CAAA;YAC9C,CAAC;SACF;QACD;YACE,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,CAAA;YAClC,CAAC;SACF;KACF,CAAA;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { MsaViewModel } from '../../model.ts';
3
- declare const HeaderMenu: ({ model }: {
3
+ declare const ColumnStats: ({ model }: {
4
4
  model: MsaViewModel;
5
- }) => React.JSX.Element;
6
- export default HeaderMenu;
5
+ }) => React.JSX.Element | null;
6
+ export default ColumnStats;
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import { observer } from 'mobx-react';
3
+ const pct = (n) => `${Math.round(n * 100)}%`;
4
+ const ColumnStats = observer(function ({ model }) {
5
+ const stats = model.mouseOverColumnStats;
6
+ if (!stats) {
7
+ return null;
8
+ }
9
+ const { col, total, conservation, propertyConservation, consensusLetter, consensusFraction, gapFraction, distribution, } = stats;
10
+ const top = distribution.slice(0, 6);
11
+ return (React.createElement("div", null,
12
+ React.createElement("b", null,
13
+ "Column ",
14
+ col + 1),
15
+ " (",
16
+ total,
17
+ " seqs)",
18
+ React.createElement("br", null),
19
+ "Consensus: ",
20
+ consensusLetter || '-',
21
+ " (",
22
+ pct(consensusFraction),
23
+ ")",
24
+ React.createElement("br", null),
25
+ "Conservation: ",
26
+ conservation.toFixed(2),
27
+ propertyConservation === undefined ? null : (React.createElement(React.Fragment, null,
28
+ React.createElement("br", null),
29
+ "Property conservation: ",
30
+ propertyConservation.toFixed(2))),
31
+ React.createElement("br", null),
32
+ "Gaps: ",
33
+ pct(gapFraction),
34
+ top.length > 0 ? (React.createElement(React.Fragment, null,
35
+ React.createElement("br", null),
36
+ top.map(([letter, count]) => (React.createElement("span", { key: letter, style: { marginRight: 8 } },
37
+ letter,
38
+ " ",
39
+ pct(count / total)))))) : null));
40
+ });
41
+ export default ColumnStats;
42
+ //# sourceMappingURL=ColumnStats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnStats.js","sourceRoot":"","sources":["../../../src/components/msa/ColumnStats.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAA;AAEpD,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAA;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,EACJ,GAAG,EACH,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,GAAG,KAAK,CAAA;IACT,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpC,OAAO,CACL;QACE;;YAAW,GAAG,GAAG,CAAC,CAAK;;QAAG,KAAK;;QAC/B,+BAAM;;QACM,eAAe,IAAI,GAAG;;QAAI,GAAG,CAAC,iBAAiB,CAAC;;QAC5D,+BAAM;;QACS,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3C;YACE,+BAAM;;YACkB,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CACtD,CACJ;QACD,+BAAM;;QACC,GAAG,CAAC,WAAW,CAAC;QACtB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAChB;YACE,+BAAM;YACL,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC5B,8BAAM,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;gBACzC,MAAM;;gBAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CACvB,CACR,CAAC,CACD,CACJ,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,WAAW,CAAA"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { MsaViewModel } from '../../model.ts';
3
+ declare const DomainLegend: ({ model }: {
4
+ model: MsaViewModel;
5
+ }) => React.JSX.Element | null;
6
+ export default DomainLegend;
@@ -0,0 +1,41 @@
1
+ import React, { useState } from 'react';
2
+ import ExpandLess from '@mui/icons-material/ExpandLess';
3
+ import ExpandMore from '@mui/icons-material/ExpandMore';
4
+ import { IconButton, Paper, Typography } from '@mui/material';
5
+ import { observer } from 'mobx-react';
6
+ const DomainLegend = observer(function ({ model }) {
7
+ const [expanded, setExpanded] = useState(true);
8
+ const { actuallyShowDomains, visibleDomainTypes: visible, fillPalette, } = model;
9
+ const ExpandIcon = expanded ? ExpandLess : ExpandMore;
10
+ return actuallyShowDomains && visible.length > 0 ? (React.createElement(Paper, { elevation: 3, style: {
11
+ position: 'absolute',
12
+ top: 4,
13
+ right: 4,
14
+ zIndex: 100,
15
+ maxWidth: 260,
16
+ maxHeight: '60%',
17
+ display: 'flex',
18
+ flexDirection: 'column',
19
+ opacity: 0.95,
20
+ } },
21
+ React.createElement("div", { style: {
22
+ display: 'flex',
23
+ alignItems: 'center',
24
+ justifyContent: 'flex-end',
25
+ padding: '2px 4px 2px 8px',
26
+ } },
27
+ React.createElement(IconButton, { size: "small", onClick: () => {
28
+ setExpanded(!expanded);
29
+ } },
30
+ React.createElement(ExpandIcon, { fontSize: "small" }))),
31
+ expanded ? (React.createElement("div", { style: { overflow: 'auto', padding: '0 8px 6px' } }, visible.map(({ accession, name }) => (React.createElement("div", { key: accession, style: { display: 'flex', alignItems: 'center', gap: 6 }, title: accession },
32
+ React.createElement("div", { style: {
33
+ width: 12,
34
+ height: 12,
35
+ flexShrink: 0,
36
+ background: fillPalette[accession],
37
+ } }),
38
+ React.createElement(Typography, { variant: "caption", noWrap: true }, name)))))) : null)) : null;
39
+ });
40
+ export default DomainLegend;
41
+ //# sourceMappingURL=DomainLegend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DomainLegend.js","sourceRoot":"","sources":["../../../src/components/msa/DomainLegend.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACxE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,EACJ,mBAAmB,EACnB,kBAAkB,EAAE,OAAO,EAC3B,WAAW,GACZ,GAAG,KAAK,CAAA;IACT,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;IAErD,OAAO,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjD,oBAAC,KAAK,IACJ,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,OAAO,EAAE,IAAI;SACd;QAED,6BACE,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,UAAU;gBAC1B,OAAO,EAAE,iBAAiB;aAC3B;YAED,oBAAC,UAAU,IACT,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,GAAG,EAAE;oBACZ,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA;gBACxB,CAAC;gBAED,oBAAC,UAAU,IAAC,QAAQ,EAAC,OAAO,GAAG,CACpB,CACT;QACL,QAAQ,CAAC,CAAC,CAAC,CACV,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IACnD,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACpC,6BACE,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EACxD,KAAK,EAAE,SAAS;YAEhB,6BACE,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC;iBACnC,GACD;YACF,oBAAC,UAAU,IAAC,OAAO,EAAC,SAAS,EAAC,MAAM,UACjC,IAAI,CACM,CACT,CACP,CAAC,CACE,CACP,CAAC,CAAC,CAAC,IAAI,CACF,CACT,CAAC,CAAC,CAAC,IAAI,CAAA;AACV,CAAC,CAAC,CAAA;AAEF,eAAe,YAAY,CAAA"}
@@ -1,9 +1,10 @@
1
- import React, { useEffect, useRef, useState } from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { BaseTooltip } from '@jbrowse/core/ui';
3
- import { autorun } from 'mobx';
4
3
  import { observer } from 'mobx-react';
4
+ import ColumnStats from "./ColumnStats.js";
5
5
  import { renderBoxFeatureCanvasBlock } from "./renderBoxFeatureCanvasBlock.js";
6
6
  import { renderMSABlock } from "./renderMSABlock.js";
7
+ import { useCanvasAutorun } from "../../useCanvasAutorun.js";
7
8
  import { useColorContrast } from "../../useColorContrast.js";
8
9
  function eventToColRow(event, el, offsetX, offsetY, colWidth, rowHeight) {
9
10
  const { left, top } = el.getBoundingClientRect();
@@ -15,31 +16,24 @@ function eventToColRow(event, el, offsetX, offsetY, colWidth, rowHeight) {
15
16
  const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
16
17
  const { colWidth, rowHeight, scrollY, scrollX, colorScheme, blockSize, mouseClickCol, mouseClickRow, highResScaleFactor, } = model;
17
18
  const { theme, contrastScheme } = useColorContrast(colorScheme);
18
- const ref = useRef(null);
19
- useEffect(() => {
20
- const ctx = ref.current?.getContext('2d');
21
- if (!ctx) {
22
- return;
23
- }
24
- return autorun(() => {
25
- ctx.resetTransform();
26
- ctx.clearRect(0, 0, blockSize * highResScaleFactor, blockSize * highResScaleFactor);
27
- if (model.actuallyShowDomains) {
28
- renderBoxFeatureCanvasBlock({
29
- ctx,
30
- offsetX,
31
- offsetY,
32
- model,
33
- });
34
- }
35
- renderMSABlock({
19
+ const ref = useCanvasAutorun(ctx => {
20
+ ctx.resetTransform();
21
+ ctx.clearRect(0, 0, blockSize * highResScaleFactor, blockSize * highResScaleFactor);
22
+ if (model.actuallyShowDomains) {
23
+ renderBoxFeatureCanvasBlock({
36
24
  ctx,
37
- theme,
38
25
  offsetX,
39
26
  offsetY,
40
- contrastScheme,
41
27
  model,
42
28
  });
29
+ }
30
+ renderMSABlock({
31
+ ctx,
32
+ theme,
33
+ offsetX,
34
+ offsetY,
35
+ contrastScheme,
36
+ model,
43
37
  });
44
38
  }, [
45
39
  model,
@@ -51,7 +45,7 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
51
45
  contrastScheme,
52
46
  ]);
53
47
  const [mousePosition, setMousePosition] = useState();
54
- const { hoveredInsertion } = model;
48
+ const { hoveredInsertion, mouseOverDomains, showColumnStats } = model;
55
49
  return (React.createElement(React.Fragment, null,
56
50
  React.createElement("canvas", { ref: ref, onMouseMove: event => {
57
51
  if (ref.current) {
@@ -66,11 +60,14 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
66
60
  else {
67
61
  model.setMousePos(undefined, undefined);
68
62
  }
69
- // only track client coords when an insertion is hovered (the only
70
- // consumer is the tooltip below); avoids a re-render on every move
71
- setMousePosition(model.hoveredInsertion
72
- ? { x: event.clientX, y: event.clientY }
73
- : undefined);
63
+ // only track client coords when there's something to show in the
64
+ // tooltip: an insertion, a domain under the cursor, or column stats
65
+ // (when that option is enabled). avoids a re-render on every move
66
+ // when nothing would be shown
67
+ const hasTooltip = model.hoveredInsertion ||
68
+ model.mouseOverDomains.length > 0 ||
69
+ (model.showColumnStats && !!model.mouseOverColumnStats);
70
+ setMousePosition(hasTooltip ? { x: event.clientX, y: event.clientY } : undefined);
74
71
  }
75
72
  }, onClick: event => {
76
73
  if (ref.current) {
@@ -100,7 +97,22 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
100
97
  ' ',
101
98
  hoveredInsertion.letters.length > 20
102
99
  ? `${hoveredInsertion.letters.slice(0, 20)}...`
103
- : hoveredInsertion.letters)) : null));
100
+ : hoveredInsertion.letters)) : null,
101
+ !hoveredInsertion &&
102
+ mousePosition &&
103
+ (mouseOverDomains.length > 0 || showColumnStats) ? (React.createElement(BaseTooltip, { clientPoint: { x: mousePosition.x, y: mousePosition.y + 15 } },
104
+ mouseOverDomains.map(d => (React.createElement("div", { key: `${d.accession}-${d.start}-${d.end}` },
105
+ React.createElement("b", null, d.name),
106
+ " (",
107
+ d.accession,
108
+ ") ",
109
+ d.start,
110
+ "-",
111
+ d.end,
112
+ d.description ? (React.createElement(React.Fragment, null,
113
+ React.createElement("br", null),
114
+ d.description)) : null))),
115
+ showColumnStats ? React.createElement(ColumnStats, { model: model }) : null)) : null));
104
116
  });
105
117
  export default MSACanvasBlock;
106
118
  //# sourceMappingURL=MSACanvasBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"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"}
@@ -1,21 +1,15 @@
1
- import React, { useEffect, useRef } from 'react';
1
+ import React from 'react';
2
2
  import { isAlive } from '@jbrowse/mobx-state-tree';
3
- import { autorun } from 'mobx';
4
3
  import { observer } from 'mobx-react';
5
4
  import { renderMouseover } from "./renderMSAMouseover.js";
5
+ import { useCanvasAutorun } from "../../useCanvasAutorun.js";
6
6
  const MSAMouseoverCanvas = observer(function ({ model, }) {
7
- const ref = useRef(null);
8
7
  const { height, msaAreaWidth, verticalScrollbarWidth, highResScaleFactor } = model;
9
8
  const width = msaAreaWidth - verticalScrollbarWidth;
10
- useEffect(() => {
11
- const ctx = ref.current?.getContext('2d');
12
- return ctx
13
- ? autorun(() => {
14
- if (isAlive(model)) {
15
- renderMouseover({ ctx, model });
16
- }
17
- })
18
- : undefined;
9
+ const ref = useCanvasAutorun(ctx => {
10
+ if (isAlive(model)) {
11
+ renderMouseover({ ctx, model });
12
+ }
19
13
  }, [model]);
20
14
  return (React.createElement("canvas", { ref: ref, id: "mouseover", width: width * highResScaleFactor, height: height * highResScaleFactor, style: {
21
15
  position: 'absolute',
@@ -1 +1 @@
1
- {"version":3,"file":"MSAMouseoverCanvas.js","sourceRoot":"","sources":["../../../src/components/msa/MSAMouseoverCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAIzD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAC5C,KAAK,GAGN;IACC,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC3C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,GACxE,KAAK,CAAA;IACP,MAAM,KAAK,GAAG,YAAY,GAAG,sBAAsB,CAAA;IACnD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACzC,OAAO,GAAG;YACR,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACX,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnB,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;gBACjC,CAAC;YACH,CAAC,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,EACR,EAAE,EAAC,WAAW,EACd,KAAK,EAAE,KAAK,GAAG,kBAAkB,EACjC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EACnC,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK;YACL,MAAM;YACN,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,MAAM;SACtB,GACD,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,kBAAkB,CAAA"}
1
+ {"version":3,"file":"MSAMouseoverCanvas.js","sourceRoot":"","sources":["../../../src/components/msa/MSAMouseoverCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAI5D,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAC5C,KAAK,GAGN;IACC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,GACxE,KAAK,CAAA;IACP,MAAM,KAAK,GAAG,YAAY,GAAG,sBAAsB,CAAA;IACnD,MAAM,GAAG,GAAG,gBAAgB,CAC1B,GAAG,CAAC,EAAE;QACJ,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAA;IAED,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,EACR,EAAE,EAAC,WAAW,EACd,KAAK,EAAE,KAAK,GAAG,kBAAkB,EACjC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EACnC,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK;YACL,MAAM;YACN,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,MAAM;SACtB,GACD,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,kBAAkB,CAAA"}
@@ -1,11 +1,13 @@
1
1
  import React from 'react';
2
2
  import { observer } from 'mobx-react';
3
+ import DomainLegend from "./DomainLegend.js";
3
4
  import MSACanvas from "./MSACanvas.js";
4
5
  import MSAMouseoverCanvas from "./MSAMouseoverCanvas.js";
5
6
  const MSAPanel = observer(function ({ model }) {
6
7
  return (React.createElement("div", { style: { position: 'relative' } },
7
8
  React.createElement(MSACanvas, { model: model }),
8
- React.createElement(MSAMouseoverCanvas, { model: model })));
9
+ React.createElement(MSAMouseoverCanvas, { model: model }),
10
+ React.createElement(DomainLegend, { model: model })));
9
11
  });
10
12
  export default MSAPanel;
11
13
  //# sourceMappingURL=MSAPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MSAPanel.js","sourceRoot":"","sources":["../../../src/components/msa/MSAPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,SAAS,MAAM,gBAAiB,CAAA;AACvC,OAAO,kBAAkB,MAAM,yBAA0B,CAAA;AAKzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACpE,OAAO,CACL,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QAClC,oBAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI;QAC3B,oBAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,GAAI,CAChC,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"MSAPanel.js","sourceRoot":"","sources":["../../../src/components/msa/MSAPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,YAAY,MAAM,mBAAoB,CAAA;AAC7C,OAAO,SAAS,MAAM,gBAAiB,CAAA;AACvC,OAAO,kBAAkB,MAAM,yBAA0B,CAAA;AAKzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACpE,OAAO,CACL,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QAClC,oBAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI;QAC3B,oBAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,GAAI;QACpC,oBAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAC1B,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { getVisibleLeaves } from "./getVisibleLeaves.js";
2
+ import { subFeatureRowHeight } from "../../constants.js";
2
3
  export function renderBoxFeatureCanvasBlock({ model, offsetX, offsetY, ctx, highResScaleFactorOverride, blockSizeYOverride, }) {
3
4
  const { blockSize, rowHeight, highResScaleFactor, showDomains } = model;
4
5
  if (showDomains) {
@@ -16,32 +17,77 @@ export function renderBoxFeatureCanvasBlock({ model, offsetX, offsetY, ctx, high
16
17
  }
17
18
  }
18
19
  function drawTiles({ model, ctx, visibleLeaves, }) {
19
- const { subFeatureRows, colWidth, rowHeight, fillPalette, strokePalette, tidyFilteredGatheredInterProAnnotations, } = model;
20
+ const { subFeatureRows, colWidth, rowHeight, fillPalette, strokePalette, segmentLabels, showMsaLetters, tidyFilteredGatheredInterProAnnotations, } = model;
21
+ const h = subFeatureRows ? subFeatureRowHeight : rowHeight;
22
+ // exon numbers label the bands only when residue letters aren't drawn (zoomed
23
+ // out); when letters show, the alternating shades alone mark the boundaries
24
+ // and a number would collide with the sequence
25
+ const drawSegmentLabels = !showMsaLetters && !subFeatureRows && h >= 9;
20
26
  for (let i = 0, l1 = visibleLeaves.length; i < l1; i++) {
21
27
  const node = visibleLeaves[i];
22
- const { x, data: { name }, } = node;
23
- const y = x;
28
+ const { name } = node.data;
29
+ const y = node.x;
24
30
  const entry = tidyFilteredGatheredInterProAnnotations[name];
25
31
  if (entry) {
26
32
  for (let j = 0, l2 = entry.length; j < l2; j++) {
27
- const { start, end, accession } = entry[j];
33
+ const { start, end, accession, strand } = entry[j];
28
34
  // Convert sequence positions to visible column positions
29
35
  // seqPos is 1-based from InterPro, so subtract 1 for 0-based
30
36
  const m1 = model.seqPosToVisibleCol(name, start - 1);
31
37
  const m2 = model.seqPosToVisibleCol(name, end);
32
- if (m1 === undefined || m2 === undefined) {
33
- continue; // Skip if either position is hidden
38
+ if (m1 !== undefined && m2 !== undefined) {
39
+ const x = m1 * colWidth;
40
+ const t = y - rowHeight + (subFeatureRows ? j * h : 0);
41
+ const lw = colWidth * (m2 - m1);
42
+ ctx.fillStyle = fillPalette[accession];
43
+ ctx.strokeStyle = strokePalette[accession];
44
+ if (strand === undefined) {
45
+ ctx.fillRect(x, t, lw, h);
46
+ ctx.strokeRect(x, t, lw, h);
47
+ // segment (exon) number drawn once per band, on the top visible row,
48
+ // so it reads as a column header for the whole band
49
+ const label = drawSegmentLabels
50
+ ? segmentLabels.get(accession)
51
+ : undefined;
52
+ if (label !== undefined && i === 0) {
53
+ const fontSize = Math.min(h - 2, 11);
54
+ ctx.font = `${fontSize}px sans-serif`;
55
+ if (ctx.measureText(label).width + 2 <= lw) {
56
+ ctx.fillStyle = '#222';
57
+ ctx.textAlign = 'center';
58
+ ctx.textBaseline = 'middle';
59
+ ctx.fillText(label, x + lw / 2, t + h / 2);
60
+ }
61
+ }
62
+ }
63
+ else {
64
+ drawGeneArrow({ ctx, x, t, w: lw, h, strand });
65
+ }
34
66
  }
35
- const x = m1 * colWidth;
36
- ctx.fillStyle = fillPalette[accession];
37
- ctx.strokeStyle = strokePalette[accession];
38
- const h = subFeatureRows ? 4 : rowHeight;
39
- const t = y - rowHeight + (subFeatureRows ? j * h : 0);
40
- const lw = colWidth * (m2 - m1);
41
- ctx.fillRect(x, t, lw, h);
42
- ctx.strokeRect(x, t, lw, h);
43
67
  }
44
68
  }
45
69
  }
46
70
  }
71
+ // A gene arrow: a full-width rectangular body spanning the feature's
72
+ // start..end columns, plus a triangular head that points *beyond* that end in
73
+ // the strand direction (right for +, left for -). Keeping the body aligned to
74
+ // the exact start/end columns means + and - strand features read as having the
75
+ // same boundaries; the arrow lives outside them purely to show transcription
76
+ // direction, preserving the column-by-column homology down the rows.
77
+ function drawGeneArrow({ ctx, x, t, w, h, strand, }) {
78
+ // body spans bodyStart..bodyEnd (the exact columns); the head extends one
79
+ // row-height past bodyEnd in the strand direction
80
+ const dir = strand > 0 ? 1 : -1;
81
+ const bodyStart = strand > 0 ? x : x + w;
82
+ const bodyEnd = strand > 0 ? x + w : x;
83
+ ctx.beginPath();
84
+ ctx.moveTo(bodyStart, t);
85
+ ctx.lineTo(bodyEnd, t);
86
+ ctx.lineTo(bodyEnd + dir * h, t + h / 2);
87
+ ctx.lineTo(bodyEnd, t + h);
88
+ ctx.lineTo(bodyStart, t + h);
89
+ ctx.closePath();
90
+ ctx.fill();
91
+ ctx.stroke();
92
+ }
47
93
  //# sourceMappingURL=renderBoxFeatureCanvasBlock.js.map