react-msaview 9.1.0 → 9.2.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 (278) hide show
  1. package/bundle/index.js +111 -115
  2. package/bundle/index.js.map +4 -4
  3. package/dist/blosum62.d.ts +3 -0
  4. package/dist/blosum62.js +43 -0
  5. package/dist/blosum62.js.map +1 -0
  6. package/dist/colorSchemes.js +1 -0
  7. package/dist/colorSchemes.js.map +1 -1
  8. package/dist/components/Loading.d.ts +3 -2
  9. package/dist/components/Loading.js +2 -2
  10. package/dist/components/Loading.js.map +1 -1
  11. package/dist/components/MSAView.d.ts +3 -2
  12. package/dist/components/MSAView.js +7 -4
  13. package/dist/components/MSAView.js.map +1 -1
  14. package/dist/components/MSAViewer.d.ts +64 -12
  15. package/dist/components/MetadataTable.d.ts +4 -1
  16. package/dist/components/MetadataTable.js +55 -16
  17. package/dist/components/MetadataTable.js.map +1 -1
  18. package/dist/components/Track.js +6 -0
  19. package/dist/components/Track.js.map +1 -1
  20. package/dist/components/controls.js +2 -1
  21. package/dist/components/controls.js.map +1 -1
  22. package/dist/components/dialogs/AnnotationFileDialog.js +7 -2
  23. package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -1
  24. package/dist/components/dialogs/FeatureDialog.js +2 -2
  25. package/dist/components/dialogs/FeatureDialog.js.map +1 -1
  26. package/dist/components/{header/MSASettingsMenu.d.ts → dialogs/GapThresholdDialog.d.ts} +3 -2
  27. package/dist/components/dialogs/GapThresholdDialog.js +15 -0
  28. package/dist/components/dialogs/GapThresholdDialog.js.map +1 -0
  29. package/dist/components/{header → dialogs}/GappynessSlider.d.ts +1 -1
  30. package/dist/components/{header → dialogs}/GappynessSlider.js +3 -10
  31. package/dist/components/dialogs/GappynessSlider.js.map +1 -0
  32. package/dist/components/{header → dialogs}/GoToBox.d.ts +4 -2
  33. package/dist/components/dialogs/GoToBox.js +48 -0
  34. package/dist/components/dialogs/GoToBox.js.map +1 -0
  35. package/dist/components/dialogs/GoToDialog.d.ts +6 -0
  36. package/dist/components/dialogs/GoToDialog.js +10 -0
  37. package/dist/components/dialogs/GoToDialog.js.map +1 -0
  38. package/dist/components/dialogs/MetadataDialog.js +11 -3
  39. package/dist/components/dialogs/MetadataDialog.js.map +1 -1
  40. package/dist/components/dialogs/goTo.d.ts +5 -0
  41. package/dist/components/{header → dialogs}/goTo.js +1 -1
  42. package/dist/components/dialogs/goTo.js.map +1 -0
  43. package/dist/components/dialogs/metadataLabels.d.ts +4 -0
  44. package/dist/components/dialogs/metadataLabels.js +52 -0
  45. package/dist/components/dialogs/metadataLabels.js.map +1 -0
  46. package/dist/components/dialogs/metadataRecord.d.ts +1 -0
  47. package/dist/components/dialogs/metadataRecord.js +38 -0
  48. package/dist/components/dialogs/metadataRecord.js.map +1 -0
  49. package/dist/components/header/Header.d.ts +6 -2
  50. package/dist/components/header/Header.js +30 -32
  51. package/dist/components/header/Header.js.map +1 -1
  52. package/dist/components/header/{TreeSettingsMenu.d.ts → HiddenColumnsChip.d.ts} +2 -2
  53. package/dist/components/header/HiddenColumnsChip.js +15 -0
  54. package/dist/components/header/HiddenColumnsChip.js.map +1 -0
  55. package/dist/components/header/MenuBar.d.ts +6 -0
  56. package/dist/components/header/MenuBar.js +33 -0
  57. package/dist/components/header/MenuBar.js.map +1 -0
  58. package/dist/components/header/ScrollZoomCheckbox.d.ts +7 -0
  59. package/dist/components/header/ScrollZoomCheckbox.js +19 -0
  60. package/dist/components/header/ScrollZoomCheckbox.js.map +1 -0
  61. package/dist/components/header/ZoomControls.js +10 -30
  62. package/dist/components/header/ZoomControls.js.map +1 -1
  63. package/dist/components/header/colorSchemeMenuItems.d.ts +4 -0
  64. package/dist/components/header/colorSchemeMenuItems.js +106 -0
  65. package/dist/components/header/colorSchemeMenuItems.js.map +1 -0
  66. package/dist/components/header/getAnnotationsMenu.d.ts +3 -30
  67. package/dist/components/header/getAnnotationsMenu.js +48 -54
  68. package/dist/components/header/getAnnotationsMenu.js.map +1 -1
  69. package/dist/components/header/menuBarItems.d.ts +11 -0
  70. package/dist/components/header/menuBarItems.js +277 -0
  71. package/dist/components/header/menuBarItems.js.map +1 -0
  72. package/dist/components/import/ImportForm.js +12 -6
  73. package/dist/components/import/ImportForm.js.map +1 -1
  74. package/dist/components/minimap/Minimap.js +7 -3
  75. package/dist/components/minimap/Minimap.js.map +1 -1
  76. package/dist/components/minimap/MinimapSVG.js +2 -1
  77. package/dist/components/minimap/MinimapSVG.js.map +1 -1
  78. package/dist/components/minimap/minimapLayout.d.ts +12 -0
  79. package/dist/components/minimap/minimapLayout.js +20 -0
  80. package/dist/components/minimap/minimapLayout.js.map +1 -1
  81. package/dist/components/msa/MSACanvas.js +26 -9
  82. package/dist/components/msa/MSACanvas.js.map +1 -1
  83. package/dist/components/msa/MSACanvasBlock.js +15 -11
  84. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  85. package/dist/components/msa/MSAMouseoverCanvas.js +2 -2
  86. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
  87. package/dist/components/msa/WheelZoomHint.d.ts +7 -0
  88. package/dist/components/msa/WheelZoomHint.js +38 -0
  89. package/dist/components/msa/WheelZoomHint.js.map +1 -0
  90. package/dist/components/msa/msaKeys.js +3 -0
  91. package/dist/components/msa/msaKeys.js.map +1 -1
  92. package/dist/components/msa/msaRaster.d.ts +4 -5
  93. package/dist/components/msa/msaRaster.js +5 -5
  94. package/dist/components/msa/msaRaster.js.map +1 -1
  95. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +22 -2
  96. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  97. package/dist/components/msa/renderHighlights.d.ts +0 -3
  98. package/dist/components/msa/renderHighlights.js +3 -3
  99. package/dist/components/msa/renderHighlights.js.map +1 -1
  100. package/dist/components/msa/renderMSABlock.d.ts +6 -1
  101. package/dist/components/msa/renderMSABlock.js +44 -17
  102. package/dist/components/msa/renderMSABlock.js.map +1 -1
  103. package/dist/components/msa/tileColor.js +7 -0
  104. package/dist/components/msa/tileColor.js.map +1 -1
  105. package/dist/components/rowpanels/RowPanelBlock.js +2 -2
  106. package/dist/components/rowpanels/RowPanelBlock.js.map +1 -1
  107. package/dist/components/settings/MenuItemsForm.d.ts +10 -0
  108. package/dist/components/settings/MenuItemsForm.js +80 -0
  109. package/dist/components/settings/MenuItemsForm.js.map +1 -0
  110. package/dist/components/settings/SettingsPanel.d.ts +12 -0
  111. package/dist/components/settings/SettingsPanel.js +92 -0
  112. package/dist/components/settings/SettingsPanel.js.map +1 -0
  113. package/dist/components/{header/FileMenu.d.ts → settings/TrackList.d.ts} +2 -2
  114. package/dist/components/settings/TrackList.js +58 -0
  115. package/dist/components/settings/TrackList.js.map +1 -0
  116. package/dist/components/tracks/TrackBlocks.js +2 -2
  117. package/dist/components/tracks/TrackBlocks.js.map +1 -1
  118. package/dist/components/tracks/TrackTooltipContent.js +2 -1
  119. package/dist/components/tracks/TrackTooltipContent.js.map +1 -1
  120. package/dist/components/tracks/drawTracks.js +13 -6
  121. package/dist/components/tracks/drawTracks.js.map +1 -1
  122. package/dist/components/tree/TreeCanvasBlock.js +2 -2
  123. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  124. package/dist/components/tree/TreeMenu.js +4 -6
  125. package/dist/components/tree/TreeMenu.js.map +1 -1
  126. package/dist/components/tree/TreeOverview.js +2 -2
  127. package/dist/components/tree/TreeOverview.js.map +1 -1
  128. package/dist/constants.d.ts +4 -1
  129. package/dist/constants.js +7 -1
  130. package/dist/constants.js.map +1 -1
  131. package/dist/darkReader.d.ts +7 -0
  132. package/dist/darkReader.js +42 -0
  133. package/dist/darkReader.js.map +1 -0
  134. package/dist/element.js +22 -47
  135. package/dist/element.js.map +1 -1
  136. package/dist/featurePanels.d.ts +37 -0
  137. package/dist/featurePanels.js +187 -0
  138. package/dist/featurePanels.js.map +1 -0
  139. package/dist/filehandleLoader.d.ts +41 -0
  140. package/dist/filehandleLoader.js +99 -0
  141. package/dist/filehandleLoader.js.map +1 -0
  142. package/dist/index.d.ts +3 -0
  143. package/dist/index.js +2 -0
  144. package/dist/index.js.map +1 -1
  145. package/dist/model/treeModel.d.ts +9 -0
  146. package/dist/model/treeModel.js +12 -1
  147. package/dist/model/treeModel.js.map +1 -1
  148. package/dist/model.d.ts +148 -32
  149. package/dist/model.js +291 -569
  150. package/dist/model.js.map +1 -1
  151. package/dist/neighborJoining.js +1 -40
  152. package/dist/neighborJoining.js.map +1 -1
  153. package/dist/renderToSvg.js +1 -13
  154. package/dist/renderToSvg.js.map +1 -1
  155. package/dist/rerootTree.d.ts +1 -0
  156. package/dist/rerootTree.js +7 -6
  157. package/dist/rerootTree.js.map +1 -1
  158. package/dist/schemeResidueColor.d.ts +12 -0
  159. package/dist/schemeResidueColor.js +33 -0
  160. package/dist/schemeResidueColor.js.map +1 -0
  161. package/dist/similarityColors.d.ts +11 -0
  162. package/dist/similarityColors.js +90 -0
  163. package/dist/similarityColors.js.map +1 -0
  164. package/dist/svgTestUtil.d.ts +64 -12
  165. package/dist/treeDisplay.d.ts +37 -0
  166. package/dist/treeDisplay.js +209 -0
  167. package/dist/treeDisplay.js.map +1 -0
  168. package/dist/types.d.ts +7 -3
  169. package/dist/useWheelScroll.d.ts +3 -1
  170. package/dist/useWheelScroll.js +36 -17
  171. package/dist/useWheelScroll.js.map +1 -1
  172. package/dist/util.d.ts +2 -0
  173. package/dist/util.js +2 -0
  174. package/dist/util.js.map +1 -1
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +1 -1
  177. package/dist/wheelZoom.d.ts +8 -3
  178. package/dist/wheelZoom.js +44 -32
  179. package/dist/wheelZoom.js.map +1 -1
  180. package/dist/zoomSnapshot.d.ts +29 -0
  181. package/dist/zoomSnapshot.js +47 -0
  182. package/dist/zoomSnapshot.js.map +1 -0
  183. package/package.json +11 -11
  184. package/src/blosum62.ts +45 -0
  185. package/src/colorSchemes.ts +1 -0
  186. package/src/components/Loading.tsx +6 -2
  187. package/src/components/MSAView.tsx +22 -5
  188. package/src/components/MetadataTable.tsx +83 -26
  189. package/src/components/Track.tsx +13 -0
  190. package/src/components/controls.ts +2 -1
  191. package/src/components/dialogs/AnnotationFileDialog.tsx +12 -1
  192. package/src/components/dialogs/FeatureDialog.tsx +2 -5
  193. package/src/components/dialogs/GapThresholdDialog.tsx +36 -0
  194. package/src/components/{header → dialogs}/GappynessSlider.tsx +3 -10
  195. package/src/components/{header → dialogs}/GoToBox.tsx +36 -10
  196. package/src/components/dialogs/GoToDialog.tsx +30 -0
  197. package/src/components/dialogs/MetadataDialog.tsx +32 -4
  198. package/src/components/{header → dialogs}/goTo.ts +1 -1
  199. package/src/components/dialogs/metadataLabels.ts +54 -0
  200. package/src/components/dialogs/metadataRecord.tsx +61 -0
  201. package/src/components/header/Header.tsx +75 -42
  202. package/src/components/header/HiddenColumnsChip.tsx +39 -0
  203. package/src/components/header/MenuBar.tsx +64 -0
  204. package/src/components/header/ScrollZoomCheckbox.tsx +46 -0
  205. package/src/components/header/ZoomControls.tsx +20 -35
  206. package/src/components/header/colorSchemeMenuItems.ts +121 -0
  207. package/src/components/header/getAnnotationsMenu.ts +52 -56
  208. package/src/components/header/menuBarItems.ts +357 -0
  209. package/src/components/import/ImportForm.tsx +19 -7
  210. package/src/components/minimap/Minimap.tsx +11 -3
  211. package/src/components/minimap/MinimapSVG.tsx +17 -1
  212. package/src/components/minimap/minimapLayout.ts +27 -0
  213. package/src/components/msa/MSACanvas.tsx +22 -3
  214. package/src/components/msa/MSACanvasBlock.tsx +18 -11
  215. package/src/components/msa/MSAMouseoverCanvas.tsx +2 -2
  216. package/src/components/msa/WheelZoomHint.tsx +56 -0
  217. package/src/components/msa/msaKeys.ts +3 -0
  218. package/src/components/msa/msaRaster.ts +6 -8
  219. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +28 -5
  220. package/src/components/msa/renderHighlights.ts +3 -3
  221. package/src/components/msa/renderMSABlock.ts +51 -15
  222. package/src/components/msa/tileColor.ts +7 -0
  223. package/src/components/rowpanels/RowPanelBlock.tsx +2 -2
  224. package/src/components/settings/MenuItemsForm.tsx +225 -0
  225. package/src/components/settings/SettingsPanel.tsx +156 -0
  226. package/src/components/settings/TrackList.tsx +124 -0
  227. package/src/components/tracks/TrackBlocks.tsx +2 -2
  228. package/src/components/tracks/TrackTooltipContent.tsx +2 -1
  229. package/src/components/tracks/drawTracks.ts +15 -7
  230. package/src/components/tree/TreeCanvasBlock.tsx +2 -2
  231. package/src/components/tree/TreeMenu.tsx +4 -6
  232. package/src/components/tree/TreeOverview.tsx +2 -2
  233. package/src/constants.ts +9 -1
  234. package/src/darkReader.ts +57 -0
  235. package/src/element.ts +34 -57
  236. package/src/featurePanels.ts +269 -0
  237. package/src/filehandleLoader.ts +136 -0
  238. package/src/index.ts +4 -0
  239. package/src/model/treeModel.ts +13 -0
  240. package/src/model.ts +370 -748
  241. package/src/neighborJoining.ts +1 -42
  242. package/src/renderToSvg.tsx +1 -13
  243. package/src/rerootTree.ts +7 -6
  244. package/src/schemeResidueColor.ts +37 -0
  245. package/src/similarityColors.ts +112 -0
  246. package/src/treeDisplay.ts +278 -0
  247. package/src/types.ts +7 -4
  248. package/src/useWheelScroll.ts +43 -22
  249. package/src/util.ts +3 -0
  250. package/src/version.ts +1 -1
  251. package/src/wheelZoom.ts +55 -33
  252. package/src/zoomSnapshot.ts +80 -0
  253. package/dist/components/header/ColorSchemeMenu.d.ts +0 -12
  254. package/dist/components/header/ColorSchemeMenu.js +0 -37
  255. package/dist/components/header/ColorSchemeMenu.js.map +0 -1
  256. package/dist/components/header/FileMenu.js +0 -92
  257. package/dist/components/header/FileMenu.js.map +0 -1
  258. package/dist/components/header/GappynessSlider.js.map +0 -1
  259. package/dist/components/header/GoToBox.js +0 -31
  260. package/dist/components/header/GoToBox.js.map +0 -1
  261. package/dist/components/header/MSASettingsMenu.js +0 -11
  262. package/dist/components/header/MSASettingsMenu.js.map +0 -1
  263. package/dist/components/header/ScrollZoomIcons.d.ts +0 -6
  264. package/dist/components/header/ScrollZoomIcons.js +0 -35
  265. package/dist/components/header/ScrollZoomIcons.js.map +0 -1
  266. package/dist/components/header/TreeSettingsMenu.js +0 -11
  267. package/dist/components/header/TreeSettingsMenu.js.map +0 -1
  268. package/dist/components/header/goTo.d.ts +0 -20
  269. package/dist/components/header/goTo.js.map +0 -1
  270. package/dist/components/header/settingsMenuItems.d.ts +0 -5
  271. package/dist/components/header/settingsMenuItems.js +0 -171
  272. package/dist/components/header/settingsMenuItems.js.map +0 -1
  273. package/src/components/header/ColorSchemeMenu.tsx +0 -56
  274. package/src/components/header/FileMenu.tsx +0 -107
  275. package/src/components/header/MSASettingsMenu.tsx +0 -26
  276. package/src/components/header/ScrollZoomIcons.tsx +0 -52
  277. package/src/components/header/TreeSettingsMenu.tsx +0 -30
  278. package/src/components/header/settingsMenuItems.ts +0 -216
