@platforma-sdk/ui-vue 1.42.53 → 1.43.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 (84) hide show
  1. package/.turbo/turbo-build.log +213 -207
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +14 -0
  4. package/dist/AgGridVue/useAgGridOptions.js +2 -3
  5. package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
  6. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js +6 -0
  7. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js.map +1 -0
  8. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js +5 -0
  9. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js.map +1 -0
  10. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +2 -3
  11. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
  12. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +11 -12
  13. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
  14. package/dist/components/PlAgRowNumHeader.vue.js +8 -9
  15. package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
  16. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.d.ts +1 -0
  17. package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js +48 -46
  18. package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js.map +1 -1
  19. package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js +5 -7
  20. package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js.map +1 -1
  21. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +14 -13
  22. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js.map +1 -1
  23. package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +9 -8
  24. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +16 -9
  25. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +117 -85
  26. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +1 -1
  27. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +25 -18
  28. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +1 -1
  29. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.d.ts +8 -0
  30. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js +10 -0
  31. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js.map +1 -0
  32. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js +77 -0
  33. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js.map +1 -0
  34. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js +9 -0
  35. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js.map +1 -0
  36. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +26 -18
  37. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +119 -120
  38. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
  39. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js +7 -124
  40. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js.map +1 -1
  41. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js +124 -2
  42. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js.map +1 -1
  43. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js +9 -0
  44. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js.map +1 -0
  45. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +90 -90
  46. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +1 -1
  47. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js +9 -7
  48. package/dist/components/PlMultiSequenceAlignment/cell-size.d.ts +4 -0
  49. package/dist/components/PlMultiSequenceAlignment/cell-size.js +8 -0
  50. package/dist/components/PlMultiSequenceAlignment/cell-size.js.map +1 -0
  51. package/dist/components/PlMultiSequenceAlignment/data.d.ts +15 -10
  52. package/dist/components/PlMultiSequenceAlignment/data.js +309 -202
  53. package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
  54. package/dist/components/PlMultiSequenceAlignment/markup.js +9 -7
  55. package/dist/components/PlMultiSequenceAlignment/markup.js.map +1 -1
  56. package/dist/components/PlMultiSequenceAlignment/migrations.js +15 -13
  57. package/dist/components/PlMultiSequenceAlignment/migrations.js.map +1 -1
  58. package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.d.ts +6 -0
  59. package/dist/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.d.ts +7 -0
  60. package/dist/components/PlMultiSequenceAlignment/settings.js +3 -4
  61. package/dist/components/PlMultiSequenceAlignment/settings.js.map +1 -1
  62. package/dist/index.js +25 -27
  63. package/dist/index.js.map +1 -1
  64. package/dist/lib.d.ts +1 -2
  65. package/package.json +6 -6
  66. package/src/components/PlMultiSequenceAlignment/Consensus.vue +38 -39
  67. package/src/components/PlMultiSequenceAlignment/Legend.vue +9 -9
  68. package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +222 -126
  69. package/src/components/PlMultiSequenceAlignment/PhylogeneticTree.vue +110 -0
  70. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +28 -22
  71. package/src/components/PlMultiSequenceAlignment/SeqLogo.vue +77 -69
  72. package/src/components/PlMultiSequenceAlignment/Toolbar.vue +47 -39
  73. package/src/components/PlMultiSequenceAlignment/cell-size.ts +4 -0
  74. package/src/components/PlMultiSequenceAlignment/data.ts +361 -149
  75. package/src/components/PlMultiSequenceAlignment/markup.ts +10 -8
  76. package/src/components/PlMultiSequenceAlignment/migrations.ts +6 -1
  77. package/src/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.ts +54 -0
  78. package/src/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.ts +89 -0
  79. package/src/components/PlMultiSequenceAlignment/settings.ts +1 -2
  80. package/src/lib.ts +1 -3
  81. package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.d.ts +0 -7
  82. package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.js +0 -51
  83. package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.js.map +0 -1
  84. package/src/components/PlMultiSequenceAlignment/multi-sequence-alignment.ts +0 -101
