react-msaview 9.1.1 → 9.3.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 (89) hide show
  1. package/bundle/index.js +79 -79
  2. package/bundle/index.js.map +4 -4
  3. package/dist/components/DragHandle.js +2 -1
  4. package/dist/components/DragHandle.js.map +1 -1
  5. package/dist/components/MSAViewer.d.ts +31 -19
  6. package/dist/components/MSAViewer.js +2 -1
  7. package/dist/components/MSAViewer.js.map +1 -1
  8. package/dist/components/Track.js +2 -5
  9. package/dist/components/Track.js.map +1 -1
  10. package/dist/components/VerticalScrollbar.js +1 -1
  11. package/dist/components/VerticalScrollbar.js.map +1 -1
  12. package/dist/components/header/Header.js +2 -1
  13. package/dist/components/header/Header.js.map +1 -1
  14. package/dist/components/minimap/Minimap.js +1 -1
  15. package/dist/components/minimap/Minimap.js.map +1 -1
  16. package/dist/components/msa/MSACanvas.js +16 -27
  17. package/dist/components/msa/MSACanvas.js.map +1 -1
  18. package/dist/components/rowpanels/RowPanels.js +8 -6
  19. package/dist/components/rowpanels/RowPanels.js.map +1 -1
  20. package/dist/components/settings/SettingsPanel.js +2 -1
  21. package/dist/components/settings/SettingsPanel.js.map +1 -1
  22. package/dist/components/settings/TrackList.js +8 -5
  23. package/dist/components/settings/TrackList.js.map +1 -1
  24. package/dist/components/tracks/TrackTooltipContent.js +2 -1
  25. package/dist/components/tracks/TrackTooltipContent.js.map +1 -1
  26. package/dist/components/tracks/drawTracks.js +13 -6
  27. package/dist/components/tracks/drawTracks.js.map +1 -1
  28. package/dist/components/tree/TreeCanvas.js +8 -6
  29. package/dist/components/tree/TreeCanvas.js.map +1 -1
  30. package/dist/constants.d.ts +1 -0
  31. package/dist/constants.js +2 -0
  32. package/dist/constants.js.map +1 -1
  33. package/dist/element.d.ts +11 -7
  34. package/dist/element.js +46 -8
  35. package/dist/element.js.map +1 -1
  36. package/dist/featurePanels.d.ts +0 -7
  37. package/dist/featurePanels.js +1 -16
  38. package/dist/featurePanels.js.map +1 -1
  39. package/dist/ggplotPalettes.js +12 -1
  40. package/dist/ggplotPalettes.js.map +1 -1
  41. package/dist/groupKeys.d.ts +6 -0
  42. package/dist/groupKeys.js +52 -0
  43. package/dist/groupKeys.js.map +1 -0
  44. package/dist/index.d.ts +1 -1
  45. package/dist/model.d.ts +40 -17
  46. package/dist/model.js +123 -54
  47. package/dist/model.js.map +1 -1
  48. package/dist/scales.d.ts +114 -13
  49. package/dist/scales.js +154 -19
  50. package/dist/scales.js.map +1 -1
  51. package/dist/svgTestUtil.d.ts +22 -12
  52. package/dist/types.d.ts +30 -28
  53. package/dist/useDragScroll.d.ts +4 -3
  54. package/dist/useDragScroll.js +9 -6
  55. package/dist/useDragScroll.js.map +1 -1
  56. package/dist/useWheelScroll.d.ts +26 -8
  57. package/dist/useWheelScroll.js +108 -71
  58. package/dist/useWheelScroll.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/dist/viewerSnapshot.js +2 -1
  62. package/dist/viewerSnapshot.js.map +1 -1
  63. package/package.json +3 -3
  64. package/src/components/DragHandle.tsx +2 -1
  65. package/src/components/MSAViewer.tsx +11 -8
  66. package/src/components/Track.tsx +2 -8
  67. package/src/components/VerticalScrollbar.tsx +1 -1
  68. package/src/components/header/Header.tsx +2 -1
  69. package/src/components/minimap/Minimap.tsx +1 -1
  70. package/src/components/msa/MSACanvas.tsx +14 -35
  71. package/src/components/rowpanels/RowPanels.tsx +8 -10
  72. package/src/components/settings/SettingsPanel.tsx +2 -1
  73. package/src/components/settings/TrackList.tsx +9 -4
  74. package/src/components/tracks/TrackTooltipContent.tsx +2 -1
  75. package/src/components/tracks/drawTracks.ts +15 -7
  76. package/src/components/tree/TreeCanvas.tsx +8 -10
  77. package/src/constants.ts +2 -0
  78. package/src/element.ts +53 -8
  79. package/src/featurePanels.ts +1 -25
  80. package/src/ggplotPalettes.ts +13 -1
  81. package/src/groupKeys.ts +54 -0
  82. package/src/index.ts +13 -2
  83. package/src/model.ts +174 -72
  84. package/src/scales.ts +268 -25
  85. package/src/types.ts +29 -26
  86. package/src/useDragScroll.ts +11 -8
  87. package/src/useWheelScroll.ts +124 -84
  88. package/src/version.ts +1 -1
  89. package/src/viewerSnapshot.ts +3 -1