@@ -1,171 +0,0 @@
1
- import { treeOrders } from '../../constants.js';
2
- import { MouseScroll, MouseZoomBoth, MouseZoomHorizontal, MouseZoomVertical, } from './ScrollZoomIcons.js';
3
- function radio(label, checked, onClick) {
4
- return { label, type: 'radio', checked, onClick };
5
- }
6
- const treeOrderLabels = {
7
- branchLength: 'By branch length',
8
- input: 'As written',
9
- ladderize: 'Ladderize, small clades first',
10
- ladderizeReverse: 'Ladderize, large clades first',
11
- };
12
- function outgroupLabel(outgroup) {
13
- const [first, ...rest] = outgroup;
14
- return rest.length === 0
15
- ? `Outgroup ${first}`
16
- : `Outgroup ${first} … ${rest.at(-1)}`;
17
- }
18
- function toggle(label, checked, set) {
19
- return {
20
- label,
21
- type: 'checkbox',
22
- checked,
23
- onClick: () => {
24
- set(!checked);
25
- },
26
- };
27
- }
28
- // the only place in the UI to turn a hidden track back on
29
- function tracksSubMenu(model) {
30
- const shown = new Set(model.turnedOnTracks.map(t => t.model.id));
31
- return model.tracks.map(({ model: { id, name } }) => toggle(name, shown.has(id), () => {
32
- model.toggleTrack(id);
33
- }));
34
- }
35
- const wheelModes = [
36
- {
37
- label: 'Scrolls the alignment',
38
- icon: MouseScroll,
39
- helpText: 'Ctrl+wheel zooms both axes at the cursor.',
40
- },
41
- {
42
- label: 'Zooms both axes',
43
- axis: 'both',
44
- icon: MouseZoomBoth,
45
- helpText: 'Hold shift to pan while the wheel zooms.',
46
- },
47
- {
48
- label: 'Zooms columns only',
49
- axis: 'horizontal',
50
- icon: MouseZoomHorizontal,
51
- helpText: 'Holds the row height, so the labels and letters stay at their size while the alignment compresses.',
52
- },
53
- {
54
- label: 'Zooms rows only',
55
- axis: 'vertical',
56
- icon: MouseZoomVertical,
57
- helpText: 'Holds the column width, so the alignment stays as wide while the rows grow or shrink.',
58
- },
59
- ];
60
- export function wheelSubMenu(model) {
61
- const active = model.scrollZoom ? model.scrollZoomAxis : undefined;
62
- return wheelModes.map(({ label, axis, icon, helpText }) => ({
63
- ...radio(label, axis === active, () => {
64
- model.setScrollZoom(axis !== undefined);
65
- if (axis !== undefined) {
66
- model.setScrollZoomAxis(axis);
67
- }
68
- }),
69
- icon,
70
- helpText,
71
- }));
72
- }
73
- export function msaSettingsMenuItems(model) {
74
- const { drawMsaLetters, hideGaps, bgColor, showColumnStats } = model;
75
- return [
76
- {
77
- label: 'Tracks',
78
- type: 'subMenu',
79
- subMenu: tracksSubMenu(model),
80
- },
81
- {
82
- label: 'Mouse wheel',
83
- type: 'subMenu',
84
- subMenu: wheelSubMenu(model),
85
- },
86
- { type: 'divider' },
87
- toggle('Show track values on hover', showColumnStats, arg => {
88
- model.setShowColumnStats(arg);
89
- }),
90
- toggle('Draw letters', drawMsaLetters, arg => {
91
- model.setDrawMsaLetters(arg);
92
- }),
93
- // inverted: bgColor colors the tile, and off colors the letter
94
- toggle('Color letters, not cells', !bgColor, arg => {
95
- model.setBgColor(!arg);
96
- }),
97
- toggle('Hide gappy columns', hideGaps, arg => {
98
- model.setHideGaps(arg);
99
- }),
100
- ];
101
- }
102
- export function treeSettingsMenuItems(model) {
103
- const { drawTree, showBranchLen, labelsAlignRight, drawNodeBubbles, drawNodeLabels, drawLabels, treeAreaWidth, showTreeOverview, treeOrder, treeRoot, rotated, } = model;
104
- return [
105
- {
106
- label: 'Order',
107
- type: 'subMenu',
108
- subMenu: [
109
- ...treeOrders.map(order => radio(treeOrderLabels[order], treeOrder === order, () => {
110
- model.setTreeOrder(order);
111
- })),
112
- { type: 'divider' },
113
- {
114
- label: 'Undo rotations',
115
- disabled: rotated.length === 0,
116
- onClick: () => {
117
- model.clearRotated();
118
- },
119
- },
120
- ],
121
- },
122
- {
123
- label: 'Root',
124
- type: 'subMenu',
125
- subMenu: [
126
- radio('As written', treeRoot === undefined, () => {
127
- model.setTreeRoot(undefined);
128
- }),
129
- radio('Midpoint', treeRoot === 'midpoint', () => {
130
- model.setTreeRoot('midpoint');
131
- }),
132
- // "Reroot here" in a node's menu sets the outgroup, so this only
133
- // reports it
134
- ...(typeof treeRoot === 'object'
135
- ? [
136
- {
137
- ...radio(outgroupLabel(treeRoot.outgroup), true, () => { }),
138
- disabled: true,
139
- },
140
- ]
141
- : []),
142
- ],
143
- },
144
- { type: 'divider' },
145
- toggle('Show branch length', showBranchLen, arg => {
146
- model.setShowBranchLen(arg);
147
- }),
148
- toggle('Show tree', drawTree, arg => {
149
- model.setDrawTree(arg);
150
- }),
151
- toggle('Draw bubbles on tree branches', drawNodeBubbles, arg => {
152
- model.setDrawNodeBubbles(arg);
153
- }),
154
- toggle('Draw internal node labels', drawNodeLabels, arg => {
155
- model.setDrawNodeLabels(arg);
156
- }),
157
- toggle('Show tree overview', showTreeOverview, arg => {
158
- model.setShowTreeOverview(arg);
159
- }),
160
- toggle('Tree labels align right', labelsAlignRight, arg => {
161
- model.setLabelsAlignRight(arg);
162
- }),
163
- toggle('Draw labels', drawLabels, arg => {
164
- model.setDrawLabels(arg);
165
- }),
166
- toggle('Fit tree area to labels and tree', treeAreaWidth === undefined, arg => {
167
- model.setTreeAreaWidth(arg ? undefined : model.effectiveTreeAreaWidth);
168
- }),
169
- ];
170
- }
171
- //# sourceMappingURL=settingsMenuItems.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settingsMenuItems.js","sourceRoot":"","sources":["../../../src/components/header/settingsMenuItems.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- import React from 'react'
2
-
3
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
4
- import Palette from '@mui/icons-material/Palette'
5
- import { observer } from 'mobx-react'
6
-
7
- import colorSchemes from '../../colorSchemes.ts'
8
-
9
- import type { MsaViewModel } from '../../model.ts'
10
-
11
- // While a `customColorScheme` map is set, a checked Custom entry stands for it
12
- // and no named scheme is checked. Picking a named scheme clears the map.
13
- export function colorSchemeMenuItems(model: MsaViewModel) {
14
- const { colorSchemeName, customColorScheme } = model
15
- const custom = customColorScheme
16
- ? [
17
- {
18
- label: 'Custom',
19
- type: 'radio',
20
- checked: true,
21
- onClick: () => {},
22
- } as const,
23
- ]
24
- : []
25
- return [
26
- ...custom,
27
- ...Object.keys(colorSchemes).map(
28
- option =>
29
- ({
30
- label: option,
31
- type: 'radio',
32
- checked: !customColorScheme && colorSchemeName === option,
33
- onClick: () => {
34
- model.setColorSchemeName(option)
35
- },
36
- }) as const,
37
- ),
38
- ]
39
- }
40
-
41
- const ColorSchemeMenu = observer(function ({ model }: { model: MsaViewModel }) {
42
- return (
43
- <CascadingMenuButton
44
- data-testid="color_scheme_menu"
45
- tooltip="Color scheme"
46
- closeAfterItemClick
47
- anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
48
- transformOrigin={{ vertical: 'top', horizontal: 'left' }}
49
- menuItems={colorSchemeMenuItems(model)}
50
- >
51
- <Palette />
52
- </CascadingMenuButton>
53
- )
54
- })
55
-
56
- export default ColorSchemeMenu
@@ -1,107 +0,0 @@
1
- import React, { lazy } from 'react'
2
-
3
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
4
- import AccountTree from '@mui/icons-material/AccountTree'
5
- import Assignment from '@mui/icons-material/Assignment'
6
- import FolderOpen from '@mui/icons-material/FolderOpen'
7
- import Menu from '@mui/icons-material/Menu'
8
- import PhotoCamera from '@mui/icons-material/PhotoCamera'
9
- import { observer } from 'mobx-react'
10
-
11
- import { maxNeighborJoiningRows } from '../../constants.ts'
12
- import { getAnnotationsMenu } from './getAnnotationsMenu.ts'
13
-
14
- import type { MsaViewModel } from '../../model.ts'
15
-
16
- const MetadataDialog = lazy(() => import('../dialogs/MetadataDialog.tsx'))
17
- const ExportSVGDialog = lazy(() => import('../dialogs/ExportSVGDialog.tsx'))
18
-
19
- function neighborJoiningItem(model: MsaViewModel) {
20
- const rows = model.rowMap.size
21
- const tooManyRows = rows > maxNeighborJoiningRows
22
- return {
23
- label: tooManyRows
24
- ? `Calculate neighbor joining tree (over ${maxNeighborJoiningRows} rows, use FastTree)`
25
- : 'Calculate neighbor joining tree (BLOSUM62)',
26
- icon: AccountTree,
27
- disabled: tooManyRows || rows < 2,
28
- onClick: () => {
29
- try {
30
- model.calculateNeighborJoiningTreeFromMSA()
31
- } catch (e) {
32
- console.error('Failed to calculate NJ tree:', e)
33
- model.addWarning(e instanceof Error ? e.message : String(e))
34
- }
35
- },
36
- }
37
- }
38
-
39
- const FileMenu = observer(({ model }: { model: MsaViewModel }) => {
40
- return (
41
- <CascadingMenuButton
42
- data-testid="file_menu"
43
- tooltip="File"
44
- menuItems={[
45
- ...(model.importForm
46
- ? [
47
- {
48
- label: 'Return to import form',
49
- icon: FolderOpen,
50
- onClick: () => {
51
- model.reset()
52
- },
53
- },
54
- ]
55
- : []),
56
- {
57
- label: 'Metadata',
58
- icon: Assignment,
59
- onClick: () => {
60
- model.queueDialog(onClose => [
61
- MetadataDialog,
62
- {
63
- model,
64
- onClose,
65
- },
66
- ])
67
- },
68
- },
69
- {
70
- label: 'Annotations',
71
- type: 'subMenu',
72
- subMenu: getAnnotationsMenu({
73
- model,
74
- }),
75
- },
76
- neighborJoiningItem(model),
77
- {
78
- label: 'Export tree (Newick)',
79
- icon: AccountTree,
80
- disabled: !!model.tree.noTree,
81
- onClick: () => {
82
- model.exportNewick()
83
- },
84
- },
85
- {
86
- label: 'Export SVG',
87
- icon: PhotoCamera,
88
- onClick: () => {
89
- model.queueDialog(onClose => [
90
- ExportSVGDialog,
91
- {
92
- onClose,
93
- model,
94
- },
95
- ])
96
- },
97
- },
98
- ]}
99
- anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
100
- transformOrigin={{ vertical: 'top', horizontal: 'left' }}
101
- >
102
- <Menu />
103
- </CascadingMenuButton>
104
- )
105
- })
106
-
107
- export default FileMenu
@@ -1,26 +0,0 @@
1
- import React from 'react'
2
-
3
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
4
- import Tune from '@mui/icons-material/Tune'
5
- import { observer } from 'mobx-react'
6
-
7
- import { msaSettingsMenuItems } from './settingsMenuItems.ts'
8
-
9
- import type { MsaViewModel } from '../../model.ts'
10
-
11
- const MSASettingsMenu = observer(function ({ model }: { model: MsaViewModel }) {
12
- return (
13
- <CascadingMenuButton
14
- data-testid="msa_settings_menu"
15
- tooltip="Alignment settings"
16
- closeAfterItemClick={false}
17
- anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
18
- transformOrigin={{ vertical: 'top', horizontal: 'left' }}
19
- menuItems={msaSettingsMenuItems(model)}
20
- >
21
- <Tune />
22
- </CascadingMenuButton>
23
- )
24
- })
25
-
26
- export default MSASettingsMenu
@@ -1,52 +0,0 @@
1
- import React from 'react'
2
-
3
- import SvgIcon from '@mui/material/SvgIcon'
4
-
5
- import type { SvgIconProps } from '@mui/material/SvgIcon'
6
-
7
- // Mouse glyphs with outward arrows on the axes a wheel zoom scales.
8
- // @mui/icons-material ships only the plain `Mouse`, and three variants that
9
- // differ only in their arrows have to share one body to stay apart at 24px.
10
- // The body's inner subpath runs the opposite sweep, which punches the hole the
11
- // wheel bar sits in.
12
- const BODY =
13
- 'M12 5a4 4 0 0 0-4 4v6a4 4 0 0 0 8 0V9a4 4 0 0 0-4-4zm0 2a2 2 0 0 1 2 2v6a2 2 0 0 1-4 0V9a2 2 0 0 1 2-2z'
14
- const WHEEL = 'M11.2 8.6h1.6v3.2h-1.6z'
15
- const LEFT = 'M.4 12 5 15V9z'
16
- const RIGHT = 'M23.6 12 19 9v6z'
17
- const UP = 'M12 .4 15 4H9z'
18
- const DOWN = 'M12 23.6 9 20h6z'
19
-
20
- function MouseZoom({
21
- arrows,
22
- ...rest
23
- }: SvgIconProps & { arrows: readonly string[] }) {
24
- return (
25
- <SvgIcon {...rest}>
26
- <path d={BODY} />
27
- <path d={WHEEL} />
28
- {arrows.map(d => (
29
- <path key={d} d={d} />
30
- ))}
31
- </SvgIcon>
32
- )
33
- }
34
-
35
- // the bare body, for a wheel that scrolls. @mui/icons-material's own `Mouse` is
36
- // a solid silhouette, which would jump to a different drawing when the menu
37
- // changes the mode.
38
- export function MouseScroll(props: SvgIconProps) {
39
- return <MouseZoom {...props} arrows={[]} />
40
- }
41
-
42
- export function MouseZoomBoth(props: SvgIconProps) {
43
- return <MouseZoom {...props} arrows={[LEFT, RIGHT, UP, DOWN]} />
44
- }
45
-
46
- export function MouseZoomHorizontal(props: SvgIconProps) {
47
- return <MouseZoom {...props} arrows={[LEFT, RIGHT]} />
48
- }
49
-
50
- export function MouseZoomVertical(props: SvgIconProps) {
51
- return <MouseZoom {...props} arrows={[UP, DOWN]} />
52
- }
@@ -1,30 +0,0 @@
1
- import React from 'react'
2
-
3
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
4
- import AccountTree from '@mui/icons-material/AccountTree'
5
- import { observer } from 'mobx-react'
6
-
7
- import { treeSettingsMenuItems } from './settingsMenuItems.ts'
8
-
9
- import type { MsaViewModel } from '../../model.ts'
10
-
11
- const TreeSettingsMenu = observer(function ({
12
- model,
13
- }: {
14
- model: MsaViewModel
15
- }) {
16
- return model.noTree ? null : (
17
- <CascadingMenuButton
18
- data-testid="tree_settings_menu"
19
- tooltip="Tree settings"
20
- closeAfterItemClick={false}
21
- anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
22
- transformOrigin={{ vertical: 'top', horizontal: 'left' }}
23
- menuItems={treeSettingsMenuItems(model)}
24
- >
25
- <AccountTree />
26
- </CascadingMenuButton>
27
- )
28
- })
29
-
30
- export default TreeSettingsMenu
@@ -1,216 +0,0 @@
1
- import { treeOrders } from '../../constants.ts'
2
- import {
3
- MouseScroll,
4
- MouseZoomBoth,
5
- MouseZoomHorizontal,
6
- MouseZoomVertical,
7
- } from './ScrollZoomIcons.tsx'
8
-
9
- import type { ScrollZoomAxis } from '../../constants.ts'
10
- import type { MsaViewModel } from '../../model.ts'
11
- import type { TreeOrder } from '../../types.ts'
12
- import type { MenuItem } from '@jbrowse/core/ui/Menu'
13
-
14
- function radio(label: string, checked: boolean, onClick: () => void) {
15
- return { label, type: 'radio' as const, checked, onClick }
16
- }
17
-
18
- const treeOrderLabels: Record<TreeOrder, string> = {
19
- branchLength: 'By branch length',
20
- input: 'As written',
21
- ladderize: 'Ladderize, small clades first',
22
- ladderizeReverse: 'Ladderize, large clades first',
23
- }
24
-
25
- function outgroupLabel(outgroup: string[]) {
26
- const [first, ...rest] = outgroup
27
- return rest.length === 0
28
- ? `Outgroup ${first}`
29
- : `Outgroup ${first} … ${rest.at(-1)}`
30
- }
31
-
32
- function toggle(label: string, checked: boolean, set: (arg: boolean) => void) {
33
- return {
34
- label,
35
- type: 'checkbox' as const,
36
- checked,
37
- onClick: () => {
38
- set(!checked)
39
- },
40
- }
41
- }
42
-
43
- // the only place in the UI to turn a hidden track back on
44
- function tracksSubMenu(model: MsaViewModel): MenuItem[] {
45
- const shown = new Set(model.turnedOnTracks.map(t => t.model.id))
46
- return model.tracks.map(({ model: { id, name } }) =>
47
- toggle(name, shown.has(id), () => {
48
- model.toggleTrack(id)
49
- }),
50
- )
51
- }
52
-
53
- const wheelModes: {
54
- label: string
55
- axis?: ScrollZoomAxis
56
- icon: typeof MouseScroll
57
- helpText: string
58
- }[] = [
59
- {
60
- label: 'Scrolls the alignment',
61
- icon: MouseScroll,
62
- helpText: 'Ctrl+wheel zooms both axes at the cursor.',
63
- },
64
- {
65
- label: 'Zooms both axes',
66
- axis: 'both',
67
- icon: MouseZoomBoth,
68
- helpText: 'Hold shift to pan while the wheel zooms.',
69
- },
70
- {
71
- label: 'Zooms columns only',
72
- axis: 'horizontal',
73
- icon: MouseZoomHorizontal,
74
- helpText:
75
- 'Holds the row height, so the labels and letters stay at their size while the alignment compresses.',
76
- },
77
- {
78
- label: 'Zooms rows only',
79
- axis: 'vertical',
80
- icon: MouseZoomVertical,
81
- helpText:
82
- 'Holds the column width, so the alignment stays as wide while the rows grow or shrink.',
83
- },
84
- ]
85
-
86
- export function wheelSubMenu(model: MsaViewModel): MenuItem[] {
87
- const active = model.scrollZoom ? model.scrollZoomAxis : undefined
88
- return wheelModes.map(({ label, axis, icon, helpText }) => ({
89
- ...radio(label, axis === active, () => {
90
- model.setScrollZoom(axis !== undefined)
91
- if (axis !== undefined) {
92
- model.setScrollZoomAxis(axis)
93
- }
94
- }),
95
- icon,
96
- helpText,
97
- }))
98
- }
99
-
100
- export function msaSettingsMenuItems(model: MsaViewModel): MenuItem[] {
101
- const { drawMsaLetters, hideGaps, bgColor, showColumnStats } = model
102
- return [
103
- {
104
- label: 'Tracks',
105
- type: 'subMenu' as const,
106
- subMenu: tracksSubMenu(model),
107
- },
108
- {
109
- label: 'Mouse wheel',
110
- type: 'subMenu' as const,
111
- subMenu: wheelSubMenu(model),
112
- },
113
- { type: 'divider' as const },
114
- toggle('Show track values on hover', showColumnStats, arg => {
115
- model.setShowColumnStats(arg)
116
- }),
117
- toggle('Draw letters', drawMsaLetters, arg => {
118
- model.setDrawMsaLetters(arg)
119
- }),
120
- // inverted: bgColor colors the tile, and off colors the letter
121
- toggle('Color letters, not cells', !bgColor, arg => {
122
- model.setBgColor(!arg)
123
- }),
124
- toggle('Hide gappy columns', hideGaps, arg => {
125
- model.setHideGaps(arg)
126
- }),
127
- ]
128
- }
129
-
130
- export function treeSettingsMenuItems(model: MsaViewModel): MenuItem[] {
131
- const {
132
- drawTree,
133
- showBranchLen,
134
- labelsAlignRight,
135
- drawNodeBubbles,
136
- drawNodeLabels,
137
- drawLabels,
138
- treeAreaWidth,
139
- showTreeOverview,
140
- treeOrder,
141
- treeRoot,
142
- rotated,
143
- } = model
144
- return [
145
- {
146
- label: 'Order',
147
- type: 'subMenu' as const,
148
- subMenu: [
149
- ...treeOrders.map(order =>
150
- radio(treeOrderLabels[order], treeOrder === order, () => {
151
- model.setTreeOrder(order)
152
- }),
153
- ),
154
- { type: 'divider' as const },
155
- {
156
- label: 'Undo rotations',
157
- disabled: rotated.length === 0,
158
- onClick: () => {
159
- model.clearRotated()
160
- },
161
- },
162
- ],
163
- },
164
- {
165
- label: 'Root',
166
- type: 'subMenu' as const,
167
- subMenu: [
168
- radio('As written', treeRoot === undefined, () => {
169
- model.setTreeRoot(undefined)
170
- }),
171
- radio('Midpoint', treeRoot === 'midpoint', () => {
172
- model.setTreeRoot('midpoint')
173
- }),
174
- // "Reroot here" in a node's menu sets the outgroup, so this only
175
- // reports it
176
- ...(typeof treeRoot === 'object'
177
- ? [
178
- {
179
- ...radio(outgroupLabel(treeRoot.outgroup), true, () => {}),
180
- disabled: true,
181
- },
182
- ]
183
- : []),
184
- ],
185
- },
186
- { type: 'divider' as const },
187
- toggle('Show branch length', showBranchLen, arg => {
188
- model.setShowBranchLen(arg)
189
- }),
190
- toggle('Show tree', drawTree, arg => {
191
- model.setDrawTree(arg)
192
- }),
193
- toggle('Draw bubbles on tree branches', drawNodeBubbles, arg => {
194
- model.setDrawNodeBubbles(arg)
195
- }),
196
- toggle('Draw internal node labels', drawNodeLabels, arg => {
197
- model.setDrawNodeLabels(arg)
198
- }),
199
- toggle('Show tree overview', showTreeOverview, arg => {
200
- model.setShowTreeOverview(arg)
201
- }),
202
- toggle('Tree labels align right', labelsAlignRight, arg => {
203
- model.setLabelsAlignRight(arg)
204
- }),
205
- toggle('Draw labels', drawLabels, arg => {
206
- model.setDrawLabels(arg)
207
- }),
208
- toggle(
209
- 'Fit tree area to labels and tree',
210
- treeAreaWidth === undefined,
211
- arg => {
212
- model.setTreeAreaWidth(arg ? undefined : model.effectiveTreeAreaWidth)
213
- },
214
- ),
215
- ]
216
- }