react-msaview 5.0.16 → 5.1.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.
- package/bundle/index.js +23 -23
- package/bundle/index.js.LICENSE.txt +1 -1
- package/bundle/index.js.map +1 -1
- package/dist/clustalX.d.ts +5 -0
- package/dist/clustalX.js +88 -0
- package/dist/clustalX.js.map +1 -0
- package/dist/components/SequenceTextArea.js +2 -2
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/TextTrack.js +3 -5
- package/dist/components/TextTrack.js.map +1 -1
- package/dist/components/Track.d.ts +2 -1
- package/dist/components/Track.js +4 -3
- package/dist/components/Track.js.map +1 -1
- package/dist/components/VerticalScrollbar.js +6 -31
- package/dist/components/VerticalScrollbar.js.map +1 -1
- package/dist/components/dialogs/InterProScanDialog.js +5 -3
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
- package/dist/components/header/HeaderStatusArea.js +4 -2
- package/dist/components/header/HeaderStatusArea.js.map +1 -1
- package/dist/components/header/MSASettingsMenu.js +2 -27
- package/dist/components/header/MSASettingsMenu.js.map +1 -1
- package/dist/components/header/SettingsMenu.js +4 -69
- package/dist/components/header/SettingsMenu.js.map +1 -1
- package/dist/components/header/TreeSettingsMenu.js +3 -41
- package/dist/components/header/TreeSettingsMenu.js.map +1 -1
- package/dist/components/header/settingsMenuItems.d.ts +4 -0
- package/dist/components/header/settingsMenuItems.js +59 -0
- package/dist/components/header/settingsMenuItems.js.map +1 -0
- package/dist/components/minimap/Minimap.js +6 -31
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +31 -33
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +15 -9
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +12 -14
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +9 -3
- package/dist/components/tree/renderTreeCanvas.js +14 -40
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/fetchUtils.d.ts +2 -1
- package/dist/fetchUtils.js +16 -2
- package/dist/fetchUtils.js.map +1 -1
- package/dist/hierarchy.d.ts +2 -0
- package/dist/hierarchy.js +25 -0
- package/dist/hierarchy.js.map +1 -1
- package/dist/launchInterProScan.d.ts +2 -1
- package/dist/launchInterProScan.js +31 -15
- package/dist/launchInterProScan.js.map +1 -1
- package/dist/model.d.ts +150 -494
- package/dist/model.js +23 -116
- package/dist/model.js.map +1 -1
- package/dist/useColorContrast.d.ts +10 -0
- package/dist/useColorContrast.js +13 -0
- package/dist/useColorContrast.js.map +1 -0
- package/dist/useDragScroll.d.ts +12 -0
- package/dist/useDragScroll.js +47 -0
- package/dist/useDragScroll.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -6
- package/src/clustalX.test.ts +76 -0
- package/src/clustalX.ts +131 -0
- package/src/components/SequenceTextArea.tsx +2 -2
- package/src/components/TextTrack.tsx +3 -8
- package/src/components/Track.tsx +6 -9
- package/src/components/VerticalScrollbar.tsx +13 -40
- package/src/components/dialogs/InterProScanDialog.tsx +7 -1
- package/src/components/header/HeaderStatusArea.tsx +6 -1
- package/src/components/header/MSASettingsMenu.tsx +3 -27
- package/src/components/header/SettingsMenu.tsx +7 -79
- package/src/components/header/TreeSettingsMenu.tsx +4 -48
- package/src/components/header/settingsMenuItems.ts +68 -0
- package/src/components/minimap/Minimap.tsx +13 -38
- package/src/components/msa/MSACanvasBlock.tsx +53 -36
- package/src/components/msa/renderMSABlock.ts +16 -9
- package/src/components/tree/TreeCanvas.tsx +13 -35
- package/src/components/tree/renderTreeCanvas.ts +23 -38
- package/src/fetchUtils.ts +16 -2
- package/src/hierarchy.ts +27 -0
- package/src/launchInterProScan.ts +34 -10
- package/src/model.ts +32 -143
- package/src/useColorContrast.ts +18 -0
- package/src/useDragScroll.ts +55 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function msaSettingsMenuItems(model) {
|
|
2
|
+
const { drawMsaLetters, hideGaps, bgColor } = model;
|
|
3
|
+
return [
|
|
4
|
+
{
|
|
5
|
+
label: 'Draw letters',
|
|
6
|
+
type: 'checkbox',
|
|
7
|
+
checked: drawMsaLetters,
|
|
8
|
+
onClick: () => { model.setDrawMsaLetters(!drawMsaLetters); },
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
label: 'Color letters instead of background of tiles',
|
|
12
|
+
type: 'checkbox',
|
|
13
|
+
checked: !bgColor,
|
|
14
|
+
onClick: () => { model.setBgColor(!bgColor); },
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
label: 'Enable hiding gappy columns?',
|
|
18
|
+
type: 'checkbox',
|
|
19
|
+
checked: hideGaps,
|
|
20
|
+
onClick: () => { model.setHideGaps(!hideGaps); },
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
export function treeSettingsMenuItems(model) {
|
|
25
|
+
const { drawTree, showBranchLen, labelsAlignRight, drawNodeBubbles, drawLabels, } = model;
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
label: 'Show branch length',
|
|
29
|
+
type: 'checkbox',
|
|
30
|
+
checked: showBranchLen,
|
|
31
|
+
onClick: () => { model.setShowBranchLen(!showBranchLen); },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
label: 'Show tree',
|
|
35
|
+
type: 'checkbox',
|
|
36
|
+
checked: drawTree,
|
|
37
|
+
onClick: () => { model.setDrawTree(!drawTree); },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: 'Draw clickable bubbles on tree branches',
|
|
41
|
+
type: 'checkbox',
|
|
42
|
+
checked: drawNodeBubbles,
|
|
43
|
+
onClick: () => { model.setDrawNodeBubbles(!drawNodeBubbles); },
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: 'Tree labels align right',
|
|
47
|
+
type: 'checkbox',
|
|
48
|
+
checked: labelsAlignRight,
|
|
49
|
+
onClick: () => { model.setLabelsAlignRight(!labelsAlignRight); },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: 'Draw labels',
|
|
53
|
+
type: 'checkbox',
|
|
54
|
+
checked: drawLabels,
|
|
55
|
+
onClick: () => { model.setDrawLabels(!drawLabels); },
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=settingsMenuItems.js.map
|
|
@@ -0,0 +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,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAA,CAAC,CAAC;SAC5D;QACD;YACE,KAAK,EAAE,8CAA8C;YACrD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,CAAC,OAAO;YACjB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC;SAC9C;QACD;YACE,KAAK,EAAE,8BAA8B;YACrC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC;SAChD;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,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAA,CAAC,CAAC;SAC1D;QACD;YACE,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC;SAChD;QACD;YACE,KAAK,EAAE,yCAAyC;YAChD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAA,CAAC,CAAC;SAC9D;QACD;YACE,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAAC,CAAA,CAAC,CAAC;SAChE;QACD;YACE,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,CAAA,CAAC,CAAC;SACpD;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
|
+
import { useDragScroll } from "../../useDragScroll.js";
|
|
3
4
|
const Minimap = observer(function ({ model }) {
|
|
4
|
-
const [mouseDown, setMouseDown] = useState();
|
|
5
5
|
const [hovered, setHovered] = useState(false);
|
|
6
|
-
const scheduled = useRef(false);
|
|
7
6
|
const { scrollX, msaAreaWidth, minimapHeight, colWidth, numColumns } = model;
|
|
8
7
|
const unit = msaAreaWidth / numColumns / colWidth;
|
|
9
8
|
const left = -scrollX;
|
|
@@ -12,30 +11,9 @@ const Minimap = observer(function ({ model }) {
|
|
|
12
11
|
const e = right * unit;
|
|
13
12
|
const fill = 'rgba(66, 119, 127, 0.3)';
|
|
14
13
|
const w = Math.max(e - s, 20);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if (!scheduled.current) {
|
|
19
|
-
scheduled.current = true;
|
|
20
|
-
window.requestAnimationFrame(() => {
|
|
21
|
-
model.setScrollX(mouseDown.scrollX - (event.clientX - mouseDown.clientX) / unit);
|
|
22
|
-
scheduled.current = false;
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
function fn2() {
|
|
28
|
-
setMouseDown(undefined);
|
|
29
|
-
}
|
|
30
|
-
if (mouseDown !== undefined) {
|
|
31
|
-
document.addEventListener('mousemove', fn);
|
|
32
|
-
document.addEventListener('mouseup', fn2);
|
|
33
|
-
return () => {
|
|
34
|
-
document.removeEventListener('mousemove', fn);
|
|
35
|
-
document.removeEventListener('mousemove', fn2);
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
}, [model, unit, mouseDown]);
|
|
14
|
+
const { startDrag } = useDragScroll('x', useCallback((delta, startScroll) => {
|
|
15
|
+
model.setScrollX(startScroll - delta / unit);
|
|
16
|
+
}, [model, unit]));
|
|
39
17
|
const barHeight = 12;
|
|
40
18
|
const polygonHeight = minimapHeight - barHeight;
|
|
41
19
|
return (React.createElement("div", { style: {
|
|
@@ -62,10 +40,7 @@ const Minimap = observer(function ({ model }) {
|
|
|
62
40
|
}, onMouseOut: () => {
|
|
63
41
|
setHovered(false);
|
|
64
42
|
}, onMouseDown: event => {
|
|
65
|
-
|
|
66
|
-
clientX: event.clientX,
|
|
67
|
-
scrollX: model.scrollX,
|
|
68
|
-
});
|
|
43
|
+
startDrag(event, model.scrollX);
|
|
69
44
|
} }),
|
|
70
45
|
React.createElement("svg", { height: polygonHeight, style: { width: '100%' } },
|
|
71
46
|
React.createElement("polygon", { fill: fill, points: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Minimap.js","sourceRoot":"","sources":["../../../src/components/minimap/Minimap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"Minimap.js","sourceRoot":"","sources":["../../../src/components/minimap/Minimap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAItD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAC5E,MAAM,IAAI,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;IACjD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAA;IACrB,MAAM,KAAK,GAAG,IAAI,GAAG,YAAY,CAAA;IACjC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;IACrB,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAA;IACtB,MAAM,IAAI,GAAG,yBAAyB,CAAA;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;IAE7B,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,CACjC,GAAG,EACH,WAAW,CACT,CAAC,KAAa,EAAE,WAAmB,EAAE,EAAE;QACrC,KAAK,CAAC,UAAU,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC,CAAA;IAC9C,CAAC,EACD,CAAC,KAAK,EAAE,IAAI,CAAC,CACd,CACF,CAAA;IAED,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,MAAM,aAAa,GAAG,aAAa,GAAG,SAAS,CAAA;IAC/C,OAAO,CACL,6BACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,MAAM;SACd;QAED,6BACE,KAAK,EAAE;gBACL,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,gBAAgB;aACzB,GACD;QACF,6BACE,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI;gBACnD,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,GAAG;aACZ,EACD,WAAW,EAAE,GAAG,EAAE;gBAChB,UAAU,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC,EACD,UAAU,EAAE,GAAG,EAAE;gBACf,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,EACD,WAAW,EAAE,KAAK,CAAC,EAAE;gBACnB,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YACjC,CAAC,GACD;QAEF,6BAAK,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;YAClD,iCACE,IAAI,EAAE,IAAI,EACV,MAAM,EAAE;oBACN,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACV,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,aAAa,CAAC;oBAClB,CAAC,YAAY,EAAE,aAAa,CAAC;iBAC9B,CAAC,QAAQ,EAAE,GACZ,CACE,CACF,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,OAAO,CAAA"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
import React, { useEffect,
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { BaseTooltip } from '@jbrowse/core/ui';
|
|
3
|
-
import { useTheme } from '@mui/material';
|
|
4
3
|
import { autorun } from 'mobx';
|
|
5
4
|
import { observer } from 'mobx-react';
|
|
6
5
|
import { renderBoxFeatureCanvasBlock } from "./renderBoxFeatureCanvasBlock.js";
|
|
7
6
|
import { renderMSABlock } from "./renderMSABlock.js";
|
|
8
|
-
import {
|
|
7
|
+
import { useColorContrast } from "../../useColorContrast.js";
|
|
8
|
+
function eventToColRow(event, el, offsetX, offsetY, colWidth, rowHeight) {
|
|
9
|
+
const { left, top } = el.getBoundingClientRect();
|
|
10
|
+
return {
|
|
11
|
+
col: Math.floor((event.clientX - left + offsetX) / colWidth),
|
|
12
|
+
row: Math.floor((event.clientY - top + offsetY) / rowHeight),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
9
15
|
const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
10
16
|
const { colWidth, rowHeight, scrollY, scrollX, colorScheme, blockSize, mouseClickCol, mouseClickRow, highResScaleFactor, } = model;
|
|
11
|
-
const theme =
|
|
12
|
-
const contrastScheme = useMemo(() => colorContrast(colorScheme, theme), [colorScheme, theme]);
|
|
17
|
+
const { theme, contrastScheme } = useColorContrast(colorScheme);
|
|
13
18
|
const ref = useRef(null);
|
|
14
19
|
useEffect(() => {
|
|
15
20
|
const ctx = ref.current?.getContext('2d');
|
|
@@ -49,36 +54,29 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
49
54
|
const { hoveredInsertion } = model;
|
|
50
55
|
return (React.createElement(React.Fragment, null,
|
|
51
56
|
React.createElement("canvas", { ref: ref, onMouseMove: event => {
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
else {
|
|
66
|
-
model.setMousePos(undefined, undefined);
|
|
57
|
+
if (ref.current) {
|
|
58
|
+
setMousePosition({ x: event.clientX, y: event.clientY });
|
|
59
|
+
const { col, row } = eventToColRow(event, ref.current, offsetX, offsetY, colWidth, rowHeight);
|
|
60
|
+
// Only set mouse position if within valid MSA bounds
|
|
61
|
+
if (col >= 0 &&
|
|
62
|
+
col < model.numColumns &&
|
|
63
|
+
row >= 0 &&
|
|
64
|
+
row < model.numRows) {
|
|
65
|
+
model.setMousePos(col, row);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
model.setMousePos(undefined, undefined);
|
|
69
|
+
}
|
|
67
70
|
}
|
|
68
71
|
}, onClick: event => {
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (x === mouseClickCol && y === mouseClickRow) {
|
|
78
|
-
model.setMouseClickPos(undefined, undefined);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
model.setMouseClickPos(x, y);
|
|
72
|
+
if (ref.current) {
|
|
73
|
+
const { col, row } = eventToColRow(event, ref.current, offsetX, offsetY, colWidth, rowHeight);
|
|
74
|
+
if (col === mouseClickCol && row === mouseClickRow) {
|
|
75
|
+
model.setMouseClickPos(undefined, undefined);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
model.setMouseClickPos(col, row);
|
|
79
|
+
}
|
|
82
80
|
}
|
|
83
81
|
}, onMouseLeave: () => {
|
|
84
82
|
model.setMousePos();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,10 @@ export function renderMSABlock({ model, offsetX, offsetY, contrastScheme, ctx, t
|
|
|
7
7
|
ctx.scale(k, k);
|
|
8
8
|
ctx.translate(-offsetX, rowHeight / 2 - offsetY);
|
|
9
9
|
ctx.textAlign = 'center';
|
|
10
|
-
|
|
10
|
+
// match an optional existing "bold " so re-renders don't accumulate it
|
|
11
|
+
// (an invalid "bold bold 16px" string would be silently ignored by canvas,
|
|
12
|
+
// freezing the font size against zoom changes)
|
|
13
|
+
ctx.font = ctx.font.replace(/(?:bold )?\d+px/, `${bgColor ? '' : 'bold '}${fontSize}px`);
|
|
11
14
|
const yStart = Math.max(0, Math.floor((offsetY - rowHeight) / rowHeight));
|
|
12
15
|
const yEnd = Math.max(0, Math.ceil((offsetY + by + rowHeight) / rowHeight));
|
|
13
16
|
const xStart = Math.max(0, Math.floor(offsetX / colWidth));
|
|
@@ -61,14 +64,17 @@ function drawTiles({ model, offsetX, ctx, visibleLeaves, theme, xStart, xEnd, })
|
|
|
61
64
|
const letter = str[j];
|
|
62
65
|
// Use a muted background for positions that match reference
|
|
63
66
|
const isMatchingReference = referenceSeq && name !== relativeTo && letter === referenceSeq[j];
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
let color;
|
|
68
|
+
if (isClustalX) {
|
|
69
|
+
color = model.colClustalX[xStart + j][letter];
|
|
70
|
+
}
|
|
71
|
+
else if (isPercentIdentity) {
|
|
72
|
+
const consensus = model.colConsensus[xStart + j];
|
|
73
|
+
color = letter === consensus.letter ? consensus.color : undefined;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
color = colorScheme[letter.toUpperCase()];
|
|
77
|
+
}
|
|
72
78
|
if (bgColor || isClustalX || isPercentIdentity) {
|
|
73
79
|
// Use a very light background for matching positions in relative mode
|
|
74
80
|
const finalColor = isMatchingReference
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderMSABlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSABlock.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,OAAO,EACP,cAAc,EACd,GAAG,EACH,KAAK,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GAWnB;IACC,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,MAAM,EACN,OAAO,GACR,GAAG,KAAK,CAAA;IACT,MAAM,CAAC,GAAG,0BAA0B,IAAI,kBAAkB,CAAA;IAC1D,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,GAAG,CAAC,cAAc,EAAE,CAAA;IACpB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACf,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAA;IAChD,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAA;IACxB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"renderMSABlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSABlock.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,OAAO,EACP,cAAc,EACd,GAAG,EACH,KAAK,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GAWnB;IACC,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,MAAM,EACN,OAAO,GACR,GAAG,KAAK,CAAA;IACT,MAAM,CAAC,GAAG,0BAA0B,IAAI,kBAAkB,CAAA;IAC1D,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,GAAG,CAAC,cAAc,EAAE,CAAA;IACpB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACf,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAA;IAChD,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAA;IACxB,uEAAuE;IACvE,2EAA2E;IAC3E,+CAA+C;IAC/C,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CACzB,iBAAiB,EACjB,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,IAAI,CACzC,CAAA;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEhD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,SAAS,CAAC;YACR,KAAK;YACL,GAAG;YACH,KAAK;YACL,OAAO;YACP,MAAM;YACN,IAAI;YACJ,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IACD,QAAQ,CAAC;QACP,KAAK;QACL,GAAG;QACH,OAAO;QACP,cAAc;QACd,MAAM;QACN,IAAI;QACJ,aAAa;KACd,CAAC,CAAA;IACF,uBAAuB,CAAC;QACtB,KAAK;QACL,GAAG;QACH,MAAM;QACN,IAAI;QACJ,aAAa;KACd,CAAC,CAAA;IACF,GAAG,CAAC,cAAc,EAAE,CAAA;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,OAAO,EACP,GAAG,EACH,aAAa,EACb,KAAK,EACL,MAAM,EACN,IAAI,GASL;IACC,MAAM,EACJ,OAAO,EACP,eAAe,EACf,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,UAAU,GACX,GAAG,KAAK,CAAA;IAET,8CAA8C;IAC9C,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAA;IAER,MAAM,UAAU,GAAG,eAAe,KAAK,0BAA0B,CAAA;IACjE,MAAM,iBAAiB,GAAG,eAAe,KAAK,0BAA0B,CAAA;IACxE,MAAM,cAAc,GAAG,OAAO,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAA;IAErD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAE,CAAA;QAC9B,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,GACf,GAAG,IAAI,CAAA;QACR,MAAM,CAAC,GAAG,IAAI,CAAC,CAAE,CAAA;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC9C,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;gBAEtB,4DAA4D;gBAC5D,MAAM,mBAAmB,GACvB,YAAY,IAAI,IAAI,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA;gBAEnE,IAAI,KAAyB,CAAA;gBAC7B,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,MAAM,CAAC,CAAA;gBAChD,CAAC;qBAAM,IAAI,iBAAiB,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;oBACjD,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;gBACnE,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;gBAC3C,CAAC;gBACD,IAAI,OAAO,IAAI,UAAU,IAAI,iBAAiB,EAAE,CAAC;oBAC/C,sEAAsE;oBACtE,MAAM,UAAU,GAAG,mBAAmB;wBACpC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;wBAC5B,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAA;oBAC7C,GAAG,CAAC,SAAS,GAAG,UAAU,CAAA;oBAC1B,GAAG,CAAC,QAAQ,CACV,CAAC,GAAG,QAAQ,GAAG,cAAc,EAC7B,CAAC,GAAG,SAAS,EACb,QAAQ,EACR,SAAS,CACV,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,EAChB,KAAK,EACL,OAAO,EACP,cAAc,EACd,GAAG,EACH,aAAa,EACb,MAAM,EACN,IAAI,GASL;IACC,MAAM,EACJ,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,UAAU,GACX,GAAG,KAAK,CAAA;IAET,8CAA8C;IAC9C,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAA;IAER,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,OAAO,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAA;QACrD,MAAM,YAAY,GAAG,QAAQ,GAAG,CAAC,CAAA;QACjC,MAAM,gBAAgB,GAAG,SAAS,GAAG,CAAC,CAAA;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAE,CAAA;YAC9B,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,GACf,GAAG,IAAI,CAAA;YACR,MAAM,CAAC,GAAG,IAAI,CAAC,CAAE,GAAG,gBAAgB,CAAA;YACpC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC9C,IAAI,GAAG,EAAE,CAAC;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;oBAEtB,+CAA+C;oBAC/C,MAAM,mBAAmB,GACvB,YAAY,IAAI,IAAI,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA;oBAEnE,mEAAmE;oBACnE,MAAM,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;oBAExD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;oBAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAA;oBAEhE,kDAAkD;oBAClD,GAAG,CAAC,SAAS,GAAG,mBAAmB;wBACjC,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,OAAO;4BACP,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,KAAK,IAAI,OAAO,CAAA;oBACtB,GAAG,CAAC,QAAQ,CACV,aAAa,EACb,CAAC,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,EAC5C,CAAC,CACF,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,EAC/B,KAAK,EACL,GAAG,EACH,aAAa,EACb,MAAM,EACN,IAAI,GAOL;IACC,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAA;IAC5C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAM;IACR,CAAC;IAED,GAAG,CAAC,SAAS,GAAG,CAAC,CAAA;IACjB,GAAG,CAAC,WAAW,GAAG,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;IAClE,GAAG,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,UAAU,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,EAClB,KAAK,EACL,GAAG,EACH,aAAa,EACb,MAAM,EACN,IAAI,EACJ,MAAM,GAQP;IACC,MAAM,OAAO,GAAG,CAAC,CAAA;IACjB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAA;IACzD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;QAC1B,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,CAAC,CAAE,CAAA;YACjB,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC;gBACjC,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;oBAChC,MAAM,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAA;oBACxB,MAAM,GAAG,GAAG,CAAC,GAAG,SAAS,CAAA;oBACzB,MAAM,MAAM,GAAG,CAAC,CAAA;oBAChB,GAAG,CAAC,SAAS,EAAE,CAAA;oBACf,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,CAAA;oBACpC,IAAI,QAAQ,GAAG,GAAG,CAAA;oBAClB,IAAI,OAAO,GAAG,IAAI,CAAA;oBAClB,OAAO,QAAQ,GAAG,MAAM,EAAE,CAAC;wBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,OAAO,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;wBACtD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;wBACjD,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAA;wBAC1C,QAAQ,GAAG,KAAK,CAAA;wBAChB,OAAO,GAAG,CAAC,OAAO,CAAA;oBACpB,CAAC;oBACD,GAAG,CAAC,MAAM,EAAE,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -23,30 +23,28 @@ const TreeCanvas = observer(function ({ model }) {
|
|
|
23
23
|
const { relativeTo, leaves, rowHeight, hoveredTreeNode, treeAreaWidth: w, height: h, scrollY: sy, mouseOverRowName, } = model;
|
|
24
24
|
ctx.resetTransform();
|
|
25
25
|
ctx.clearRect(0, 0, w, h);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
ctx.fillRect(0,
|
|
26
|
+
const leafByName = new Map(leaves.map(leaf => [leaf.data.name, leaf]));
|
|
27
|
+
const fillRow = (name) => {
|
|
28
|
+
const leaf = leafByName.get(name);
|
|
29
|
+
if (leaf) {
|
|
30
|
+
ctx.fillRect(0, leaf.x + sy - rowHeight / 2, w, rowHeight);
|
|
31
31
|
}
|
|
32
|
+
};
|
|
33
|
+
if (relativeTo) {
|
|
34
|
+
ctx.fillStyle = referenceColor;
|
|
35
|
+
fillRow(relativeTo);
|
|
32
36
|
}
|
|
33
37
|
if (hoveredTreeNode) {
|
|
34
38
|
ctx.fillStyle = treeHoverColor;
|
|
35
39
|
for (const descendantName of hoveredTreeNode.descendantNames) {
|
|
36
|
-
|
|
37
|
-
if (matchingLeaf) {
|
|
38
|
-
ctx.fillRect(0, matchingLeaf.x + sy - rowHeight / 2, w, rowHeight);
|
|
39
|
-
}
|
|
40
|
+
fillRow(descendantName);
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
if (mouseOverRowName &&
|
|
43
44
|
mouseOverRowName !== relativeTo &&
|
|
44
45
|
!hoveredTreeNode?.descendantNames.includes(mouseOverRowName)) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
ctx.fillStyle = treeHoverColor;
|
|
48
|
-
ctx.fillRect(0, matchingLeaf.x + sy - rowHeight / 2, w, rowHeight);
|
|
49
|
-
}
|
|
46
|
+
ctx.fillStyle = treeHoverColor;
|
|
47
|
+
fillRow(mouseOverRowName);
|
|
50
48
|
}
|
|
51
49
|
}
|
|
52
50
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE7D,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,MAAM,sBAAuB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAIxD,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAC5C,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAE5C,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACtE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,YAAY,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IACpD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IAC3D,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,CAAS,EAAE,EAAE;QACZ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAA;IACD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;IAErE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QAClD,OAAO,GAAG;YACR,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACX,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnB,MAAM,EACJ,UAAU,EACV,MAAM,EACN,SAAS,EACT,eAAe,EACf,aAAa,EAAE,CAAC,EAChB,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,EAAE,EACX,gBAAgB,GACjB,GAAG,KAAK,CAAA;oBACT,GAAG,CAAC,cAAc,EAAE,CAAA;oBACpB,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;oBAEzB,
|
|
1
|
+
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -21,26 +21,32 @@ interface ClickMapIndex {
|
|
|
21
21
|
maxY: number;
|
|
22
22
|
}): ClickEntry[];
|
|
23
23
|
}
|
|
24
|
-
export declare function renderTree({ offsetY, ctx, model, theme, blockSizeYOverride, }: {
|
|
24
|
+
export declare function renderTree({ offsetY, ctx, model, theme, maxBranchLen, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
25
25
|
offsetY: number;
|
|
26
26
|
ctx: CanvasRenderingContext2D;
|
|
27
27
|
model: MsaViewModel;
|
|
28
28
|
theme: Theme;
|
|
29
|
+
maxBranchLen: number;
|
|
30
|
+
maxDepthToLeaf: number;
|
|
29
31
|
blockSizeYOverride?: number;
|
|
30
32
|
}): void;
|
|
31
|
-
export declare function renderNodeBubbles({ ctx, clickMap, offsetY, model, blockSizeYOverride, }: {
|
|
33
|
+
export declare function renderNodeBubbles({ ctx, clickMap, offsetY, model, maxBranchLen, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
32
34
|
ctx: CanvasRenderingContext2D;
|
|
33
35
|
clickMap?: ClickMapIndex;
|
|
34
36
|
offsetY: number;
|
|
35
37
|
model: MsaViewModel;
|
|
38
|
+
maxBranchLen: number;
|
|
39
|
+
maxDepthToLeaf: number;
|
|
36
40
|
blockSizeYOverride?: number;
|
|
37
41
|
}): void;
|
|
38
|
-
export declare function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, blockSizeYOverride, }: {
|
|
42
|
+
export declare function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, maxBranchLen, maxDepthToLeaf, blockSizeYOverride, }: {
|
|
39
43
|
model: MsaViewModel;
|
|
40
44
|
offsetY: number;
|
|
41
45
|
ctx: CanvasRenderingContext2D;
|
|
42
46
|
clickMap?: ClickMapIndex;
|
|
43
47
|
theme: Theme;
|
|
48
|
+
maxBranchLen: number;
|
|
49
|
+
maxDepthToLeaf: number;
|
|
44
50
|
blockSizeYOverride?: number;
|
|
45
51
|
}): void;
|
|
46
52
|
export declare function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highResScaleFactorOverride, blockSizeYOverride, }: {
|
|
@@ -1,37 +1,8 @@
|
|
|
1
|
-
import { descendants, links } from "../../hierarchy.js";
|
|
1
|
+
import { calcDepthToLeaf, descendants, links } from "../../hierarchy.js";
|
|
2
2
|
export const padding = 600;
|
|
3
3
|
const extendBounds = 5;
|
|
4
4
|
const radius = 2.5;
|
|
5
5
|
const d = radius * 2;
|
|
6
|
-
// Cladogram positioning algorithm based on ape package's plot.phylo
|
|
7
|
-
// Uses topological depth (steps to tips) instead of branch length for x-positioning
|
|
8
|
-
// This ensures all leaf nodes align at the same x-coordinate (rightmost position)
|
|
9
|
-
// See: https://github.com/emmanuelparadis/ape/blob/master/R/plot.phylo.R
|
|
10
|
-
function calcDepthToLeaf(node) {
|
|
11
|
-
if (node.depthToLeaf !== undefined) {
|
|
12
|
-
return node.depthToLeaf;
|
|
13
|
-
}
|
|
14
|
-
if (!node.children || node.children.length === 0) {
|
|
15
|
-
node.depthToLeaf = 0;
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
let maxDepth = 0;
|
|
19
|
-
for (const child of node.children) {
|
|
20
|
-
maxDepth = Math.max(maxDepth, 1 + calcDepthToLeaf(child));
|
|
21
|
-
}
|
|
22
|
-
node.depthToLeaf = maxDepth;
|
|
23
|
-
}
|
|
24
|
-
return node.depthToLeaf;
|
|
25
|
-
}
|
|
26
|
-
function findMaxBranchLen(node) {
|
|
27
|
-
let maxLen = node.len || 0;
|
|
28
|
-
if (node.children) {
|
|
29
|
-
for (const child of node.children) {
|
|
30
|
-
maxLen = Math.max(maxLen, findMaxBranchLen(child));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return maxLen;
|
|
34
|
-
}
|
|
35
6
|
// Calculate node x-coordinate for both phylogram (with branch lengths) and cladogram (topology only) modes
|
|
36
7
|
// For cladograms: x = (maxDepthToLeaf - nodeDepthToLeaf) / maxDepthToLeaf * maxWidth
|
|
37
8
|
// This positions: leaves at maxWidth (rightmost), root at 0 (leftmost), internal nodes proportionally in between
|
|
@@ -43,12 +14,10 @@ function getNodeX(node, showBranchLen, maxBranchLen, maxDepthToLeaf) {
|
|
|
43
14
|
const depthToLeaf = calcDepthToLeaf(node);
|
|
44
15
|
return ((maxDepthToLeaf - depthToLeaf) / maxDepthToLeaf) * maxBranchLen;
|
|
45
16
|
}
|
|
46
|
-
export function renderTree({ offsetY, ctx, model, theme, blockSizeYOverride, }) {
|
|
17
|
+
export function renderTree({ offsetY, ctx, model, theme, maxBranchLen, maxDepthToLeaf, blockSizeYOverride, }) {
|
|
47
18
|
const { hierarchy, showBranchLenEffective: showBranchLen, blockSize } = model;
|
|
48
19
|
const by = blockSizeYOverride || blockSize;
|
|
49
20
|
ctx.strokeStyle = theme.palette.text.primary;
|
|
50
|
-
const maxBranchLen = findMaxBranchLen(hierarchy);
|
|
51
|
-
const maxDepthToLeaf = calcDepthToLeaf(hierarchy);
|
|
52
21
|
for (const link of links(hierarchy)) {
|
|
53
22
|
const { source, target } = link;
|
|
54
23
|
const sy = source.x;
|
|
@@ -72,11 +41,9 @@ export function renderTree({ offsetY, ctx, model, theme, blockSizeYOverride, })
|
|
|
72
41
|
}
|
|
73
42
|
}
|
|
74
43
|
}
|
|
75
|
-
export function renderNodeBubbles({ ctx, clickMap, offsetY, model, blockSizeYOverride, }) {
|
|
44
|
+
export function renderNodeBubbles({ ctx, clickMap, offsetY, model, maxBranchLen, maxDepthToLeaf, blockSizeYOverride, }) {
|
|
76
45
|
const { hierarchy, showBranchLenEffective: showBranchLen, collapsed, blockSize, marginLeft: ml, } = model;
|
|
77
46
|
const by = blockSizeYOverride || blockSize;
|
|
78
|
-
const maxBranchLen = findMaxBranchLen(hierarchy);
|
|
79
|
-
const maxDepthToLeaf = calcDepthToLeaf(hierarchy);
|
|
80
47
|
for (const node of descendants(hierarchy)) {
|
|
81
48
|
const x = getNodeX(node, showBranchLen, maxBranchLen, maxDepthToLeaf);
|
|
82
49
|
if (x === undefined) {
|
|
@@ -106,8 +73,8 @@ export function renderNodeBubbles({ ctx, clickMap, offsetY, model, blockSizeYOve
|
|
|
106
73
|
}
|
|
107
74
|
}
|
|
108
75
|
}
|
|
109
|
-
export function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, blockSizeYOverride, }) {
|
|
110
|
-
const { fontSize, showBranchLenEffective: showBranchLen, treeMetadata, blockSize, labelsAlignRight, drawTree, treeAreaWidth, treeAreaWidthMinusMargin, marginLeft, leaves, noTree,
|
|
76
|
+
export function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, maxBranchLen, maxDepthToLeaf, blockSizeYOverride, }) {
|
|
77
|
+
const { fontSize, showBranchLenEffective: showBranchLen, treeMetadata, blockSize, labelsAlignRight, drawTree, treeAreaWidth, treeAreaWidthMinusMargin, marginLeft, leaves, noTree, } = model;
|
|
111
78
|
const by = blockSizeYOverride || blockSize;
|
|
112
79
|
const emHeight = ctx.measureText('M').width;
|
|
113
80
|
if (labelsAlignRight) {
|
|
@@ -117,8 +84,6 @@ export function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, blockSi
|
|
|
117
84
|
else {
|
|
118
85
|
ctx.textAlign = 'start';
|
|
119
86
|
}
|
|
120
|
-
const maxBranchLen = findMaxBranchLen(hierarchy);
|
|
121
|
-
const maxDepthToLeaf = calcDepthToLeaf(hierarchy);
|
|
122
87
|
for (const node of leaves) {
|
|
123
88
|
const { data: { name, id }, } = node;
|
|
124
89
|
const y = node.x;
|
|
@@ -186,12 +151,17 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
186
151
|
ctx.translate(marginLeft, -offsetY);
|
|
187
152
|
const font = ctx.font;
|
|
188
153
|
ctx.font = font.replace(/\d+px/, `${fontSize}px`);
|
|
154
|
+
// memoized on the model and shared across the tree/bubble/label passes (and
|
|
155
|
+
// across all tree blocks) rather than re-traversing the hierarchy in each
|
|
156
|
+
const { maxBranchLength: maxBranchLen, maxDepthToLeaf } = model;
|
|
189
157
|
if (!noTree && drawTree) {
|
|
190
158
|
renderTree({
|
|
191
159
|
ctx,
|
|
192
160
|
offsetY,
|
|
193
161
|
model,
|
|
194
162
|
theme,
|
|
163
|
+
maxBranchLen,
|
|
164
|
+
maxDepthToLeaf,
|
|
195
165
|
blockSizeYOverride,
|
|
196
166
|
});
|
|
197
167
|
if (drawNodeBubbles) {
|
|
@@ -200,6 +170,8 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
200
170
|
offsetY,
|
|
201
171
|
clickMap,
|
|
202
172
|
model,
|
|
173
|
+
maxBranchLen,
|
|
174
|
+
maxDepthToLeaf,
|
|
203
175
|
blockSizeYOverride,
|
|
204
176
|
});
|
|
205
177
|
}
|
|
@@ -211,6 +183,8 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
211
183
|
model,
|
|
212
184
|
clickMap,
|
|
213
185
|
theme,
|
|
186
|
+
maxBranchLen,
|
|
187
|
+
maxDepthToLeaf,
|
|
214
188
|
blockSizeYOverride,
|
|
215
189
|
});
|
|
216
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/renderTreeCanvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"renderTreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/renderTreeCanvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAMxE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAA;AAE1B,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,MAAM,GAAG,GAAG,CAAA;AAClB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAA;AAEpB,2GAA2G;AAC3G,qFAAqF;AACrF,iHAAiH;AACjH,+EAA+E;AAC/E,SAAS,QAAQ,CACf,IAAmB,EACnB,aAAsB,EACtB,YAAoB,EACpB,cAAsB;IAEtB,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IACD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,CAAC,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,cAAc,CAAC,GAAG,YAAY,CAAA;AACzE,CAAC;AAwBD,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,GAAG,EACH,KAAK,EACL,KAAK,EACL,YAAY,EACZ,cAAc,EACd,kBAAkB,GASnB;IACC,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAC7E,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAE,CAAA;QACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAE,CAAA;QACpB,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;QACxE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;QACxE,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACzC,SAAQ;QACV,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,yEAAyE;QACzE,0EAA0E;QAC1E,QAAQ;QACR,IAAI,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACxC,GAAG,CAAC,SAAS,EAAE,CAAA;YACf,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YAClB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YAClB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YAClB,GAAG,CAAC,MAAM,EAAE,CAAA;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,QAAQ,EACR,OAAO,EACP,KAAK,EACL,YAAY,EACZ,cAAc,EACd,kBAAkB,GASnB;IACC,MAAM,EACJ,SAAS,EACT,sBAAsB,EAAE,aAAa,EACrC,SAAS,EACT,SAAS,EACT,UAAU,EAAE,EAAE,GACf,GAAG,KAAK,CAAA;IACT,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;QACrE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,SAAQ;QACV,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAE,CAAA;QACjB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QACzB,IACE,IAAI,CAAC,MAAM,IAAI,CAAC;YAChB,CAAC,GAAG,OAAO,GAAG,YAAY;YAC1B,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,YAAY,EAC/B,CAAC;YACD,GAAG,CAAC,WAAW,GAAG,OAAO,CAAA;YACzB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;YAC1D,GAAG,CAAC,SAAS,EAAE,CAAA;YACf,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,GAAG,CAAC,IAAI,EAAE,CAAA;YACV,GAAG,CAAC,MAAM,EAAE,CAAA;YAEZ,QAAQ,EAAE,MAAM,CAAC;gBACf,IAAI,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE;gBACrB,IAAI,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE;gBACzB,IAAI,EAAE,CAAC,GAAG,MAAM;gBAChB,IAAI,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC;gBACpB,MAAM,EAAE,IAAI;gBACZ,EAAE;gBACF,IAAI;aACL,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,OAAO,EACP,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,kBAAkB,GAUnB;IACC,MAAM,EACJ,QAAQ,EACR,sBAAsB,EAAE,aAAa,EACrC,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,wBAAwB,EACxB,UAAU,EACV,MAAM,EACN,MAAM,GACP,GAAG,KAAK,CAAA;IACT,MAAM,EAAE,GAAG,kBAAkB,IAAI,SAAS,CAAA;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;IAC3C,IAAI,gBAAgB,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAA;QACvB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,SAAS,GAAG,OAAO,CAAA;IACzB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GACnB,GAAG,IAAI,CAAA;QACR,MAAM,CAAC,GAAG,IAAI,CAAC,CAAE,CAAA;QAEjB,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,IAAI,CAAA;QACtD,IAAI,CAAC,GAAG,OAAO,GAAG,YAAY,IAAI,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;YAClE,sDAAsD;YACtD,MAAM,EAAE,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAA;YAC3B,IAAI,EAAE,GAAG,CAAC,CAAA;YACV,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,CAAA;YACvE,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YAE9C,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;YAC1C,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,YAAY,GAAG,CAAC,CAAA;gBACtB,MAAM,MAAM,GAAG,wBAAwB,GAAG,YAAY,CAAA;gBACtD,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACxB,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;oBAC9B,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,KAAK,EAAE,CAAC,CAAC,CAAA;oBAC5C,GAAG,CAAC,MAAM,EAAE,CAAA;gBACd,CAAC;gBACD,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;gBACrC,QAAQ,EAAE,MAAM,CAAC;oBACf,IAAI,EAAE,aAAa,GAAG,KAAK;oBAC3B,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,EAAE,GAAG,QAAQ;oBACnB,IAAI,EAAE,EAAE;oBACR,IAAI;oBACJ,EAAE;iBACH,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;gBAClC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;gBACrC,QAAQ,EAAE,MAAM,CAAC;oBACf,IAAI,EAAE,MAAM,GAAG,UAAU;oBACzB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU;oBACjC,IAAI,EAAE,EAAE,GAAG,QAAQ;oBACnB,IAAI,EAAE,EAAE;oBACR,IAAI;oBACJ,EAAE;iBACH,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,GAAG,EACH,OAAO,EACP,KAAK,EACL,0BAA0B,EAC1B,kBAAkB,GASnB;IACC,QAAQ,EAAE,KAAK,EAAE,CAAA;IAEjB,yDAAyD;IACzD,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,IAAI;IACJ,8DAA8D;IAC9D,SAAS,EAAE,UAAU,EAAE,iDAAiD;MACzE,GAAG,KAAK,CAAA;IAET,GAAG,CAAC,cAAc,EAAE,CAAA;IAEpB,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,4CAA4C;IAC5C,MAAM,CAAC,GACL,IAAI,GAAG,CAAC;QACN,CAAC,CAAC,MAAM,CAAC,iBAAiB;QAC1B,CAAC,CAAC,0BAA0B,IAAI,kBAAkB,CAAA;IACtD,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACf,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;IAEnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IACrB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAA;IAEjD,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;IAE/D,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QACxB,UAAU,CAAC;YACT,GAAG;YACH,OAAO;YACP,KAAK;YACL,KAAK;YACL,YAAY;YACZ,cAAc;YACd,kBAAkB;SACnB,CAAC,CAAA;QAEF,IAAI,eAAe,EAAE,CAAC;YACpB,iBAAiB,CAAC;gBAChB,GAAG;gBACH,OAAO;gBACP,QAAQ;gBACR,KAAK;gBACL,YAAY;gBACZ,cAAc;gBACd,kBAAkB;aACnB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,gBAAgB,CAAC;YACf,GAAG;YACH,OAAO;YACP,KAAK;YACL,QAAQ;YACR,KAAK;YACL,YAAY;YACZ,cAAc;YACd,kBAAkB;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAA;AACpB,CAAC"}
|
package/dist/fetchUtils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function myfetch(url: string, args?: RequestInit): Promise<Response>;
|
|
2
2
|
export declare function textfetch(url: string, args?: RequestInit): Promise<string>;
|
|
3
3
|
export declare function jsonfetch<T>(url: string, args?: RequestInit): Promise<T>;
|
|
4
|
-
export declare function timeout(time: number): Promise<
|
|
4
|
+
export declare function timeout(time: number, signal?: AbortSignal): Promise<void>;
|
|
5
|
+
export declare function isAbortError(e: unknown): boolean;
|
package/dist/fetchUtils.js
CHANGED
|
@@ -13,7 +13,21 @@ export async function jsonfetch(url, args) {
|
|
|
13
13
|
const response = await myfetch(url, args);
|
|
14
14
|
return response.json();
|
|
15
15
|
}
|
|
16
|
-
export function timeout(time) {
|
|
17
|
-
return new Promise(
|
|
16
|
+
export function timeout(time, signal) {
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
if (signal?.aborted) {
|
|
19
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const id = setTimeout(resolve, time);
|
|
23
|
+
signal?.addEventListener('abort', () => {
|
|
24
|
+
clearTimeout(id);
|
|
25
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export function isAbortError(e) {
|
|
31
|
+
return e instanceof DOMException && e.name === 'AbortError';
|
|
18
32
|
}
|
|
19
33
|
//# sourceMappingURL=fetchUtils.js.map
|
package/dist/fetchUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAkB;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAEvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,QAAQ,QAAQ,CAAC,MAAM,aAAa,GAAG,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CACnE,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,IAAkB;IAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,GAAW,EAAE,IAAkB;IAChE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAO,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAkB;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAEvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,QAAQ,QAAQ,CAAC,MAAM,aAAa,GAAG,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CACnE,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,IAAkB;IAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,GAAW,EAAE,IAAkB;IAChE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAO,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAoB;IACxD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACpC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrC,YAAY,CAAC,EAAE,CAAC,CAAA;gBAChB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;YACnD,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAA;AAC7D,CAAC"}
|