@@ -1,106 +1,138 @@
1
- import { defineComponent as I, useCssVars as R, computed as f, useTemplateRef as N, createElementBlock as l, openBlock as s, normalizeClass as n, createElementVNode as t, createBlock as g, createCommentVNode as a, Fragment as i, renderList as d, normalizeStyle as b, toDisplayString as m } from "vue";
2
- import { useObjectUrl as L } from "@vueuse/core";
3
- import S from "./Consensus.vue.js";
4
- import V from "./Legend.vue.js";
5
- import z from "./SeqLogo.vue.js";
6
- const A = /* @__PURE__ */ I({
1
+ import { defineComponent as M, useCssVars as U, unref as n, computed as C, useCssModule as D, useTemplateRef as b, ref as I, onBeforeMount as E, onBeforeUnmount as A, watch as F, onWatcherCleanup as H, createElementBlock as c, openBlock as t, normalizeClass as l, createElementVNode as i, createBlock as f, createCommentVNode as u, Fragment as d, renderList as v, toDisplayString as y, withDirectives as O, vShow as P, normalizeStyle as W } from "vue";
2
+ import { cellSize as k } from "./cell-size.js";
3
+ import $ from "./Consensus.vue.js";
4
+ import j from "./Legend.vue.js";
5
+ import G from "./PhylogeneticTree.vue.js";
6
+ import J from "./SeqLogo.vue.js";
7
+ const ne = /* @__PURE__ */ M({
7
8
  __name: "MultiSequenceAlignmentView",
8
9
  props: {
9
10
  sequences: {},
10
- sequenceNames: {},
11
- labelRows: {},
12
- residueCounts: {},
13
- highlightImage: {},
11
+ labels: {},
12
+ highlightLegend: {},
13
+ phylogeneticTree: {},
14
14
  widgets: {}
15
15
  },
16
- setup(c, { expose: q }) {
17
- R((e) => ({
18
- "861533c4": k.value
16
+ setup(R, { expose: B }) {
17
+ U((o) => ({
18
+ e405b06c: n(N),
19
+ "0c44921e": s.sequences.length,
20
+ "6aab37c6": _.value,
21
+ "2e72cab4": s.labels.length,
22
+ "1ad5abe9": V.value,
23
+ "3c16a76c": x.value,
24
+ "1406981e": n(T)
19
25
  }));
20
- const $ = N("rootRef");
21
- q({ rootEl: $ });
22
- const h = L(() => {
23
- var e;
24
- return (e = c.highlightImage) == null ? void 0 : e.blob;
25
- }), k = f(
26
- () => h.value ? `url('${h.value}')` : "none"
27
- ), C = f(
28
- () => {
29
- var e;
30
- return (e = c.sequences.at(0)) == null ? void 0 : e.split(" ").map(({ length: y }) => y);
31
- }
26
+ const s = R, r = D(), L = b("rootRef");
27
+ B({ rootEl: L });
28
+ const _ = C(() => {
29
+ var o;
30
+ return ((o = s.sequences.at(0)) == null ? void 0 : o.rows.length) ?? 0;
31
+ }), T = CSS.px(k.inline).toString(), N = CSS.px(k.block).toString(), w = b("referenceCell"), h = I(), q = b("corner"), z = I(), x = C(
32
+ () => h.value ? CSS.px(k.inline - h.value).toString() : void 0
33
+ ), V = C(
34
+ () => CSS.px(z.value ?? 0).toString()
32
35
  );
33
- return (e, y) => {
34
- var p, v;
35
- return s(), l("div", {
36
- ref: "rootRef",
37
- class: n(e.$style.root)
36
+ let g;
37
+ E(() => {
38
+ const o = (a) => {
39
+ var e;
40
+ return (e = a.borderBoxSize.find(Boolean)) == null ? void 0 : e.inlineSize;
41
+ };
42
+ g = new ResizeObserver((a) => {
43
+ for (const e of a)
44
+ switch (e.target) {
45
+ case w.value:
46
+ h.value = o(e);
47
+ break;
48
+ case q.value:
49
+ z.value = o(e);
50
+ break;
51
+ }
52
+ });
53
+ }), A(() => {
54
+ g.disconnect();
55
+ });
56
+ for (const o of [w, q])
57
+ F(o, (a, e) => {
58
+ a && g.observe(a), H(() => {
59
+ e && g.unobserve(e);
60
+ });
61
+ });
62
+ return (o, a) => (t(), c("div", {
63
+ ref: "rootRef",
64
+ class: l(n(r).root)
65
+ }, [
66
+ i("div", {
67
+ ref: "referenceCell",
68
+ class: l(n(r).referenceCell)
69
+ }, "x", 2),
70
+ i("div", {
71
+ class: l(["pl-scrollable", n(r).table])
38
72
  }, [
39
- t("div", {
40
- class: n(["pl-scrollable", e.$style.table])
73
+ i("div", {
74
+ class: l(n(r).sidebar)
41
75
  }, [
42
- t("div", {
43
- class: n(e.$style.corner)
76
+ s.widgets.includes("tree") && s.phylogeneticTree ? (t(), f(G, {
77
+ key: 0,
78
+ tree: s.phylogeneticTree,
79
+ class: l(n(r).phylogeneticTree)
80
+ }, null, 8, ["tree", "class"])) : u("", !0),
81
+ i("div", {
82
+ class: l(n(r).labels)
44
83
  }, [
45
- t("div", {
46
- class: n(e.$style["label-scroll-indicator"])
47
- }, null, 2)
48
- ], 2),
49
- t("div", {
50
- class: n(e.$style.header)
84
+ (t(!0), c(d, null, v(s.labels, ({ rows: e }, m) => (t(), c(d, { key: m }, [
85
+ (t(!0), c(d, null, v(e, (p, S) => (t(), c("div", { key: S }, y(p), 1))), 128))
86
+ ], 64))), 128))
87
+ ], 2)
88
+ ], 2),
89
+ x.value !== void 0 ? (t(!0), c(d, { key: 0 }, v(s.sequences, (e, m) => (t(), c("div", {
90
+ key: m,
91
+ class: l(n(r).sequenceColumn)
92
+ }, [
93
+ i("div", {
94
+ class: l(n(r).sequenceHeader)
51
95
  }, [
52
- e.sequenceNames.length > 1 ? (s(), l("div", {
96
+ O(i("div", {
97
+ class: l(n(r).sequenceName)
98
+ }, y(e.name), 3), [
99
+ [P, s.sequences.length > 1]
100
+ ]),
101
+ s.widgets.includes("consensus") ? (t(), f($, {
53
102
  key: 0,
54
- class: n(e.$style["sequence-names"])
55
- }, [
56
- (s(!0), l(i, null, d(e.sequenceNames, (u, r) => {
57
- var o;
58
- return s(), l("span", {
59
- key: r,
60
- style: b({
61
- inlineSize: (((o = C.value) == null ? void 0 : o.at(r)) ?? 0) * 20 + "px"
62
- })
63
- }, m(u), 5);
64
- }), 128))
65
- ], 2)) : a("", !0),
66
- e.widgets.includes("consensus") ? (s(), g(S, {
103
+ "residue-counts": e.residueCounts,
104
+ "labels-class": n(r).sequenceRow
105
+ }, null, 8, ["residue-counts", "labels-class"])) : u("", !0),
106
+ s.widgets.includes("seqLogo") ? (t(), f(J, {
67
107
  key: 1,
68
108
  "residue-counts": e.residueCounts
69
- }, null, 8, ["residue-counts"])) : a("", !0),
70
- e.widgets.includes("seqLogo") ? (s(), g(z, {
71
- key: 2,
72
- "residue-counts": e.residueCounts
73
- }, null, 8, ["residue-counts"])) : a("", !0)
74
- ], 2),
75
- t("div", {
76
- class: n(e.$style.labels)
77
- }, [
78
- t("div", {
79
- class: n(e.$style["labels-grid"])
80
- }, [
81
- (s(!0), l(i, null, d(e.labelRows, (u, r) => (s(), l(i, null, [
82
- (s(!0), l(i, null, d(u, (o, w) => (s(), l("div", {
83
- key: w,
84
- style: b({ gridRow: r + 1 })
85
- }, m(o), 5))), 128))
86
- ], 64))), 256))
87
- ], 2)
109
+ }, null, 8, ["residue-counts"])) : u("", !0)
88
110
  ], 2),
89
- t("div", {
90
- class: n(e.$style.sequences)
111
+ i("div", {
112
+ class: l(n(r).sequenceRowsContainer),
113
+ style: W({
114
+ backgroundImage: e.highlightImageUrl ? `url(${e.highlightImageUrl})` : void 0
115
+ })
91
116
  }, [
92
- (s(!0), l(i, null, d(e.sequences, (u, r) => (s(), l("div", { key: r }, m(u), 1))), 128))
93
- ], 2)
94
- ], 2),
95
- (p = e.widgets) != null && p.includes("legend") && ((v = e.highlightImage) != null && v.legend) ? (s(), g(V, {
96
- key: 0,
97
- legend: e.highlightImage.legend
98
- }, null, 8, ["legend"])) : a("", !0)
99
- ], 2);
100
- };
117
+ (t(!0), c(d, null, v(e.rows, (p, S) => (t(), c("div", {
118
+ key: S,
119
+ class: l(n(r).sequenceRow)
120
+ }, y(p), 3))), 128))
121
+ ], 6)
122
+ ], 2))), 128)) : u("", !0),
123
+ i("div", {
124
+ ref: "corner",
125
+ class: l(n(r).corner)
126
+ }, null, 2)
127
+ ], 2),
128
+ s.widgets.includes("legend") && s.highlightLegend ? (t(), f(j, {
129
+ key: 0,
130
+ legend: s.highlightLegend
131
+ }, null, 8, ["legend"])) : u("", !0)
132
+ ], 2));
101
133
  }
102
134
  });
103
135
  export {
104
- A as default
136
+ ne as default
105
137
  };
106
138
  //# sourceMappingURL=MultiSequenceAlignmentView.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSequenceAlignmentView.vue2.js","sources":["../../../src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useObjectUrl } from '@vueuse/core';\nimport { computed, useTemplateRef } from 'vue';\nimport Consensus from './Consensus.vue';\nimport Legend from './Legend.vue';\nimport SeqLogo from './SeqLogo.vue';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst { sequences, highlightImage } = defineProps<{\n sequences: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage: {\n blob: Blob;\n legend: HighlightLegend;\n } | undefined;\n widgets: ('consensus' | 'seqLogo' | 'legend')[];\n}>();\n\nconst rootEl = useTemplateRef('rootRef');\ndefineExpose({ rootEl });\n\nconst highlightImageObjectUrl = useObjectUrl(() => highlightImage?.blob);\nconst highlightImageCssUrl = computed(() =>\n highlightImageObjectUrl.value\n ? `url('${highlightImageObjectUrl.value}')`\n : 'none',\n);\n\nconst sequenceLengths = computed(() =>\n sequences.at(0)?.split(' ').map(({ length }) => length),\n);\n</script>\n\n<template>\n <div ref=\"rootRef\" :class=\"$style.root\">\n <div :class=\"['pl-scrollable', $style.table]\">\n <div :class=\"$style.corner\">\n <div :class=\"$style['label-scroll-indicator']\" />\n </div>\n <div :class=\"$style.header\">\n <div v-if=\"sequenceNames.length > 1\" :class=\"$style['sequence-names']\">\n <span\n v-for=\"(name, index) of sequenceNames\"\n :key=\"index\"\n :style=\"{\n inlineSize: ((sequenceLengths?.at(index) ?? 0) * 20)\n + 'px',\n }\"\n >{{ name }}</span>\n </div>\n <Consensus v-if=\"widgets.includes('consensus')\" :residue-counts />\n <SeqLogo v-if=\"widgets.includes('seqLogo')\" :residue-counts />\n </div>\n <div :class=\"$style.labels\">\n <div :class=\"$style['labels-grid']\">\n <template v-for=\"(labelRow, rowIndex) of labelRows\">\n <div\n v-for=\"(label, labelIndex) of labelRow\"\n :key=\"labelIndex\"\n :style=\"{ gridRow: rowIndex + 1 }\"\n >\n {{ label }}\n </div>\n </template>\n </div>\n </div>\n <div :class=\"$style.sequences\">\n <div\n v-for=\"(sequence, index) of sequences\"\n :key=\"index\"\n >\n {{ sequence }}\n </div>\n </div>\n </div>\n <Legend\n v-if=\"widgets?.includes('legend') && highlightImage?.legend\"\n :legend=\"highlightImage.legend\"\n />\n </div>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-block-size: 0;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n\n &[data-pre-print] {\n .table {\n container-type: unset;\n }\n .labels {\n max-inline-size: unset;\n }\n }\n}\n\n.table {\n container-type: inline-size;\n display: grid;\n grid-template-areas:\n \"corner header\"\n \"labels sequences\";\n justify-content: start;\n timeline-scope: --msa-labels-scroll;\n @media print {\n overflow: visible;\n }\n}\n\n.corner {\n grid-area: corner;\n background-color: #fff;\n position: sticky;\n inset-inline-start: 0;\n inset-block-start: 0;\n z-index: 2;\n}\n\n.label-scroll-indicator {\n position: absolute;\n inset-inline-end: 0;\n block-size: 100cqb;\n inline-size: 8px;\n animation-name: hide;\n animation-timeline: --msa-labels-scroll;\n visibility: hidden;\n background: #fff;\n box-shadow: -4px 0 4px -2px rgba(0, 0, 0, 0.10);\n}\n\n.header {\n grid-area: header;\n background-color: #fff;\n position: sticky;\n inset-block-start: 0;\n z-index: 1;\n}\n\n.sequence-names {\n display: flex;\n font-weight: 700;\n line-height: 20px;\n margin-block-end: 4px;\n gap: 20px;\n}\n\n.labels {\n grid-area: labels;\n background-color: #fff;\n position: sticky;\n inset-inline-start: 0;\n z-index: 1;\n inline-size: max-content;\n max-inline-size: 30cqi;\n overflow: scroll;\n scrollbar-width: none;\n overscroll-behavior-inline: none;\n scroll-timeline: --msa-labels-scroll inline;\n}\n\n.labels-grid {\n display: grid;\n grid-auto-flow: dense;\n font-family: Spline Sans Mono;\n line-height: 24px;\n text-wrap: nowrap;\n\n > * {\n padding-inline-end: 12px;\n }\n}\n\n.sequences {\n grid-area: sequences;\n display: flex;\n flex-direction: column;\n font-family: Spline Sans Mono;\n font-weight: 600;\n line-height: 24px;\n letter-spacing: 11.6px;\n text-indent: 5.8px;\n margin-inline-end: -5.8px;\n background-image: v-bind(highlightImageCssUrl);\n background-repeat: no-repeat;\n background-size: calc(100% - 5.8px) 100%;\n}\n\n@keyframes hide {\n from {\n visibility: visible;\n }\n to {\n visibility: hidden;\n }\n}\n</style>\n"],"names":["rootEl","useTemplateRef","__expose","highlightImageObjectUrl","useObjectUrl","_a","__props","highlightImageCssUrl","computed","sequenceLengths","length"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,UAAMA,IAASC,EAAe,SAAS;AACvC,IAAAC,EAAa,EAAE,QAAAF,GAAQ;AAEvB,UAAMG,IAA0BC,EAAa,MAAA;;AAAM,cAAAC,IAAAC,EAAA,mBAAA,gBAAAD,EAAgB;AAAA,KAAI,GACjEE,IAAuBC;AAAA,MAAS,MACpCL,EAAwB,QACpB,QAAQA,EAAwB,KAAK,OACrC;AAAA,IAAA,GAGAM,IAAkBD;AAAA,MAAS,MAAA;;AAC/B,gBAAAH,IAAAC,YAAU,GAAG,CAAC,MAAd,gBAAAD,EAAiB,MAAM,KAAK,IAAI,CAAC,EAAE,QAAAK,EAAA,MAAaA;AAAA;AAAA,IAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MultiSequenceAlignmentView.vue2.js","sources":["../../../src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { PlMultiSequenceAlignmentWidget } from '@platforma-sdk/model';\nimport {\n computed,\n onBeforeMount,\n onBeforeUnmount,\n onWatcherCleanup,\n ref,\n useCssModule,\n useTemplateRef,\n watch,\n} from 'vue';\nimport { cellSize } from './cell-size';\nimport Consensus from './Consensus.vue';\nimport Legend from './Legend.vue';\nimport type { TreeNodeData } from './phylogenetic-tree.worker';\nimport PhylogeneticTree from './PhylogeneticTree.vue';\nimport SeqLogo from './SeqLogo.vue';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst props = defineProps<{\n sequences: {\n name: string;\n rows: string[];\n residueCounts: ResidueCounts;\n highlightImageUrl?: string;\n }[];\n labels: {\n rows: string[];\n }[];\n highlightLegend: HighlightLegend | undefined;\n phylogeneticTree: TreeNodeData[] | undefined;\n widgets: PlMultiSequenceAlignmentWidget[];\n}>();\n\nconst classes = useCssModule();\n\nconst rootEl = useTemplateRef('rootRef');\ndefineExpose({ rootEl });\n\nconst rowCount = computed(() => props.sequences.at(0)?.rows.length ?? 0);\n\nconst targetCellInlineSize = CSS.px(cellSize.inline).toString();\nconst targetCellBlockSize = CSS.px(cellSize.block).toString();\n\nconst referenceCellRef = useTemplateRef('referenceCell');\nconst referenceCellInlineSize = ref<number>();\n\nconst cornerRef = useTemplateRef('corner');\nconst cornerInlineSize = ref<number>();\n\nconst letterSpacing = computed(() =>\n referenceCellInlineSize.value\n ? CSS.px(cellSize.inline - referenceCellInlineSize.value).toString()\n : undefined,\n);\n\nconst sequenceNameInsetInlineStart = computed(() =>\n CSS.px(cornerInlineSize.value ?? 0).toString(),\n);\n\nlet observer: ResizeObserver;\n\nonBeforeMount(() => {\n const getInlineSize = (entry: ResizeObserverEntry) =>\n entry.borderBoxSize.find(Boolean)?.inlineSize;\n\n observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n switch (entry.target) {\n case referenceCellRef.value:\n referenceCellInlineSize.value = getInlineSize(entry);\n break;\n case cornerRef.value:\n cornerInlineSize.value = getInlineSize(entry);\n break;\n }\n }\n });\n});\n\nonBeforeUnmount(() => {\n observer.disconnect();\n});\n\nfor (const ref of [referenceCellRef, cornerRef]) {\n watch(ref, (el, prevEl) => {\n if (el) observer.observe(el);\n onWatcherCleanup(() => {\n if (prevEl) observer.unobserve(prevEl);\n });\n });\n}\n</script>\n\n<template>\n <div ref=\"rootRef\" :class=\"classes.root\">\n <div ref=\"referenceCell\" :class=\"classes.referenceCell\">x</div>\n <div :class=\"['pl-scrollable', classes.table]\">\n <div :class=\"classes.sidebar\">\n <PhylogeneticTree\n v-if=\"props.widgets.includes('tree') && props.phylogeneticTree\"\n :tree=\"props.phylogeneticTree\"\n :class=\"classes.phylogeneticTree\"\n />\n <div :class=\"classes.labels\">\n <template\n v-for=\"({ rows }, columnIndex) of props.labels\"\n :key=\"columnIndex\"\n >\n <div v-for=\"(row, rowIndex) of rows\" :key=\"rowIndex\">\n {{ row }}\n </div>\n </template>\n </div>\n </div>\n <template v-if=\"letterSpacing !== undefined\">\n <div\n v-for=\"(column, columnIndex) of props.sequences\"\n :key=\"columnIndex\"\n :class=\"classes.sequenceColumn\"\n >\n <div :class=\"classes.sequenceHeader\">\n <div\n v-show=\"props.sequences.length > 1\"\n :class=\"classes.sequenceName\"\n >\n {{ column.name }}\n </div>\n <Consensus\n v-if=\"props.widgets.includes('consensus')\"\n :residue-counts=\"column.residueCounts\"\n :labels-class=\"classes.sequenceRow\"\n />\n <SeqLogo\n v-if=\"props.widgets.includes('seqLogo')\"\n :residue-counts=\"column.residueCounts\"\n />\n </div>\n <div\n :class=\"classes.sequenceRowsContainer\"\n :style=\"{\n backgroundImage: column.highlightImageUrl\n ? `url(${column.highlightImageUrl})`\n : undefined,\n }\"\n >\n <div\n v-for=\"(row, rowIndex) of column.rows\"\n :key=\"rowIndex\"\n :class=\"classes.sequenceRow\"\n >\n {{ row }}\n </div>\n </div>\n </div>\n </template>\n <div ref=\"corner\" :class=\"classes.corner\" />\n </div>\n <Legend\n v-if=\"props.widgets.includes('legend') && props.highlightLegend\"\n :legend=\"props.highlightLegend\"\n />\n </div>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-block-size: 0;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n container-type: inline-size;\n\n &[data-pre-print] {\n container-type: unset;\n\n .sidebar {\n max-inline-size: unset;\n }\n }\n}\n\n.referenceCell {\n position: fixed;\n visibility: hidden;\n font-family: Spline Sans Mono;\n font-weight: 600;\n line-height: v-bind('targetCellBlockSize');\n}\n\n.table {\n display: grid;\n grid-template-columns:\n [sidebar-start] auto [sidebar-end] repeat(\n v-bind('props.sequences.length'),\n [column-start] auto [column-end]\n );\n grid-template-rows:\n [header-start] auto [header-end]\n repeat(v-bind('rowCount'), [row-start] auto [row-end]);\n justify-content: start;\n position: relative;\n @media print {\n overflow: visible;\n }\n}\n\n.sidebar {\n grid-column: sidebar;\n grid-row: 1 row-start / -1 row-end;\n display: grid;\n grid-template-rows: subgrid;\n position: sticky;\n inset-inline-start: 0;\n background-color: #fff;\n inline-size: min-content;\n max-inline-size: 30cqi;\n overflow: scroll;\n overscroll-behavior-inline: none;\n scrollbar-width: none;\n}\n\n.phylogeneticTree {\n grid-row: 1 row-start / -1 row-end;\n}\n\n.labels {\n grid-row: 1 row-start / -1 row-end;\n display: grid;\n grid-template-columns: repeat(v-bind('props.labels.length'), auto);\n grid-template-rows: subgrid;\n grid-auto-flow: column;\n column-gap: 12px;\n padding-inline-end: 12px;\n font-family: Spline Sans Mono;\n line-height: v-bind('targetCellBlockSize');\n white-space: nowrap;\n}\n\n.sequenceColumn {\n grid-row: header-start / -1 row-end;\n display: grid;\n grid-template-rows: subgrid;\n & + & {\n margin-inline-start: 24px;\n }\n}\n\n.sequenceHeader {\n grid-row: header;\n display: flex;\n flex-direction: column;\n justify-content: end;\n min-inline-size: 0;\n position: sticky;\n inset-block-start: 0;\n background-color: #fff;\n}\n\n.sequenceName {\n margin-block-end: 4px;\n font-weight: 700;\n line-height: 20px;\n inline-size: fit-content;\n position: sticky;\n inset-inline-start: v-bind('sequenceNameInsetInlineStart');\n}\n\n.sequenceRowsContainer {\n grid-row: 1 row-start / -1 row-end;\n display: grid;\n grid-template-rows: subgrid;\n}\n\n.sequenceRow {\n font-family: Spline Sans Mono;\n font-weight: 600;\n line-height: v-bind('targetCellBlockSize');\n letter-spacing: v-bind('letterSpacing');\n text-indent: calc(v-bind('letterSpacing') / 2);\n inline-size: calc-size(\n min-content,\n round(down, size, v-bind('targetCellInlineSize'))\n );\n white-space: nowrap;\n}\n\n.corner {\n grid-column: sidebar;\n grid-row: header;\n position: sticky;\n inset-inline-start: 0;\n inset-block-start: 0;\n background-color: #fff;\n}\n</style>\n"],"names":["props","__props","classes","useCssModule","rootEl","useTemplateRef","__expose","rowCount","computed","_a","targetCellInlineSize","cellSize","targetCellBlockSize","referenceCellRef","referenceCellInlineSize","ref","cornerRef","cornerInlineSize","letterSpacing","sequenceNameInsetInlineStart","observer","onBeforeMount","getInlineSize","entry","entries","onBeforeUnmount","watch","el","prevEl","onWatcherCleanup"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,UAAMA,IAAQC,GAeRC,IAAUC,EAAA,GAEVC,IAASC,EAAe,SAAS;AACvC,IAAAC,EAAa,EAAE,QAAAF,GAAQ;AAEvB,UAAMG,IAAWC,EAAS,MAAA;;AAAM,eAAAC,IAAAT,EAAM,UAAU,GAAG,CAAC,MAApB,gBAAAS,EAAuB,KAAK,WAAU;AAAA,KAAC,GAEjEC,IAAuB,IAAI,GAAGC,EAAS,MAAM,EAAE,SAAA,GAC/CC,IAAsB,IAAI,GAAGD,EAAS,KAAK,EAAE,SAAA,GAE7CE,IAAmBR,EAAe,eAAe,GACjDS,IAA0BC,EAAA,GAE1BC,IAAYX,EAAe,QAAQ,GACnCY,IAAmBF,EAAA,GAEnBG,IAAgBV;AAAA,MAAS,MAC7BM,EAAwB,QACpB,IAAI,GAAGH,EAAS,SAASG,EAAwB,KAAK,EAAE,aACxD;AAAA,IAAA,GAGAK,IAA+BX;AAAA,MAAS,MAC5C,IAAI,GAAGS,EAAiB,SAAS,CAAC,EAAE,SAAA;AAAA,IAAS;AAG/C,QAAIG;AAEJ,IAAAC,EAAc,MAAM;AAClB,YAAMC,IAAgB,CAACC,MAAA;;AACrB,gBAAAd,IAAAc,EAAM,cAAc,KAAK,OAAO,MAAhC,gBAAAd,EAAmC;AAAA;AAErC,MAAAW,IAAW,IAAI,eAAe,CAACI,MAAY;AACzC,mBAAWD,KAASC;AAClB,kBAAQD,EAAM,QAAA;AAAA,YACZ,KAAKV,EAAiB;AACpB,cAAAC,EAAwB,QAAQQ,EAAcC,CAAK;AACnD;AAAA,YACF,KAAKP,EAAU;AACb,cAAAC,EAAiB,QAAQK,EAAcC,CAAK;AAC5C;AAAA,UAAA;AAAA,MAGR,CAAC;AAAA,IACH,CAAC,GAEDE,EAAgB,MAAM;AACpB,MAAAL,EAAS,WAAA;AAAA,IACX,CAAC;AAED,eAAWL,KAAO,CAACF,GAAkBG,CAAS;AAC5C,MAAAU,EAAMX,GAAK,CAACY,GAAIC,MAAW;AACzB,QAAID,KAAIP,EAAS,QAAQO,CAAE,GAC3BE,EAAiB,MAAM;AACrB,UAAID,KAAQR,EAAS,UAAUQ,CAAM;AAAA,QACvC,CAAC;AAAA,MACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,24 +1,31 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('._root_y6xw0_2{display:flex;flex-direction:column;gap:12px;min-block-size:0;-webkit-print-color-adjust:exact;print-color-adjust:exact}._root_y6xw0_2[data-pre-print] ._table_y6xw0_11{container-type:unset}._root_y6xw0_2[data-pre-print] ._labels_y6xw0_14{max-inline-size:unset}._table_y6xw0_11{container-type:inline-size;display:grid;grid-template-areas:"corner header" "labels sequences";justify-content:start;timeline-scope:--msa-labels-scroll}@media print{._table_y6xw0_11{overflow:visible}}._corner_y6xw0_33{grid-area:corner;background-color:#fff;position:sticky;inset-inline-start:0;inset-block-start:0;z-index:2}._label-scroll-indicator_y6xw0_42{position:absolute;inset-inline-end:0;block-size:100cqb;inline-size:8px;animation-name:_hide_y6xw0_1;animation-timeline:--msa-labels-scroll;visibility:hidden;background:#fff;box-shadow:-4px 0 4px -2px #0000001a}._header_y6xw0_54{grid-area:header;background-color:#fff;position:sticky;inset-block-start:0;z-index:1}._sequence-names_y6xw0_62{display:flex;font-weight:700;line-height:20px;margin-block-end:4px;gap:20px}._labels_y6xw0_14{grid-area:labels;background-color:#fff;position:sticky;inset-inline-start:0;z-index:1;inline-size:max-content;max-inline-size:30cqi;overflow:scroll;scrollbar-width:none;overscroll-behavior-inline:none;scroll-timeline:--msa-labels-scroll inline}._labels-grid_y6xw0_84{display:grid;grid-auto-flow:dense;font-family:Spline Sans Mono;line-height:24px;text-wrap:nowrap}._labels-grid_y6xw0_84>*{padding-inline-end:12px}._sequences_y6xw0_96{grid-area:sequences;display:flex;flex-direction:column;font-family:Spline Sans Mono;font-weight:600;line-height:24px;letter-spacing:11.6px;text-indent:5.8px;margin-inline-end:-5.8px;background-image:var(--861533c4);background-repeat:no-repeat;background-size:calc(100% - 5.8px) 100%}@keyframes _hide_y6xw0_1{0%{visibility:visible}to{visibility:hidden}}')),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}})();
2
- const e = "_root_y6xw0_2", _ = "_table_y6xw0_11", s = "_labels_y6xw0_14", l = "_corner_y6xw0_33", o = "_hide_y6xw0_1", c = "_header_y6xw0_54", n = "_sequences_y6xw0_96", a = {
1
+ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._root_34869_2{display:flex;flex-direction:column;gap:12px;min-block-size:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;container-type:inline-size}._root_34869_2[data-pre-print]{container-type:unset}._root_34869_2[data-pre-print] ._sidebar_34869_14{max-inline-size:unset}._referenceCell_34869_20{position:fixed;visibility:hidden;font-family:Spline Sans Mono;font-weight:600;line-height:var(--e405b06c)}._table_34869_28{display:grid;grid-template-columns:[sidebar-start] auto [sidebar-end] repeat(var(--0c44921e),[column-start] auto [column-end]);grid-template-rows:[header-start] auto [header-end] repeat(var(--6aab37c6),[row-start] auto [row-end]);justify-content:start;position:relative}@media print{._table_34869_28{overflow:visible}}._sidebar_34869_14{grid-column:sidebar;grid-row:1 row-start / -1 row-end;display:grid;grid-template-rows:subgrid;position:sticky;inset-inline-start:0;background-color:#fff;inline-size:min-content;max-inline-size:30cqi;overflow:scroll;overscroll-behavior-inline:none;scrollbar-width:none}._phylogeneticTree_34869_60{grid-row:1 row-start / -1 row-end}._labels_34869_64{grid-row:1 row-start / -1 row-end;display:grid;grid-template-columns:repeat(var(--2e72cab4),auto);grid-template-rows:subgrid;grid-auto-flow:column;column-gap:12px;padding-inline-end:12px;font-family:Spline Sans Mono;line-height:var(--e405b06c);white-space:nowrap}._sequenceColumn_34869_77{grid-row:header-start / -1 row-end;display:grid;grid-template-rows:subgrid}._sequenceColumn_34869_77+._sequenceColumn_34869_77{margin-inline-start:24px}._sequenceHeader_34869_86{grid-row:header;display:flex;flex-direction:column;justify-content:end;min-inline-size:0;position:sticky;inset-block-start:0;background-color:#fff}._sequenceName_34869_97{margin-block-end:4px;font-weight:700;line-height:20px;inline-size:fit-content;position:sticky;inset-inline-start:var(--1ad5abe9)}._sequenceRowsContainer_34869_106{grid-row:1 row-start / -1 row-end;display:grid;grid-template-rows:subgrid}._sequenceRow_34869_106{font-family:Spline Sans Mono;font-weight:600;line-height:var(--e405b06c);letter-spacing:var(--3c16a76c);text-indent:calc(var(--3c16a76c) / 2);inline-size:calc-size(min-content,round(down,size,var(--1406981e)));white-space:nowrap}._corner_34869_125{grid-column:sidebar;grid-row:header;position:sticky;inset-inline-start:0;inset-block-start:0;background-color:#fff}")),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}})();
2
+ const e = "_root_34869_2", n = "_sidebar_34869_14", s = "_referenceCell_34869_20", o = "_table_34869_28", c = "_phylogeneticTree_34869_60", _ = "_labels_34869_64", r = "_sequenceColumn_34869_77", t = "_sequenceHeader_34869_86", l = "_sequenceName_34869_97", a = "_sequenceRowsContainer_34869_106", u = "_sequenceRow_34869_106", q = "_corner_34869_125", b = {
3
3
  root: e,
4
- table: _,
5
- labels: s,
6
- corner: l,
7
- "label-scroll-indicator": "_label-scroll-indicator_y6xw0_42",
8
- hide: o,
9
- header: c,
10
- "sequence-names": "_sequence-names_y6xw0_62",
11
- "labels-grid": "_labels-grid_y6xw0_84",
12
- sequences: n
4
+ sidebar: n,
5
+ referenceCell: s,
6
+ table: o,
7
+ phylogeneticTree: c,
8
+ labels: _,
9
+ sequenceColumn: r,
10
+ sequenceHeader: t,
11
+ sequenceName: l,
12
+ sequenceRowsContainer: a,
13
+ sequenceRow: u,
14
+ corner: q
13
15
  };
14
16
  export {
15
- l as corner,
16
- a as default,
17
- c as header,
18
- o as hide,
19
- s as labels,
17
+ q as corner,
18
+ b as default,
19
+ _ as labels,
20
+ c as phylogeneticTree,
21
+ s as referenceCell,
20
22
  e as root,
21
- n as sequences,
22
- _ as table
23
+ r as sequenceColumn,
24
+ t as sequenceHeader,
25
+ l as sequenceName,
26
+ u as sequenceRow,
27
+ a as sequenceRowsContainer,
28
+ n as sidebar,
29
+ o as table
23
30
  };
24
31
  //# sourceMappingURL=MultiSequenceAlignmentView.vue3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSequenceAlignmentView.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"MultiSequenceAlignmentView.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -0,0 +1,8 @@
1
+ import { TreeNodeData } from './phylogenetic-tree.worker';
2
+ type __VLS_Props = {
3
+ tree: TreeNodeData[];
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
6
+ plotEl: HTMLDivElement;
7
+ }, any>;
8
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import o from "./PhylogeneticTree.vue2.js";
2
+ import s from "./PhylogeneticTree.vue3.js";
3
+ import e from "../../_virtual/_plugin-vue_export-helper.js";
4
+ const t = {
5
+ $style: s
6
+ }, f = /* @__PURE__ */ e(o, [["__cssModules", t]]);
7
+ export {
8
+ f as default
9
+ };
10
+ //# sourceMappingURL=PhylogeneticTree.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhylogeneticTree.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,77 @@
1
+ import { defineComponent as v, useCssModule as g, useTemplateRef as y, computed as w, shallowRef as k, watchEffect as _, onBeforeUnmount as I, createBlock as x, createElementBlock as C, unref as o, openBlock as p, withCtx as L, createTextVNode as T, toDisplayString as B, normalizeClass as E } from "vue";
2
+ import { PlAlert as P } from "@milaboratories/uikit";
3
+ import { cellSize as d } from "./cell-size.js";
4
+ import { useMiPlots as b } from "./useMiPlots.js";
5
+ const N = /* @__PURE__ */ v({
6
+ __name: "PhylogeneticTree",
7
+ props: {
8
+ tree: {}
9
+ },
10
+ setup(m) {
11
+ const f = m, h = g(), l = y("plotEl"), a = {
12
+ type: "dendro",
13
+ title: { show: !1, name: "" },
14
+ size: {
15
+ width: 149,
16
+ minCellHeight: d.block,
17
+ maxCellHeight: d.block,
18
+ marginLeft: 1,
19
+ marginRight: 0,
20
+ marginTop: 0,
21
+ marginBottom: 0
22
+ },
23
+ mode: "normal",
24
+ leavesMode: "alignLeavesToLine",
25
+ leavesOrder: "indexAsc",
26
+ legend: { show: !1 },
27
+ id: {
28
+ type: "column",
29
+ value: "nodeId"
30
+ },
31
+ parentId: {
32
+ type: "column",
33
+ value: "parentId"
34
+ },
35
+ height: {
36
+ type: "column",
37
+ value: "distance"
38
+ },
39
+ showNodes: !1,
40
+ showNodesLabels: !1,
41
+ showLeavesLabels: !1,
42
+ rootPosition: "left"
43
+ }, r = w(() => {
44
+ const e = [], n = [], u = [];
45
+ for (const s of f.tree)
46
+ e.push(s.id), n.push(s.parentId ?? null), u.push(s.length ?? 0);
47
+ return {
48
+ type: "columns",
49
+ id: `phylogeneticTree-${crypto.randomUUID()}`,
50
+ values: { nodeId: e, parentId: n, distance: u }
51
+ };
52
+ }), { miplots: i, error: c } = b(), t = k();
53
+ return _(async () => {
54
+ !l.value || !i.value || (t.value ? t.value.updateSettingsAndData(r.value, a) : (t.value = i.value.newPlot(r.value, a), t.value.mount(l.value)));
55
+ }), I(() => {
56
+ var e;
57
+ (e = t.value) == null || e.unmount();
58
+ }), (e, n) => o(c) ? (p(), x(o(P), {
59
+ key: 0,
60
+ type: "error"
61
+ }, {
62
+ default: L(() => [
63
+ T(B(o(c).message), 1)
64
+ ]),
65
+ _: 1
66
+ })) : (p(), C("div", {
67
+ key: 1,
68
+ ref_key: "plotEl",
69
+ ref: l,
70
+ class: E(o(h).container)
71
+ }, null, 2));
72
+ }
73
+ });
74
+ export {
75
+ N as default
76
+ };
77
+ //# sourceMappingURL=PhylogeneticTree.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhylogeneticTree.vue2.js","sources":["../../../src/components/PlMultiSequenceAlignment/PhylogeneticTree.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n ChartInterface,\n DataByColumns,\n Settings,\n} from '@milaboratories/miplots4';\nimport { PlAlert } from '@milaboratories/uikit';\nimport {\n computed,\n onBeforeUnmount,\n shallowRef,\n useCssModule,\n useTemplateRef,\n watchEffect,\n} from 'vue';\nimport { cellSize } from './cell-size';\nimport type { TreeNodeData } from './phylogenetic-tree.worker';\nimport { useMiPlots } from './useMiPlots';\n\nconst props = defineProps<{\n tree: TreeNodeData[];\n}>();\n\nconst classes = useCssModule();\n\nconst plotEl = useTemplateRef('plotEl');\n\nconst settings: Settings = {\n type: 'dendro',\n title: { show: false, name: '' },\n size: {\n width: 149,\n minCellHeight: cellSize.block,\n maxCellHeight: cellSize.block,\n marginLeft: 1,\n marginRight: 0,\n marginTop: 0,\n marginBottom: 0,\n },\n mode: 'normal',\n leavesMode: 'alignLeavesToLine',\n leavesOrder: 'indexAsc',\n legend: { show: false },\n id: {\n type: 'column',\n value: 'nodeId',\n },\n parentId: {\n type: 'column',\n value: 'parentId',\n },\n height: {\n type: 'column',\n value: 'distance',\n },\n showNodes: false,\n showNodesLabels: false,\n showLeavesLabels: false,\n rootPosition: 'left',\n};\n\nconst data = computed<DataByColumns>(() => {\n const nodeId: number[] = [];\n const parentId: (number | null)[] = [];\n const distance: number[] = [];\n for (const node of props.tree) {\n nodeId.push(node.id);\n parentId.push(node.parentId ?? null);\n distance.push(node.length ?? 0);\n }\n return ({\n type: 'columns',\n id: `phylogeneticTree-${crypto.randomUUID()}`,\n values: { nodeId, parentId, distance },\n });\n});\n\nconst { miplots, error } = useMiPlots();\n\nconst plot = shallowRef<ChartInterface>();\n\nwatchEffect(async () => {\n if (!plotEl.value || !miplots.value) return;\n if (!plot.value) {\n plot.value = miplots.value.newPlot(data.value, settings);\n plot.value.mount(plotEl.value);\n } else {\n plot.value.updateSettingsAndData(data.value, settings);\n }\n});\n\nonBeforeUnmount(() => {\n plot.value?.unmount();\n});\n</script>\n\n<template>\n <PlAlert v-if=\"error\" type=\"error\">\n {{ error.message }}\n </PlAlert>\n <div v-else ref=\"plotEl\" :class=\"classes.container\" />\n</template>\n\n<style module>\n.container {\n svg {\n display: block;\n }\n}\n</style>\n"],"names":["props","__props","classes","useCssModule","plotEl","useTemplateRef","settings","cellSize","data","computed","nodeId","parentId","distance","node","miplots","error","useMiPlots","plot","shallowRef","watchEffect","onBeforeUnmount","_a"],"mappings":";;;;;;;;;;AAmBA,UAAMA,IAAQC,GAIRC,IAAUC,EAAA,GAEVC,IAASC,EAAe,QAAQ,GAEhCC,IAAqB;AAAA,MACzB,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,IAAO,MAAM,GAAA;AAAA,MAC5B,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,eAAeC,EAAS;AAAA,QACxB,eAAeA,EAAS;AAAA,QACxB,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,MAAA;AAAA,MAEhB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ,EAAE,MAAM,GAAA;AAAA,MAChB,IAAI;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,cAAc;AAAA,IAAA,GAGVC,IAAOC,EAAwB,MAAM;AACzC,YAAMC,IAAmB,CAAA,GACnBC,IAA8B,CAAA,GAC9BC,IAAqB,CAAA;AAC3B,iBAAWC,KAAQb,EAAM;AACvB,QAAAU,EAAO,KAAKG,EAAK,EAAE,GACnBF,EAAS,KAAKE,EAAK,YAAY,IAAI,GACnCD,EAAS,KAAKC,EAAK,UAAU,CAAC;AAEhC,aAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI,oBAAoB,OAAO,WAAA,CAAY;AAAA,QAC3C,QAAQ,EAAE,QAAAH,GAAQ,UAAAC,GAAU,UAAAC,EAAA;AAAA,MAAS;AAAA,IAEzC,CAAC,GAEK,EAAE,SAAAE,GAAS,OAAAC,EAAA,IAAUC,EAAA,GAErBC,IAAOC,EAAA;AAEb,WAAAC,EAAY,YAAY;AACtB,MAAI,CAACf,EAAO,SAAS,CAACU,EAAQ,UACzBG,EAAK,QAIRA,EAAK,MAAM,sBAAsBT,EAAK,OAAOF,CAAQ,KAHrDW,EAAK,QAAQH,EAAQ,MAAM,QAAQN,EAAK,OAAOF,CAAQ,GACvDW,EAAK,MAAM,MAAMb,EAAO,KAAK;AAAA,IAIjC,CAAC,GAEDgB,EAAgB,MAAM;;AACpB,OAAAC,IAAAJ,EAAK,UAAL,QAAAI,EAAY;AAAA,IACd,CAAC;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,9 @@
1
+ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1uo2b_2 svg{display:block}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
2
+ const n = "_container_1uo2b_2", t = {
3
+ container: n
4
+ };
5
+ export {
6
+ n as container,
7
+ t as default
8
+ };
9
+ //# sourceMappingURL=PhylogeneticTree.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhylogeneticTree.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -26,19 +26,24 @@ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {},
26
26
  "onUpdate:modelValue"?: ((value: PlMultiSequenceAlignmentModel) => any) | undefined;
27
27
  }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
28
28
  msa: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
29
- sequences: string[];
30
- sequenceNames: string[];
31
- labelRows: string[][];
32
- residueCounts: import('./types').ResidueCounts;
33
- highlightImage: {
34
- blob: Blob;
35
- legend: import('./types').HighlightLegend;
36
- } | undefined;
37
- widgets: ("consensus" | "seqLogo" | "legend")[];
29
+ sequences: {
30
+ name: string;
31
+ rows: string[];
32
+ residueCounts: import('./types').ResidueCounts;
33
+ highlightImageUrl?: string;
34
+ }[];
35
+ labels: {
36
+ rows: string[];
37
+ }[];
38
+ highlightLegend: import('./types').HighlightLegend | undefined;
39
+ phylogeneticTree: import('./phylogenetic-tree.worker').TreeNodeData[] | undefined;
40
+ widgets: import('@platforma-sdk/model').PlMultiSequenceAlignmentWidget[];
38
41
  }> & Readonly<{}>, {
39
42
  rootEl: Readonly<import('vue').ShallowRef<HTMLDivElement | null>>;
40
43
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, import('vue').PublicProps, {}, false, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
41
44
  rootRef: HTMLDivElement;
45
+ referenceCell: HTMLDivElement;
46
+ corner: HTMLDivElement;
42
47
  }, HTMLDivElement, import('vue').ComponentProvideOptions, {
43
48
  P: {};
44
49
  B: {};
@@ -47,15 +52,18 @@ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {},
47
52
  M: {};
48
53
  Defaults: {};
49
54
  }, Readonly<{
50
- sequences: string[];
51
- sequenceNames: string[];
52
- labelRows: string[][];
53
- residueCounts: import('./types').ResidueCounts;
54
- highlightImage: {
55
- blob: Blob;
56
- legend: import('./types').HighlightLegend;
57
- } | undefined;
58
- widgets: ("consensus" | "seqLogo" | "legend")[];
55
+ sequences: {
56
+ name: string;
57
+ rows: string[];
58
+ residueCounts: import('./types').ResidueCounts;
59
+ highlightImageUrl?: string;
60
+ }[];
61
+ labels: {
62
+ rows: string[];
63
+ }[];
64
+ highlightLegend: import('./types').HighlightLegend | undefined;
65
+ phylogeneticTree: import('./phylogenetic-tree.worker').TreeNodeData[] | undefined;
66
+ widgets: import('@platforma-sdk/model').PlMultiSequenceAlignmentWidget[];
59
67
  }> & Readonly<{}>, {
60
68
  rootEl: Readonly<import('vue').ShallowRef<HTMLDivElement | null>>;
61
69
  }, {}, {}, {}, {}> | null;