@milaboratories/multi-sequence-alignment 1.45.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 (114) hide show
  1. package/.turbo/turbo-build.log +52 -0
  2. package/.turbo/turbo-lint.log +12 -0
  3. package/.turbo/turbo-test.log +13 -0
  4. package/.turbo/turbo-type-check.log +6 -0
  5. package/dist/Consensus.vue.d.ts +9 -0
  6. package/dist/Consensus.vue.js +10 -0
  7. package/dist/Consensus.vue.js.map +1 -0
  8. package/dist/Consensus.vue2.js +122 -0
  9. package/dist/Consensus.vue2.js.map +1 -0
  10. package/dist/Consensus.vue3.js +9 -0
  11. package/dist/Consensus.vue3.js.map +1 -0
  12. package/dist/Legend.vue.d.ts +6 -0
  13. package/dist/Legend.vue.js +10 -0
  14. package/dist/Legend.vue.js.map +1 -0
  15. package/dist/Legend.vue2.js +28 -0
  16. package/dist/Legend.vue2.js.map +1 -0
  17. package/dist/Legend.vue3.js +13 -0
  18. package/dist/Legend.vue3.js.map +1 -0
  19. package/dist/MultiSequenceAlignmentView.vue.d.ts +25 -0
  20. package/dist/MultiSequenceAlignmentView.vue.js +10 -0
  21. package/dist/MultiSequenceAlignmentView.vue.js.map +1 -0
  22. package/dist/MultiSequenceAlignmentView.vue2.js +138 -0
  23. package/dist/MultiSequenceAlignmentView.vue2.js.map +1 -0
  24. package/dist/MultiSequenceAlignmentView.vue3.js +31 -0
  25. package/dist/MultiSequenceAlignmentView.vue3.js.map +1 -0
  26. package/dist/PhylogeneticTree.vue.d.ts +8 -0
  27. package/dist/PhylogeneticTree.vue.js +10 -0
  28. package/dist/PhylogeneticTree.vue.js.map +1 -0
  29. package/dist/PhylogeneticTree.vue2.js +77 -0
  30. package/dist/PhylogeneticTree.vue2.js.map +1 -0
  31. package/dist/PhylogeneticTree.vue3.js +9 -0
  32. package/dist/PhylogeneticTree.vue3.js.map +1 -0
  33. package/dist/PlMultiSequenceAlignment.vue.d.ts +71 -0
  34. package/dist/PlMultiSequenceAlignment.vue.js +10 -0
  35. package/dist/PlMultiSequenceAlignment.vue.js.map +1 -0
  36. package/dist/PlMultiSequenceAlignment.vue2.js +224 -0
  37. package/dist/PlMultiSequenceAlignment.vue2.js.map +1 -0
  38. package/dist/PlMultiSequenceAlignment.vue3.js +9 -0
  39. package/dist/PlMultiSequenceAlignment.vue3.js.map +1 -0
  40. package/dist/SeqLogo.vue.d.ts +8 -0
  41. package/dist/SeqLogo.vue.js +10 -0
  42. package/dist/SeqLogo.vue.js.map +1 -0
  43. package/dist/SeqLogo.vue2.js +127 -0
  44. package/dist/SeqLogo.vue2.js.map +1 -0
  45. package/dist/SeqLogo.vue3.js +9 -0
  46. package/dist/SeqLogo.vue3.js.map +1 -0
  47. package/dist/Toolbar.vue.d.ts +16 -0
  48. package/dist/Toolbar.vue.js +10 -0
  49. package/dist/Toolbar.vue.js.map +1 -0
  50. package/dist/Toolbar.vue2.js +228 -0
  51. package/dist/Toolbar.vue2.js.map +1 -0
  52. package/dist/Toolbar.vue3.js +19 -0
  53. package/dist/Toolbar.vue3.js.map +1 -0
  54. package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
  55. package/dist/_virtual/_plugin-vue_export-helper.js.map +1 -0
  56. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js +6 -0
  57. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js.map +1 -0
  58. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js +5 -0
  59. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js.map +1 -0
  60. package/dist/cell-size.d.ts +4 -0
  61. package/dist/cell-size.js +8 -0
  62. package/dist/cell-size.js.map +1 -0
  63. package/dist/chemical-properties.d.ts +44 -0
  64. package/dist/chemical-properties.js +132 -0
  65. package/dist/chemical-properties.js.map +1 -0
  66. package/dist/data.d.ts +61 -0
  67. package/dist/data.js +370 -0
  68. package/dist/data.js.map +1 -0
  69. package/dist/index.d.ts +1 -0
  70. package/dist/index.js +6 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/markup.d.ts +16 -0
  73. package/dist/markup.js +84 -0
  74. package/dist/markup.js.map +1 -0
  75. package/dist/migrations.d.ts +3 -0
  76. package/dist/migrations.js +24 -0
  77. package/dist/migrations.js.map +1 -0
  78. package/dist/multi-sequence-alignment.worker.d.ts +6 -0
  79. package/dist/node_modules/.pnpm/@milaboratories_helpers@1.12.0/node_modules/@milaboratories/helpers/dist/objects.js +33 -0
  80. package/dist/node_modules/.pnpm/@milaboratories_helpers@1.12.0/node_modules/@milaboratories/helpers/dist/objects.js.map +1 -0
  81. package/dist/phylogenetic-tree.worker.d.ts +7 -0
  82. package/dist/residue-counts.d.ts +2 -0
  83. package/dist/residue-counts.js +13 -0
  84. package/dist/residue-counts.js.map +1 -0
  85. package/dist/settings.d.ts +2 -0
  86. package/dist/settings.js +9 -0
  87. package/dist/settings.js.map +1 -0
  88. package/dist/types.d.ts +5 -0
  89. package/dist/useMiPlots.d.ts +4 -0
  90. package/dist/useMiPlots.js +19 -0
  91. package/dist/useMiPlots.js.map +1 -0
  92. package/eslint.config.js +66 -0
  93. package/package.json +45 -0
  94. package/src/Consensus.vue +165 -0
  95. package/src/Legend.vue +44 -0
  96. package/src/MultiSequenceAlignmentView.vue +299 -0
  97. package/src/PhylogeneticTree.vue +110 -0
  98. package/src/PlMultiSequenceAlignment.vue +314 -0
  99. package/src/README.md +216 -0
  100. package/src/SeqLogo.vue +166 -0
  101. package/src/Toolbar.vue +228 -0
  102. package/src/cell-size.ts +4 -0
  103. package/src/chemical-properties.ts +199 -0
  104. package/src/data.ts +661 -0
  105. package/src/index.ts +2 -0
  106. package/src/markup.ts +141 -0
  107. package/src/migrations.ts +46 -0
  108. package/src/multi-sequence-alignment.worker.ts +54 -0
  109. package/src/phylogenetic-tree.worker.ts +89 -0
  110. package/src/residue-counts.ts +124 -0
  111. package/src/settings.ts +7 -0
  112. package/src/types.ts +3 -0
  113. package/src/useMiPlots.ts +23 -0
  114. package/tsconfig.json +10 -0
