From 06c228ee9c6c29c052765fe7a842d40d48f4caee Mon Sep 17 00:00:00 2001 From: Nick Rosenau Date: Mon, 27 Nov 2023 14:33:53 -0500 Subject: [PATCH] Upgrade annotation feature. --- README.md | 29 ++++++++ src/Linear/Annotations.tsx | 64 ++++++++++++++++-- src/assets/aptamer.png | Bin 0 -> 691 bytes src/assets/assembly-scar.png | Bin 0 -> 224 bytes src/assets/association.png | Bin 0 -> 427 bytes src/assets/blunt-restriction-site.png | Bin 0 -> 255 bytes src/assets/cds-arrow.png | Bin 0 -> 528 bytes src/assets/cds.png | Bin 0 -> 401 bytes src/assets/chromosomal-locus.png | Bin 0 -> 611 bytes src/assets/circular-plasmid.png | Bin 0 -> 470 bytes src/assets/complex-sbgn.png | Bin 0 -> 268 bytes src/assets/composite.png | Bin 0 -> 296 bytes src/assets/control.png | Bin 0 -> 273 bytes src/assets/degradation.png | Bin 0 -> 478 bytes src/assets/dissociation.png | Bin 0 -> 781 bytes src/assets/dna-stability-element.png | Bin 0 -> 415 bytes src/assets/dsNA.png | Bin 0 -> 388 bytes src/assets/engineered-region.png | Bin 0 -> 266 bytes src/assets/five-prime-overhang.png | Bin 0 -> 213 bytes .../five-prime-sticky-restriction-site.png | Bin 0 -> 267 bytes src/assets/generic-sbgn.png | Bin 0 -> 567 bytes src/assets/halfround-rectangle.png | Bin 0 -> 378 bytes src/assets/inert-dna-spacer.png | Bin 0 -> 720 bytes src/assets/inhibition.png | Bin 0 -> 204 bytes src/assets/insulator.png | Bin 0 -> 399 bytes src/assets/intron.png | Bin 0 -> 788 bytes src/assets/location-dna-no-top.png | Bin 0 -> 201 bytes src/assets/location-dna.png | Bin 0 -> 565 bytes src/assets/location-protein-no-top.png | Bin 0 -> 605 bytes src/assets/location-protein.png | Bin 0 -> 817 bytes src/assets/location-rna-no-top.png | Bin 0 -> 467 bytes src/assets/location-rna.png | Bin 0 -> 705 bytes src/assets/macromolecule.png | Bin 0 -> 568 bytes src/assets/na-sbgn.png | Bin 0 -> 378 bytes src/assets/ncrna.png | Bin 0 -> 507 bytes src/assets/no-glyph-assigned.png | Bin 0 -> 228 bytes src/assets/nuclease-site.png | Bin 0 -> 441 bytes src/assets/omitted-detail.png | Bin 0 -> 149 bytes src/assets/operator.png | Bin 0 -> 258 bytes src/assets/origin-of-replication.png | Bin 0 -> 654 bytes src/assets/origin-of-transfer.png | Bin 0 -> 821 bytes src/assets/polyA.png | Bin 0 -> 309 bytes src/assets/polypeptide-region.png | Bin 0 -> 662 bytes src/assets/primer-binding-site.png | Bin 0 -> 293 bytes src/assets/process.png | Bin 0 -> 259 bytes src/assets/promoter.png | Bin 0 -> 470 bytes src/assets/protease-site.png | Bin 0 -> 723 bytes src/assets/protein-stability-element.png | Bin 0 -> 638 bytes src/assets/protein.png | Bin 0 -> 438 bytes src/assets/replacement-glyph.png | Bin 0 -> 511 bytes src/assets/ribonuclease-site.png | Bin 0 -> 591 bytes src/assets/ribosome-entry-site.png | Bin 0 -> 571 bytes src/assets/rna-stability-element.png | Bin 0 -> 534 bytes src/assets/signature.png | Bin 0 -> 596 bytes src/assets/simple-chemical-circle.png | Bin 0 -> 287 bytes src/assets/simple-chemical-hexagon.png | Bin 0 -> 225 bytes src/assets/simple-chemical-pentagon.png | Bin 0 -> 239 bytes src/assets/simple-chemical-triangle.png | Bin 0 -> 255 bytes src/assets/specific-recombination-site.png | Bin 0 -> 283 bytes src/assets/ssNA.png | Bin 0 -> 684 bytes src/assets/stimulation.png | Bin 0 -> 267 bytes src/assets/terminator.png | Bin 0 -> 249 bytes src/assets/three-prime-overhang.png | Bin 0 -> 207 bytes .../three-prime-sticky-restriction-site.png | Bin 0 -> 267 bytes src/assets/transcription-end.png | Bin 0 -> 640 bytes src/assets/translation-end.png | Bin 0 -> 784 bytes src/assets/unspecified-glyph.png | Bin 0 -> 511 bytes src/elements.ts | 20 ++++++ src/style.ts | 9 ++- 69 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 src/assets/aptamer.png create mode 100644 src/assets/assembly-scar.png create mode 100644 src/assets/association.png create mode 100644 src/assets/blunt-restriction-site.png create mode 100644 src/assets/cds-arrow.png create mode 100644 src/assets/cds.png create mode 100644 src/assets/chromosomal-locus.png create mode 100644 src/assets/circular-plasmid.png create mode 100644 src/assets/complex-sbgn.png create mode 100644 src/assets/composite.png create mode 100644 src/assets/control.png create mode 100644 src/assets/degradation.png create mode 100644 src/assets/dissociation.png create mode 100644 src/assets/dna-stability-element.png create mode 100644 src/assets/dsNA.png create mode 100644 src/assets/engineered-region.png create mode 100644 src/assets/five-prime-overhang.png create mode 100644 src/assets/five-prime-sticky-restriction-site.png create mode 100644 src/assets/generic-sbgn.png create mode 100644 src/assets/halfround-rectangle.png create mode 100644 src/assets/inert-dna-spacer.png create mode 100644 src/assets/inhibition.png create mode 100644 src/assets/insulator.png create mode 100644 src/assets/intron.png create mode 100644 src/assets/location-dna-no-top.png create mode 100644 src/assets/location-dna.png create mode 100644 src/assets/location-protein-no-top.png create mode 100644 src/assets/location-protein.png create mode 100644 src/assets/location-rna-no-top.png create mode 100644 src/assets/location-rna.png create mode 100644 src/assets/macromolecule.png create mode 100644 src/assets/na-sbgn.png create mode 100644 src/assets/ncrna.png create mode 100644 src/assets/no-glyph-assigned.png create mode 100644 src/assets/nuclease-site.png create mode 100644 src/assets/omitted-detail.png create mode 100644 src/assets/operator.png create mode 100644 src/assets/origin-of-replication.png create mode 100644 src/assets/origin-of-transfer.png create mode 100644 src/assets/polyA.png create mode 100644 src/assets/polypeptide-region.png create mode 100644 src/assets/primer-binding-site.png create mode 100644 src/assets/process.png create mode 100644 src/assets/promoter.png create mode 100644 src/assets/protease-site.png create mode 100644 src/assets/protein-stability-element.png create mode 100644 src/assets/protein.png create mode 100644 src/assets/replacement-glyph.png create mode 100644 src/assets/ribonuclease-site.png create mode 100644 src/assets/ribosome-entry-site.png create mode 100644 src/assets/rna-stability-element.png create mode 100644 src/assets/signature.png create mode 100644 src/assets/simple-chemical-circle.png create mode 100644 src/assets/simple-chemical-hexagon.png create mode 100644 src/assets/simple-chemical-pentagon.png create mode 100644 src/assets/simple-chemical-triangle.png create mode 100644 src/assets/specific-recombination-site.png create mode 100644 src/assets/ssNA.png create mode 100644 src/assets/stimulation.png create mode 100644 src/assets/terminator.png create mode 100644 src/assets/three-prime-overhang.png create mode 100644 src/assets/three-prime-sticky-restriction-site.png create mode 100644 src/assets/transcription-end.png create mode 100644 src/assets/translation-end.png create mode 100644 src/assets/unspecified-glyph.png diff --git a/README.md b/README.md index 7377fc72a..1df4a05fe 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,35 @@ The name of the sequence/plasmid. Shown at the center of the circular viewer. An array of `Annotation`s to render. Each `Annotation` requires 0-based start (inclusive) and end (exclusive) indexes. `name`s are rendered on top of the annotations. Set the annotation's direction to `1` for forward arrows and `-1` for reverse arrows. +Optional Parameters: + - Annotation border styling: `"dashed" | "dotted" | "bold"` + ```js +annotations = [ + { start: 0, end: 22, name: "Strong promoter", direction: 1, border: "dashed"}, +]; +``` + - Annotation font styling; user can change font family, font weight, or font color: + ```js +annotations = [ + { start: 0, end: 22, name: "Strong promoter", direction: 1, border: "dashed", font: {"fontFamily": "Times New Roman", "fontWeight": 800, "fontSize": 17, "fontColor": "red"}}, +]; +``` + - Adding an svg icon to annotation; the available icons are part of the SBOL library and can be viewed in the `assets` folder under `src/assets/`, the name of the desired icon must exactly match the filename of the icon in the `assets` folder: + ```js +annotations = [ + { start: 0, end: 22, name: "Strong promoter", direction: 1, border: "dashed", font: {"fontFamily": "Times New Roman", "fontWeight": 800, "fontSize": 17, "fontColor": "red"}}, + svg: 'promoter' +]; +``` + here `promoter` matches the name of the promoter icon file `promoter.png` + - Annotation background color gradient. User can enter a starting color and stopping color: +```js +annotations = [ + { start: 0, end: 22, name: "Strong promoter", direction: 1, border: "dashed", font: {"fontFamily": "Times New Roman", "fontWeight": 800, "fontSize": 17, "fontColor": "red"}}, + svg: 'promoter', gradient: {start: 'lightblue', stop: 'green'} +]; +``` + ```js annotations = [ { start: 0, end: 22, name: "Strong promoter", direction: 1 }, // [0, 22) diff --git a/src/Linear/Annotations.tsx b/src/Linear/Annotations.tsx index 6e3607eb6..39700ea5a 100644 --- a/src/Linear/Annotations.tsx +++ b/src/Linear/Annotations.tsx @@ -182,7 +182,10 @@ const SingleNamedElement = (props: { } // 0.591 is our best approximation of Roboto Mono's aspect ratio (width / height). - const fontSize = 12; + let fontSize = 12; + if (element.font?.fontSize) { + fontSize = element.font.fontSize; + } const annotationCharacterWidth = 0.591 * fontSize; const availableCharacters = Math.floor((width - 40) / annotationCharacterWidth); @@ -198,10 +201,54 @@ const SingleNamedElement = (props: { } } + let strokeVal: string | null = null; + let strokeWidth: string | null = null; + + if (element.border) { + switch (element.border) { + case "dashed": + strokeVal = "5, 5"; + break; + case "dotted": + strokeVal = "1, 5"; + break; + case "bold": + strokeWidth = "2"; + break; + } + } + + let fontFamily: string | undefined = undefined; + let fontWeight: number = 400; + let fontColor: string = "rgb(42, 42, 42)"; + + if (element.font?.fontFamily) { + fontFamily = element.font.fontFamily; + } + if (element.font?.fontWeight) { + fontWeight = element.font.fontWeight; + } + if (element.font?.fontColor) { + fontColor = element.font.fontColor; + } + + let svg: any = null; + if (element.svg) { + svg = require(`../assets/${element.svg}.png`); + } + return ( {/* provides a hover tooltip on most browsers */} <title>{name} + {element.gradient && ( + + + + + + + )} { // do nothing }} @@ -227,13 +276,20 @@ const SingleNamedElement = (props: { onMouseOut={() => hoverOtherAnnotationRows(element.id, 0.7)} onMouseOver={() => hoverOtherAnnotationRows(element.id, 1.0)} /> + q>*@ehaVk;i}mDcq7mCh{tDi{uWJu9=ZAmH`9Z z0VxIsl!3y)GZ`^J8F&>21~QR>SD`$v2_anfatzkK-4o7fpY5Ep$^O>qocgcz|Nqwh zuf5hf6ciK`tD)yR;<9H}u=55KIWn2)q)=<`>AJ4J8hTRl#3uS!6 zu|(_uBSbJCL~uO@Z}1& zOun;r#@iT!#~J-=k|ux&qBMTac*a|d)`ZGJx&YpZnPp_gGbV_V*_YA3CTRk=CpzS! zjAtxP_Q;KPgAJ)(R)_-7-B3jtI44qIejPr;aaT0JiOmpI57Wgw^9<8c*q3lZJpC=r zlT{y`q8s;!xu_a540he4;{Ew+=)g-M?ml)^tgXT&5oCX|*0OP-9>$9Cw?~Wz0~`^7 zotAxOYAGlEK7f{{%wKuM^-u(mH$?z>Qv{GVMF4s8&j&E<4}7nSzlsCg6r)5zK|#TP Z#1Cw(hrfRyVY2`L002ovPDHLkV1gwjL^1#X literal 0 HcmV?d00001 diff --git a/src/assets/assembly-scar.png b/src/assets/assembly-scar.png new file mode 100644 index 0000000000000000000000000000000000000000..1be25133f36231fab19b24d04fceb2bf6688c014 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}~*o-U3d z8I5nR8FDchinv}}ZP2@ehns!Nh63?*NeSPc#;sYKv*u2#SX4&tcef;$XL26jJ?fke z@q0{C@tjnbEcEQz0l6DB>!+BrFJPBjs`jQK{pm(;uGwwU7J(m3n9Lu{VY#f$a)D`e z|0&6L95GsJRsU|iX!A(7V0j$>4yNuU8@BMTX;eEi&478DXMssPrzgcYI TtPzd|I*`HB)z4*}Q$iB}*p^eZ literal 0 HcmV?d00001 diff --git a/src/assets/association.png b/src/assets/association.png new file mode 100644 index 0000000000000000000000000000000000000000..3de9545c7381cba5de2254f41c1cc91fef340e55 GIT binary patch literal 427 zcmV;c0aX5pP)F-MLIy?2ITm@7O#ILuu<5A)~D%()LCgb+dqA%s5lAgz1l z12%DtPFlyz}H^Ouh3AP0Ck_hfBZN5D_c`DyB#(v9J(DVnl`7#X$#Q`gGSKKD)aZ}6(bMPzz6SkoEM)(s*Gjx7OJ5m=ajfLKWc!^LxSN;9 z@EWIr=Qr>yA|^7|{oD(U+u_aJn?4)3E}P%Ox;tgX77d{jvIXQw$ryi>A7&dom2CoH z6-R?-(|8aWukUF3i5JV6J1@U$~28A<6R?cmm-I4jj!m_*b%=<7iJM+F|GMP*!lc|oOf@dq(#aM*? z&v1aZGDUCEjCh@5q)Y>i$Of7?Q9K(uGTPz&5w80Y?t*p9f8TH72|Hy7ha)gohTt!Z z`&t9xNF0_S9LoSq;9R?j{Xs=z8h}Y$YB#Yrh+u33Fomn2-w$l}D^`U8n8uBE6I=ZV zRb>EXa2NFdj*VVLsx$zzxDR4@!D=r8RU3dsJO*(*VX523bua+Scn)HDz(O|->tX=b z@TwKh#m^6hV@DK&x{N^5Qz+?0ob+!r>5VMuqeRk&xulQNNhdU=q?ARKfQHr%9V@Aa vV}Fp;*S@S$L{f#Ve_2}0WHOmdCKHQKTwnD_%k z!jzGLfkfg@5QZj(WrTqUNvUWDv>p*9@v3{%lGI?I>e0Hl_nv#}bg;k4&e=JSy?$$- zwbxoiB9TZW5{X12kw_#GiR3{`4mOuyC03vlckm_aV$F7-RS>rZtCKNx-ah4<9vsSQ zur1?vE!c={*n-W;*nmQvYyHZo0ku0Y4|}m6d$1cz>#$SCD-7X1-eEYo_SCV?G-e8+ zwK#(lLcCUD9D{g)m&tr68H0(~|ITrYB;wLz3=eS?C$SUr^AK2#0^XVw{Ti2Xz#J3X zTH$`XknSdUhJGO&O0%q~X#ZeJ)s7}$8c82K-J#;jy^m^Z|eHF z2^y&_K%SV*C}uvKj-_zfQ8J|5r^M(dYZnXJFQ1KZJUvY2(7xi*Xn&fLOv4YUxm zMG;4EUJ%$TRN8-?rEkf5xt*U{StNwtMcl-w6H)R>=#1)ec3^cM>)@H6A3RovJ ze>-px`%=$8HnMmY2Nnp`cwsUo=F6}gT|%$lh4n%UUCB-#PG`{Yhx7p|;u=<^?zN>v zc3^QM#uCc7ha0%5!L*v*nNvdHY8EA-_2?Jkd;rh!L=$U4`VVXpb|t;bWB4KLT3N{3 xrDXm!c~%lC@h73p7#4c|k!FdEL?V&7%Wn}|b(3}6@YVnT002ovPDHLkV1kAn6Tbie literal 0 HcmV?d00001 diff --git a/src/assets/circular-plasmid.png b/src/assets/circular-plasmid.png new file mode 100644 index 0000000000000000000000000000000000000000..eac55785f1a32e87b3f8691f1024cad041bae1e3 GIT binary patch literal 470 zcmV;{0V)28P)ZGk8|z z{0hEe9t-%6W$a`PEUTM%kHZsf4R7%Zow-FCH)uu;ivAG1CF z|BWlppZVhg0!Q}F5;?cE;^-s!&2xSqFy6P0cbZ7X$2R{p?N7C~9Tc9%<@F_V<6*JQ z4|jH%RveV;-@kWB*pJBvRl_R6)&HDab9%!r6N9&wcOEo6mT%v6bmQp@F;XwI4Y)J| zqPebI3x6P8{B{1t%IQzj_}%_Z3|#M0_~W8}@#6U9%1S`+sO~SrTNS01-sz^zK+iCE My85}Sb4q9e0JZya&;S4c literal 0 HcmV?d00001 diff --git a/src/assets/composite.png b/src/assets/composite.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0ad13f06419fe3a9884b03698ed262d297330c GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v~02o-U3d z8I5nR?A2p+lwf6rsjQ{+sw^0^1H@*{)F5Meqd9WxxG5W?^?KKB9 z#g6et9yr@knWXz z^KjFL1L83m|CF?69Mip4(9GD!W&DsKz2e8eqzjuKdfh#{pZ9vXP4=-5!u^Mz%kNly k!uELf(S02dQ2&~H^)~UH#{)GjfgWY>boFyt=akR{07y%I{r~^~ literal 0 HcmV?d00001 diff --git a/src/assets/control.png b/src/assets/control.png new file mode 100644 index 0000000000000000000000000000000000000000..5c63da9498828bec30f3d515ae3bcff9bd56a10d GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}~o-U3d z8I5nR8G0QKkU9R5|Ek=A**iRBiyNKhR&(oLSZQAH!DMescwkJdi`9;@ssJx(-^|}a zKWevqVEXy*p=zZI81P*2ecPZc)w6M>Y*Cl`p9jqRQ=_eBKbAgUaa3JywOHu}>3E*B z4(E@q@7puF_51h=cbDHyDBZSYzwd?vLa(R&jx#tUo%TbE`#1BSM}PP9u6?)e$C~b! zn_8EJYg!$wk9&0Qn0W5|i}#L;x7VdKcj~j%PSKFMbG@$v40f#0t+rH&HLbjQ80aGg MPgg&ebxsLQ0R6{wp#T5? literal 0 HcmV?d00001 diff --git a/src/assets/degradation.png b/src/assets/degradation.png new file mode 100644 index 0000000000000000000000000000000000000000..74f7e7d7caad7f2fb39232edb2f64e9b53c7fa7c GIT binary patch literal 478 zcmV<40U`d0P)p~)-#M2M zLI@#*5JCw5M_Wa|(}}bAc!)La7{(Az;tL+5mJh1JO}xjVw3+=}#yc#aCz~6_8{9=l z2|2bjh0ScNV*za_dUhs)U}SFN-^8w}eh$O*)D4rg5*_ zl=o`Z#6^wx1hZJeQ;lVQDqA~JR;-&Y7&2N$H6YL zOH#vrk}kh_tm3y+Qacw}m9G+A_;83d?YM@k(yK&GDzC3com>bZgb+dqA%uVN7x!pb U%x7ppyZ`_I07*qoM6N<$g7x9sWB>pF literal 0 HcmV?d00001 diff --git a/src/assets/dissociation.png b/src/assets/dissociation.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f3e4e9e3f840007ce5dc118412a6e716f59ea6 GIT binary patch literal 781 zcmV+o1M>WdP)Vi|K~!jg?bg3b8(|y<@W=e{a+eF|AYv9ls{p*VCArMf5%`WK{#MIn<$QwgMW2&F9!LOUoicY3+JPnRl1amq;s-_LgN z@;=YY`{j56Ns=Tv|c0r`hEJ;B{wbXVq~W zo}8S}Fbp0X9NZhBLZQI6wl?PTc{+~6a5#JkAkpmd@cDf2$H&KOBsn%V#_8$ld*yFr zG8vAJj*=uNCMIfrzkjjO{D!YE7!3ACA`u?|6bc25jEp?EHjzl+`1lwA(AU@J3kHLI zjpjFe0Ft#@tp)&46a|)LJ-F7gEGUWs0I+QvB<)7?8$Q70<>i-rK7S1W!^6Ya-rjz2 z?bg=T?F}6r9bH!{l|rNWZs=E4_3HfmoM&fe?C9v=($dns`CnUGV|#l$Pft&IadAOS z)2;x#Xm)u3KqwT-CX>nQo4-wWcQ<3P7-wc?I6FJbp`jsmb#?LZ@Q@^#N~LUF*FQD8 z_y0OoRsEgGWE>#`Ez9EO<|fnWG}GxcH#RnCnkI!1oSU0-R8{>0Al&TIclBzT_9GsT zo4H($LWtY(5kfGR%P}60o0_Km1Q2m6)a}Qd*4oqGB^qcW9T*= z-J8UK^a!bA0kp9I+E@T>EP%uE7`4>``-(WnAI#c7Ekm;nbR5lVNP}5y0PpxA9)QM> z+A7c@IgK7q#AynPz%9P14`9owSq1K6HCYvX$HF_ z&Bj-Ye{_k5u?{?uG~OY)z@=awc*dXk>#B}&aLOP+GgOn1Z{oi5{1vK+jS|{e0BtOQ zHWok|3!se!(8dC!@G|1LP^Lp|4BQco)Yn9R9zFy1G7O`v`~V}wW6{1^xOD&k002ov JPDHLkV1kz@vReQE literal 0 HcmV?d00001 diff --git a/src/assets/dsNA.png b/src/assets/dsNA.png new file mode 100644 index 0000000000000000000000000000000000000000..17aa1f93ee0a525b8985295544b089dde4800116 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$qWpPmYyz- zAsLNtFYoo1ag<cyGt<8ReXH~S%^4vl4n>jomTFd6{vRaW zEBe`UZwhSN&@ZKxd((MM^2!xyyCaWP%FX`1{L-PgN9=w@-#GRc^knXFbN^U(a+?iBxz?Dz9#-ag=%zVZD! ztJi^|?Gdjh?VTWIp!3#acj%uZ7R$PFKA5G}95C~`arAc0-S+Yw2X*#6Vw!x(vVL;5 za)gU)|NG596JMUGpCZP@e5rE(5z~FiYU!$PJnV~PrGLu$a{p*bcQwDa`qO`TPQ?}h fppRfg#!v1}4#UOqVQnVBU}f-h^>bP0l+XkKXy2+E literal 0 HcmV?d00001 diff --git a/src/assets/engineered-region.png b/src/assets/engineered-region.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe655413bbea1e3a686a7a4d62a459de9740775 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v~0)o-U3d z8I5mm81gk4NF4pRzp1%x;_erWUlwh$E@FG1bmi!ggC@JCh+H{nwnSd-{d9o^B^CXf z0t5sF1wG9^KWDnZ;C)!f@ZAByg1ZOgD*oNP=n&B;9MJzM?~^5S>C61Cd(F}xPRxI< z&b{E%^}lCgIJ`HXmeD#kZNg_R1M^;ECeaPcn68B!n8g(l%$Ti};LEyZWy97_r*AZ7 z{tx0SVU5XOQ#IctknfQC6)85)tA`4bvw7E?d35CGjT=HB7kpsy-Q#pM{L55ppjQ|? MUHx3vIVCg!0MpHH7XSbN literal 0 HcmV?d00001 diff --git a/src/assets/five-prime-overhang.png b/src/assets/five-prime-overhang.png new file mode 100644 index 0000000000000000000000000000000000000000..e748408d512c3e33c13e513abf90f7e832cf486e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}VPZ!6K zjK;Uu4)V4r2sm7P|1I%NB7Zcu`R|R~w?A&MmEgX}bzp^p%s+1n!2}PsG>1tlo|8h{ zr_XrZC@B%wrJBa-mauzQ0n<0PVE#cbOC6>`recgveIB`h6@;HCQ8DyJ+{+2|yE7rj{_sXFJa9SoWd_=qd(JS3j3^ HP60FM;VUl?(tos5xkN@?;P{6mTN4E*;byZvBKP^Z5;(=PeqD_2kAGT`Q0@Qfh~N^Cn7bDbgg zq@z&Y0nQ!$rp3%ThZlch=u7UsqFthEd^+50qgxjHIUdIAllvzxcijEjKD+X7fb0JK yH|IMc8xvOC;Ju`7@~*h>*?+(8n>lmpcNWfQ;k<7e+~GjKFnGH9xvXBbhU4D9j(u;t=L}pP7@Hc^@*FOeT}b zWHNJ>d5QHFVKo+`UOe!%cs}AezNac!b^RuOCzCVF(6+3YQ?{FHG z1iJsQ7WZ%mjnv|Q(I{%%#ZW5It(d}D^raGQLtjyA3eB=&8}J#s$_hoW2cIw!D^SA( z4yJMx!6D(;joRGDg=4PQ+{9?iz%lGk>m`Zm`a|Jc${2RJa{`&26FW=$I;A2uE43ID%(Nv@9dSWwJMwqYl_t)Lvg!s3~0Q z=X9aTnuZF_3mw4bRHB1IgEfvVsYIutS=1QEn$+SIoD%MbTS9-7qJOVpx3F0!aZ;DR zbic5<9^eNq74HqL2-%Lh@Yfi{QD3SPw;NFC}InmN>e(F*lH6W7gTGMP*!lgZ3QegUaRSkH8Id3gW;002ovPDHLk FV1lP>{TcuO literal 0 HcmV?d00001 diff --git a/src/assets/halfround-rectangle.png b/src/assets/halfround-rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..079b86709eedb138621d867480e0a460027c170c GIT binary patch literal 378 zcmV-=0fqjFP)L6Lgu2fA%qY@_`mv6UB*5JGxpMr z7p&u`TsXk{FB=Ci(3b2FyITu=lbnh|M5t;!mQ=O~4o$gJhde^!*k2l5V*~VDK zO?9G%6*Lq_ewF5>9`>-2o}Y1sb6n#}5$*{OJvK0e(JtQ^#{_1vfT^^8j3v#Zk0Q(# zF66(ke>NJ}Y2Ap{FHq`N{0obi!E_omz3pP@UfYg!;1)NEd+>?kzTWEz2qA0x$iEP)C@R529Ce=|%V6E`fC!JWjH&~aSJhrxyK;75EJGKnjJ zr!Y~GjFDkbpFjiXMiW6-0*P_q$D(a0y{C6N&|X8*U(y8HbI@ekX`|W@^AZunK$!{(9OsU0;pqJ8Zx(5_zY zF%94`eu0O;d)*F8?7G@lrAz|rf|w29J}@ObGo{D+!gDXR&q`=e6u*sH*P$!`I~0?s zWG19#GXO4(;G+rj1V7!VN(DMXP}A15uwgV&zqZfM_1K~fHBMHWZQ!{R{59n>A&KvC zayh*rQHh;*0?z>xz|+7aB=Kg}Zae+6DH2$<0&H0QAxV^pH*8vC%dy3ep-xc~;GQ#H zmPCknfQQ!jzK$7LEtJ zCF}36C3e4nyQu2q(gW@QKTDpseM_@kAT$A+VI{5(j0^qar;HZ`dkGzs*bO_RhMg1k zOW%z%tF~}AaZ9j~#IFO-2uos`gqygIx=|VD4+6xS4I6scJ+j94NU+>itN{H$@rIBj z2G-b<*y5r1DzOkKJ|u}nr~g)p1Zt>jpb4@Ayb2Uwmc#(~Wc|NI!uxXD2|kK=LsQ%O z{9KE!+Mz21?GYy4Faf*}{47OP>Y+h#-S47ai9=ZgK2n^)$}abl$OqOY>a9{bC#Ln- zKzMGA3NQ7B2J&(;?Fjgw+fj+#693_|icK4J4fF~0wJj>xu%XmY*T7}eWyB|XA9YC0 z5~)sXp6ZIzwz_p}phf534ZrzV5MZ%4p2FzhKyj91_W_{=Sw0_z<) zrm>KF34u|r@jnvHav*H*2rO)}i0Odwwv(g+3t&=*X< zB5ai^v;qU*4!F=R{DV1gMc6X4(2mdD}iUDKG|qTXl0tBpr=;g z4R}!2{>44;t|`=x(3t_G}002ovPDHLkV1ints3!mb literal 0 HcmV?d00001 diff --git a/src/assets/intron.png b/src/assets/intron.png new file mode 100644 index 0000000000000000000000000000000000000000..67b0784709e6fdb463dcce55f10be14c6cb06462 GIT binary patch literal 788 zcmV+v1MB>WP)Uft-s9%>t^0QN1#I?%n0Cm6`%;W4(UVzO@;0drd(|-Zy zfuF*r71$pd@F4l)dha+tB+kzRo7IBuGYbLJ*`jq}I zUIPz=-V3Y_b=DT}4Hyyn5n!t_hKp{@@BwJV-1Q)|1pr(FrZTyf@<$%SIB-ws$3q=s z3RsmLCFUYxxL7CT@1agH1)K%yGkG4k5fQ_tg<_|<8tSMmU=zh5GX_j5W4O3XzABgi zZihN*3+N~B5Hl$5l!rY)o6vj6U+9Wx3fKZ17Wy!GORa`MA-@6cYn(L&bO0+dc?#2w zs-+FsA@nZHq!x^(0BKvAIjhCa|GU}%K1PU~Y&<;0tcOZmqV7}l@{g=SRqv*fsxM-|w zQefKt!}V!#0JBDS4X;Ju6=nwhp-k?g7Bhr)WwMV+%<^R^nnog#NF)-8CE+iLa-8&U Sk5dr<0000e0MRuN^@U`U7-cb2`gX7*2JX2-z&!iBq+bLRfeowH}oC6P$% zXj(Nqb05y(4Cb=6FL;6HSgT>rN|?kvR`91_tl%>CG^DYR8R2w`g!hh@n5|;tDpF`a z7I8dUTNhGhIosnX&SH0D^F~Os)e1C};*R|3KE~lK?2h0`kL~U8NG#?UHgpBu$3!3d z2|S4GH-xv-7`GxZAB74uh$(!E{BG2yZV28*LavVBw-EWgtwGmNw1k@85prq--_w!b zZzYOJzkD6Ulu-LSd>_I0TQuLBJ!@N(31Ah!qTh2xhFfqjn*UUyl$HsAeEyyv!S6ye zUoNSk6xVcf`G@?;7I8>8^^V^{ZR&<#7VSvPD@^yXpT<&T-^PKOH4fy8{MYq8F3SJG zCvgcMdTi&%s9{IOnYYV5nB>$E=Q6|qU>i6DrTjfK6S zAcB8@on=~EOVNM{+L_YALO2L$Pz!&62r4AOV3Lc)@}Dk>@}wk+Ec#=eX?j$s%pc#CN~z5mQ2fd+Qsolq|K@dQ6`TqxaL_=)F`gup75CW3M(q|DPBUoMuI5Ct4QP!=~h^?l!uHXJrVbS_5+h=A6g5SfNy%xDR)5 z3NZjr`}Rz%WEMvSTAgJD096U8!V-b_Tw;42wiy(E(&GUqLENPitA|V z?n0|Jv5n5jx6!GdWmkZ^@*kjy)3HJ+4>X4`E_CHZyvD5HLI>C9OyFk19FmZIJCm`& zHrhsOLI-Z~IW}NQ8y&-09KoPaMo0Z=qmL8nM{z^`BA!&j8cbC};|1n46KR*i8N3mi zRqG$07ivEH7V5o9uqZVg5VjEm!V&U?_5)1B3Z!eU(UZ8E zxu1;nH!-H50QvErhjh|of@6>J4dG#ZU2UEB$CC(X=z$(@_2 zIA3`1-psl8{O-Hwo_p>LZQ8VXr|HPh=Nx>EFR`fd*&|%T6}-yevnkBNK0Lu_o$Cqq zqN_z3>(VW}-Fm{uUpKIz8IGF~LLcHfzKA{>7DDE3#m8s(3Ns^{J3^SfXo7|$PN;pm zKVr!Qc1v+-oNfQ~NUYE2c%v%lBxW?QpMg`6{TpF+TE?+R%qI!lC@JV$4TtX^M8348MyLA%nzKQPdCTd9HkZLSHQ~PG?u~>NPW9@pgsVl(( z3`AmXVO|6KdH6Z9AHe*~8Vfm~c6a?1->NR~9xTT${5H;Z-*k(ehz^|f--2ye?Jhn3 zIxSB*KP5Wx14fjqMu)JiB}xlekDu^X@gSaKMXJMGQ`n6iScS)UfIqNF$XsI^S3h=V z(vXe)stDT zE^LXOAEkDfGmWkm&dHw&W%Qu1Gp~(oE@bqd#P^D`&_zvHgSkRzQwf`qOun1KdZB=e ztI}se%*V5^xm5zo(j}aMKN8m49NbhLKwqkZ+*xQ?D5IYWr?Vm4j=pbnelEpyr_nXo z89gWete9&jUML*cJMgz~fLSNRd}qaGNGRt1%%mZS^NQ=B?^-3U4CmAr{}9`oj$#0uB?;ZaFt!498iG1f)00000NkvXXu0mjfLeGf- literal 0 HcmV?d00001 diff --git a/src/assets/location-rna-no-top.png b/src/assets/location-rna-no-top.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9ab66209037598900337110d69053859a44446 GIT binary patch literal 467 zcmV;^0WAKBP))y6J7l09?95cp9 z4{vi9Zh(G^pe~C=fimeKo^QP8fEsXYlxM~UvI`H+EZ_w; z0H`AJ39#sDq~wUKe92cwPX&=L1Kn0ZR)ef{-7C^UZN)j+uh5pSj-GL{lQ;q9T#W)) z0_sSC3tycu_K*S}&MrYbA_bl;0<3<80M1AUT9X6AtY0Tj_5fFb9#1w{Jc{3Sp->KDer(+WcucS7vRJw&x}oE7cMOVEaw2gb<4Ba zUur9cNvCgf2ey56^sFKB6=2j?M^6zcumWV|DGvApzY#b{5*D)=Dv0 zNU*m^v`eFf5G7ay8xgdz&{PJjj1l|*5j+CHk5hxEF3 zHqri0hNU!10^rWy6CQpiMSC`*hD=<+&gE~oJ)6XKOs~g&BWmi}paRr{m}fw_iG3NE z5%x7;tFp$HT*BR5-vXy`Kk#ng4DhbOc6e2lCQt$<`M+SRVS0N8ca-Am4m#z0D%Jtl zfMr@&qRYT&z10DrJayaqOF1k$R> ztC*jd}M{P)~VBzSW(yOX;X^EDSPJ7<5( z%pT5?Wm%SGS@vJ+tU5r9HVon-#_b*Til-!c&~acC5rAtik|BF@amy zR7uJPPT?bt3cE0yTK)RZI5N+<=Hx7%p*M2fHoV7B>Oe8}<1N+{T;DJ3#O73iVl2ih z94J}m1ny!%=|qu+g_p6c4!pqL1ht~v!J$O8&IqlyWjgT#U5V;#5sqWa^d-Jw4bxZ> zyRcc$Ze*FzJyMy%B$mf6EcyUbLKjM^>5W$DI%AzVpRYtDM`6&p*|8N?fD->IhBF(w?P;SzPa@e+qqgo<$z59$Gm z>Jnz4u_TEivFmz5+J06hG^~ z|8foA@CEmA9S?+Q1Q!|O8Gx!bM#K?^Q`*0iUgn@6ZaMs@mUu~}o-Y>ZgLI)bb zYOD}O>j@mMFjtiIxGEftY23rXN)wgP@=lUvS(as4mcSoR=TYP4guHS90000L6Lgu2fA%qY@_`mv6UB*5JGxpMr z7p&u`TsXk{FB=Ci(3b2FyITu=lbnh|M5t;!mQ=O~4o$gJhde^!*k2l5V*~VDK zO?9G%6*Lq_ewF5>9`>-2o}Y1sb6n#}5$*{OJvK0e(JtQ^#{_1vfT^^8j3v#Zk0Q(# zF66(ke>NJ}Y2Ap{FHq`N{0obi!E_omz3pP@UfYg!;1)NEd+>?kzTWEz2qA!BrM2K<87rZq_B{e4Jiv{Wo6~=EoEV$ zWaXv&0}?A`VI$3y6eXFJDK=gfB1{NHlksvbo@aEO&Y5#=b2s$+?9T6eJJ0WVp5MKM z5JCtcgb>0%s@*WR3j6RK9~+(_Q?)iJJUL{LJ}LEUCy1 z;~Bo>>}9kD(C=TC;VtfBEl%gfj#lJ5`TZ#z!e@+?G&Y2rc!%{kEN!~(aQb#mI-!xC z+6Cz*4i>UoF@=jgwf*>oYtEZ$mZjC!`w~E7aRqI_PGyU3tw-O~Q3I@ERM; xKHoFC_|#<48dG>afbWD5LI@#*5JCw5wcoB%SA`;Ms3HIW002ovPDHLkV1h()?qdJ| literal 0 HcmV?d00001 diff --git a/src/assets/no-glyph-assigned.png b/src/assets/no-glyph-assigned.png new file mode 100644 index 0000000000000000000000000000000000000000..853d305b397f794313c438ca3737324a93467538 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}~ro-U3d z8I5nR8*&|T5O90g-nDe<(p0}Em2WRsF!WD2Ueifg`Tx?pKD@d!^ey8}Gsg5U2NqsA>~df5#Lg%PE*x$lFHI5##Q=qpT(mC RqJWNM@O1TaS?83{1OO;=St|el literal 0 HcmV?d00001 diff --git a/src/assets/nuclease-site.png b/src/assets/nuclease-site.png new file mode 100644 index 0000000000000000000000000000000000000000..915977dc07cb6cc1f046df262354d481119ffe8a GIT binary patch literal 441 zcmV;q0Y?6bP)l%H!y>!{ z){p`zDUyIlOpzI3$DeoxJ2OV_NRjL$@A@8TG-FT{#g_^228{oZF*X^KRvI}l0=|G0 z*Z|^@A!ar;S)-P^HDUnF%)@;ogx~V1$r`lUumR`5N2bIUxNk5g2%Wf(j##KUy zsJx}Agb-nQ%OMFN;_{X%384q&EoBm0dQ#r9FVU;=mIsOgk0A@WAmrD)>p2k=p}c%A zB!qnV&&>6j$R&j0R{5H_f5Gpy<0uH_`}{QX-4y?Kr%n;752<|th)m*+`V+QH0P~-D z=C_T>Ix1(tit6%EEdWJ{mC1DG#AgWjX1B8dEP!huahOlc%);ESO{O!aK109~xB_l~ zXW-o<=^rHikH2T*R#M~00000NkvXXu0mjfe(b>w literal 0 HcmV?d00001 diff --git a/src/assets/omitted-detail.png b/src/assets/omitted-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..621a828d54b9ed0b24092b215baf71fd47337bc9 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v_b=PZ!6K zjK;U;9l06|cvudE3fMnQu1)QKwN&4uHE2eoL&OaSA)vYh&)W(AeTu&9Rjus$X;MCE p`+3s|)8E$1%*_1B4wPol_{s3(E#DMj_LbW}Tu)a&mvv4FO#sDgG6Mhr literal 0 HcmV?d00001 diff --git a/src/assets/operator.png b/src/assets/operator.png new file mode 100644 index 0000000000000000000000000000000000000000..7823ce94bdde38a5be83594dfdaa636a4a5c8678 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v~0qo-U3d z8I5mm81fx55OBFD@8e%1W@TleHK#p$38SK(z|3Q4avAY(@LshP|dq@USYKIs-JFg&wYZ0GM;2ScB_CO)zWFV4$t zoWGdqUdVyjTou8L`C1QrS@*1LFcenwX}s{p;g;OXk;vd$@?2>^9N BVIBYg literal 0 HcmV?d00001 diff --git a/src/assets/origin-of-replication.png b/src/assets/origin-of-replication.png new file mode 100644 index 0000000000000000000000000000000000000000..ae30432827ed32eaf86a9bd696ae6f90a1240130 GIT binary patch literal 654 zcmV;90&)F`P)C@)j$--f4y|6;j$Ah>>#`Z+^~}m!(#}UO&h+%moI)fLi9{j~m?VJa5HJNi z0Xq8H8E^%B1AYgvS(^k{1h#=6K+ke~2eyC(!c1Nz=73Mwowgkxfo}8e-jMzssJwP%2{^$FqLDXIOq(5G zxPnd_*u_kzpv)BvzDAYJs-&1f%+_$mjSK; z$ee$SV}1_EIPl0~voWSl^j`(gH?|T>9<`SX z+D|=d-;$u(z|6=AewvUGRI{Jyz9(R%>yn?TUFtOSHQ z*+16jw&&LQ2ftM$T~r(B`a?@ro8TX;D+#I%+(b1aHm9#qi_|=xN@a+8+X5z0KX)he owNvhX?*0j2GZKkJB9Vv5U&qqz;+>^DbpQYW07*qoM6N<$f)->k*#H0l literal 0 HcmV?d00001 diff --git a/src/assets/origin-of-transfer.png b/src/assets/origin-of-transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..61421a2f854415676ba9799a22c5b9b739971a24 GIT binary patch literal 821 zcmV-51Iqk~P)TeF zo0y8(cpX!42ZOkdzdH2YhO;S8Cu;VW$(#5b7x2Ha(Tm&2sJX3pHAm;GRG)iT+)Lvx z;~PB4F`d``#+P_8(%K#U-x6kP5R-akei3fv7<`BuxP+U+=x4=U$Ga)>BUq0G_`X-> z*I_ti<}SX)67;9yCt)e}3Ckkx_g{wjp0Yxi;yCFZVL27yH5~Bdv(hpS=I06Px1Dqd z%PVRfk-UK+%&fsZBjo!ztYlx^|kwFHw@y z6*aQnHvK8>Q{5WPVvgh}EvlfAWxmbI)PK{uF`LDXD8cU)`ajJ)Ve4==irHA%X%0U{ z;@_3*+sS;JLs8rhWfDv%5HmfxzEVPaH+GF)w}g>Bm=pV3bp1w&9EJG9*yyY(*yl6J zkzdy#ep3{Gv5dJQGf;*1M}J$`fFFC5r%*jGC~TQ2KD}QE#mUb&ULZc!y;(2^ir+w+ zIR$mEVsi-}bEE50H&BFa#@6RR-QvP-_0K5Br*$Vtf5_^tl2+;Qhm261w3D2vQMVtL zBkhwlYA0ANISU(V(%qiYT~d?o6ZGL+lxSGBJyFa@lI7;nF7-O{j!<~S#rcYgS|3Xu z2He71HF)gEa>H?!Ck z3xy9(R%tjQd92dPiMxjR<83_VC47y4WgEZ_{v^X%c@onD%00000NkvXXu0mjfCr*;s literal 0 HcmV?d00001 diff --git a/src/assets/polyA.png b/src/assets/polyA.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9044930cad5cfc7dd271cb9e4a9eaf7c47b0ff GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}};o-U3d z8I5nR7-lgAinKnA7vNS*m>DuHvU!5)4HoI$OT4rrQW+ziq{J0oZeln+g-eR5>=BcY zhia0d;aS1>g-3Jm&3;rnj0Rc?Iy+f z@6|1sYAJt-p>FFN=^r7wmbE4PlAja5pIqc^dU6K8^}g=Q#+&!0RX;rC}6WeNT2rpMJs8uu$OPi;dp9Tg~Kk+l$?wm1YF+(cQ*9@MnelF{r5}E)v>UeGd literal 0 HcmV?d00001 diff --git a/src/assets/polypeptide-region.png b/src/assets/polypeptide-region.png new file mode 100644 index 0000000000000000000000000000000000000000..10bcc004206fd69e6f259b6313c820b9e8238784 GIT binary patch literal 662 zcmV;H0%`q;P)ap*x9|ZLiiMBlES6|)=E%)HxHR*HD{k4}{eHjQ zy_wk|lgVTgg=3HyjUIB_R{b3N~8P+6dhs7nXmJLw1 z0L3i+BnUF0`|J)Qfv%-k86?w00a%5nL6ApSk)XX2=;m-b)wrnwuoja+nEU=ul#6j& zT;f=YX_EzD16~JVE+uNm0^N`Bgp?~$m+#`qX-A@VHu#>jUTXRdT+lwUd_jML?xy$= zI+0@7WPvlicC4T@IuB>-ff3@zie6L9JcZ7 zzub++2m2n?o-~ zd%O3s%yhM-bx#hw3D(b&J;%L0Bp_kwlBe=BtIPK%oZvOvuzJmh{2xb{ h*NKojf4mFKy?$xWlR3$= zmMyw9MM#lla`9QFGoO3D?^{tO!M2%UZTJdn))&5vRlyDSL>8ED)-UXtIHx!;*X!h~ z8)@OM;uq~N{rUR}xAJ`T!tKw$ysFP|0fDeLydt`8Q=7_<-Us@D!PC{xWt~$(696&v BY~26= literal 0 HcmV?d00001 diff --git a/src/assets/promoter.png b/src/assets/promoter.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea4efc0fe006101413ca2e25b2b7fb93d8c8840 GIT binary patch literal 470 zcmV;{0V)28P)ncbaHbBNprF3jA^9NuT{xxVFM2$LzU$fe#lFF#7JbQ zvea-YFR_nDk)g`+3`g=3UojpTsw@w&D=%@5>8b^%T;JM=af#m=1tS};fX9{ckkEn zvfqP)?!a9#DQl7LgZd5gIP3RtuQTv3n8BfZ_&v-TAUv@G3$nI(+BLT&I|DxlEfOWL zh))=6-?#8y_UUexDHL@E=5=0P18?!UN};G7_<#$X$o@zxg(q$Y4&{5lGSOe58G6wH`$paGdsJme>kwqp7XxX zJM*4r&MaNJblEK9c#g3x#2AZWjOU_g1B_r1t5`;`i5Nk&b~TDMl9RSf3}8A+zL_Ed zRq?A)tbtq=W?&REH6m7UBg48tQv5tl79%m8jTRATBk?g=iwLx#_?WaJ0&OflX1yW; z9Uwktts+)*i1?WLB05TZ%%sKwo|Y+SBLtE?Upro5duhrt5J-xz?f-bZEK6J(fkwAE zC3K=C$s+ESBXNBK&8_l`#}UyrY(9TqvVg2-r$Pxdioc2{_=s=#j?eg_aX*w= z#C2<5`Cl4^){ljn&&yG)mNJBjM)7^tcAon2B3cuFuS79h#vo?v#K%lxPV(;5Z{QVN zQY~UOirG?*M`Dkz^LwxGHF3A_;dM^3h>2+JWE89I>BT?Q0v_fOwCKlrzpynbcvhG1 zb-}qe%_OGq+xnaMCwfZK*OWcd9cUF7^GcZaRag)@Od1#RO4yrMpom4h#eV!1w$YTZ z-{){3ns*EjqB$MIPW(}Aqg>w3TDg%1CGYrB9zlz;(H#0-!8_d6#{Rz+!`LNspDtb6mH&atGraoGMmGQe002ovPDHLk FV1h<~QWF3G literal 0 HcmV?d00001 diff --git a/src/assets/protein-stability-element.png b/src/assets/protein-stability-element.png new file mode 100644 index 0000000000000000000000000000000000000000..065a5ec9c98ced1333ab25df68f107e0afd0210a GIT binary patch literal 638 zcmV-^0)hRBP)&|*e`6c%X>4w zH@ulQGfP21!MtWcr2jfx#_~4(%eaWgkviJu2L41ouVMuB#5iLh(m%S5MI8_@!zk{z zXuA=|JJ@&I+*L`1v$OEqpYZz>BOo?~a;FF&Z;Al&rU)Q!iU1O9n1yX$2m6iUmgjzwa)~u3a7cQWCz|#KZ*Uok(@N9vO;~%H+rVA zH7AX!^ayic82f}eu?y#fG@1$GT3!NUIIj}GSWH8mJQFu!Kp6EwtQ1zJNt{a9yvbNY z+Z@AB&F8?BP$RmMQR$QTnJ(T?9@4lbOx3&}%u8S^^a^)CdxZM19*glnC4fsY9b`R; z%NVcuwoLVHTsdP6ZL>-k-Fw32)wHmU{-QdCcIKonl{?ZW@y*yyvRna{v|zJWULQF$>6p;fMO1!^|X)N{^Q!|Ee2EXu8 zSUv}_DPdE>T71n=N85}`KMQnq6&~|{@lS;tjcBq=p{2rpXpK;LOTtR@NZ7;`6cluT YzuObbW$7&DJpcdz07*qoM6N<$f@8WN$^ZZW literal 0 HcmV?d00001 diff --git a/src/assets/protein.png b/src/assets/protein.png new file mode 100644 index 0000000000000000000000000000000000000000..1c841d46b90e6796a5059c1217f070aafddf3b81 GIT binary patch literal 438 zcmV;n0ZIOeP)i}l)2{+iq0sggKoWl?%u!I$S!v|dC2!GKE zTE&ALfnAK^Gk#&bYS<*s@v3T2K?A7cJBF(S?P4=Wk4mWFC)UdbjNnp+-&nyjoJoTz z?4|St`t3KKx4YSCQBL9{dv}UE!gRZvod(cU^4Dc{qeDMC4d7VX|NCtUf66qhNyX}E z*6tMZSlUP)mJQgD7IMF)(l&Og1Pn{Xq^{VxDTlYx449}IG%l6(FH)JmYlB#mjxUSd z9`5z4j$upMk9Y7De{of=kN>Gjr`rX*YvnGZ(XC<8X)%xYn8OqK)<#pRxDD)KU)nxH g2qAjNl@PG~#i_qmisaQk}xWt#f1IB@Sb>3Cu))JNjYrrTLMMTLTsPnj^3yfhwM3nrJCi(-M1KYp}@THBdQ}Wj-?mOSp zB%7f*4Q;HWu9Xszv|-!8F>u7+KdotkfE(?4p%JFPHc{*l1nh;z3W>-oKLBjt?+Fih z!r#PU`Wm4>+uULw6B%+e?g2{uN!{Kl^91cer`~o}8$>bn%FtGpt002ovPDHLkV1nZH B;Pn6i literal 0 HcmV?d00001 diff --git a/src/assets/ribonuclease-site.png b/src/assets/ribonuclease-site.png new file mode 100644 index 0000000000000000000000000000000000000000..61825a964636110b80160c8aa110093e79202f11 GIT binary patch literal 591 zcmV-V0|!&a!(piOFnsG8@#l!5gI zu2V?)7huwkVtq_QC{iTv(`X1q3gvz3g;1ne-ltXwMH|TbR0~n2P2_!|A=*mbXN$@J zn@)`kP{_x|v`;uiAzxT8vY+Y@ib{F^_esh_C@Mdd$H)+Gq%?%0`gcALT!fC_6L0Ng z6~+HeYJgzb?dkEU39(B34m*bYA`R;?FQH>4U8|+!fDitcpGC@F1D*O@G{lFl*)n>7 zCu+;*kdKZBEJenILpzzpzD{t+fTOD)y zfOCQXR|M}x+fYQ_g+kI3*m{Y5CPLdk$W?0UDIh!XzFQr07766vfg!g#=H!4w;EumA d85tQC_yrka{97|9;AsE=002ovPDHLkV1lwY2bKT; literal 0 HcmV?d00001 diff --git a/src/assets/ribosome-entry-site.png b/src/assets/ribosome-entry-site.png new file mode 100644 index 0000000000000000000000000000000000000000..22d00945e433b6235899789a213f363fd8b2ef3a GIT binary patch literal 571 zcmV-B0>u4^P)Mi3Pdn-D}T1Qo1Ip`ew8z4#Im zu(z=gUxS5>)`DFyzJwGKLBuGih@_B2C4Vej;_R_|H@lg;D9jfIes}!ld7jxjW_HMA zGMP*!lWEORpLF-)Fvg3|pYR#Wee&BfJ28bvc!Q0au~76}#g1)BTER`ss}Ef_=5b>i z@@{env$}`;S&VKyvp71?d;uiWYVM+jNyHU@qO)fvmwl2J)ca$H<;{=+OT{u)lE6u%dUFJd^Qc)>6}20k+} zlVXqa>p}e#tBss zHICDqA3?pRS98n)!WXrT#&Mbxdh~or{AaFpZTasP(Db0VqQBcH>}%2-vw*dr9?|Cu zM;GtboL7F87}QuPyt@*66+DL1k-e!{@aOuP$z(E_OeWJWegj+Qu^X4b+i(B?002ov JPDHLkV1k=54iW$W literal 0 HcmV?d00001 diff --git a/src/assets/rna-stability-element.png b/src/assets/rna-stability-element.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c130fe9d9082d3c35b8ddc2a0aada65d03eb7 GIT binary patch literal 534 zcmV+x0_pvUP)gsgdkH!B_BNZqJ~%kSPUcN+hTFS?LgK&MVHFsK=?{TeQQ2|t)`kbAO;*D3;y7>R2EOx z{|qo`#Wa9TYGwULh87y)dQ1aP)QXq!2DmNABg@|bV^)n6xknz>0aJ-g-H8u{^B8ag z#0}*#hIkb!z?EGcb>hGSauMmMlbGDhy#p)0&*lu~i<~Z?gnR{ttr{tkLzd6k)lp*} zS^k^gU1}&y&4AeZMZDH|Gm*$t0cGL52S^#pV~iBuFJ5h-5-?@eC$p;b>KU Y0Y@T{A~AjloB#j-07*qoM6N<$f?;vr?EnA( literal 0 HcmV?d00001 diff --git a/src/assets/signature.png b/src/assets/signature.png new file mode 100644 index 0000000000000000000000000000000000000000..60d5bb9a1d8534166ca34006316c29d3b835d4a1 GIT binary patch literal 596 zcmV-a0;~OrP);s{9@yFng7*S^z)sXg6bq44(4baY>@JyPCl7ncCKuT+44M7UWcdAdX8yCg zR8&+{R8-6`we30~s*` zuz=@XA|GMDxcEVPWmF0qAa3G^$%|)`28f%Ow0K4^07oTRCKUfh{4_6%LRl!Jfya_8 z6LJ_2v29EO3p0#?2A<(S5c?9;m$7C_CI%UZiErWvUIekJnjpRhmgG}qQ+vbil|Lu$ zm8`SSCcdG!_>7o|GM|TX2Kr@?_d&ghOX(j&zT%|h{oxo|_$*1gSFvvlqCemoe)j9s zD~+B>%OG~+EDojDt2$?8)N&;qx6lm0lOe>D+?}v7U^ys{3V>yqU)t|fG*S7TWQ z{@`{=V|Os~uavPFI4+-UwhFlvo#pinN$Q&=zGERDc@iFUT1CTo`(fq zdGTB0r2kt5GC!|4c+uqz!}%RCCtP^vJQPjt`Ow!b)N7^Mb?w@P@V}cC>$tvkb%4Q) a>+%xoWaKYe?KT4XkHOQ`&t;ucLK6TPCwYDV literal 0 HcmV?d00001 diff --git a/src/assets/simple-chemical-hexagon.png b/src/assets/simple-chemical-hexagon.png new file mode 100644 index 0000000000000000000000000000000000000000..793cff43167fe31e0754bef4b2f5d25d4f97621e GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}~5o-U3d z8I5nxFXTNGAma9rIb^~H=kf#B9|gv?EIA!w=q{en!o|a^pj|LSTcE>CbISyLTPEzrlv_$7^($Sj?x&{4PFLqsEFi&7Px6v?a@`rUd)gCZ~$gk}(Q{9=dP&}ai zW$B)^S-Zcn|9=~9Uohk5rYp?;3z)xc)VpQ+Ft%H!k+I@PTgFk#qd+57JWrjKj^G!O U4o=*j2y`KXr>mdKI;Vst0IpM3+5i9m literal 0 HcmV?d00001 diff --git a/src/assets/simple-chemical-pentagon.png b/src/assets/simple-chemical-pentagon.png new file mode 100644 index 0000000000000000000000000000000000000000..a5bf278cc8ef5d0704c7be83c2a701cc27cefd92 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}Mo-U3d z8I5l*Z{$4WAkp?v{3zoZrbdy*oCVq`jK(p`3OHwTaNTsOW)GOXf5HSej}w~jnd3kI zJ$_fTT)}gaif7QIYZK>(Ff8{lyso%<<~Lgg+k(C?7gh6_w;YgNVgJi&m)SKHZT5K% zmPXpi)BGzRT=9Rw7Snk5L=JyU(%F<}KbYMYNWPpsLv=lqoC8~qa%9QXrtiPJ*!Qr# h6x%yd1!P10GhTsPlKI{<9YJ1W@O1TaS?83{1OUB8S>gZy literal 0 HcmV?d00001 diff --git a/src/assets/simple-chemical-triangle.png b/src/assets/simple-chemical-triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a63eea52425d83ec7cbce6eb68fe8afea8d99c GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}Uo-U3d z8I5nR7-lsYO0Yd}*SX5gap@$tMac&y+XnHBa&FrOTd$82whhhAO9>o>`K`{7e|5fX~`9bbq;=kf6j;srN5W2Rvi+Nea(O=Q;`95!Y z=3jllnr-ea(|ZN~wbg$ulrxJc%Q}B!)&G>)JCCa8860Cz(`|~ncY^Eiq{2gs62pX* sWll?ML0)AiyQWcJTf*Ik1CUlh+{6X&2iJ%MHtA6Z`LfEl+#)mDgbB z1a1S}oflRd@0jrKo3_X|wKC&7A^)A9mF-yh?tILQhs#zm`>uGX_Gh8ppKMW%e@Wgh dE-osC?7f@Ms&)7j*aH2=;OXk;vd$@?2>?hTa@_y` literal 0 HcmV?d00001 diff --git a/src/assets/ssNA.png b/src/assets/ssNA.png new file mode 100644 index 0000000000000000000000000000000000000000..937f09e0f753670b5fa7e0bb1ff5eb707c99fe18 GIT binary patch literal 684 zcmV;d0#p5oP)mUSPJtT~n5bO|ii4GDNW5OWl)Flf#6jVwxv}h#q?tQ;q9L&@utK;*5 z_x9!c{C+=Pz_KjMvMkH8EX%U~kD;NVbFS-NXc0N7lzObSegPnJfXWnr0)Q-lLoISg zMC7S4<|}~v0MvnpZf1;mn@*<#k{cvnkt~wDM{=xCC|owitoQczddXzc2S5OKTh!eI z5cK!=d&U@FL|y_2?~zj?vJ{C#ys4=vDy0IYRKBeR0NfH0e{F4ze;OSf^+lwb%jHg! zyp&3%o&g9ZCMIS{4v=iV@Oh=w*5u@55Cj1$l?ppLI_gTP`90pe<2X*RxVT7?oSU2D z_HnMYv%pcMRDF7SddKkPa=B4@y(#M`r5=fhUn-SI(kJ<`TCJ8Mk;r;H9{*CS)t-}l zPtwch^No(NrjDfJIQ48cyW>6Ab$zY%cL1?=mY5BP!}XPw6_VuU<|Y$~glCL-jotrd zNJPqAU0vSt@-j&>lgR{H>l%RLjSxvg@>E}6-;y!r*TTX=u2?LNi^#_C@NnJpyd4Xy zuCB7Pv$GE1VLJ;%MdaJy;GkD3l{hjo;wz=L0G!2$hrgRg`f?)9fI>*^dim!G#w7SQLo(uB6y{j>LPeNneMVI?qau@Wzopr E03QHxX8-^I literal 0 HcmV?d00001 diff --git a/src/assets/terminator.png b/src/assets/terminator.png new file mode 100644 index 0000000000000000000000000000000000000000..fc26c68c1a536af907176f89fee64e021d11ff01 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}~Ho-U3d z8I5l*8FC$R5OBD-{<}c;gUlS;4sp&K&-k`|n|AM@+XtR9A>B<0kM&e0_%QuHc*x1a zNS;l_GipQV!<&2-%(FYwPF6CpKe+e(sML=$Pp<4#yx!WNec@ZSoU6C_>G-9hO?kcB znCoj;zP+qt^kd%lkxlNU&$@@(na)PoYp%VZBq4CNA%o4uSYa09MV^i{2NUK+k`N(j q;|EiB>btStxwNt=eWFU{ynRV`OlRsj9Nh8`EaUs0oPd_0`jJuR<0_pLwje0>AZFqM^Q<_fNkGjHz_I0JMKgQu&X%Q~loCIFid BPEG&- literal 0 HcmV?d00001 diff --git a/src/assets/three-prime-sticky-restriction-site.png b/src/assets/three-prime-sticky-restriction-site.png new file mode 100644 index 0000000000000000000000000000000000000000..527db15fa70097c172ddb19a68223165b02243b4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}|IjhXq-z3)!-t7xeigq-y#JaR;yXQ72saOs#7FtApN! z{DR#LGiUzY>}0DDz;OCk4TILhY5i+<_O5&N*?aN1XIsqu=g5DtTp-B4!qVX^V-{aP zalj`qdpUk}#bGc(?NznoR%g@CxdT-`mOUl=@H{an^L HB{Ts5$-Zj! literal 0 HcmV?d00001 diff --git a/src/assets/transcription-end.png b/src/assets/transcription-end.png new file mode 100644 index 0000000000000000000000000000000000000000..826f5635fb242c04a666260cf27d741b91ec66ad GIT binary patch literal 640 zcmV-`0)PF9P)>q}mJ$q*7 zIrDO6my(i_6-`S6-nkY>aTuGUZ4~`@fvE=cSr^*Si!uDEQpRu*YYNg>l@4Kas|l|x zuhChLj_a|6)?)zs65F(}WQJlNyKw}o6Q2*lGW%5r4Y{~0JGxJ>Z4tj7JgxA((;SJ_ z*@GGLf*zo?hJPy_CjK+R>=eeWM9fzq1Eq|_XD1TdIt(Z6ZsZYAYqb7_Q%U_cCWUM? z$B&9@8-7RM#on=O@&wR=?a6(Ayj~DC=s8S8TMr%ynF?Md?RIF)d9)<$vKw+&w7*e1 zg>H?$sja=4!c!&^5yzsf8|Q^wpB`YBv0s?=_k@1yj)=NS$ZrfwN@;J$hB_oA)t<)H0000w#0K~!jg?U+4i6hRcne-|~H*ocBBnrI@3q9O!E45Ec7el%hs77{GA z5XB%CVlR?t7X&Q?jbb4-B50!+gM|?*V+21yA~^y<^bDHQm{`17_U$Emac_5SvT#3G zc6Rpd&i~EKdo#OGrAn1lld}LWRVsV{d?>+!l zO=H&tJS?)kRvC%mYy`&f1>FQ{O4!!`x0L-jGCIz0%J%v^7vMCt_6M>+v(mBnK%w)fM#{wW6md$06hwfnz|<7Hj=3To~h?n zV`n{@k$Qpwx!%;jpmYjdX>4^}eI4$$U>I`UI7yX=Y4-n4Y9aDuqRgli+}-B*9{yrp5jyb?(BtU1{iB13==9yW?HsCSA{gK}HJOZ{lQx}1Y1jTnC zsWdfsX><~a4{LKh?m`wuohpAo97z?O1cSECt(@p&k*$O0L;+aqR8bkU0N?SQ=yEHk zJWk;|@Ww_1wu0E>kSY&bZYy!_5?l+8yOk4-R)X7#9JBCmTq*A3i~o&mF;c}ld0Pt@EsUNJ}*_C(j`tG5gH*Vq{V4wbY(9y6{KA%HIdu3)z4w z&$rxG;xq$a@kii>TRG9uf36F_I=6D7(}wTB3CCK>rj?X@#8;`3R{jADz3E}YpH|)g O0000jNl@PG~#i_qmisaQk}xWt#f1IB@Sb>3Cu))JNjYrrTLMMTLTsPnj^3yfhwM3nrJCi(-M1KYp}@THBdQ}Wj-?mOSp zB%7f*4Q;HWu9Xszv|-!8F>u7+KdotkfE(?4p%JFPHc{*l1nh;z3W>-oKLBjt?+Fih z!r#PU`Wm4>+uULw6B%+e?g2{uN!{Kl^91cer`~o}8$>bn%FtGpt002ovPDHLkV1nZH B;Pn6i literal 0 HcmV?d00001 diff --git a/src/elements.ts b/src/elements.ts index c81b327e9..be06715da 100644 --- a/src/elements.ts +++ b/src/elements.ts @@ -10,11 +10,31 @@ export interface NameRange extends Range { color?: string; id: string; name: string; + border?: "dashed" | "dotted" | "bold"; + font?: Font; + svg?: string; + gradient?: Gradient; +} + +interface Font { + fontFamily?: string; + fontSize: number; + fontWeight: number; + fontColor: string; +} + +interface Gradient { + start: string; + stop: string; } /** AnnotationProp is an annotation provided to SeqViz via the annotations prop. */ export interface AnnotationProp { color?: string; + border?: "dashed" | "dotted" | "bold"; + font?: Font; + svg?: string; + gradient?: Gradient; direction?: number | string; end: number; name: string; diff --git a/src/style.ts b/src/style.ts index 797dd2fe1..90d0e80c5 100644 --- a/src/style.ts +++ b/src/style.ts @@ -24,7 +24,6 @@ export const svgText: CSS.Properties = { MozUserSelect: "none", WebkitUserSelect: "none", background: "none", - fill: "rgb(42, 42, 42)", fontFamily: "Roboto Mono, Monaco, monospace", msUserSelect: "none", userSelect: "none", @@ -98,8 +97,6 @@ export const annotation: CSS.Properties = { export const annotationLabel: CSS.Properties = { ...svgText, - color: "rgb(42, 42, 42)", - fontWeight: 400, shapeRendering: "geometricPrecision", strokeLinejoin: "round", textRendering: "optimizeLegibility", @@ -151,3 +148,9 @@ export const seqBlock: CSS.Properties = { padding: 0, width: "100%", }; + +export const iconStyle: CSS.Properties = { + width: "25px", + height: "25px", + zIndex: 100, +};