@@ -1,19 +1,65 @@
1
1
  import { useEffect, useRef, useState } from 'react';
2
2
  import { WheelZoomSmoother } from './wheelZoom.js';
3
3
  const zoomSettleMs = 150;
4
- export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle, onWheelScroll, scrollZoom, }) {
4
+ // a wheel event this soon after one the view took belongs to the same gesture,
5
+ // so the view keeps it at an edge rather than handing the momentum to the page
6
+ const wheelLatchMs = 150;
7
+ /**
8
+ * Whether a vertical wheel `delta` moves a view at `scrollY`. At the top or
9
+ * bottom, or when every row fits, the page scrolls instead, so an embedded
10
+ * viewer never traps the reader scrolling past it.
11
+ */
12
+ export function canScrollY(model, delta) {
13
+ const { scrollY, maxScrollY } = model;
14
+ return delta > 0 ? scrollY > maxScrollY : delta < 0 && scrollY < 0;
15
+ }
16
+ // Safari reads a touch-action holding pinch-zoom as invalid and falls back to
17
+ // auto, which hands every swipe to the page
18
+ const pinchZoom = typeof CSS !== 'undefined' && CSS.supports('touch-action', 'pinch-zoom')
19
+ ? 'pinch-zoom'
20
+ : undefined;
21
+ function withPinch(pan) {
22
+ return pinchZoom ? `${pan} ${pinchZoom}` : pan;
23
+ }
24
+ /**
25
+ * The CSS touch-action for a pannable area: the browser keeps a touch pan
26
+ * along every axis the view cannot scroll, and pinch zoom on the page where it
27
+ * supports that value.
28
+ */
29
+ export function panTouchAction(model, axes) {
30
+ const x = axes.includes('x') && model.maxScrollX < 0;
31
+ const y = axes.includes('y') && model.maxScrollY < 0;
32
+ return x && y
33
+ ? (pinchZoom ?? 'none')
34
+ : x
35
+ ? withPinch('pan-y')
36
+ : y
37
+ ? withPinch('pan-x')
38
+ : 'auto';
39
+ }
40
+ /**
41
+ * Wheel scrolling, wheel zoom and pointer-drag panning of `model` over `ref`,
42
+ * along `axes`. The returned `onPointerDown` starts a pan with a mouse, a pen
43
+ * or a finger; put `touchAction` on the same element.
44
+ */
45
+ export function useWheelScroll({ ref, model, axes, zoom, onWheelScroll, }) {
5
46
  const scheduled = useRef(false);
6
47
  const zoomFrame = useRef(undefined);
7
48
  const zoomSettle = useRef(undefined);
8
49
  const deltaX = useRef(0);
9
50
  const deltaY = useRef(0);
51
+ const lastTaken = useRef(Number.NEGATIVE_INFINITY);
10
52
  const zoomSmoother = useRef(new WheelZoomSmoother());
11
53
  const zoomX = useRef(0);
12
54
  const zoomY = useRef(0);
13
55
  const lastZoomTime = useRef(null);
14
- const prevX = useRef(0);
15
- const prevY = useRef(0);
16
- const [mouseDragging, setMouseDragging] = useState(false);
56
+ const prev = useRef({ x: 0, y: 0 });
57
+ const latest = useRef({ x: 0, y: 0 });
58
+ const panFrame = useRef(false);
59
+ // the pointer that started the pan; a second finger neither moves nor ends it
60
+ const [panPointer, setPanPointer] = useState();
61
+ const x = axes.includes('x');
62
+ const y = axes.includes('y');
17
63
  useEffect(() => {
18
64
  const curr = ref.current;
19
65
  if (!curr) {
@@ -24,11 +70,10 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
24
70
  // scrollZoom is on, a plain vertical-dominant wheel zooms too; holding
25
71
  // shift is the escape hatch to pan instead.
26
72
  const isCtrlZoom = event.ctrlKey || event.metaKey;
27
- const isScrollZoom = scrollZoom &&
73
+ const isScrollZoom = model.scrollZoom &&
28
74
  !event.shiftKey &&
29
75
  Math.abs(event.deltaY) >= Math.abs(event.deltaX);
30
- if (onZoom && (isCtrlZoom || isScrollZoom)) {
31
- const zoom = onZoom;
76
+ if (zoom && (isCtrlZoom || isScrollZoom)) {
32
77
  const rect = curr.getBoundingClientRect();
33
78
  zoomSmoother.current.add(event.deltaY, event.deltaMode, isCtrlZoom);
34
79
  zoomX.current = event.clientX - rect.left;
@@ -38,10 +83,10 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
38
83
  const frame = (now) => {
39
84
  const elapsed = lastZoomTime.current === null ? 16.67 : now - lastZoomTime.current;
40
85
  lastZoomTime.current = now;
41
- zoom(zoomSmoother.current.step(Math.min(100, elapsed)), zoomX.current, zoomY.current);
86
+ model.wheelZoomToPos(zoomSmoother.current.step(Math.min(100, elapsed)), zoomX.current, zoomY.current);
42
87
  clearTimeout(zoomSettle.current);
43
88
  zoomSettle.current = setTimeout(() => {
44
- onZoomSettle?.();
89
+ model.endWheelZoom();
45
90
  }, zoomSettleMs);
46
91
  zoomFrame.current = zoomSmoother.current.idle
47
92
  ? undefined
@@ -53,29 +98,29 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
53
98
  event.stopPropagation();
54
99
  return;
55
100
  }
56
- // only swallow the wheel event on an axis we actually handle, otherwise a
57
- // vertical wheel over an x-only scroller (e.g. a Track) blocks page scroll
58
- const consumeX = !!onScrollX && event.deltaX !== 0;
59
- const consumeY = !!onScrollY && event.deltaY !== 0;
60
- if (consumeX || consumeY) {
61
- onWheelScroll?.(event);
62
- if (onScrollX) {
63
- deltaX.current += event.deltaX;
64
- }
65
- if (onScrollY) {
66
- deltaY.current += event.deltaY;
101
+ // the dominant axis decides: a trackpad's vertical swipe carries a pixel
102
+ // or two of deltaX, which must not hold the page at the bottom row. A
103
+ // horizontal wheel stays taken at the edges, where the page would read
104
+ // it as a swipe back through history.
105
+ const { deltaX: dx, deltaY: dy } = event;
106
+ const vertical = Math.abs(dy) >= Math.abs(dx);
107
+ const latched = event.timeStamp - lastTaken.current < wheelLatchMs;
108
+ const takeY = y && dy !== 0 && (latched || canScrollY(model, dy) || !vertical);
109
+ const takeX = x && dx !== 0 && (!vertical || takeY);
110
+ if (takeX || takeY) {
111
+ if (takeY && vertical) {
112
+ lastTaken.current = event.timeStamp;
67
113
  }
114
+ onWheelScroll?.(event);
115
+ deltaX.current += takeX ? event.deltaX : 0;
116
+ deltaY.current += takeY ? event.deltaY : 0;
68
117
  if (!scheduled.current) {
69
118
  scheduled.current = true;
70
119
  requestAnimationFrame(() => {
71
- if (onScrollX) {
72
- onScrollX(-deltaX.current);
73
- deltaX.current = 0;
74
- }
75
- if (onScrollY) {
76
- onScrollY(-deltaY.current);
77
- deltaY.current = 0;
78
- }
120
+ model.doScrollX(-deltaX.current);
121
+ model.doScrollY(-deltaY.current);
122
+ deltaX.current = 0;
123
+ deltaY.current = 0;
79
124
  scheduled.current = false;
80
125
  });
81
126
  }
@@ -92,59 +137,51 @@ export function useWheelScroll({ ref, onScrollX, onScrollY, onZoom, onZoomSettle
92
137
  }
93
138
  clearTimeout(zoomSettle.current);
94
139
  };
95
- }, [
96
- ref,
97
- onScrollX,
98
- onScrollY,
99
- onZoom,
100
- onZoomSettle,
101
- onWheelScroll,
102
- scrollZoom,
103
- ]);
140
+ }, [ref, model, x, y, zoom, onWheelScroll]);
104
141
  useEffect(() => {
105
- if (!mouseDragging) {
142
+ if (panPointer === undefined) {
106
143
  return;
107
144
  }
108
- function globalMouseMove(event) {
145
+ // a frame applies the distance from the last applied position to the
146
+ // newest one, so a move landing while a frame is pending is not dropped
147
+ function onMove(event) {
148
+ if (event.pointerId !== panPointer) {
149
+ return;
150
+ }
109
151
  event.preventDefault();
110
- const distanceX = event.clientX - prevX.current;
111
- const distanceY = event.clientY - prevY.current;
112
- if ((distanceX && onScrollX) || (distanceY && onScrollY)) {
113
- if (!scheduled.current) {
114
- scheduled.current = true;
115
- requestAnimationFrame(() => {
116
- onScrollX?.(distanceX);
117
- onScrollY?.(distanceY);
118
- scheduled.current = false;
119
- prevX.current = event.clientX;
120
- prevY.current = event.clientY;
121
- });
122
- }
152
+ latest.current = { x: event.clientX, y: event.clientY };
153
+ if (!panFrame.current) {
154
+ panFrame.current = true;
155
+ requestAnimationFrame(() => {
156
+ const to = latest.current;
157
+ model.doScrollX(x ? to.x - prev.current.x : 0);
158
+ model.doScrollY(y ? to.y - prev.current.y : 0);
159
+ prev.current = to;
160
+ panFrame.current = false;
161
+ });
123
162
  }
124
163
  }
125
- function globalMouseUp() {
126
- prevX.current = 0;
127
- prevY.current = 0;
128
- setMouseDragging(false);
164
+ function onUp(event) {
165
+ if (event.pointerId === panPointer) {
166
+ setPanPointer(undefined);
167
+ }
129
168
  }
130
- window.addEventListener('mousemove', globalMouseMove, true);
131
- window.addEventListener('mouseup', globalMouseUp, true);
169
+ window.addEventListener('pointermove', onMove, true);
170
+ window.addEventListener('pointerup', onUp, true);
171
+ window.addEventListener('pointercancel', onUp, true);
132
172
  return () => {
133
- window.removeEventListener('mousemove', globalMouseMove, true);
134
- window.removeEventListener('mouseup', globalMouseUp, true);
173
+ window.removeEventListener('pointermove', onMove, true);
174
+ window.removeEventListener('pointerup', onUp, true);
175
+ window.removeEventListener('pointercancel', onUp, true);
135
176
  };
136
- }, [mouseDragging, onScrollX, onScrollY]);
137
- function onMouseDown(event) {
138
- if (event.button === 0) {
139
- prevX.current = event.clientX;
140
- prevY.current = event.clientY;
141
- setMouseDragging(true);
177
+ }, [panPointer, model, x, y]);
178
+ function onPointerDown(event) {
179
+ if (event.button === 0 && event.isPrimary && panPointer === undefined) {
180
+ prev.current = { x: event.clientX, y: event.clientY };
181
+ latest.current = prev.current;
182
+ setPanPointer(event.pointerId);
142
183
  }
143
184
  }
144
- function onMouseUp(event) {
145
- event.preventDefault();
146
- setMouseDragging(false);
147
- }
148
- return { onMouseDown, onMouseUp };
185
+ return { onPointerDown, touchAction: panTouchAction(model, axes) };
149
186
  }
150
187
  //# sourceMappingURL=useWheelScroll.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWheelScroll.js","sourceRoot":"","sources":["../src/useWheelScroll.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useWheelScroll.js","sourceRoot":"","sources":["../src/useWheelScroll.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "9.1.1";
1
+ export declare const version = "9.3.0";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '9.1.1';
1
+ export const version = '9.3.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -1,9 +1,10 @@
1
1
  import { createJBrowseTheme } from '@jbrowse/core/ui/theme';
2
+ import { letterColors } from './scales.js';
2
3
  export function colorSchemeSnapshot(scheme) {
3
4
  return typeof scheme === 'string'
4
5
  ? { colorSchemeName: scheme }
5
6
  : scheme
6
- ? { customColorScheme: scheme.map }
7
+ ? { customColorScheme: letterColors(scheme) }
7
8
  : {};
8
9
  }
9
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"viewerSnapshot.js","sourceRoot":"","sources":["../src/viewerSnapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewerSnapshot.js","sourceRoot":"","sources":["../src/viewerSnapshot.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-msaview",
3
3
  "author": "Colin",
4
- "version": "9.1.1",
4
+ "version": "9.3.0",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "repository": {
@@ -50,10 +50,10 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@gmod/newick": "^1.0.3",
53
- "@jbrowse/svgcanvas": "9.1.1",
53
+ "@jbrowse/svgcanvas": "9.3.0",
54
54
  "colord": "^2.10.0",
55
55
  "flatbush": "^4.6.2",
56
- "msa-parsers": "9.1.1"
56
+ "msa-parsers": "9.3.0"
57
57
  },
58
58
  "scripts": {
59
59
  "clean": "rimraf dist bundle",
@@ -85,11 +85,12 @@ export default function DragHandle({
85
85
  onMouseLeave={() => {
86
86
  setHovered(false)
87
87
  }}
88
- onMouseDown={event => {
88
+ onPointerDown={event => {
89
89
  startDrag(event, getStart())
90
90
  }}
91
91
  style={{
92
92
  position,
93
+ touchAction: 'none',
93
94
  zIndex,
94
95
  cursor: cursor(axis),
95
96
  background: hovered ? fillHovered(theme) : fill(theme),
@@ -12,6 +12,7 @@ import { ThemeProvider } from '@mui/material/styles'
12
12
  import { compareStructural, reaction, when } from 'mobx'
13
13
 
14
14
  import MSAModelF from '../model.ts'
15
+ import { letterColors } from '../scales.ts'
15
16
  import {
16
17
  fileLocations,
17
18
  resolveTheme,
@@ -57,8 +58,9 @@ export interface MSAViewerProps {
57
58
  /** a URL the viewer fetches the GFF from; `gffFilehandle` wins */
58
59
  gffUrl?: string
59
60
  /**
60
- * a scheme name from the built-in table, or `{map}`, a color per residue
61
- * letter that leaves every other letter uncolored
61
+ * a scheme name from the built-in table, or `{domain, range}`, a color per
62
+ * residue letter that leaves every other letter uncolored. The earlier
63
+ * `{map}` still reads
62
64
  */
63
65
  colorScheme?: ColorScheme
64
66
  height?: number
@@ -103,15 +105,16 @@ export interface MSAViewerProps {
103
105
  /** extra fields per row name, such as a lineage or a host (see docs/layers.md) */
104
106
  rowData?: RowDataInput
105
107
  /**
106
- * what the viewer's marks read from a table: `{channel, field, scale?}`,
107
- * where `channel` is `tipLabel`, `rowTint` or `branch` over `rowData`, or
108
- * `featureFill` or `featureLabel` over the annotations (see docs/layers.md)
108
+ * what the viewer's marks read from a table:
109
+ * `{channel, field, range?, domain?, title?}`, where `channel` is
110
+ * `tipLabel`, `rowTint` or `branch` over `rowData`, or `featureFill` or
111
+ * `featureLabel` over the annotations (see docs/layers.md)
109
112
  */
110
113
  encodings?: Encoding[]
111
114
  /**
112
115
  * panels between the tree and the alignment, one cell per row:
113
- * `{kind: 'strip', field, scale?, width?, header?}` colors each row by a
114
- * `rowData` field (see docs/layers.md)
116
+ * `{kind: 'strip', field, range?, domain?, title?, width?, header?}` colors
117
+ * each row by a `rowData` field (see docs/layers.md)
115
118
  */
116
119
  rowPanels?: RowPanelSpec[]
117
120
  /** draw the phylogenetic tree (default true); false leaves a labels-only gutter */
@@ -357,7 +360,7 @@ const syncedProps = [
357
360
  if (typeof scheme === 'string') {
358
361
  m.setColorSchemeName(scheme)
359
362
  } else if (scheme) {
360
- m.setCustomColorScheme(scheme.map)
363
+ m.setCustomColorScheme(letterColors(scheme))
361
364
  }
362
365
  },
363
366
  ),
@@ -1,4 +1,4 @@
1
- import React, { lazy, useCallback, useRef, useState } from 'react'
1
+ import React, { lazy, useRef, useState } from 'react'
2
2
 
3
3
  import BaseTooltip from '@jbrowse/core/ui/BaseTooltip'
4
4
  import { makeStyles } from '@jbrowse/core/util/tss-react'
@@ -153,13 +153,7 @@ const Track = observer(function ({
153
153
  model: { height },
154
154
  } = track
155
155
  const ref = useRef<HTMLDivElement>(null)
156
- const onScrollX = useCallback(
157
- (d: number) => {
158
- model.doScrollX(d)
159
- },
160
- [model],
161
- )
162
- useWheelScroll({ ref, onScrollX })
156
+ useWheelScroll({ ref, model, axes: 'x' })
163
157
  const { classes } = useStyles()
164
158
  const { anchor, onMouseMove, onMouseDown, onMouseLeave } = useTrackHover({
165
159
  model,
@@ -23,7 +23,7 @@ const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
23
23
 
24
24
  return (
25
25
  <div
26
- onMouseDown={event => {
26
+ onPointerDown={event => {
27
27
  if (event.button === 0 && event.target === event.currentTarget) {
28
28
  const y =
29
29
  event.clientY - event.currentTarget.getBoundingClientRect().top
@@ -2,7 +2,8 @@ import React, { useEffect } from 'react'
2
2
 
3
3
  import useMeasure from '@jbrowse/core/util/useMeasure'
4
4
  import Tune from '@mui/icons-material/Tune'
5
- import { AppBar, Button, IconButton, Toolbar, Tooltip } from '@mui/material'
5
+ import { Button, IconButton, Toolbar, Tooltip } from '@mui/material'
6
+ import AppBar from '@mui/material/AppBar'
6
7
  import { observer } from 'mobx-react'
7
8
 
8
9
  import StatusMessage from '../StatusMessage.tsx'
@@ -78,7 +78,7 @@ const Minimap = observer(function ({ model }: { model: MsaViewModel }) {
78
78
  ref={ref}
79
79
  width={barWidth}
80
80
  height={barHeight}
81
- onMouseDown={event => {
81
+ onPointerDown={event => {
82
82
  if (event.button === 0 && unit > 0) {
83
83
  const x =
84
84
  event.clientX - event.currentTarget.getBoundingClientRect().left
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useRef } from 'react'
1
+ import React, { useRef } from 'react'
2
2
 
3
3
  import { observer } from 'mobx-react'
4
4
 
@@ -19,7 +19,6 @@ const MSACanvas = observer(function ({ model }: { model: MsaViewModel }) {
19
19
  height,
20
20
  msaCanvasWidth,
21
21
  blocks2d,
22
- scrollZoom,
23
22
  scrollX,
24
23
  scrollY,
25
24
  zoomSnapshot,
@@ -33,36 +32,13 @@ const MSACanvas = observer(function ({ model }: { model: MsaViewModel }) {
33
32
  ? zoomSnapshotScale(model, zoomSnapshot)
34
33
  : undefined
35
34
  const ref = useRef<HTMLDivElement>(null)
36
- const onScrollX = useCallback(
37
- (d: number) => {
38
- model.doScrollX(d)
39
- },
40
- [model],
41
- )
42
- const onScrollY = useCallback(
43
- (d: number) => {
44
- model.doScrollY(d)
45
- },
46
- [model],
47
- )
48
- const onZoom = useCallback(
49
- (scaleFactor: number, offsetX: number, offsetY: number) => {
50
- model.wheelZoomToPos(scaleFactor, offsetX, offsetY)
51
- },
52
- [model],
53
- )
54
- const onZoomSettle = useCallback(() => {
55
- model.endWheelZoom()
56
- }, [model])
57
35
  const hint = useWheelZoomHint(model)
58
- const { onMouseDown, onMouseUp } = useWheelScroll({
36
+ const { onPointerDown, touchAction } = useWheelScroll({
59
37
  ref,
60
- onScrollX,
61
- onScrollY,
62
- onZoom,
63
- onZoomSettle,
38
+ model,
39
+ axes: 'xy',
40
+ zoom: true,
64
41
  onWheelScroll: hint.onWheelScroll,
65
- scrollZoom,
66
42
  })
67
43
 
68
44
  return (
@@ -78,20 +54,23 @@ const MSACanvas = observer(function ({ model }: { model: MsaViewModel }) {
78
54
  event.preventDefault()
79
55
  }
80
56
  }}
57
+ // a shifted press selects cells (useMsaBlockMouse), so it takes the
58
+ // focus Escape clears from, and leaves out the pan and the page's own
59
+ // text selection
81
60
  onMouseDown={event => {
82
- // a shifted press selects cells (useMsaBlockMouse), so it takes the
83
- // focus Escape clears from, and leaves out the pan and the page's own
84
- // text selection
85
61
  if (event.shiftKey) {
86
62
  event.preventDefault()
87
63
  ref.current?.focus({ preventScroll: true })
88
- } else {
89
- onMouseDown(event)
90
64
  }
91
65
  }}
92
- onMouseUp={onMouseUp}
66
+ onPointerDown={event => {
67
+ if (!event.shiftKey) {
68
+ onPointerDown(event)
69
+ }
70
+ }}
93
71
  style={{
94
72
  position: 'relative',
73
+ touchAction,
95
74
  height,
96
75
  width: msaCanvasWidth,
97
76
  overflow: 'hidden',
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useRef } from 'react'
1
+ import React, { useRef } from 'react'
2
2
 
3
3
  import { observer } from 'mobx-react'
4
4
 
@@ -17,21 +17,19 @@ const RowPanel = observer(function ({
17
17
  }) {
18
18
  const ref = useRef<HTMLDivElement>(null)
19
19
  const { height, blocksY, scrollY } = model
20
- const onScrollY = useCallback(
21
- (d: number) => {
22
- model.doScrollY(d)
23
- },
24
- [model],
25
- )
26
- const { onMouseDown, onMouseUp } = useWheelScroll({ ref, onScrollY })
20
+ const { onPointerDown, touchAction } = useWheelScroll({
21
+ ref,
22
+ model,
23
+ axes: 'y',
24
+ })
27
25
 
28
26
  return (
29
27
  <div
30
28
  ref={ref}
31
29
  data-testid={`rowpanel_${panel.id}`}
32
- onMouseDown={onMouseDown}
33
- onMouseUp={onMouseUp}
30
+ onPointerDown={onPointerDown}
34
31
  style={{
32
+ touchAction,
35
33
  height,
36
34
  width: panel.width,
37
35
  flexShrink: 0,
@@ -3,7 +3,8 @@ import React, { useState } from 'react'
3
3
  import ArrowDropDown from '@mui/icons-material/ArrowDropDown'
4
4
  import ArrowRight from '@mui/icons-material/ArrowRight'
5
5
  import Close from '@mui/icons-material/Close'
6
- import { Box, ButtonBase, IconButton, Typography } from '@mui/material'
6
+ import { Box, IconButton, Typography } from '@mui/material'
7
+ import ButtonBase from '@mui/material/ButtonBase'
7
8
  import { observer } from 'mobx-react'
8
9
 
9
10
  import { settingsPanelWidth } from '../../constants.ts'
@@ -21,15 +21,20 @@ function trackGroups(model: MsaViewModel) {
21
21
  const computed = new Set(model.computedTrackModels.map(t => t.model.id))
22
22
  const computedEntries: Entry[] = []
23
23
  const alignmentEntries: Entry[] = []
24
+ const referenceEntries: Entry[] = []
24
25
  for (const { model: t } of model.tracks) {
25
- ;(computed.has(t.id) ? computedEntries : alignmentEntries).push({
26
- id: t.id,
27
- label: t.name,
28
- })
26
+ const entries =
27
+ t.kind === 'reference'
28
+ ? referenceEntries
29
+ : computed.has(t.id)
30
+ ? computedEntries
31
+ : alignmentEntries
32
+ entries.push({ id: t.id, label: t.name })
29
33
  }
30
34
  return [
31
35
  { title: 'Computed from the alignment', entries: computedEntries },
32
36
  { title: 'Alignment annotations', entries: alignmentEntries },
37
+ { title: 'Reference row', entries: referenceEntries },
33
38
  ].filter(g => g.entries.length > 0)
34
39
  }
35
40
 
@@ -137,7 +137,8 @@ const TrackTooltipContent = observer(function ({
137
137
  case 'logo': {
138
138
  return <LogoTooltip model={model} col={col} />
139
139
  }
140
- case 'text': {
140
+ case 'text':
141
+ case 'reference': {
141
142
  return <TextTooltip model={model} track={track} col={col} />
142
143
  }
143
144
  case 'arc': {