jbrowse-plugin-protein3d 1.2.0 → 1.2.1
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/README.md +5 -3
- package/dist/LaunchProteinView/utils/util.js +23 -3
- package/dist/chunks/{ProteinView-B57QOH3K.js → ProteinView-MG7N24DJ.js} +2 -2
- package/dist/chunks/{chunk-UTUOAPWU.js → chunk-252AFZJZ.js} +1 -1
- package/dist/chunks/{chunk-UTUOAPWU.js.map → chunk-252AFZJZ.js.map} +1 -1
- package/dist/jbrowse-plugin-protein3d.esm.js +7 -7
- package/dist/jbrowse-plugin-protein3d.esm.js.map +4 -4
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/src/LaunchProteinView/utils/util.ts +28 -3
- package/src/version.ts +1 -1
- /package/dist/chunks/{ProteinView-B57QOH3K.js.map → ProteinView-MG7N24DJ.js.map} +0 -0
package/README.md
CHANGED
|
@@ -37,9 +37,11 @@ Using the plugin:
|
|
|
37
37
|
gene, and reads the R248 hotspot back to its codon;
|
|
38
38
|
[Proteins on genomes.jbrowse.org](https://jbrowse.org/jb2/docs/tutorials/genomes_proteins/)
|
|
39
39
|
launches a structure and an MSA from any gene's right-click menu.
|
|
40
|
-
- [Demos](docs/demos.md):
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
- [Demos](docs/demos.md): one link each. Genes opened by name alone in human,
|
|
41
|
+
mouse, yeast, bacteria, fungi and viruses (E. coli recA, M. tuberculosis katG,
|
|
42
|
+
the SARS-CoV-2 spike, the HIV-1 capsid), then the structures that are easy to
|
|
43
|
+
map wrong — a peptide bound to a larger partner, a protein bound to DNA, a
|
|
44
|
+
receptor with another protein fused into it, a phosphorylated residue, and a
|
|
43
45
|
mitochondrial protein.
|
|
44
46
|
- [Your own structures](docs/your-own-structures.md): opening a model you folded
|
|
45
47
|
yourself (ColabFold, AlphaFold 3, Boltz…) instead of the AlphaFold DB one,
|
|
@@ -122,6 +122,15 @@ export function findRecognizedDbIds(f) {
|
|
|
122
122
|
}
|
|
123
123
|
return [...new Set(recognizedIds)];
|
|
124
124
|
}
|
|
125
|
+
// `UniProtKB/Swiss-Prot:P0A7G6`, the reviewed entry before a TrEMBL one
|
|
126
|
+
function dbxrefUniProtId(f) {
|
|
127
|
+
const entries = parseDbxref(f?.get('Dbxref') ?? f?.get('dbxref') ?? f?.get('db_xref'));
|
|
128
|
+
return ['UniProtKB/Swiss-Prot:', 'UniProtKB/TrEMBL:']
|
|
129
|
+
.flatMap(prefix => entries
|
|
130
|
+
.filter(e => e.startsWith(prefix))
|
|
131
|
+
.map(e => e.slice(prefix.length)))
|
|
132
|
+
.find(id => id.length > 0);
|
|
133
|
+
}
|
|
125
134
|
/**
|
|
126
135
|
* Extract all useful identifiers from a feature for UniProt lookup.
|
|
127
136
|
* If the feature is a gene, prioritizes identifiers from the preferred
|
|
@@ -140,13 +149,24 @@ export function extractFeatureIdentifiers(f, preferredTranscriptId) {
|
|
|
140
149
|
transcripts[0] ??
|
|
141
150
|
f;
|
|
142
151
|
}
|
|
143
|
-
//
|
|
144
|
-
|
|
152
|
+
// NCBI's GFF3 puts the protein on the CDS record, not the transcript: its
|
|
153
|
+
// RefSeq accession always, and for a curated genome (E. coli K-12, yeast)
|
|
154
|
+
// the UniProt accession itself. A prokaryotic gene has no transcript record
|
|
155
|
+
// between, so the CDS is the only place either appears.
|
|
156
|
+
const cds = featureToProcess
|
|
157
|
+
.get('subfeatures')
|
|
158
|
+
?.find(sub => sub.get('type')?.toLowerCase() === 'cds');
|
|
159
|
+
const recognizedIds = [
|
|
160
|
+
...findRecognizedDbIds(featureToProcess),
|
|
161
|
+
...findRecognizedDbIds(cds),
|
|
162
|
+
];
|
|
145
163
|
// Handle UniProt ID from feature attributes (trust that it's valid if present)
|
|
146
164
|
const uniprotIdAttr = featureToProcess.get('uniprot') ??
|
|
147
165
|
featureToProcess.get('uniprotId') ??
|
|
148
166
|
featureToProcess.get('uniprotid') ??
|
|
149
|
-
featureToProcess.get('UniProt')
|
|
167
|
+
featureToProcess.get('UniProt') ??
|
|
168
|
+
dbxrefUniProtId(featureToProcess) ??
|
|
169
|
+
dbxrefUniProtId(cds);
|
|
150
170
|
const uniprotId = typeof uniprotIdAttr === 'string' && uniprotIdAttr.length > 0
|
|
151
171
|
? uniprotIdAttr
|
|
152
172
|
: undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Aa as xe,Ba as Pt,Ca as Ct,E as tt,Fa as Tt,Ha as kt,M as rt,R as ye,U as ot,W as nt,a as k,b as xo,da as at,ea as ut,fa as dt,g as Ne,ga as ct,h as wo,ha as pt,ia as ve,k as _e,ka as Se,l as Ke,m as Ge,p as je,pa as mt,q as Ye,r as Qe,ra as ft,sa as gt,t as Xe,ta as ht,u as Ze,ua as yt,v as Re,va as bt,w as et,wa as vt,xa as St,ya as xt,za as wt}from"./chunk-
|
|
1
|
+
import{Aa as xe,Ba as Pt,Ca as Ct,E as tt,Fa as Tt,Ha as kt,M as rt,R as ye,U as ot,W as nt,a as k,b as xo,da as at,ea as ut,fa as dt,g as Ne,ga as ct,h as wo,ha as pt,ia as ve,k as _e,ka as Se,l as Ke,m as Ge,p as je,pa as mt,q as Ye,r as Qe,ra as ft,sa as gt,t as Xe,ta as ht,u as Ze,ua as yt,v as Re,va as bt,w as et,wa as vt,xa as St,ya as xt,za as wt}from"./chunk-252AFZJZ.js";import{a as C}from"./chunk-X5RLRQSB.js";import{c as it,d as st,f as be,g as lt}from"./chunk-GQU3SL56.js";import{a as $}from"./chunk-533QNNGN.js";import{a as he,b as U}from"./chunk-J236G3A2.js";import{a as w}from"./chunk-GVEKA5YG.js";import{a as So}from"./chunk-B3HKXTGK.js";import{a as A,c as l}from"./chunk-KVMUXFPB.js";var Ot=A((Cn,Vt)=>{Vt.exports=JBrowseExports["@mui/material/Checkbox"]});var zt=A((Tn,Wt)=>{Wt.exports=JBrowseExports["@mui/material/Divider"]});var we=A((kn,qt)=>{qt.exports=JBrowseExports["@mui/material/IconButton"]});var _t=A((Mn,Nt)=>{Nt.exports=JBrowseExports["@mui/material/ListItemIcon"]});var Gt=A((In,Kt)=>{Kt.exports=JBrowseExports["@mui/material/ListItemText"]});var Yt=A((Ln,jt)=>{jt.exports=JBrowseExports["@mui/material/Menu"]});var Xt=A((En,Qt)=>{Qt.exports=JBrowseExports["@mui/material/MenuItem"]});var Pe=A((Bn,Zt)=>{Zt.exports=JBrowseExports["@mui/material/Tooltip"]});var Ce=A((Hn,rr)=>{rr.exports=JBrowseExports["@mui/material/Typography"]});var hr=A((_n,gr)=>{gr.exports=JBrowseExports["@mui/material/Chip"]});var br=A((Kn,yr)=>{yr.exports=JBrowseExports["@mui/material/Link"]});var P=l(w()),_=l(he());var Mt=l($(),1),X=(0,C.createSvgIcon)((0,Mt.jsx)("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");var bo=l(U()),se=l(k());var M=l(w()),T=l(U());function It(o){let e=o.next();for(;!e.done&&e.value.trim()==="";)e=o.next();return e.value}function Et(o){let e=o.trim();return e?e.split(/\s+/).every(n=>/^\d+$/.test(n)):!1}function Po(o){let e=o.trim();return/^\w+\s+/.test(e)&&!Et(o)}function Co(o){return o.length>=3&&/^\d+$/.test(o[1])}function To(o,e){let n=o.trim().split(/\s+/),r=n[e],i=o.indexOf(r,o.indexOf(n[0])+n[0].length);return[i,i+r.length]}function Lt(o){let e=It(o),t=[],n="";if(!e)return;for(;e;)Et(e)||(Po(e)?t.push(e):n=e),e=o.next().value;if(t.length===0)return;let r=t.map(S=>S.trim().split(/\s+/)),i=r[0];if(!i)return;let s=Co(i)?2:1,[a,u]=To(t[0],s),y=r.map(S=>S[0]),d=r.map(S=>S[s]),h=n.slice(a,u),v=d[0];if(v){let S=v.length-h.length;S>0&&(h+=" ".repeat(S))}return{ids:y,seqs:d,consensus:h}}function Bt(o){let e,t=Lt(o);if(t!==void 0)for(;e=Lt(o);){for(let n=0;n<e.seqs.length;n++)t.seqs[n]+=e.seqs[n];t.consensus+=e.consensus}return t}function At(o){let e=o.split(`
|
|
2
2
|
`).filter(s=>!s.startsWith("#")).join(`
|
|
3
3
|
`),t=Bt(e.split(`
|
|
4
4
|
`)[Symbol.iterator]());if(t===void 0)throw new Error("No blocks parsed");let n=t.seqs.map((s,a)=>({id:t.ids[a],seq:s})),{consensus:r}=t,i=n[0];if(!i)throw new Error("No alignments found");if(r.length!==i.seq.length)throw new Error(`Consensus length !== sequence length. Con ${r.length} seq ${i.seq.length}`);if(n.length!==2)throw new Error(`Expected exactly 2 sequences in pairwise alignment, got ${n.length}`);return{consensus:r,alns:n}}var Ft=l(k());var ko=(0,Ft.observer)(function({model:e}){let[t,n]=(0,M.useState)(""),[r,i]=(0,M.useState)(),{showManualAlignmentDialog:s,alignmentStructure:a}=e,u=()=>{n(""),i(void 0),e.setShowManualAlignmentDialog(!1)},y=()=>{if(t.trim())try{let d=At(t.trim()),h=a?.entities,v=a&&h?Ct(d,a.userProvidedTranscriptSequence,h,a.mappedEntityId):void 0;!a||!v?i("No structure loaded to apply alignment to"):"problem"in v?i(v.problem):(a.importAlignment(Pt(d)),u())}catch(d){i(`Failed to parse alignment: ${d}`)}};return s?M.default.createElement(T.Dialog,{open:!0,onClose:u,maxWidth:"md",fullWidth:!0},M.default.createElement(T.DialogTitle,null,"Import manual alignment"),M.default.createElement(T.DialogContent,null,M.default.createElement(T.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Paste a pre-computed alignment in Clustal format. The first sequence should be the transcript and the second should be the structure."),M.default.createElement(T.TextField,{multiline:!0,rows:12,fullWidth:!0,placeholder:`Example:
|
|
@@ -6,4 +6,4 @@ transcript MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG
|
|
|
6
6
|
|||||||||||||||||||||||||||||||||||||
|
|
7
7
|
structure MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG`,value:t,onChange:d=>{n(d.target.value),i(void 0)},slotProps:{htmlInput:{style:{fontFamily:"monospace",fontSize:12}}}}),r?M.default.createElement(T.Typography,{color:"error",variant:"body2",sx:{mt:1}},r):null),M.default.createElement(T.DialogActions,null,M.default.createElement(T.Button,{onClick:()=>{u()}},"Cancel"),M.default.createElement(T.Button,{onClick:()=>{y()},variant:"contained",color:"primary",disabled:!t.trim()},"Apply alignment"))):null}),Dt=ko;var f=l(w()),uo=l(he());var Ht=l($(),1),$t=(0,C.createSvgIcon)((0,Ht.jsx)("path",{d:"M12 2C6.49 2 2 6.49 2 12s4.49 10 10 10c1.38 0 2.5-1.12 2.5-2.5 0-.61-.23-1.2-.64-1.67-.08-.1-.13-.21-.13-.33 0-.28.22-.5.5-.5H16c3.31 0 6-2.69 6-6 0-4.96-4.49-9-10-9m5.5 11c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5m-3-4c-.83 0-1.5-.67-1.5-1.5S13.67 6 14.5 6s1.5.67 1.5 1.5S15.33 9 14.5 9M5 11.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5S7.33 13 6.5 13 5 12.33 5 11.5m6-4c0 .83-.67 1.5-1.5 1.5S8 8.33 8 7.5 8.67 6 9.5 6s1.5.67 1.5 1.5"}),"Palette");var Ut=l($(),1),Jt=(0,C.createSvgIcon)((0,Ut.jsx)("path",{d:"M3 17v2h6v-2zM3 5v2h10V5zm10 16v-2h8v-2h-8v-2h-2v6zM7 9v2H3v2h4v2h2V9zm14 4v-2H11v2zm-6-4h2V7h4V5h-4V3h-2z"}),"Tune");var co=l(Ot()),po=l(zt()),He=l(we()),mo=l(_t()),fo=l(Gt()),$e=l(Yt()),Ue=l(Xt()),Je=l(Pe()),me=l(k());var c=l(w()),Rt=l(he()),p=l(U()),er=l(k());var Mo=(0,er.observer)(function({model:e}){let[t,n]=(0,c.useState)(),[r,i]=(0,c.useState)(""),[s,a]=(0,c.useState)(""),[u,y]=(0,c.useState)("pdb"),[d,h]=(0,c.useState)(""),[v,S]=(0,c.useState)(),[O,Y]=(0,c.useState)(!0),{showAddStructureDialog:ee}=e,te=!!e.primaryStructure?.userProvidedTranscriptSequence,W=()=>{n(void 0),i(""),a(""),h(""),S(void 0),e.setShowAddStructureDialog(!1)},z=async()=>{try{let x=u==="pdb"&&r?{pdbId:r}:u==="uniprot"&&s?{uniprotId:s}:u==="url"&&d?{url:d}:u==="file"&&t?{data:await ct(t)}:void 0;if(x){let D=e.primaryStructure,le=O&&D?.userProvidedTranscriptSequence?{userProvidedTranscriptSequence:D.userProvidedTranscriptSequence,feature:D.feature,connectedViewId:D.connectedViewId}:{};e.addStructure({...x,...le}),W()}}catch(x){console.error(x),S(x)}};if(!ee)return null;let K=r!==""&&!ye(r),E=u==="url"&&d!==""||u==="file"&&t!==void 0||u==="pdb"&&ye(r)||u==="uniprot"&&s!=="";return c.default.createElement(p.Dialog,{open:!0,onClose:W,maxWidth:"sm",fullWidth:!0},c.default.createElement(p.DialogTitle,null,"Add structure"),c.default.createElement(p.DialogContent,null,v?c.default.createElement(Rt.ErrorMessage,{error:v}):null,c.default.createElement(p.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Add another structure to superpose on the existing structure(s)."),c.default.createElement(p.FormControl,{component:"fieldset",sx:{mb:2}},c.default.createElement(p.RadioGroup,{value:u,onChange:x=>{y(x.target.value)}},c.default.createElement(p.FormControlLabel,{value:"pdb",control:c.default.createElement(p.Radio,null),label:"PDB ID"}),c.default.createElement(p.FormControlLabel,{value:"uniprot",control:c.default.createElement(p.Radio,null),label:"UniProt ID (AlphaFold)"}),c.default.createElement(p.FormControlLabel,{value:"url",control:c.default.createElement(p.Radio,null),label:"URL"}),c.default.createElement(p.FormControlLabel,{value:"file",control:c.default.createElement(p.Radio,null),label:"File"}))),u==="pdb"?c.default.createElement(p.TextField,{fullWidth:!0,value:r,onChange:x=>{i(x.target.value.trim().toUpperCase())},label:"PDB ID (e.g. 1CRN)",placeholder:"Enter PDB ID",error:K,helperText:K?"A PDB ID is four characters beginning with a digit":void 0,sx:{mb:2}}):null,u==="uniprot"?c.default.createElement(p.TextField,{fullWidth:!0,value:s,onChange:x=>{a(x.target.value.trim().toUpperCase())},label:"UniProt ID (e.g. P04637)",placeholder:"Enter UniProt ID",helperText:"Fetches the AlphaFold predicted structure",sx:{mb:2}}):null,u==="url"?c.default.createElement(p.TextField,{fullWidth:!0,label:"Structure URL",value:d,onChange:x=>{h(x.target.value.trim())},placeholder:"https://files.rcsb.org/download/1CRN.cif",sx:{mb:2}}):null,u==="file"?c.default.createElement("div",{style:{marginBottom:16}},c.default.createElement(p.Button,{variant:"outlined",component:"label"},t?t.name:"Choose file",c.default.createElement("input",{type:"file",hidden:!0,accept:pt,onChange:({target:x})=>{let D=x.files?.[0];D&&n(D)}})),t?c.default.createElement(p.Typography,{variant:"body2",sx:{mt:1}},"Selected: ",t.name):null):null,te?c.default.createElement(p.FormControlLabel,{control:c.default.createElement(p.Checkbox,{checked:O,onChange:x=>{Y(x.target.checked)}}),label:"Map to the same transcript as the first structure (alignment, hover and click linked to the genome)"}):null,c.default.createElement(p.Typography,{variant:"body2",color:"text.secondary",sx:{mt:1}},"Tip: Structures will be automatically superposed using TM-align. For manual control, use the Mol* controls (\u{1F527} wrench icon).")),c.default.createElement(p.DialogActions,null,c.default.createElement(p.Button,{onClick:()=>{W()}},"Cancel"),c.default.createElement(p.Button,{onClick:()=>{z()},variant:"contained",color:"primary",disabled:!E},"Add structure")))}),tr=Mo;var H=l(w()),or=l(Ce()),nr={width:8,height:8,border:"1px solid rgba(0,0,0,0.3)"};function ir({title:o,testId:e,color:t,children:n}){return H.default.createElement(or.default,{variant:"caption",color:t,component:"div","data-testid":e,style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:6,fontSize:9,paddingLeft:8}},H.default.createElement("span",null,o,":"),n)}function ke({title:o,entries:e,testId:t="track-legend",color:n="textSecondary"}){return H.default.createElement(ir,{title:o,testId:t,color:n},e.map(({label:r,color:i},s)=>H.default.createElement("span",{key:`${s}-${r}`,style:{display:"inline-flex",alignItems:"center",gap:3}},H.default.createElement("span",{style:{...nr,background:i}}),r)))}function Me({title:o,minLabel:e,maxLabel:t,colors:n,testId:r="track-legend",color:i="textSecondary"}){return H.default.createElement(ir,{title:o,testId:r,color:i},e,H.default.createElement("span",{style:{...nr,width:60,background:`linear-gradient(to right, ${n.join(", ")})`}}),t)}function Te(o){return`#${o.toString(16).padStart(6,"0")}`}function Io(o){return o.replaceAll(/([a-z])([A-Z])(?=[a-z])/g,(e,t,n)=>`${t} ${n.toLowerCase()}`)}function sr({title:o,legend:e}){return e.kind==="table-legend"?H.default.createElement(ke,{title:o,testId:"structure-legend",entries:e.table.map(([t,n])=>({label:Io(t),color:Te(n)}))}):H.default.createElement(Me,{title:o,testId:"structure-legend",minLabel:e.minLabel,maxLabel:e.maxLabel,colors:e.colors.map(t=>Array.isArray(t)?`${Te(t[0])} ${100*t[1]}%`:Te(t))})}var b=l(w());var lr=l($(),1),ar=(0,C.createSvgIcon)((0,lr.jsx)("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"ChevronRight");var ur=l($(),1),dr=(0,C.createSvgIcon)((0,ur.jsx)("path",{d:"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"}),"ExpandMore");var cr=l($(),1),pr=(0,C.createSvgIcon)((0,cr.jsx)("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"}),"Visibility");var mr=l($(),1),fr=(0,C.createSvgIcon)((0,mr.jsx)("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2m4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3z"}),"VisibilityOff");var wr=l(hr()),de=l(we()),Pr=l(br()),j=l(Pe()),re=l(Ce()),ce=l(k());var ue=l(w()),Z=l(U()),vr=l(k());var Lo=(0,vr.observer)(function({model:e}){let{entities:t,mappedEntity:n,userProvidedTranscriptSequence:r}=e;return!t||t.length<2?null:ue.default.createElement(Z.Tooltip,{title:r?"Mapped chain: the one the transcript maps to":"Chain: the one hovers read",placement:"left"},ue.default.createElement(Z.TextField,{select:!0,size:"small",variant:"standard","data-testid":"protein-mapped-chain",value:e.pendingEntityId??n?.entityId??"",onChange:i=>{e.chooseEntity(i.target.value)},slotProps:{input:{disableUnderline:!0,sx:{fontSize:12}},htmlInput:{"aria-label":"Mapped chain"}},sx:{minWidth:60}},t.map(i=>ue.default.createElement(Z.MenuItem,{key:i.entityId,value:i.entityId,dense:!0},tt(i)))))}),Sr=Lo;function xr(o){return o.aligned===0?"no residues aligned":[`${Math.round(o.identity*100)}% identity`,o.aligned===o.transcriptLength?"whole transcript":`transcript ${o.transcriptStart}\u2013${o.transcriptEnd} (${o.aligned} of ${o.transcriptLength})`,o.aligned<o.structureLength?`${o.aligned} of ${o.structureLength} structure residues`:void 0].filter(Boolean).join(" \xB7 ")}var Eo=`Under ${Math.round(je*100)}% of the shorter sequence is identical (${Math.round(Qe*100)}% for an alignment of fewer than ${Ye} residues): an alignment this weak is what two unrelated proteins produce, so the positions it maps may be unrelated. Check the mapped chain, the transcript isoform, or import a curated alignment.`,Bo=(0,ce.observer)(function({structure:e}){let{uniprotId:t,uniprotName:n}=e.uniProtEntry;return t?b.default.createElement(j.default,{title:`The mapped chain is UniProt ${t}${n?` (${n})`:""}, which its feature tracks annotate`},b.default.createElement(Pr.default,{variant:"caption",href:nt(t),target:"_blank",rel:"noreferrer",noWrap:!0,sx:{minWidth:40}},"UniProt ",t)):null}),Ao=(0,ce.observer)(function({model:e,structure:t,readout:n}){let{label:r,alignmentQuality:i,statusMessage:s,hidden:a}=t,u=e.structures.length>1,y=e.showAlignment&&u,d=e.alignmentStructure===t,h=i?et(i):void 0;return b.default.createElement("div",{"data-testid":"structure-row","data-label":r,"data-open":y?d:void 0,"data-hidden":a||void 0,style:{opacity:a?.6:void 0,display:"flex",alignItems:"center",gap:8,minHeight:24,minWidth:0}},y?b.default.createElement(j.default,{title:d?"Alignment shown below":"Show alignment"},b.default.createElement("span",null,b.default.createElement(de.default,{size:"small","aria-label":`Show ${r} alignment`,"aria-expanded":d,disabled:d,onClick:()=>{e.openAlignmentOf(t)},sx:{p:0}},d?b.default.createElement(dr,{fontSize:"small"}):b.default.createElement(ar,{fontSize:"small"})))):null,b.default.createElement(re.default,{variant:"caption",sx:{fontWeight:"bold",flexShrink:0}},r),s?b.default.createElement(re.default,{variant:"caption",color:"error","data-testid":"structure-status"},s):null,n?b.default.createElement(re.default,{variant:"caption",noWrap:!0,title:n,"data-testid":"structure-hover"},n):i?b.default.createElement(j.default,{title:i.aligned===0?"":`${Re(i)}${h?`, ${h}`:""}; ${Ze(i)}`},b.default.createElement(re.default,{variant:"caption",color:"textSecondary",noWrap:!0,"data-testid":"header-alignment-quality"},xr(i))):null,b.default.createElement(Bo,{structure:t}),b.default.createElement("div",{style:{flex:1}}),d&&e.showAlignment||!t.userProvidedTranscriptSequence?b.default.createElement(Sr,{model:t}):null,i&&Xe(i)?b.default.createElement(j.default,{title:Eo},b.default.createElement(wr.default,{size:"small",color:"warning",variant:"outlined",label:"low similarity","data-testid":"header-low-similarity"})):null,u||a?b.default.createElement(j.default,{title:a?`Show ${r}`:`Hide ${r}`},b.default.createElement(de.default,{size:"small","aria-label":a?`Show ${r}`:`Hide ${r}`,"aria-pressed":a,onClick:()=>{t.setHidden(!a)},sx:{p:.25}},a?b.default.createElement(fr,{fontSize:"small"}):b.default.createElement(pr,{fontSize:"small"}))):null,b.default.createElement(j.default,{title:`Remove ${r}`},b.default.createElement(de.default,{size:"small","aria-label":`Remove ${r}`,onClick:()=>{e.removeStructure(t)},sx:{p:.25}},b.default.createElement(X,{fontSize:"small"}))))}),Fo=(0,ce.observer)(function({model:e}){let{structures:t}=e,n=t.some(r=>r.hoverPosition&&r.hoverPosition.source!=="structure");return b.default.createElement("div",{style:{flex:1,minWidth:0}},t.map((r,i)=>b.default.createElement(Ao,{key:i,model:e,structure:r,readout:r.hoverString||(n&&r.genomeToTranscriptSeqMapping?"not in structure":"")})))}),Cr=Fo;var g=l(w()),ro=l(U()),oo=l(mt()),no=l(k());var io=l(xo());var Ie=l(w()),Tr=l(k());function Do(o,e,t){let n=[];if(!o)return n;for(let r=0;r<e;r++){let i=o[r];if(i===void 0)continue;let s=t(i);s%10===0?n.push({col:r,label:`${s}`}):s%5===0&&n.push({col:r})}return n}var Ho=(0,Tr.observer)(function({model:e,columns:t}){let{columnWidth:n}=e,r=Do(e.pairwiseAlignmentToStructurePosition,t,i=>e.residueNumber(i));return Ie.default.createElement("div",{style:{position:"relative",height:"100%",color:"#888",fontSize:8}},r.map(({col:i,label:s})=>Ie.default.createElement("span",{key:i,style:{position:"absolute",left:i*n,top:0,bottom:0,borderLeft:"1px solid #aaa",paddingLeft:2,lineHeight:`${12}px`,whiteSpace:"nowrap"}},s)))}),kr=Ho;var F=l(w()),Le=l(k());function oe({start:o,end:e,columnWidth:t,background:n,border:r}){return F.default.createElement("div",{style:{position:"absolute",top:0,bottom:0,left:o*t,width:(e-o+1)*t,background:n,border:r,boxSizing:"border-box",pointerEvents:"none"}})}function Mr({zIndex:o,children:e}){return F.default.createElement("div",{style:{position:"absolute",inset:0,pointerEvents:"none",zIndex:o}},e)}var Ir=(0,Le.observer)(function({model:e,matchHeight:t}){let{clickAlignmentRanges:n,columnWidth:r,showHighlight:i,alignmentMatchSet:s}=e;return F.default.createElement(Mr,{zIndex:0},i&&s?F.default.createElement("div",{style:{position:"relative",height:t}},kt(s).map(a=>F.default.createElement(oe,{key:a.start,start:a.start,end:a.end-1,columnWidth:r,background:bt}))):null,n.map(a=>F.default.createElement(oe,{key:a.start,start:a.start,end:a.end,columnWidth:r,background:ht})))}),$o=(0,Le.observer)(function({model:e}){let{clickAlignmentRanges:t,alignmentHoverRange:n,alignmentHoverPos:r,columnWidth:i}=e;return F.default.createElement(Mr,{zIndex:1},t.map(s=>F.default.createElement(oe,{key:s.start,start:s.start,end:s.end,columnWidth:i,background:"transparent",border:yt})),n?F.default.createElement(oe,{start:n.start,end:n.end,columnWidth:i,background:gt}):null,r===void 0?null:F.default.createElement(oe,{start:r,end:r,columnWidth:i,background:ft}))}),Lr=$o;var J=l(w());var Er=l($(),1),Br=(0,C.createSvgIcon)((0,Er.jsx)("path",{d:"M7.41 18.59 8.83 20 12 16.83 15.17 20l1.41-1.41L12 14zm9.18-13.18L15.17 4 12 7.17 8.83 4 7.41 5.41 12 10z"}),"UnfoldLess");var Ar=l($(),1),Fr=(0,C.createSvgIcon)((0,Ar.jsx)("path",{d:"M12 5.83 15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15z"}),"UnfoldMore");var ne=l(U()),Dr=l(k());var Uo=(0,Dr.observer)(function({type:e,laneCount:t,model:n}){let r=n.expandedFeatureTypes.has(e),i=n.trackHeight;return J.default.createElement(ne.Tooltip,{title:e,placement:"left"},J.default.createElement("div",{style:{height:"100%",whiteSpace:"nowrap",display:"flex",alignItems:r?"flex-start":"center",justifyContent:"flex-end",gap:2}},J.default.createElement(ne.IconButton,{onClick:()=>{n.hideFeatureType(e)},title:`Hide ${e} track`,sx:{p:0,color:xe}},J.default.createElement(X,{sx:{fontSize:i}})),t>1?J.default.createElement(ne.IconButton,{onClick:()=>{n.toggleFeatureTypeExpanded(e)},title:r?`Collapse ${e} track`:`Expand ${e} track (${t} overlapping rows)`,sx:{p:0,color:xe}},r?J.default.createElement(Br,{sx:{fontSize:i}}):J.default.createElement(Fr,{sx:{fontSize:i}})):null,J.default.createElement("span",null,e)))}),Hr=Uo;var Ur=l(w()),Jr=l(k());function Jo(o,e,t){if(!(!o||!e||o==="-"||e==="-"||o.toUpperCase()===e.toUpperCase()))return t===":"||t==="."?"similar":"different"}function $r(o){let e=o.alns[0]?.seq??"",t=o.alns[1]?.seq??"",n=[];for(let r=0;r<e.length;r++){let i=Jo(e[r],t[r],o.consensus[r]),s=n.at(-1);i&&s?.kind===i&&s.end===r?s.end=r+1:i&&n.push({start:r,end:r+1,kind:i})}return n}var Vo=(0,Jr.observer)(function({model:e}){let{alignment:t,columnWidth:n}=e;return t?$r(t).map(r=>Ur.default.createElement("div",{key:r.start,style:{position:"absolute",top:0,bottom:0,left:r.start*n,width:(r.end-r.start)*n,background:r.kind==="similar"?vt:St}})):null}),Vr=Vo;var Nr=l(w()),_r=l(k());var L=l(w()),Wr=l(U()),zr=l(k());var Oo={Domain:"#1f77b4","DNA binding":"#ff7f0e",Region:"#2ca02c","Zinc finger":"#d62728","Coiled coil":"#9467bd",Motif:"#8c564b","Compositional bias":"#e377c2",Repeat:"#7f7f7f",Transmembrane:"#bcbd22",Intramembrane:"#17becf","Topological domain":"#aec7e8",Signal:"#ffbb78","Signal peptide":"#ffbb78",Propeptide:"#98df8a","Transit peptide":"#ff9896",Chain:"#c5b0d5","Disulfide bond":"#c49c94","Active site":"#f7b6d2","Binding site":"#c7c7c7",Site:"#dbdb8d","Modified residue":"#9edae5",Glycosylation:"#393b79",Lipidation:"#637939","Cross-link":"#8c6d31","Alternative sequence":"#e7969c","Natural variant":"#de9ed6",Mutagenesis:"#ad494a","Sequence conflict":"#b5cf6b",Helix:"#e7ba52","Beta strand":"#6b6ecf",Turn:"#d6616b","Initiator methionine":"#ce6dbd",Peptide:"#6baed6","Calcium binding":"#fd8d3c","Nucleotide binding":"#74c476"};function Or(o){return Oo[o]??"#999999"}async function Wo(o){let e=await(await rt(o)).text(),t=[];for(let n of e.split(`
|
|
8
8
|
`)){if(n.startsWith("#")||!n.trim())continue;let r=n.split(" ");if(r.length<9)continue;let i=r[2],s=Number.parseInt(r[3]??"",10),a=Number.parseInt(r[4]??"",10),u=r[8]??"",y="",d;for(let h of u.split(";")){let[v,S]=h.split("=");v==="Note"?y=decodeURIComponent(S??""):v==="ID"&&(d=S)}if(i&&s>=1&&a>=s){let h=`${i}-${s}-${a}-${t.length}`;t.push({type:i,start:s,end:a,description:y,id:d,uniqueId:h})}}return t}function Ee(o){let{data:e,error:t,isLoading:n}=at(o?ot(o):null,Wo,ut);return{features:e,error:t,isLoading:n}}function zo({feature:o,layout:e,model:t}){let n=t.residueNumber(e.structureStart),r=t.residueNumber(e.structureEnd-1),i=n!==o.start||r!==o.end;return L.default.createElement("div",null,L.default.createElement("div",null,L.default.createElement("strong",null,o.type)),L.default.createElement("div",null,"UniProt position: ",o.start,"-",o.end),i?L.default.createElement("div",null,"Structure residue: ",n,"-",r):null,o.description?L.default.createElement("div",null,o.description):null)}var qo=(0,zr.observer)(function({layout:e,top:t,selected:n,model:r}){let[i,s]=(0,L.useState)(!1),{feature:a,alignmentStart:u,alignmentEnd:y}=e,{columnWidth:d,trackHeight:h}=r;return L.default.createElement(Wr.Tooltip,{title:L.default.createElement(zo,{feature:a,layout:e,model:r}),followCursor:!0},L.default.createElement("div",{"data-testid":`protein-feature-${a.type}`,"data-feature-id":a.uniqueId,"data-feature-start":a.start,"data-feature-end":a.end,onClick:()=>{n?(r.setSelectedFeatureId(void 0),r.setClickedStructureRanges([])):(r.setSelectedFeatureId(a.uniqueId),Tt({model:r,structureSeqPos:e.structureStart,structureSeqEndPos:e.structureEnd}).catch(v=>{console.error(v),r.setViewError(v)}))},onMouseEnter:()=>{s(!0),r.setAlignmentHoverRange({start:u,end:y})},onMouseLeave:()=>{s(!1),r.setAlignmentHoverRange(void 0)},style:{position:"absolute",left:u*d,top:t,width:(y-u+1)*d,height:h,backgroundColor:Or(a.type),opacity:i||n?.9:.6,cursor:"pointer",borderRadius:2,border:n?xt:i?wt:"none",boxSizing:"border-box"}}))}),qr=qo;function Kr(o,e){return(o.expandedFeatureTypes.has(e.type)?e.laneCount:1)*(o.trackHeight+o.trackGap)}var No=(0,_r.observer)(function({group:e,model:t}){let{selectedFeatureId:n,trackHeight:r,trackGap:i}=t,s=t.expandedFeatureTypes.has(e.type);return e.layouts.map(a=>Nr.default.createElement(qr,{key:a.feature.uniqueId,layout:a,top:(s?a.lane:0)*(r+i),selected:n===a.feature.uniqueId,model:t}))}),Gr=No;var N=l(w()),jr=l(U()),Be=l(k()),_o=(0,Be.observer)(function({cells:e,colorFor:t,model:n}){let{columnWidth:r,trackHeight:i}=n;return N.default.createElement("div",{style:{position:"relative",height:i}},e.map(s=>N.default.createElement("div",{key:s.col,style:{position:"absolute",left:s.col*r,width:r,height:i,backgroundColor:t(s.value)}})))}),Ko=(0,Be.observer)(function({cells:e,colorFor:t,formatValue:n,model:r}){let i=(0,N.useMemo)(()=>new Map(e.map(u=>[u.col,u.value])),[e]),{alignmentHoverPos:s}=r,a=s===void 0?void 0:i.get(s);return N.default.createElement(jr.Tooltip,{title:a===void 0?"":n(a),followCursor:!0},N.default.createElement("div",null,N.default.createElement(_o,{cells:e,colorFor:t,model:r})))}),Ae=Ko;var Yr=l(w()),Qr=l(k()),Go=(0,Qr.observer)(function({model:e,str:t}){let{columnWidth:n}=e;return t.split("").map((r,i)=>Yr.default.createElement("span",{key:i,style:{position:"absolute",left:i*n,width:n}},r===" "?"\xA0":r))}),Xr=Go;var Zr=l(mt());function jo({x:o,width:e,scrollLeft:t,clientWidth:n}){return o>=t&&o+e<=t+n?void 0:o+e/2-n/2}function Rr({start:o,end:e,scrollLeft:t,clientWidth:n}){let r=t+n;return e>=t&&o<=r?void 0:(o+e)/2-n/2}function eo(o,e){return(0,Zr.reaction)(()=>o.alignmentHoverPos,t=>{let n=e();if(t!==void 0&&n&&o.autoScrollAlignment&&!o.isMouseInAlignment){let r=jo({x:t*o.columnWidth,width:o.columnWidth,scrollLeft:n.scrollLeft,clientWidth:n.clientWidth});r!==void 0&&(n.scrollLeft=r)}})}var to=l(w());function Yo(o,e,t){let n=t(o.start),r=t(o.end);if(n===void 0||r===void 0)return;let i=e[n],s=e[r];return i===void 0||s===void 0?void 0:{feature:o,structureStart:n,structureEnd:r+1,alignmentStart:i,alignmentEnd:s,lane:0}}function Qo(o){let e=[],t=[...o].sort((n,r)=>n.alignmentStart-r.alignmentStart);for(let n of t){let r=e.findIndex(i=>i<n.alignmentStart);r===-1?(n.lane=e.length,e.push(n.alignmentEnd)):(n.lane=r,e[r]=n.alignmentEnd)}return Math.max(e.length,1)}function Fe(o,e,t){let{features:n,isLoading:r,error:i}=Ee(e),{omittedFeatureTypes:s,structurePositionToAlignmentMap:a}=o;return{groups:(0,to.useMemo)(()=>{if(!n||!a)return;let y=new Map;for(let d of n)if(!s.has(d.type)){let h=Yo(d,a,t);if(h){let v=y.get(d.type);v?v.push(h):y.set(d.type,[h])}}return[...y].map(([d,h])=>({type:d,layouts:h,laneCount:Qo(h)}))},[n,s,a,t]),isLoading:r,error:i}}var Zo=(0,io.makeStyles)()(o=>({scroll:{overflow:"auto",whiteSpace:"nowrap",flex:1,paddingBottom:2,backgroundColor:o.palette.background.paper},trackMessage:{position:"sticky",left:0,lineHeight:`${12}px`,color:o.palette.text.secondary},trackError:{color:o.palette.error.main}}));function ie({label:o,title:e}){return g.default.createElement(ro.Tooltip,{title:e,placement:"left"},g.default.createElement("div",{style:{height:"100%",display:"flex",alignItems:"center",justifyContent:"flex-end"}},o))}var Ro=(0,no.observer)(function({model:e}){let{alignment:t,showProteinTracks:n,showAllFeatureTracks:r,label:i,confidenceCells:s,columnWidth:a,trackHeight:u,trackGap:y}=e,d=r?e.hydrophobicityCells:[],{classes:h,cx:v}=Zo(),S=(0,g.useRef)(null),O=(0,g.useRef)(void 0),{uniprotId:Y,mapUniProtPosition:ee,isLoading:te,error:W}=e.uniProtEntry,{groups:z,isLoading:K,error:E}=Fe(e,Y,ee),x=te||K,D=W??E,le=D?`${W?`Could not map ${i} to a UniProt entry through SIFTS`:`Could not load UniProt features for ${Y??i}`}: ${Ne(D)}`:void 0;if((0,g.useEffect)(()=>eo(e,()=>S.current),[e]),(0,g.useEffect)(()=>(0,oo.autorun)(()=>{let m=S.current,B=e.clickAlignmentRanges,I=B[0];if(m)if(I){let ae=B.map(G=>`${G.start}-${G.end}`).join(",");if(ae!==O.current){O.current=ae;let G=Rr({start:I.start*e.columnWidth,end:(I.end+1)*e.columnWidth,scrollLeft:m.scrollLeft,clientWidth:m.clientWidth});G!==void 0&&(m.scrollLeft=G)}}else O.current=void 0}),[e]),!t)return null;let fe=Ge(t),Oe=u+y,We=(m,B,I,ae,G)=>({key:m,height:12,label:g.default.createElement(ie,{label:B,title:I}),content:g.default.createElement("div",{style:{lineHeight:`${12}px`}},G,g.default.createElement(Xr,{model:e,str:ae})),selectsResidue:!0}),ge=le??(x?"Loading UniProt features...":""),ze=[We("transcript","GENOME","The protein as the reference genome's transcript translates",_e(t)),We("structure","STRUCT","The protein as the structure file spells it. Shaded where it differs from the transcript's: amber for a similar amino acid, red for a different one.",Ke(t),g.default.createElement(Vr,{model:e}))],Q=[...ze,{key:"ruler",height:12,label:g.default.createElement(ie,{label:"residue",title:"Residue numbers as the structure's authors assigned them, the numbering papers and the 3D view's hover label use"}),content:g.default.createElement(kr,{model:e,columns:fe}),selectsResidue:!0}],vo=ze.length*12;if(n){ge&&Q.push({key:"uniprot-status",height:12,label:g.default.createElement(ie,{label:"UniProt",title:ge}),content:g.default.createElement("span",{className:v(h.trackMessage,le&&h.trackError)},ge)});for(let m of z??[])Q.push({key:`feature-${m.type}`,height:Kr(e,m),label:g.default.createElement(Hr,{type:m.type,laneCount:m.laneCount,model:e}),content:g.default.createElement(Gr,{group:m,model:e})});s.length>0&&Q.push({key:"plddt",height:Oe,label:g.default.createElement(ie,{label:"pLDDT",title:g.default.createElement(ke,{title:"AlphaFold per-residue confidence (pLDDT)",entries:it,color:"inherit"})}),content:g.default.createElement(Ae,{cells:s,colorFor:st,formatValue:m=>`pLDDT ${m.toFixed(0)}`,model:e})}),d.length>0&&Q.push({key:"hydrophobicity",height:Oe,label:g.default.createElement(ie,{label:"hydro",title:g.default.createElement(Me,{title:"Kyte-Doolittle hydrophobicity",testId:"hydrophobicity-legend",minLabel:"hydrophilic",maxLabel:"hydrophobic",colors:lt.map(m=>be(m)),color:"inherit"})}),content:g.default.createElement(Ae,{cells:d,colorFor:be,formatValue:m=>`Kyte-Doolittle ${m.toFixed(1)}`,model:e})})}let qe=m=>{let{left:B}=m.currentTarget.getBoundingClientRect(),I=Math.floor((m.clientX-B)/a);return I>=0&&I<fe?I:void 0};return g.default.createElement("div",{"data-testid":"protein-alignment-panel","data-structure":i},g.default.createElement("div",{style:{display:"flex",fontSize:9,fontFamily:"monospace",margin:"2px 8px 4px"},onMouseEnter:()=>{e.setIsMouseInAlignment(!0)},onMouseLeave:()=>{e.leaveAlignment()}},g.default.createElement("div",{style:{flexShrink:0,minWidth:124,paddingRight:4,whiteSpace:"nowrap",lineHeight:1}},Q.map(m=>g.default.createElement("div",{key:m.key,"data-row-label":m.key,style:{height:m.height,overflow:"hidden"}},m.label))),g.default.createElement("div",{ref:S,className:h.scroll},g.default.createElement("div",{"data-testid":"alignment-rows",style:{position:"relative",width:fe*a},onMouseMove:m=>{let B=qe(m);B===void 0?e.setHoveredPosition(void 0):e.hoverAlignmentPosition(B)},onMouseLeave:()=>{e.setHoveredPosition(void 0)}},g.default.createElement(Ir,{model:e,matchHeight:vo}),Q.map(m=>g.default.createElement("div",{key:m.key,"data-row":m.key,style:{position:"relative",height:m.height,cursor:m.selectsResidue?"pointer":void 0},onClick:m.selectsResidue?B=>{let I=qe(B);I!==void 0&&e.clickAlignmentPosition(I)}:void 0},m.content)),g.default.createElement(Lr,{model:e})))))}),so=Ro;var R=l(w()),lo=l(So());var pe=l(U()),en=(0,R.lazy)(()=>import("./ProteinAlignmentHelpDialog-6VFZFN6X.js"));function De({model:o}){return R.default.createElement(pe.Tooltip,{title:"What the alignment panel shows"},R.default.createElement(pe.IconButton,{size:"small",onClick:()=>{(0,lo.getSession)(o).queueDialog(e=>[en,{handleClose:e}])}},R.default.createElement(dt,{fontSize:"small"})))}var tn=(0,me.observer)(function({model:e}){let[t,n]=(0,f.useState)(null),i=`Color scheme: ${Se.find(s=>s.value===e.colorScheme)?.label??e.colorScheme}`;return f.default.createElement(f.default.Fragment,null,f.default.createElement(Je.default,{title:i},f.default.createElement(He.default,{size:"small","aria-label":i,onClick:s=>{n(s.currentTarget)}},f.default.createElement($t,{fontSize:"small"}))),f.default.createElement($e.default,{anchorEl:t,open:!!t,onClose:()=>{n(null)}},Se.map(s=>f.default.createElement(Ue.default,{key:s.value,dense:!0,selected:s.value===e.colorScheme,onClick:()=>{e.setColorScheme(s.value),n(null)}},s.label))))});function ao({checked:o,label:e,onToggle:t}){return f.default.createElement(Ue.default,{onClick:()=>{t()},dense:!0},f.default.createElement(mo.default,null,f.default.createElement(co.default,{checked:o,size:"small",edge:"start",disableRipple:!0})),f.default.createElement(fo.default,null,e))}var rn=(0,me.observer)(function({model:e}){let[t,n]=(0,f.useState)(null);return f.default.createElement(f.default.Fragment,null,f.default.createElement(Je.default,{title:"Display settings"},f.default.createElement(He.default,{size:"small",onClick:r=>{n(r.currentTarget)}},f.default.createElement(Jt,{fontSize:"small"}))),f.default.createElement($e.default,{anchorEl:t,open:!!t,onClose:()=>{n(null)}},e.displayToggles.map(r=>f.default.createElement(ao,{key:r.label,checked:r.checked,label:r.label,onToggle:r.toggle})),f.default.createElement(po.default,null),e.behaviorToggles.map(r=>f.default.createElement(ao,{key:r.label,checked:r.checked,label:r.label,onToggle:r.toggle}))))}),on=(0,me.observer)(function({model:e}){let{alignmentStructure:t,showAlignment:n,colorLegend:r}=e;return f.default.createElement("div",null,f.default.createElement("div",{style:{display:"flex",alignItems:"flex-start",gap:8}},f.default.createElement(Cr,{model:e}),f.default.createElement("div",{style:{display:"flex",gap:4,alignItems:"center",flexShrink:0,minHeight:24}},f.default.createElement(tn,{model:e}),f.default.createElement(rn,{model:e}),f.default.createElement(De,{model:e}))),r?f.default.createElement(sr,{title:"Structure colors",legend:r}):null,n&&t?.pairwiseAlignment?f.default.createElement(so,{model:t}):n&&t?.alignmentPending?f.default.createElement(uo.LoadingEllipses,{message:"Loading pairwise alignment"}):null,f.default.createElement(tr,{model:e}))}),go=on;var V=l(w()),yo=l(wo());var ho=!1;function nn(o){if(!ho){ho=!0;let e=document.createElement("style");e.append(o),document.head.append(e)}}function Ve({showControls:o,model:e}){let t=(0,V.useRef)(null),n=(0,V.useRef)(null),[r,i]=(0,V.useState)(),[s,a]=(0,V.useState)(!0);return(0,V.useEffect)(()=>{let u={cancelled:!1};return(async()=>{try{if(!t.current)return;let{Color:y,GeometryExport:d,MAQualityAssessment:h,PluginConfig:v,PluginSpec:S,DefaultPluginUISpec:O,createPluginUI:Y,registerColorThemes:ee,renderReact18:te,css:W}=await ve();nn(W);let z=document.createElement("div");t.current.append(z),u.host=z;let K=O(),E=await Y({target:z,render:te,spec:{...K,behaviors:[...K.behaviors,S.Behavior(d),S.Behavior(h)],layout:{initial:{controlsDisplay:"reactive",showControls:o}},config:[[v.Viewport.ShowExpand,!1]]}});await E.initialized,ee(E),E.canvas3d?.setProps({renderer:{selectColor:y(16711935),selectStrength:1},marking:{selectEdgeColor:y(16711935)}}),u.cancelled?(E.dispose(),z.remove()):(u.plugin=E,n.current=E,e?.setMolstarPluginContext(E))}catch(y){console.error(y),i(y)}finally{a(!1)}})(),()=>{u.cancelled=!0,n.current=null,e&&(0,yo.isAlive)(e)&&e.setMolstarPluginContext(void 0),u.plugin?.dispose(),u.host?.remove()}},[]),(0,V.useEffect)(()=>{let u={cancelled:!1};return(async()=>{let y=n.current;if(y){let{PluginCommands:d}=await ve();u.cancelled||await d.Layout.Update(y,{state:{showControls:o}})}})(),()=>{u.cancelled=!0}},[o]),{parentRef:t,error:r,loading:s}}var sn=(0,se.observer)(function({model:e}){let{showControls:t}=e,{parentRef:n,error:r,loading:i}=Ve({showControls:t,model:e});return r?P.default.createElement(_.ErrorMessage,{error:r}):P.default.createElement(un,{model:e,parentRef:n,loading:i})}),ln=(0,se.observer)(function({model:e}){let{error:t}=e;return t?P.default.createElement("div",{style:{display:"flex",alignItems:"flex-start"}},P.default.createElement("div",{style:{flex:1}},P.default.createElement(_.ErrorMessage,{error:t})),P.default.createElement(bo.IconButton,{size:"small","aria-label":"Dismiss error",onClick:()=>{e.setError(void 0)}},P.default.createElement(X,{fontSize:"small"}))):null}),an=(0,se.observer)(function({model:e}){let{loadingMessages:t}=e;return t.length>0?P.default.createElement("div",{"data-testid":"protein-view-loading-overlay",style:{position:"absolute",top:8,left:8,maxWidth:"calc(100% - 16px)",padding:"2px 8px",borderRadius:4,background:"rgba(255,255,255,0.85)",color:"#000",pointerEvents:"none"}},t.map(({id:n,message:r})=>P.default.createElement(_.LoadingEllipses,{key:n,message:r}))):null}),un=(0,se.observer)(function({model:e,parentRef:t,loading:n}){let{width:r,height:i}=e,s=!n&&!e.showLoading;return P.default.createElement("div",{style:{background:"#ccc"},"data-testid":s?"protein-view-ready":"protein-view-loading"},P.default.createElement(ln,{model:e}),n?P.default.createElement(_.LoadingEllipses,{message:"Loading protein viewer"}):P.default.createElement(go,{model:e}),P.default.createElement("div",{style:{position:"relative",width:r,height:i}},P.default.createElement("div",{ref:t,"data-testid":"protein-view-molstar",style:{position:"relative",width:r,height:i}}),P.default.createElement(an,{model:e})),P.default.createElement(_.ResizeHandle,{style:{height:4,background:"grey"},onDrag:a=>e.setHeight(e.height+a)}),P.default.createElement(Dt,{model:e}))}),hs=sn;export{hs as default};
|
|
9
|
-
//# sourceMappingURL=ProteinView-
|
|
9
|
+
//# sourceMappingURL=ProteinView-MG7N24DJ.js.map
|