@@ -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/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","_unref","_createBlock","PlAlert","_createTextVNode","_toDisplayString","_createElementBlock","_normalizeClass"],"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,aAIgBC,EAAAP,CAAA,UAAfQ,EAEUD,EAAAE,CAAA,GAAA;AAAA;MAFY,MAAK;AAAA,IAAA;iBACzB,MAAmB;AAAA,QAAhBC,EAAAC,EAAAJ,EAAAP,CAAA,EAAM,OAAO,GAAA,CAAA;AAAA,MAAA;;gBAElBY,EAAsD,OAAA;AAAA;eAAtC;AAAA,MAAJ,KAAIvB;AAAA,MAAU,OAAKwB,EAAEN,EAAApB,CAAA,EAAQ,SAAS;AAAA,IAAA;;;"}
@@ -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":";;;"}
@@ -0,0 +1,71 @@
1
+ import { PColumnPredicate, PFrameHandle, PlMultiSequenceAlignmentModel, PlSelectionModel } from '@platforma-sdk/model';
2
+ type __VLS_Props = {
3
+ /**
4
+ * Handle to PFrame created using `createPFrameForGraphs`.
5
+ * Should contain all desired sequence and label columns.
6
+ */
7
+ readonly pFrame: PFrameHandle | undefined;
8
+ /**
9
+ * Return true if column should be shown in sequence columns dropdown.
10
+ * By default, all sequence columns are selected.
11
+ */
12
+ readonly sequenceColumnPredicate: PColumnPredicate;
13
+ /**
14
+ * Row selection model (from `PlAgDataTableV2` or `GraphMaker`).
15
+ * If not provided or empty, all rows will be considered selected.
16
+ * Warning: should be forwarded as a field of `reactive` object
17
+ */
18
+ readonly selection?: PlSelectionModel;
19
+ };
20
+ type __VLS_PublicProps = {
21
+ modelValue?: PlMultiSequenceAlignmentModel;
22
+ } & __VLS_Props;
23
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
24
+ "update:modelValue": (value: PlMultiSequenceAlignmentModel) => any;
25
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
26
+ "onUpdate:modelValue"?: ((value: PlMultiSequenceAlignmentModel) => any) | undefined;
27
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
28
+ msa: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
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[];
41
+ }> & Readonly<{}>, {
42
+ rootEl: Readonly<import('vue').ShallowRef<HTMLDivElement | null>>;
43
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, import('vue').PublicProps, {}, false, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
44
+ rootRef: HTMLDivElement;
45
+ referenceCell: HTMLDivElement;
46
+ corner: HTMLDivElement;
47
+ }, HTMLDivElement, import('vue').ComponentProvideOptions, {
48
+ P: {};
49
+ B: {};
50
+ D: {};
51
+ C: {};
52
+ M: {};
53
+ Defaults: {};
54
+ }, Readonly<{
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[];
67
+ }> & Readonly<{}>, {
68
+ rootEl: Readonly<import('vue').ShallowRef<HTMLDivElement | null>>;
69
+ }, {}, {}, {}, {}> | null;
70
+ }, any>;
71
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import s from "./PlMultiSequenceAlignment.vue2.js";
2
+ import o from "./PlMultiSequenceAlignment.vue3.js";
3
+ import t from "./_virtual/_plugin-vue_export-helper.js";
4
+ const e = {
5
+ $style: o
6
+ }, c = /* @__PURE__ */ t(s, [["__cssModules", e]]);
7
+ export {
8
+ c as default
9
+ };
10
+ //# sourceMappingURL=PlMultiSequenceAlignment.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlMultiSequenceAlignment.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,224 @@
1
+ import { defineComponent as J, mergeModels as Q, useModel as G, onBeforeMount as H, reactive as h, useCssModule as K, computed as T, watchEffect as L, useTemplateRef as W, onUnmounted as X, createElementBlock as A, openBlock as p, Fragment as N, createVNode as R, createBlock as S, unref as r, withCtx as b, createTextVNode as w, toDisplayString as v, createCommentVNode as V, normalizeClass as Y } from "vue";
2
+ import { isJsonEqual as q } from "./node_modules/.pnpm/@milaboratories_helpers@1.12.0/node_modules/@milaboratories/helpers/dist/objects.js";
3
+ import { PlAlert as P, PlSplash as Z } from "@milaboratories/uikit";
4
+ import { getRawPlatformaInstance as ee } from "@platforma-sdk/model";
5
+ import { useSequenceColumnsOptions as te, useLabelColumnsOptions as oe, useMarkupColumnsOptions as ne, useMultipleAlignmentData as le, SEQUENCE_LIMIT as _ } from "./data.js";
6
+ import { runMigrations as se } from "./migrations.js";
7
+ import ae from "./MultiSequenceAlignmentView.vue.js";
8
+ import { defaultSettings as j } from "./settings.js";
9
+ import re from "./Toolbar.vue.js";
10
+ const ye = /* @__PURE__ */ J({
11
+ __name: "PlMultiSequenceAlignment",
12
+ props: /* @__PURE__ */ Q({
13
+ pFrame: {},
14
+ sequenceColumnPredicate: { type: Function },
15
+ selection: {}
16
+ }, {
17
+ modelValue: { default: {} },
18
+ modelModifiers: {}
19
+ }),
20
+ emits: ["update:modelValue"],
21
+ setup(k) {
22
+ const y = G(k, "modelValue");
23
+ H(() => {
24
+ se(y);
25
+ });
26
+ const t = h({
27
+ ...j
28
+ }), c = k, B = K(), g = h(te(() => ({
29
+ pFrame: c.pFrame,
30
+ sequenceColumnPredicate: c.sequenceColumnPredicate
31
+ }))), f = h(oe(() => ({
32
+ pFrame: c.pFrame,
33
+ sequenceColumnIds: t.sequenceColumnIds
34
+ }))), C = h(ne(() => ({
35
+ pFrame: c.pFrame,
36
+ sequenceColumnIds: t.sequenceColumnIds
37
+ }))), s = h(le(() => ({
38
+ pFrame: c.pFrame,
39
+ sequenceColumnIds: t.sequenceColumnIds,
40
+ labelColumnIds: t.labelColumnIds,
41
+ selection: c.selection,
42
+ colorScheme: t.colorScheme,
43
+ alignmentParams: t.alignmentParams,
44
+ shouldBuildPhylogeneticTree: t.widgets.includes("tree")
45
+ }))), I = new Intl.NumberFormat("en").format, D = T(
46
+ () => [
47
+ {
48
+ label: "Chemical Properties",
49
+ value: { type: "chemical-properties" }
50
+ },
51
+ {
52
+ label: "No Color",
53
+ value: { type: "no-color" }
54
+ },
55
+ ...(C.data ?? []).map(({ label: o, value: n }) => ({
56
+ label: o,
57
+ value: {
58
+ type: "markup",
59
+ columnIds: n
60
+ }
61
+ }))
62
+ ]
63
+ ), x = T(
64
+ () => g.error ?? f.error ?? C.error ?? s.error
65
+ );
66
+ function E(o) {
67
+ y.value = Object.fromEntries(
68
+ Object.entries({ ...y.value, ...o }).filter(([n, e]) => e !== void 0)
69
+ );
70
+ }
71
+ L(() => {
72
+ var n, e;
73
+ const o = Object.fromEntries(
74
+ Object.entries({
75
+ ...j,
76
+ sequenceColumnIds: (n = g.data) == null ? void 0 : n.defaults,
77
+ labelColumnIds: (e = f.data) == null ? void 0 : e.defaults,
78
+ ...y.value
79
+ }).filter(
80
+ ([l, a]) => !q(
81
+ t[l],
82
+ a
83
+ )
84
+ )
85
+ );
86
+ Object.assign(t, o);
87
+ }), L(() => {
88
+ var e, l, a;
89
+ const o = [];
90
+ !g.isLoading && ((e = t.sequenceColumnIds) != null && e.some(
91
+ (i) => {
92
+ var m;
93
+ return (((m = g.data) == null ? void 0 : m.options) ?? []).every(
94
+ ({ value: u }) => !q(u, i)
95
+ );
96
+ }
97
+ )) && o.push("sequenceColumnIds"), !f.isLoading && ((l = t.labelColumnIds) != null && l.some(
98
+ (i) => {
99
+ var m;
100
+ return (((m = f.data) == null ? void 0 : m.options) ?? []).every(
101
+ ({ value: u }) => !q(u, i)
102
+ );
103
+ }
104
+ )) && o.push("labelColumnIds");
105
+ const n = ((a = t.colorScheme) == null ? void 0 : a.type) === "markup" ? t.colorScheme.columnIds : void 0;
106
+ !C.isLoading && n && (C.data ?? []).every(
107
+ ({ value: i }) => !q(i, n)
108
+ ) && o.push("colorScheme"), o.length && E(Object.fromEntries(
109
+ o.map((i) => [i, void 0])
110
+ ));
111
+ });
112
+ const z = W("msa");
113
+ async function U() {
114
+ var M, F, O;
115
+ const o = (F = (M = ee()) == null ? void 0 : M.lsDriver) == null ? void 0 : F.exportToPdf;
116
+ if (!o)
117
+ return console.error(
118
+ "API getPlatformaRawInstance().lsDriver.exportToPdf is not available"
119
+ );
120
+ const n = (O = z.value) == null ? void 0 : O.rootEl;
121
+ if (!n)
122
+ throw new Error("MSA element is not available.");
123
+ const e = document.createElement("div");
124
+ e.id = `print-target-${crypto.randomUUID()}`;
125
+ const l = new CSSStyleSheet();
126
+ document.adoptedStyleSheets.push(l), l.insertRule(`
127
+ @media screen {
128
+ #${e.id} {
129
+ visibility: hidden;
130
+ position: fixed;
131
+ }
132
+ }`);
133
+ const a = n.cloneNode(!0);
134
+ a.dataset.prePrint = "", e.replaceChildren(a), document.body.appendChild(e);
135
+ const { height: i, width: m } = e.getBoundingClientRect(), u = CSS.cm(1), $ = [m, i].map((d) => CSS.px(d).add(u.mul(2))).join(" ");
136
+ l.insertRule(`
137
+ @media print {
138
+ @page {
139
+ size: ${$};
140
+ margin: ${u};
141
+ }
142
+ body > :not(#${e.id}) {
143
+ display: none;
144
+ }
145
+ }`);
146
+ try {
147
+ await o();
148
+ } catch (d) {
149
+ console.error(d);
150
+ } finally {
151
+ document.body.removeChild(e);
152
+ const d = document.adoptedStyleSheets.indexOf(l);
153
+ d >= 0 && document.adoptedStyleSheets.splice(d, 1);
154
+ }
155
+ }
156
+ return X(() => {
157
+ s.data = void 0;
158
+ }), (o, n) => {
159
+ var e, l, a;
160
+ return p(), A(N, null, [
161
+ R(re, {
162
+ settings: t,
163
+ "sequence-column-options": (e = g.data) == null ? void 0 : e.options,
164
+ "label-column-options": (l = f.data) == null ? void 0 : l.options,
165
+ "color-scheme-options": D.value,
166
+ onUpdateSettings: E,
167
+ onExport: U
168
+ }, null, 8, ["settings", "sequence-column-options", "label-column-options", "color-scheme-options"]),
169
+ x.value ? (p(), S(r(P), {
170
+ key: 0,
171
+ type: "error"
172
+ }, {
173
+ default: b(() => [
174
+ w(v(x.value), 1)
175
+ ]),
176
+ _: 1
177
+ })) : !s.isLoading && !s.data ? (p(), S(r(P), {
178
+ key: 1,
179
+ type: "warn",
180
+ icon: ""
181
+ }, {
182
+ default: b(() => [...n[0] || (n[0] = [
183
+ w(" Please select at least one sequence column and two or more rows to run alignment ", -1)
184
+ ])]),
185
+ _: 1
186
+ })) : (p(), A(N, { key: 2 }, [
187
+ (a = s.data) != null && a.exceedsLimit ? (p(), S(r(P), {
188
+ key: 0,
189
+ type: "warn",
190
+ icon: "",
191
+ label: "Visualization is limited"
192
+ }, {
193
+ default: b(() => [
194
+ w(" MSA visualization supports " + v(r(I)(2)) + " to " + v(r(I)(r(_))) + " sequences. Only the first " + v(r(I)(r(_))) + " will be displayed. ", 1)
195
+ ]),
196
+ _: 1
197
+ })) : V("", !0),
198
+ R(r(Z), {
199
+ type: "transparent",
200
+ class: Y(r(B).splash),
201
+ loading: s.isLoading
202
+ }, {
203
+ default: b(() => [
204
+ s.data ? (p(), S(ae, {
205
+ key: 0,
206
+ ref: "msa",
207
+ sequences: s.data.sequences,
208
+ labels: s.data.labels,
209
+ "highlight-legend": s.data.highlightLegend,
210
+ "phylogenetic-tree": s.data.phylogeneticTree,
211
+ widgets: t.widgets
212
+ }, null, 8, ["sequences", "labels", "highlight-legend", "phylogenetic-tree", "widgets"])) : V("", !0)
213
+ ]),
214
+ _: 1
215
+ }, 8, ["class", "loading"])
216
+ ], 64))
217
+ ], 64);
218
+ };
219
+ }
220
+ });
221
+ export {
222
+ ye as default
223
+ };
224
+ //# sourceMappingURL=PlMultiSequenceAlignment.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlMultiSequenceAlignment.vue2.js","sources":["../src/PlMultiSequenceAlignment.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { isJsonEqual } from '@milaboratories/helpers';\nimport {\n type ListOptionNormalized,\n PlAlert,\n PlSplash,\n} from '@milaboratories/uikit';\nimport {\n getRawPlatformaInstance,\n type PColumnPredicate,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentModel,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n} from '@platforma-sdk/model';\nimport {\n computed,\n onBeforeMount,\n onUnmounted,\n reactive,\n useCssModule,\n useTemplateRef,\n watchEffect,\n} from 'vue';\nimport {\n SEQUENCE_LIMIT,\n useLabelColumnsOptions,\n useMarkupColumnsOptions,\n useMultipleAlignmentData,\n useSequenceColumnsOptions,\n} from './data';\nimport { runMigrations } from './migrations';\nimport MultiSequenceAlignmentView from './MultiSequenceAlignmentView.vue';\nimport { defaultSettings } from './settings';\nimport Toolbar from './Toolbar.vue';\n\nconst model = defineModel<PlMultiSequenceAlignmentModel>({ default: {} });\n\nonBeforeMount(() => {\n runMigrations(model);\n});\n\nconst settings = reactive<PlMultiSequenceAlignmentSettings>({\n ...defaultSettings,\n});\n\nconst props = defineProps<{\n /**\n * Handle to PFrame created using `createPFrameForGraphs`.\n * Should contain all desired sequence and label columns.\n */\n readonly pFrame: PFrameHandle | undefined;\n /**\n * Return true if column should be shown in sequence columns dropdown.\n * By default, all sequence columns are selected.\n */\n readonly sequenceColumnPredicate: PColumnPredicate;\n /**\n * Row selection model (from `PlAgDataTableV2` or `GraphMaker`).\n * If not provided or empty, all rows will be considered selected.\n * Warning: should be forwarded as a field of `reactive` object\n */\n readonly selection?: PlSelectionModel;\n}>();\n\nconst classes = useCssModule();\n\nconst sequenceColumns = reactive(useSequenceColumnsOptions(() => ({\n pFrame: props.pFrame,\n sequenceColumnPredicate: props.sequenceColumnPredicate,\n})));\n\nconst labelColumns = reactive(useLabelColumnsOptions(() => ({\n pFrame: props.pFrame,\n sequenceColumnIds: settings.sequenceColumnIds,\n})));\n\nconst markupColumns = reactive(useMarkupColumnsOptions(() => ({\n pFrame: props.pFrame,\n sequenceColumnIds: settings.sequenceColumnIds,\n})));\n\nconst multipleAlignmentData = reactive(useMultipleAlignmentData(() => ({\n pFrame: props.pFrame,\n sequenceColumnIds: settings.sequenceColumnIds,\n labelColumnIds: settings.labelColumnIds,\n selection: props.selection,\n colorScheme: settings.colorScheme,\n alignmentParams: settings.alignmentParams,\n shouldBuildPhylogeneticTree: settings.widgets.includes('tree'),\n})));\n\nconst formatNumber = new Intl.NumberFormat('en').format;\n\nconst colorSchemeOptions = computed<\n ListOptionNormalized<PlMultiSequenceAlignmentColorSchemeOption>[]\n>(\n () => [\n {\n label: 'Chemical Properties',\n value: { type: 'chemical-properties' },\n },\n {\n label: 'No Color',\n value: { type: 'no-color' },\n },\n ...(markupColumns.data ?? []).map(({ label, value }) => ({\n label,\n value: {\n type: 'markup' as const,\n columnIds: value,\n },\n })),\n ],\n);\n\nconst error = computed(() =>\n sequenceColumns.error\n ?? labelColumns.error\n ?? markupColumns.error\n ?? multipleAlignmentData.error,\n);\n\nfunction applySettings(\n settingsPatch: Partial<PlMultiSequenceAlignmentSettings>,\n) {\n model.value = Object.fromEntries(\n Object.entries({ ...model.value, ...settingsPatch })\n .filter(([_key, value]) => value !== undefined),\n );\n}\n\nwatchEffect(() => {\n const patch: Partial<PlMultiSequenceAlignmentSettings> = Object.fromEntries(\n Object.entries({\n ...defaultSettings,\n sequenceColumnIds: sequenceColumns.data?.defaults,\n labelColumnIds: labelColumns.data?.defaults,\n ...model.value,\n }).filter(([key, value]) =>\n !isJsonEqual(\n settings[key as keyof PlMultiSequenceAlignmentSettings],\n value,\n ),\n ),\n );\n Object.assign(settings, patch);\n});\n\n// Reset stale settings\nwatchEffect(() => {\n const settingsToReset: (keyof PlMultiSequenceAlignmentSettings)[] = [];\n if (\n !sequenceColumns.isLoading\n && settings.sequenceColumnIds?.some((id) =>\n (sequenceColumns.data?.options ?? []).every(\n ({ value }) => !isJsonEqual(value, id),\n ),\n )\n ) {\n settingsToReset.push('sequenceColumnIds');\n }\n if (\n !labelColumns.isLoading\n && settings.labelColumnIds?.some((id) =>\n (labelColumns.data?.options ?? []).every(\n ({ value }) => !isJsonEqual(value, id),\n ),\n )\n ) {\n settingsToReset.push('labelColumnIds');\n }\n\n const markupColumnIds = settings.colorScheme?.type === 'markup'\n ? settings.colorScheme.columnIds\n : undefined;\n\n if (\n !markupColumns.isLoading\n && markupColumnIds\n && (markupColumns.data ?? []).every(\n ({ value }) => !isJsonEqual(value, markupColumnIds),\n )\n ) {\n settingsToReset.push('colorScheme');\n }\n if (settingsToReset.length) {\n applySettings(Object.fromEntries(\n settingsToReset.map((key) => [key, undefined]),\n ));\n }\n});\n\nconst msaEl = useTemplateRef('msa');\n\nasync function exportPdf() {\n const exportToPdf = getRawPlatformaInstance()?.lsDriver\n ?.exportToPdf;\n if (!exportToPdf) {\n return console.error(\n 'API getPlatformaRawInstance().lsDriver.exportToPdf is not available',\n );\n }\n const msaRoot = msaEl.value?.rootEl;\n if (!msaRoot) {\n throw new Error('MSA element is not available.');\n }\n const printTarget = document.createElement('div');\n printTarget.id = `print-target-${crypto.randomUUID()}`;\n const printStyleSheet = new CSSStyleSheet();\n document.adoptedStyleSheets.push(printStyleSheet);\n printStyleSheet.insertRule(`\n@media screen {\n #${printTarget.id} {\n visibility: hidden;\n position: fixed;\n }\n}`);\n const msaClone = msaRoot.cloneNode(true) as HTMLElement;\n msaClone.dataset.prePrint = '';\n printTarget.replaceChildren(msaClone);\n document.body.appendChild(printTarget);\n const { height, width } = printTarget.getBoundingClientRect();\n const margin = CSS.cm(1);\n const pageSize = [width, height]\n .map((value) => CSS.px(value).add(margin.mul(2)))\n .join(' ');\n printStyleSheet.insertRule(`\n@media print {\n @page {\n size: ${pageSize};\n margin: ${margin};\n }\n body > :not(#${printTarget.id}) {\n display: none;\n }\n}`);\n try {\n await exportToPdf();\n } catch (error) {\n console.error(error);\n } finally {\n document.body.removeChild(printTarget);\n const index = document.adoptedStyleSheets.indexOf(printStyleSheet);\n if (index >= 0) {\n document.adoptedStyleSheets.splice(index, 1);\n }\n }\n}\n\nonUnmounted(() => {\n multipleAlignmentData.data = undefined;\n});\n</script>\n\n<template>\n <Toolbar\n :settings=\"settings\"\n :sequence-column-options=\"sequenceColumns.data?.options\"\n :label-column-options=\"labelColumns.data?.options\"\n :color-scheme-options=\"colorSchemeOptions\"\n @update-settings=\"applySettings\"\n @export=\"exportPdf\"\n />\n <PlAlert v-if=\"error\" type=\"error\">\n {{ error }}\n </PlAlert>\n <PlAlert\n v-else-if=\"!multipleAlignmentData.isLoading && !multipleAlignmentData.data\"\n type=\"warn\"\n icon\n >\n Please select at least one sequence column and two or more rows to run\n alignment\n </PlAlert>\n <template v-else>\n <PlAlert\n v-if=\"multipleAlignmentData.data?.exceedsLimit\"\n type=\"warn\"\n icon\n label=\"Visualization is limited\"\n >\n MSA visualization supports {{ formatNumber(2) }} to\n {{ formatNumber(SEQUENCE_LIMIT) }} sequences. Only the first\n {{ formatNumber(SEQUENCE_LIMIT) }} will be displayed.\n </PlAlert>\n <PlSplash\n type=\"transparent\"\n :class=\"classes.splash\"\n :loading=\"multipleAlignmentData.isLoading\"\n >\n <MultiSequenceAlignmentView\n v-if=\"multipleAlignmentData.data\"\n ref=\"msa\"\n :sequences=\"multipleAlignmentData.data.sequences\"\n :labels=\"multipleAlignmentData.data.labels\"\n :highlight-legend=\"multipleAlignmentData.data.highlightLegend\"\n :phylogenetic-tree=\"multipleAlignmentData.data.phylogeneticTree\"\n :widgets=\"settings.widgets\"\n />\n </PlSplash>\n </template>\n</template>\n\n<style module>\n.splash {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n overflow: hidden;\n}\n</style>\n"],"names":["model","_useModel","__props","onBeforeMount","runMigrations","settings","reactive","defaultSettings","props","classes","useCssModule","sequenceColumns","useSequenceColumnsOptions","labelColumns","useLabelColumnsOptions","markupColumns","useMarkupColumnsOptions","multipleAlignmentData","useMultipleAlignmentData","formatNumber","colorSchemeOptions","computed","label","value","error","applySettings","settingsPatch","_key","watchEffect","patch","_a","_b","key","isJsonEqual","settingsToReset","id","markupColumnIds","_c","msaEl","useTemplateRef","exportPdf","exportToPdf","getRawPlatformaInstance","msaRoot","printTarget","printStyleSheet","msaClone","height","width","margin","pageSize","index","onUnmounted","_createVNode","Toolbar","_createBlock","_unref","PlAlert","_cache","_createElementBlock","_Fragment","_createTextVNode","_toDisplayString","SEQUENCE_LIMIT","PlSplash","_normalizeClass","MultiSequenceAlignmentView"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._splash_dk8xp_2{flex:1;display:flex;flex-direction:column;gap:12px;overflow:hidden}")),document.head.appendChild(e)}}catch(d){console.error("vite-plugin-css-injected-by-js",d)}})();
2
+ const s = "_splash_dk8xp_2", a = {
3
+ splash: s
4
+ };
5
+ export {
6
+ a as default,
7
+ s as splash
8
+ };
9
+ //# sourceMappingURL=PlMultiSequenceAlignment.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlMultiSequenceAlignment.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,8 @@
1
+ import { ResidueCounts } from './types';
2
+ type __VLS_Props = {
3
+ residueCounts: ResidueCounts;
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 "./SeqLogo.vue2.js";
2
+ import s from "./SeqLogo.vue3.js";
3
+ import t from "./_virtual/_plugin-vue_export-helper.js";
4
+ const e = {
5
+ $style: s
6
+ }, f = /* @__PURE__ */ t(o, [["__cssModules", e]]);
7
+ export {
8
+ f as default
9
+ };
10
+ //# sourceMappingURL=SeqLogo.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeqLogo.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,127 @@
1
+ import { defineComponent as C, useCssModule as w, useTemplateRef as E, computed as f, shallowRef as x, watchEffect as D, onBeforeUnmount as _, createBlock as K, createElementBlock as B, unref as l, openBlock as d, withCtx as A, createTextVNode as G, toDisplayString as S, normalizeClass as T } from "vue";
2
+ import { PlAlert as L } from "@milaboratories/uikit";
3
+ import { cellSize as N } from "./cell-size.js";
4
+ import { useMiPlots as P } from "./useMiPlots.js";
5
+ const R = /* @__PURE__ */ C({
6
+ __name: "SeqLogo",
7
+ props: {
8
+ residueCounts: {}
9
+ },
10
+ setup(y) {
11
+ const u = y, g = w(), n = E("plotEl"), e = {
12
+ blue: "#549EE7",
13
+ red: "#E85456",
14
+ green: "#65BF65",
15
+ magenta: "#9178E1",
16
+ pink: "#D568D5",
17
+ orange: "#C59445",
18
+ cyan: "#62C7CC",
19
+ yellow: "#D5D549",
20
+ black: "#000000"
21
+ }, h = {
22
+ A: e.blue,
23
+ R: e.red,
24
+ N: e.green,
25
+ D: e.magenta,
26
+ C: e.pink,
27
+ Q: e.green,
28
+ E: e.magenta,
29
+ G: e.orange,
30
+ H: e.cyan,
31
+ I: e.blue,
32
+ L: e.blue,
33
+ K: e.red,
34
+ M: e.blue,
35
+ F: e.blue,
36
+ P: e.yellow,
37
+ S: e.green,
38
+ T: e.green,
39
+ W: e.blue,
40
+ Y: e.cyan,
41
+ V: e.blue,
42
+ B: e.black,
43
+ X: e.black,
44
+ Z: e.black
45
+ }, r = f(() => ({
46
+ type: "discrete",
47
+ title: {
48
+ name: "",
49
+ show: !1
50
+ },
51
+ size: {
52
+ width: u.residueCounts.length * N.inline,
53
+ height: 80,
54
+ innerOffset: 0,
55
+ outerOffset: 0
56
+ },
57
+ frame: {
58
+ type: "empty"
59
+ },
60
+ xAxis: {
61
+ title: "",
62
+ showGrid: !1,
63
+ showTicks: !1,
64
+ hiddenLabels: !0
65
+ },
66
+ yAxis: {
67
+ title: "",
68
+ showGrid: !1,
69
+ showTicks: !1,
70
+ hiddenLabels: !0
71
+ },
72
+ y: {
73
+ type: "column",
74
+ value: "countKey"
75
+ },
76
+ primaryGrouping: {
77
+ columnName: {
78
+ type: "column",
79
+ value: "columnKey"
80
+ }
81
+ },
82
+ secondaryGrouping: {
83
+ columnName: {
84
+ type: "column",
85
+ value: "residueKey"
86
+ }
87
+ },
88
+ layers: [{
89
+ type: "logo",
90
+ aes: { fillColor: h }
91
+ }]
92
+ })), a = f(() => {
93
+ const t = [], s = [], m = [];
94
+ for (const [v, b] of u.residueCounts.entries())
95
+ for (const [p, k] of Object.entries(b))
96
+ p !== "-" && (t.push(k), s.push(v), m.push(p));
97
+ return {
98
+ type: "columns",
99
+ id: `seq-logo-${crypto.randomUUID()}`,
100
+ values: { countKey: t, columnKey: s, residueKey: m }
101
+ };
102
+ }), { miplots: c, error: i } = P(), o = x();
103
+ return D(async () => {
104
+ !n.value || !c.value || (o.value ? o.value.updateSettingsAndData(a.value, r.value) : (o.value = c.value.newPlot(a.value, r.value), o.value.mount(n.value)));
105
+ }), _(() => {
106
+ var t;
107
+ (t = o.value) == null || t.unmount();
108
+ }), (t, s) => l(i) ? (d(), K(l(L), {
109
+ key: 0,
110
+ type: "error"
111
+ }, {
112
+ default: A(() => [
113
+ G(S(l(i).message), 1)
114
+ ]),
115
+ _: 1
116
+ })) : (d(), B("div", {
117
+ key: 1,
118
+ ref_key: "plotEl",
119
+ ref: n,
120
+ class: T(l(g).container)
121
+ }, null, 2));
122
+ }
123
+ });
124
+ export {
125
+ R as default
126
+ };
127
+ //# sourceMappingURL=SeqLogo.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeqLogo.vue2.js","sources":["../src/SeqLogo.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 { ResidueCounts } from './types';\nimport { useMiPlots } from './useMiPlots';\n\nconst props = defineProps<{\n residueCounts: ResidueCounts;\n}>();\n\nconst classes = useCssModule();\n\nconst plotEl = useTemplateRef('plotEl');\n\nconst palette = {\n blue: '#549EE7',\n red: '#E85456',\n green: '#65BF65',\n magenta: '#9178E1',\n pink: '#D568D5',\n orange: '#C59445',\n cyan: '#62C7CC',\n yellow: '#D5D549',\n black: '#000000',\n};\n\nconst residueColors = {\n A: palette.blue,\n R: palette.red,\n N: palette.green,\n D: palette.magenta,\n C: palette.pink,\n Q: palette.green,\n E: palette.magenta,\n G: palette.orange,\n H: palette.cyan,\n I: palette.blue,\n L: palette.blue,\n K: palette.red,\n M: palette.blue,\n F: palette.blue,\n P: palette.yellow,\n S: palette.green,\n T: palette.green,\n W: palette.blue,\n Y: palette.cyan,\n V: palette.blue,\n B: palette.black,\n X: palette.black,\n Z: palette.black,\n};\n\nconst settings = computed(() => ({\n type: 'discrete',\n title: {\n name: '',\n show: false,\n },\n size: {\n width: props.residueCounts.length * cellSize.inline,\n height: 80,\n innerOffset: 0,\n outerOffset: 0,\n },\n frame: {\n type: 'empty',\n },\n xAxis: {\n title: '',\n showGrid: false,\n showTicks: false,\n hiddenLabels: true,\n },\n yAxis: {\n title: '',\n showGrid: false,\n showTicks: false,\n hiddenLabels: true,\n },\n y: {\n type: 'column',\n value: 'countKey',\n },\n primaryGrouping: {\n columnName: {\n type: 'column',\n value: 'columnKey',\n },\n },\n secondaryGrouping: {\n columnName: {\n type: 'column',\n value: 'residueKey',\n },\n },\n layers: [{\n type: 'logo',\n aes: { fillColor: residueColors },\n }],\n} satisfies Settings));\n\nconst data = computed<DataByColumns>(() => {\n const countKey: number[] = [];\n const columnKey: number[] = [];\n const residueKey: string[] = [];\n for (const [columnIndex, column] of props.residueCounts.entries()) {\n for (const [residue, count] of Object.entries(column)) {\n if (residue === '-') continue;\n countKey.push(count);\n columnKey.push(columnIndex);\n residueKey.push(residue);\n }\n }\n return ({\n type: 'columns',\n id: `seq-logo-${crypto.randomUUID()}`,\n values: { countKey, columnKey, residueKey },\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.value);\n plot.value.mount(plotEl.value);\n } else {\n plot.value.updateSettingsAndData(data.value, settings.value);\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","palette","residueColors","settings","computed","cellSize","data","countKey","columnKey","residueKey","columnIndex","column","residue","count","miplots","error","useMiPlots","plot","shallowRef","watchEffect","onBeforeUnmount","_a","_unref","_createBlock","PlAlert","_createTextVNode","_toDisplayString","_createElementBlock","_normalizeClass"],"mappings":"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"}
@@ -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=SeqLogo.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeqLogo.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}