react-msaview 8.4.0 → 9.0.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 +503 -89
- package/bundle/index.js.map +4 -4
- package/dist/components/MSAView.js +2 -2
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +1 -3
- package/dist/components/MSAViewer.js +1 -2
- package/dist/components/MSAViewer.js.map +1 -1
- package/dist/components/ResizeHandles.js +1 -1
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/Track.js +1 -1
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/ExportSVGDialog.js +2 -2
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
- package/dist/components/header/GoToBox.d.ts +332 -0
- package/dist/components/header/GoToBox.js +14 -4
- package/dist/components/header/GoToBox.js.map +1 -1
- package/dist/components/header/settingsMenuItems.js +4 -1
- package/dist/components/header/settingsMenuItems.js.map +1 -1
- package/dist/components/tree/CladeLabels.js +3 -3
- package/dist/components/tree/CladeLabels.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +4 -4
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +4 -4
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeOverview.js +10 -5
- package/dist/components/tree/TreeOverview.js.map +1 -1
- package/dist/components/tree/TreePanel.js +6 -2
- package/dist/components/tree/TreePanel.js.map +1 -1
- package/dist/components/tree/TreeRuler.js +2 -2
- package/dist/components/tree/TreeRuler.js.map +1 -1
- package/dist/components/tree/cladeBrackets.d.ts +8 -10
- package/dist/components/tree/cladeBrackets.js +7 -6
- package/dist/components/tree/cladeBrackets.js.map +1 -1
- package/dist/components/tree/clickMap.d.ts +2 -0
- package/dist/components/tree/clickMap.js.map +1 -1
- package/dist/components/tree/ellipsize.d.ts +8 -0
- package/dist/components/tree/ellipsize.js +20 -0
- package/dist/components/tree/ellipsize.js.map +1 -0
- package/dist/components/tree/renderTreeCanvas.js +30 -26
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/components/tree/renderTreeMouseover.js +1 -1
- package/dist/components/tree/renderTreeMouseover.js.map +1 -1
- package/dist/constants.d.ts +6 -3
- package/dist/constants.js +16 -6
- package/dist/constants.js.map +1 -1
- package/dist/measureTextCanvas.js +2 -2
- package/dist/measureTextCanvas.js.map +1 -1
- package/dist/model/treeModel.d.ts +14 -20
- package/dist/model/treeModel.js +16 -23
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +192 -213
- package/dist/model.js +112 -104
- package/dist/model.js.map +1 -1
- package/dist/renderToSvg.js +24 -22
- package/dist/renderToSvg.js.map +1 -1
- package/dist/svgTestUtil.d.ts +252 -356
- package/dist/tipLabels.d.ts +8 -0
- package/dist/tipLabels.js +46 -0
- package/dist/tipLabels.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -6
- package/src/components/MSAView.tsx +2 -2
- package/src/components/MSAViewer.tsx +1 -5
- package/src/components/ResizeHandles.tsx +1 -1
- package/src/components/Track.tsx +1 -1
- package/src/components/dialogs/ExportSVGDialog.tsx +2 -2
- package/src/components/header/GoToBox.tsx +18 -4
- package/src/components/header/settingsMenuItems.ts +8 -0
- package/src/components/tree/CladeLabels.tsx +3 -3
- package/src/components/tree/TreeCanvas.tsx +10 -4
- package/src/components/tree/TreeCanvasBlock.tsx +4 -4
- package/src/components/tree/TreeOverview.tsx +10 -5
- package/src/components/tree/TreePanel.tsx +8 -2
- package/src/components/tree/TreeRuler.tsx +7 -3
- package/src/components/tree/cladeBrackets.ts +10 -17
- package/src/components/tree/clickMap.ts +2 -0
- package/src/components/tree/ellipsize.ts +24 -0
- package/src/components/tree/renderTreeCanvas.ts +42 -30
- package/src/components/tree/renderTreeMouseover.ts +1 -1
- package/src/constants.ts +17 -6
- package/src/measureTextCanvas.ts +2 -2
- package/src/model/treeModel.ts +17 -27
- package/src/model.ts +133 -128
- package/src/renderToSvg.tsx +24 -22
- package/src/tipLabels.ts +51 -0
- package/src/version.ts +1 -1
|
@@ -56,7 +56,7 @@ export function msaSettingsMenuItems(model) {
|
|
|
56
56
|
];
|
|
57
57
|
}
|
|
58
58
|
export function treeSettingsMenuItems(model) {
|
|
59
|
-
const { drawTree, showBranchLen, labelsAlignRight, drawNodeBubbles, drawNodeLabels, drawLabels, showTreeOverview, treeOrder, treeRoot, rotated, } = model;
|
|
59
|
+
const { drawTree, showBranchLen, labelsAlignRight, drawNodeBubbles, drawNodeLabels, drawLabels, treeAreaWidth, showTreeOverview, treeOrder, treeRoot, rotated, } = model;
|
|
60
60
|
return [
|
|
61
61
|
{
|
|
62
62
|
label: 'Order',
|
|
@@ -119,6 +119,9 @@ export function treeSettingsMenuItems(model) {
|
|
|
119
119
|
toggle('Draw labels', drawLabels, arg => {
|
|
120
120
|
model.setDrawLabels(arg);
|
|
121
121
|
}),
|
|
122
|
+
toggle('Fit tree area to labels and tree', treeAreaWidth === undefined, arg => {
|
|
123
|
+
model.setTreeAreaWidth(arg ? undefined : model.effectiveTreeAreaWidth);
|
|
124
|
+
}),
|
|
122
125
|
];
|
|
123
126
|
}
|
|
124
127
|
//# sourceMappingURL=settingsMenuItems.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settingsMenuItems.js","sourceRoot":"","sources":["../../../src/components/header/settingsMenuItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAM/C,SAAS,KAAK,CAAC,KAAa,EAAE,OAAgB,EAAE,OAAmB;IACjE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AAC5D,CAAC;AAED,MAAM,eAAe,GAA8B;IACjD,YAAY,EAAE,kBAAkB;IAChC,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,+BAA+B;IAC1C,gBAAgB,EAAE,+BAA+B;CAClD,CAAA;AAED,SAAS,aAAa,CAAC,QAAkB;IACvC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAA;IACjC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;QACtB,CAAC,CAAC,YAAY,KAAK,EAAE;QACrB,CAAC,CAAC,YAAY,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,OAAgB,EAAE,GAA2B;IAC1E,OAAO;QACL,KAAK;QACL,IAAI,EAAE,UAAmB;QACzB,OAAO;QACP,OAAO,EAAE,GAAG,EAAE;YACZ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAED,0DAA0D;AAC1D,SAAS,aAAa,CAAC,KAAmB;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;IAChE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAClD,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE;QAC/B,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,CAAA;IACpE,OAAO;QACL;YACE,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,SAAkB;YACxB,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC;SAC9B;QACD,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5B,MAAM,CAAC,4BAA4B,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE;YAC1D,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE;YAC3C,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC,CAAC;QACF,+DAA+D;QAC/D,MAAM,CAAC,0BAA0B,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YACjD,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,CAAC;QACF,MAAM,CAAC,oBAAoB,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;YAC3C,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,CAAC;KACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAmB;IACvD,MAAM,EACJ,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,OAAO,GACR,GAAG,KAAK,CAAA;IACT,OAAO;QACL;YACE,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,SAAkB;YACxB,OAAO,EAAE;gBACP,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACxB,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,SAAS,KAAK,KAAK,EAAE,GAAG,EAAE;oBACtD,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC,CAAC,CACH;gBACD,EAAE,IAAI,EAAE,SAAkB,EAAE;gBAC5B;oBACE,KAAK,EAAE,gBAAgB;oBACvB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;oBAC9B,OAAO,EAAE,GAAG,EAAE;wBACZ,KAAK,CAAC,YAAY,EAAE,CAAA;oBACtB,CAAC;iBACF;aACF;SACF;QACD;YACE,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,SAAkB;YACxB,OAAO,EAAE;gBACP,KAAK,CAAC,YAAY,EAAE,QAAQ,KAAK,SAAS,EAAE,GAAG,EAAE;oBAC/C,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;gBAC9B,CAAC,CAAC;gBACF,KAAK,CAAC,UAAU,EAAE,QAAQ,KAAK,UAAU,EAAE,GAAG,EAAE;oBAC9C,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBAC/B,CAAC,CAAC;gBACF,iEAAiE;gBACjE,aAAa;gBACb,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ;oBAC9B,CAAC,CAAC;wBACE;4BACE,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC;4BAC1D,QAAQ,EAAE,IAAI;yBACf;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;SACF;QACD,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5B,MAAM,CAAC,oBAAoB,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE;YAChD,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC,CAAC;QACF,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;YAClC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,CAAC;QACF,MAAM,CAAC,+BAA+B,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE;YAC7D,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC,CAAC;QACF,MAAM,CAAC,2BAA2B,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE;YACxD,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC,CAAC;QACF,MAAM,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE;YACnD,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;QAChC,CAAC,CAAC;QACF,MAAM,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE;YACxD,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;QAChC,CAAC,CAAC;QACF,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE;YACtC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settingsMenuItems.js","sourceRoot":"","sources":["../../../src/components/header/settingsMenuItems.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,12 +9,12 @@ import { bracketGap, cladeHeight, cladeInGutter, cladeLabelHorizontal, cladeLabe
|
|
|
9
9
|
* the same labels with a `rotate(-90)`.
|
|
10
10
|
*/
|
|
11
11
|
const CladeLabels = observer(function ({ model }) {
|
|
12
|
-
const { resolvedClades, cladeGutterWidth, rowHeight,
|
|
12
|
+
const { resolvedClades, cladeGutterWidth, rowHeight, effectiveTreeAreaWidth, fontSize, } = model;
|
|
13
13
|
const theme = useTheme();
|
|
14
14
|
if (cladeGutterWidth === 0) {
|
|
15
15
|
return null;
|
|
16
16
|
}
|
|
17
|
-
const gutterLeft =
|
|
17
|
+
const gutterLeft = effectiveTreeAreaWidth - cladeGutterWidth;
|
|
18
18
|
return (React.createElement(React.Fragment, null, resolvedClades.map((clade, index) => {
|
|
19
19
|
const { label, markColor, rows } = clade;
|
|
20
20
|
if (!label || !cladeInGutter(clade)) {
|
|
@@ -26,7 +26,7 @@ const CladeLabels = observer(function ({ model }) {
|
|
|
26
26
|
position: 'absolute',
|
|
27
27
|
left,
|
|
28
28
|
top: rows[0] * rowHeight,
|
|
29
|
-
width:
|
|
29
|
+
width: effectiveTreeAreaWidth - left - bracketGap,
|
|
30
30
|
height: cladeHeight(clade, rowHeight),
|
|
31
31
|
display: 'flex',
|
|
32
32
|
alignItems: 'center',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CladeLabels.js","sourceRoot":"","sources":["../../../src/components/tree/CladeLabels.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAI3B;;;;;GAKG;AACH,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACvE,MAAM,EACJ,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"CladeLabels.js","sourceRoot":"","sources":["../../../src/components/tree/CladeLabels.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAI3B;;;;;GAKG;AACH,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACvE,MAAM,EACJ,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,sBAAsB,EACtB,QAAQ,GACT,GAAG,KAAK,CAAA;IACT,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,UAAU,GAAG,sBAAsB,GAAG,gBAAgB,CAAA;IAC5D,OAAO,CACL,0CACG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACnC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;QACnE,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,EACrC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,IAAI;gBACJ,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;gBACxB,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,UAAU;gBACjD,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;gBACrC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;gBAC9C,QAAQ;gBACR,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,UAAU;gBACxB,UAAU,EAAE,QAAQ;gBACpB,aAAa,EAAE,MAAM;gBACrB,8DAA8D;gBAC9D,kDAAkD;gBAClD,GAAG,CAAC,UAAU;oBACZ,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;aACjE,IAEA,KAAK,CACF,CACP,CAAA;IACH,CAAC,CAAC,CACD,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,WAAW,CAAA"}
|
|
@@ -8,12 +8,12 @@ import TreeCanvasBlock from './TreeCanvasBlock.js';
|
|
|
8
8
|
import { renderTreeMouseover } from './renderTreeMouseover.js';
|
|
9
9
|
const TreeCanvas = observer(function ({ model }) {
|
|
10
10
|
const ref = useRef(null);
|
|
11
|
-
const { height, blocksY,
|
|
11
|
+
const { height, blocksY, effectiveTreeAreaWidth, scrollY, highResScaleFactor, } = model;
|
|
12
12
|
const onScrollY = useCallback((d) => {
|
|
13
13
|
model.doScrollY(d);
|
|
14
14
|
}, [model]);
|
|
15
15
|
const { onMouseDown, onMouseUp } = useWheelScroll({ ref, onScrollY });
|
|
16
|
-
const canvasWidth =
|
|
16
|
+
const canvasWidth = effectiveTreeAreaWidth * highResScaleFactor;
|
|
17
17
|
const canvasHeight = height * highResScaleFactor;
|
|
18
18
|
const mouseoverRef = useCanvasAutorun({
|
|
19
19
|
draw: ctx => {
|
|
@@ -28,7 +28,7 @@ const TreeCanvas = observer(function ({ model }) {
|
|
|
28
28
|
return (React.createElement("div", { ref: ref, onMouseDown: onMouseDown, onMouseUp: onMouseUp, style: {
|
|
29
29
|
height,
|
|
30
30
|
position: 'relative',
|
|
31
|
-
width:
|
|
31
|
+
width: effectiveTreeAreaWidth,
|
|
32
32
|
} },
|
|
33
33
|
React.createElement("div", { style: {
|
|
34
34
|
position: 'absolute',
|
|
@@ -43,7 +43,7 @@ const TreeCanvas = observer(function ({ model }) {
|
|
|
43
43
|
position: 'absolute',
|
|
44
44
|
top: 0,
|
|
45
45
|
left: 0,
|
|
46
|
-
width:
|
|
46
|
+
width: effectiveTreeAreaWidth,
|
|
47
47
|
height,
|
|
48
48
|
zIndex: 1000,
|
|
49
49
|
pointerEvents: 'none',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,WAAW,MAAM,kBAAmB,CAAA;AAC3C,OAAO,eAAe,MAAM,sBAAuB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAI9D,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACtE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,
|
|
1
|
+
{"version":3,"file":"TreeCanvas.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,WAAW,MAAM,kBAAmB,CAAA;AAC3C,OAAO,eAAe,MAAM,sBAAuB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAI9D,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACtE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,EACJ,MAAM,EACN,OAAO,EACP,sBAAsB,EACtB,OAAO,EACP,kBAAkB,GACnB,GAAG,KAAK,CAAA;IACT,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,MAAM,WAAW,GAAG,sBAAsB,GAAG,kBAAkB,CAAA;IAC/D,MAAM,YAAY,GAAG,MAAM,GAAG,kBAAkB,CAAA;IAChD,MAAM,YAAY,GAAG,gBAAgB,CAAC;QACpC,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnB,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QACD,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAA;IAEF,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,MAAM;YACN,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,sBAAsB;SAC9B;QAID,6BACE,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,cAAc,OAAO,KAAK;gBACrC,UAAU,EAAE,WAAW;aACxB;YAEA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACpB,oBAAC,eAAe,IAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAI,CAC9D,CAAC;YACF,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI,CACzB;QACN,gCACE,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,sBAAsB;gBAC7B,MAAM;gBACN,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,MAAM;aACtB,GACD,CACE,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}
|
|
@@ -21,9 +21,9 @@ const TreeCanvasBlock = observer(function ({ model, offsetY, }) {
|
|
|
21
21
|
const [menu, setMenu] = useState();
|
|
22
22
|
const { clickMap, anchor, hitTest, onMouseMove, onMouseLeave } = useTreeHover({ model, offsetY });
|
|
23
23
|
const hovered = anchor?.value;
|
|
24
|
-
const {
|
|
25
|
-
// TreePanel clips to
|
|
26
|
-
const width =
|
|
24
|
+
const { effectiveTreeAreaWidth, blockSize, highResScaleFactor } = model;
|
|
25
|
+
// TreePanel clips to the tree area, so a wider canvas is wasted backing store
|
|
26
|
+
const width = effectiveTreeAreaWidth;
|
|
27
27
|
const height = blockSize;
|
|
28
28
|
const canvasWidth = width * highResScaleFactor;
|
|
29
29
|
const canvasHeight = height * highResScaleFactor;
|
|
@@ -76,7 +76,7 @@ const TreeCanvasBlock = observer(function ({ model, offsetY, }) {
|
|
|
76
76
|
width: hovered.maxX - hovered.minX,
|
|
77
77
|
height: hovered.maxY - hovered.minY,
|
|
78
78
|
} })) : null,
|
|
79
|
-
anchor ? (React.createElement(BaseTooltip, { clientPoint: anchor.clientPoint }, anchor.value.name)) : null));
|
|
79
|
+
anchor ? (React.createElement(BaseTooltip, { clientPoint: anchor.clientPoint }, anchor.value.label ?? anchor.value.name)) : null));
|
|
80
80
|
});
|
|
81
81
|
export default TreeCanvasBlock;
|
|
82
82
|
//# sourceMappingURL=TreeCanvasBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvasBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,WAAW,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,QAAQ,MAAM,eAAgB,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKhD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvC,KAAK,EAAE;QACL,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;KACvC;CACF,CAAC,CAAC,CAAA;AAEH,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,EACzC,KAAK,EACL,OAAO,GAIR;IACC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAkB,CAAA;IAClD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,YAAY,CAC3E,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,CAAA;IAE7B,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"TreeCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/tree/TreeCanvasBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -12,10 +12,10 @@ import { drawTreeOverview, drawTreeOverviewBox, treeOverviewImage, } from './ren
|
|
|
12
12
|
* moving across it costs are a blit and two boxes.
|
|
13
13
|
*/
|
|
14
14
|
const TreeOverview = observer(function ({ model }) {
|
|
15
|
-
const {
|
|
15
|
+
const { effectiveTreeAreaWidth, overviewHeight, highResScaleFactor } = model;
|
|
16
16
|
const theme = useTheme();
|
|
17
17
|
const [hover, setHover] = useState();
|
|
18
|
-
const width = Math.round(
|
|
18
|
+
const width = Math.round(effectiveTreeAreaWidth * highResScaleFactor);
|
|
19
19
|
const height = Math.round(overviewHeight * highResScaleFactor);
|
|
20
20
|
const ref = useCanvasAutorun({
|
|
21
21
|
draw: ctx => {
|
|
@@ -24,12 +24,17 @@ const TreeOverview = observer(function ({ model }) {
|
|
|
24
24
|
const image = treeOverviewImage({
|
|
25
25
|
model,
|
|
26
26
|
theme,
|
|
27
|
-
width:
|
|
27
|
+
width: effectiveTreeAreaWidth,
|
|
28
28
|
height: overviewHeight,
|
|
29
29
|
scale: highResScaleFactor,
|
|
30
30
|
});
|
|
31
31
|
ctx.scale(highResScaleFactor, highResScaleFactor);
|
|
32
|
-
const box = {
|
|
32
|
+
const box = {
|
|
33
|
+
model,
|
|
34
|
+
ctx,
|
|
35
|
+
width: effectiveTreeAreaWidth,
|
|
36
|
+
height: overviewHeight,
|
|
37
|
+
};
|
|
33
38
|
if (image) {
|
|
34
39
|
ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, box.width, box.height);
|
|
35
40
|
}
|
|
@@ -60,7 +65,7 @@ const TreeOverview = observer(function ({ model }) {
|
|
|
60
65
|
display: 'block',
|
|
61
66
|
flexShrink: 0,
|
|
62
67
|
cursor: 'pointer',
|
|
63
|
-
width:
|
|
68
|
+
width: effectiveTreeAreaWidth,
|
|
64
69
|
height: overviewHeight,
|
|
65
70
|
}, onMouseMove: event => {
|
|
66
71
|
const hit = model.treeOverviewHit(event.nativeEvent.offsetY);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeOverview.js","sourceRoot":"","sources":["../../../src/components/tree/TreeOverview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAIhC;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACxE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"TreeOverview.js","sourceRoot":"","sources":["../../../src/components/tree/TreeOverview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,12 @@ import React from 'react';
|
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
3
|
import TreeCanvas from './TreeCanvas.js';
|
|
4
4
|
const TreePanel = observer(function ({ model }) {
|
|
5
|
-
const {
|
|
6
|
-
return (React.createElement("div", { style: {
|
|
5
|
+
const { effectiveTreeAreaWidth } = model;
|
|
6
|
+
return (React.createElement("div", { style: {
|
|
7
|
+
overflow: 'hidden',
|
|
8
|
+
flexShrink: 0,
|
|
9
|
+
width: effectiveTreeAreaWidth,
|
|
10
|
+
} },
|
|
7
11
|
React.createElement(TreeCanvas, { model: model })));
|
|
8
12
|
});
|
|
9
13
|
export default TreePanel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreePanel.js","sourceRoot":"","sources":["../../../src/components/tree/TreePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,UAAU,MAAM,iBAAkB,CAAA;AAIzC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACrE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"TreePanel.js","sourceRoot":"","sources":["../../../src/components/tree/TreePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,UAAU,MAAM,iBAAkB,CAAA;AAIzC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACrE,MAAM,EAAE,sBAAsB,EAAE,GAAG,KAAK,CAAA;IACxC,OAAO,CACL,6BACE,KAAK,EAAE;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,sBAAsB;SAC9B;QAED,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CACxB,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,SAAS,CAAA"}
|
|
@@ -8,9 +8,9 @@ import ScaleBarSVG from './ScaleBarSVG.js';
|
|
|
8
8
|
// scale bar: without one the branch lengths are drawn to a scale nothing
|
|
9
9
|
// states.
|
|
10
10
|
const TreeRuler = observer(({ model }) => {
|
|
11
|
-
const {
|
|
11
|
+
const { effectiveTreeAreaWidth, marginLeft, treeScaleBar: bar } = model;
|
|
12
12
|
const theme = useTheme();
|
|
13
|
-
return (React.createElement("div", { style: { flexShrink: 0, width:
|
|
13
|
+
return (React.createElement("div", { style: { flexShrink: 0, width: effectiveTreeAreaWidth } }, bar ? (React.createElement("svg", { width: effectiveTreeAreaWidth, height: h, style: { display: 'block' } },
|
|
14
14
|
React.createElement(ScaleBarSVG, { bar: bar, marginLeft: marginLeft, y: h, color: theme.palette.text.primary }))) : null));
|
|
15
15
|
});
|
|
16
16
|
export default TreeRuler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeRuler.js","sourceRoot":"","sources":["../../../src/components/tree/TreeRuler.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,kBAAkB,IAAI,CAAC,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,WAAW,MAAM,kBAAmB,CAAA;AAI3C,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,UAAU;AACV,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAA2B,EAAE,EAAE;IAChE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"TreeRuler.js","sourceRoot":"","sources":["../../../src/components/tree/TreeRuler.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,kBAAkB,IAAI,CAAC,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,WAAW,MAAM,kBAAmB,CAAA;AAI3C,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,UAAU;AACV,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAA2B,EAAE,EAAE;IAChE,MAAM,EAAE,sBAAsB,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;IACvE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IAExB,OAAO,CACL,6BAAK,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,IACzD,GAAG,CAAC,CAAC,CAAC,CACL,6BACE,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;QAE3B,oBAAC,WAAW,IACV,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,CAAC,EAAE,CAAC,EACJ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GACjC,CACE,CACP,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,SAAS,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { ResolvedClade } from '../../types.ts';
|
|
1
|
+
import type { Clade, ResolvedClade } from '../../types.ts';
|
|
2
2
|
export declare const bracketBarWidth = 3;
|
|
3
3
|
export declare const bracketGap = 4;
|
|
4
4
|
export declare const maxCladeGutterWidth = 140;
|
|
5
5
|
/** whether a clade draws in the gutter: a bracket, or a highlight with a label */
|
|
6
|
-
export declare function cladeInGutter(clade:
|
|
6
|
+
export declare function cladeInGutter(clade: Pick<Clade, 'mark' | 'label'>): boolean;
|
|
7
7
|
/** the pixel height of the rows a clade covers */
|
|
8
8
|
export declare function cladeHeight(clade: ResolvedClade, rowHeight: number): number;
|
|
9
9
|
/**
|
|
@@ -12,14 +12,12 @@ export declare function cladeHeight(clade: ResolvedClade, rowHeight: number): nu
|
|
|
12
12
|
*/
|
|
13
13
|
export declare function cladeLabelHorizontal(clade: ResolvedClade, rowHeight: number, fontSize: number): boolean;
|
|
14
14
|
/** the px between the left edge of the gutter and the label's own column */
|
|
15
|
-
export declare function cladeLabelOffset(clade:
|
|
15
|
+
export declare function cladeLabelOffset(clade: Pick<Clade, 'mark'>): number;
|
|
16
16
|
/**
|
|
17
17
|
* The gutter the bracket mark needs at the right of the tree area: the bar plus
|
|
18
|
-
* the widest label
|
|
19
|
-
* most maxCladeGutterWidth.
|
|
18
|
+
* the widest label read across at labelFitFontSize, zero where no clade draws
|
|
19
|
+
* there, and at most maxCladeGutterWidth. The records size it, so a zoom, a
|
|
20
|
+
* collapse or a focus leaves it as it is, and a renderer clips a label that
|
|
21
|
+
* outgrows it.
|
|
20
22
|
*/
|
|
21
|
-
export declare function cladeGutterWidth(
|
|
22
|
-
clades: ResolvedClade[];
|
|
23
|
-
rowHeight: number;
|
|
24
|
-
fontSize: number;
|
|
25
|
-
}): number;
|
|
23
|
+
export declare function cladeGutterWidth(clades: Pick<Clade, 'mark' | 'label'>[]): number;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { labelFitFontSize } from '../../constants.js';
|
|
1
2
|
import { measureTextCanvas } from '../../measureTextCanvas.js';
|
|
2
3
|
// The bar of the bracket mark and the space around it, in px.
|
|
3
4
|
export const bracketBarWidth = 3;
|
|
@@ -28,19 +29,19 @@ export function cladeLabelOffset(clade) {
|
|
|
28
29
|
}
|
|
29
30
|
/**
|
|
30
31
|
* The gutter the bracket mark needs at the right of the tree area: the bar plus
|
|
31
|
-
* the widest label
|
|
32
|
-
* most maxCladeGutterWidth.
|
|
32
|
+
* the widest label read across at labelFitFontSize, zero where no clade draws
|
|
33
|
+
* there, and at most maxCladeGutterWidth. The records size it, so a zoom, a
|
|
34
|
+
* collapse or a focus leaves it as it is, and a renderer clips a label that
|
|
35
|
+
* outgrows it.
|
|
33
36
|
*/
|
|
34
|
-
export function cladeGutterWidth(
|
|
37
|
+
export function cladeGutterWidth(clades) {
|
|
35
38
|
let widest = 0;
|
|
36
39
|
for (const clade of clades) {
|
|
37
40
|
if (!cladeInGutter(clade)) {
|
|
38
41
|
continue;
|
|
39
42
|
}
|
|
40
43
|
const text = clade.label
|
|
41
|
-
?
|
|
42
|
-
? measureTextCanvas(clade.label, fontSize)
|
|
43
|
-
: fontSize
|
|
44
|
+
? measureTextCanvas(clade.label, labelFitFontSize)
|
|
44
45
|
: 0;
|
|
45
46
|
widest = Math.max(widest, cladeLabelOffset(clade) + text + bracketGap);
|
|
46
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cladeBrackets.js","sourceRoot":"","sources":["../../../src/components/tree/cladeBrackets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAI9D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAA;AAE3B,8EAA8E;AAC9E,kDAAkD;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAEtC,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"cladeBrackets.js","sourceRoot":"","sources":["../../../src/components/tree/cladeBrackets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAI9D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAA;AAE3B,8EAA8E;AAC9E,kDAAkD;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAEtC,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAoC;IAChE,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAC1E,CAAA;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,WAAW,CAAC,KAAoB,EAAE,SAAiB;IACjE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAA;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAoB,EACpB,SAAiB,EACjB,QAAgB;IAEhB,OAAO,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,QAAQ,CAAA;AAClD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,gBAAgB,CAAC,KAA0B;IACzD,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS;QAC7B,CAAC,CAAC,UAAU,GAAG,eAAe,GAAG,UAAU;QAC3C,CAAC,CAAC,UAAU,CAAA;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAuC;IACtE,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK;YACtB,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC;YAClD,CAAC,CAAC,CAAC,CAAA;QACL,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAA;IACxE,CAAC;IACD,4EAA4E;IAC5E,4CAA4C;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickMap.js","sourceRoot":"","sources":["../../../src/components/tree/clickMap.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"clickMap.js","sourceRoot":"","sources":["../../../src/components/tree/clickMap.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAqB/B,uEAAuE;AACvE,+EAA+E;AAC/E,6DAA6D;AAC7D,MAAM,OAAO,aAAa;IAChB,QAAQ,GAAoB,IAAI,CAAA;IAChC,OAAO,GAAiB,EAAE,CAAA;IAElC,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,KAAiB;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACjD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACnE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAQ;QACb,OAAO,CACL,IAAI,CAAC,QAAQ;YACX,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;aAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CACpC,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const ellipsis = '…';
|
|
2
|
+
/**
|
|
3
|
+
* the longest prefix of `text`, plus an ellipsis, that measures at most
|
|
4
|
+
* `room` px
|
|
5
|
+
*/
|
|
6
|
+
export function ellipsize(measure, text, room) {
|
|
7
|
+
const width = measure(text);
|
|
8
|
+
if (width <= room) {
|
|
9
|
+
return { text, width };
|
|
10
|
+
}
|
|
11
|
+
for (let n = Math.floor((text.length * room) / width); n > 0; n--) {
|
|
12
|
+
const truncated = text.slice(0, n).trimEnd() + ellipsis;
|
|
13
|
+
const truncatedWidth = measure(truncated);
|
|
14
|
+
if (truncatedWidth <= room) {
|
|
15
|
+
return { text: truncated, width: truncatedWidth };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return { text: '', width: 0 };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ellipsize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ellipsize.js","sourceRoot":"","sources":["../../../src/components/tree/ellipsize.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,GAAG,CAAA;AAEpB;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,OAAiC,EACjC,IAAY,EACZ,IAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAA;QACvD,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAA;QACnD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;AAC/B,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { getVisibleLeaves } from '../getVisibleLeaves.js';
|
|
|
4
4
|
import { drawHighlightLabel, highlightLabelHeight, highlightRowFill, } from '../msa/renderHighlights.js';
|
|
5
5
|
import { referenceColor } from '../overlayColors.js';
|
|
6
6
|
import { bracketBarWidth, bracketGap } from './cladeBrackets.js';
|
|
7
|
+
import { ellipsize } from './ellipsize.js';
|
|
7
8
|
const radius = 2.5;
|
|
8
9
|
const d = radius * 2;
|
|
9
10
|
// How far outside a block a node's row-center can sit and still draw into it: a
|
|
@@ -219,7 +220,8 @@ function renderNodeLabels({ ctx, theme, offsetY, model, tipX, maxDepthToLeaf, bl
|
|
|
219
220
|
setFontSize(ctx, fontSize);
|
|
220
221
|
}
|
|
221
222
|
function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, tipX, maxDepthToLeaf, blockSizeYOverride, collapsedSet, }) {
|
|
222
|
-
const { fontSize, showBranchLenEffective: showBranchLen, tipLabelColors, blockSize, labelsAlignRight, drawTree, treeAreaWidthMinusMargin, marginLeft, noTree,
|
|
223
|
+
const { fontSize, showBranchLenEffective: showBranchLen, tipLabelColors, blockSize, labelsAlignRight, drawTree, treeAreaWidthMinusMargin, marginLeft, noTree, } = model;
|
|
224
|
+
const treeDrawn = drawTree && !noTree;
|
|
223
225
|
const by = blockSizeYOverride ?? blockSize;
|
|
224
226
|
// labels only exist for leaves, which are laid out top to bottom, so take the
|
|
225
227
|
// same slice the MSA renderer uses instead of walking every tip per block
|
|
@@ -245,19 +247,18 @@ function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, tipX, maxDepth
|
|
|
245
247
|
// fontSize/4 below the row center, the baseline the alignment letters
|
|
246
248
|
// share
|
|
247
249
|
const yp = y + fontSize / 4;
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
const
|
|
254
|
-
? ctx.measureText(displayName).width
|
|
255
|
-
: measured * labelWidthScale;
|
|
250
|
+
const xp = treeDrawn
|
|
251
|
+
? (getNodeX(node, showBranchLen, tipX, maxDepthToLeaf) ?? 0)
|
|
252
|
+
: 0;
|
|
253
|
+
const fit = (room) => ellipsize(text => ctx.measureText(text).width, displayName, room);
|
|
254
|
+
// a label cut to nothing still gets a click box the font size wide
|
|
255
|
+
const boxWidth = (width) => Math.max(width, fontSize);
|
|
256
256
|
ctx.fillStyle = tipLabelColors?.get(name) ?? theme.palette.text.primary;
|
|
257
257
|
if (labelsAlignRight) {
|
|
258
258
|
const smallPadding = 2;
|
|
259
259
|
const offset = treeAreaWidthMinusMargin - smallPadding;
|
|
260
|
-
|
|
260
|
+
const { text, width } = fit(offset - (treeDrawn ? xp + radius + 2 + smallPadding : 0));
|
|
261
|
+
if (treeDrawn) {
|
|
261
262
|
// beginPath is load-bearing: without it every leader line re-strokes
|
|
262
263
|
// all the ones before it, which is quadratic in the label count
|
|
263
264
|
ctx.beginPath();
|
|
@@ -265,29 +266,32 @@ function renderTreeLabels({ theme, model, offsetY, ctx, clickMap, tipX, maxDepth
|
|
|
265
266
|
ctx.lineTo(offset - smallPadding - width, y);
|
|
266
267
|
ctx.stroke();
|
|
267
268
|
}
|
|
268
|
-
ctx.fillText(
|
|
269
|
+
ctx.fillText(text, offset, yp);
|
|
269
270
|
// everything here is drawn under translate(marginLeft), so the click box
|
|
270
271
|
// has to be the text's own right edge in that same space -- taking
|
|
271
|
-
//
|
|
272
|
+
// the tree area width instead put the target smallPadding off the label
|
|
272
273
|
const labelRight = offset + marginLeft;
|
|
273
274
|
clickMap?.insert({
|
|
274
|
-
minX: labelRight - width,
|
|
275
|
+
minX: labelRight - boxWidth(width),
|
|
275
276
|
maxX: labelRight,
|
|
276
277
|
minY: yp - emHeight,
|
|
277
278
|
maxY: yp,
|
|
278
279
|
name,
|
|
280
|
+
label: displayName,
|
|
279
281
|
id,
|
|
280
282
|
});
|
|
281
283
|
}
|
|
282
284
|
else {
|
|
283
|
-
const labelX =
|
|
284
|
-
|
|
285
|
+
const labelX = treeDrawn ? xp + d : 2;
|
|
286
|
+
const { text, width } = fit(treeAreaWidthMinusMargin - labelX);
|
|
287
|
+
ctx.fillText(text, labelX, yp);
|
|
285
288
|
clickMap?.insert({
|
|
286
289
|
minX: labelX + marginLeft,
|
|
287
|
-
maxX: labelX + width + marginLeft,
|
|
290
|
+
maxX: labelX + boxWidth(width) + marginLeft,
|
|
288
291
|
minY: yp - emHeight,
|
|
289
292
|
maxY: yp,
|
|
290
293
|
name,
|
|
294
|
+
label: displayName,
|
|
291
295
|
id,
|
|
292
296
|
});
|
|
293
297
|
}
|
|
@@ -312,9 +316,9 @@ function firstRow(rowIndices) {
|
|
|
312
316
|
// branches. A clade spanning hundreds of rows crosses several blocks, so each
|
|
313
317
|
// block draws the whole rectangle and the canvas takes the part that is its.
|
|
314
318
|
function renderCladeHighlights({ ctx, model, offsetY, tipX, maxDepthToLeaf, blockSizeYOverride, }) {
|
|
315
|
-
const { resolvedClades, hierarchy, showBranchLenEffective: showBranchLen, rowHeight,
|
|
319
|
+
const { resolvedClades, hierarchy, showBranchLenEffective: showBranchLen, rowHeight, effectiveTreeAreaWidth, marginLeft, blockSize, } = model;
|
|
316
320
|
const by = blockSizeYOverride ?? blockSize;
|
|
317
|
-
const right =
|
|
321
|
+
const right = effectiveTreeAreaWidth - marginLeft;
|
|
318
322
|
for (const { rows, color, mark } of resolvedClades) {
|
|
319
323
|
if (mark !== 'highlight') {
|
|
320
324
|
continue;
|
|
@@ -334,12 +338,12 @@ function renderCladeHighlights({ ctx, model, offsetY, tipX, maxDepthToLeaf, bloc
|
|
|
334
338
|
// right of the tree area. The label beside it is DOM text on screen and a
|
|
335
339
|
// <text> in the export, since the canvas layer has no rotation.
|
|
336
340
|
function renderCladeBrackets({ ctx, model, theme, offsetY, blockSizeYOverride, }) {
|
|
337
|
-
const { resolvedClades, cladeGutterWidth, rowHeight,
|
|
341
|
+
const { resolvedClades, cladeGutterWidth, rowHeight, effectiveTreeAreaWidth, marginLeft, blockSize, } = model;
|
|
338
342
|
if (cladeGutterWidth === 0) {
|
|
339
343
|
return;
|
|
340
344
|
}
|
|
341
345
|
const by = blockSizeYOverride ?? blockSize;
|
|
342
|
-
const x =
|
|
346
|
+
const x = effectiveTreeAreaWidth -
|
|
343
347
|
marginLeft -
|
|
344
348
|
cladeGutterWidth +
|
|
345
349
|
bracketGap +
|
|
@@ -364,12 +368,12 @@ function renderCladeBrackets({ ctx, model, theme, offsetY, blockSizeYOverride, }
|
|
|
364
368
|
// washed across the tree area under the labels, with each set's label in the
|
|
365
369
|
// gutter at its first row
|
|
366
370
|
function renderRowHighlights({ ctx, model, theme, offsetY, blockSizeYOverride, }) {
|
|
367
|
-
const { resolvedHighlights, rowTints, referenceRowIndex, rowHeight,
|
|
371
|
+
const { resolvedHighlights, rowTints, referenceRowIndex, rowHeight, effectiveTreeAreaWidth, marginLeft, blockSize, } = model;
|
|
368
372
|
const by = blockSizeYOverride ?? blockSize;
|
|
369
373
|
const pad = blockPad(model);
|
|
370
374
|
const placed = [];
|
|
371
375
|
const fillRow = (index) => {
|
|
372
|
-
ctx.fillRect(-marginLeft, index * rowHeight,
|
|
376
|
+
ctx.fillRect(-marginLeft, index * rowHeight, effectiveTreeAreaWidth, rowHeight);
|
|
373
377
|
};
|
|
374
378
|
if (rowTints) {
|
|
375
379
|
const top = Math.max(0, Math.floor((offsetY - pad) / rowHeight));
|
|
@@ -403,8 +407,8 @@ function renderRowHighlights({ ctx, model, theme, offsetY, blockSizeYOverride, }
|
|
|
403
407
|
label,
|
|
404
408
|
x: -marginLeft + 2,
|
|
405
409
|
y: first * rowHeight,
|
|
406
|
-
spanWidth:
|
|
407
|
-
bounds: { min: -marginLeft, max:
|
|
410
|
+
spanWidth: effectiveTreeAreaWidth,
|
|
411
|
+
bounds: { min: -marginLeft, max: effectiveTreeAreaWidth - marginLeft },
|
|
408
412
|
placed,
|
|
409
413
|
});
|
|
410
414
|
}
|
|
@@ -424,13 +428,13 @@ export function renderTreeCanvas({ model, clickMap, ctx, offsetY, theme, highRes
|
|
|
424
428
|
setFontSize(ctx, fontSize);
|
|
425
429
|
// memoized on the model and shared across the tree/bubble/label passes (and
|
|
426
430
|
// across all tree blocks) rather than re-traversing the hierarchy in each
|
|
427
|
-
const { maxBranchLength, maxDepthToLeaf, showBranchLenEffective,
|
|
431
|
+
const { maxBranchLength, maxDepthToLeaf, showBranchLenEffective, effectiveTreeWidth, } = model;
|
|
428
432
|
// pixel x of the tips. A phylogram scales branch lengths so the longest
|
|
429
433
|
// root-to-tip path lands at maxBranchLength; a cladogram ignores lengths and
|
|
430
434
|
// spreads topological depth across the whole tree area instead. Reusing
|
|
431
435
|
// maxBranchLength for the cladogram would pin every node to x=0 for a tree
|
|
432
436
|
// with no branch lengths -- which is exactly what forces cladogram mode.
|
|
433
|
-
const tipX = showBranchLenEffective ? maxBranchLength :
|
|
437
|
+
const tipX = showBranchLenEffective ? maxBranchLength : effectiveTreeWidth;
|
|
434
438
|
// built once for all three passes: each of them asks about a different node on
|
|
435
439
|
// every block of every redraw, and `collapsed` is a list
|
|
436
440
|
const collapsedSet = new Set(model.collapsed);
|