From f3e8e5b379114bff3efdd4a387276231e6d1c56f Mon Sep 17 00:00:00 2001 From: Silas Bartha Date: Wed, 21 Aug 2024 15:38:02 -0400 Subject: [PATCH] headless render + terminal display pages --- .../projects/bevy_headless_render/index.md | 13 ++++++++ .../projects/bevy_terminal_display/dialog.png | Bin 0 -> 38779 bytes .../projects/bevy_terminal_display/index.md | 28 ++++++++++++++++++ .../projects/bevy_terminal_display/sponza.png | Bin 0 -> 40621 bytes sass/style.scss | 23 ++++++++++++++ templates/projects.html | 12 +++++++- 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 content/projects/bevy_headless_render/index.md create mode 100644 content/projects/bevy_terminal_display/dialog.png create mode 100644 content/projects/bevy_terminal_display/index.md create mode 100644 content/projects/bevy_terminal_display/sponza.png diff --git a/content/projects/bevy_headless_render/index.md b/content/projects/bevy_headless_render/index.md new file mode 100644 index 0000000..92dc46a --- /dev/null +++ b/content/projects/bevy_headless_render/index.md @@ -0,0 +1,13 @@ ++++ +title = "bevy_headless_render" +[taxonomies] +categories = ["bevy plugin"] +languages = ["rust"] +[extra] +github = ["exvacuum/bevy_headless_render"] +crates = ["bevy_headless_render"] ++++ + +this plugin is pretty simple, it just allows you to set up a render texture to be extracted for use on the CPU every frame + +i made this plugin as part of the [white (I)](@/projects/white_I/index.md) project super early on when i needed a copy of the rendered frame in the main world to be rendered as braille to the screen diff --git a/content/projects/bevy_terminal_display/dialog.png b/content/projects/bevy_terminal_display/dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..d9281f24bee3c17075cb5590be22ffbef4257b44 GIT binary patch literal 38779 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 literal 0 HcmV?d00001 diff --git a/content/projects/bevy_terminal_display/index.md b/content/projects/bevy_terminal_display/index.md new file mode 100644 index 0000000..d47c28b --- /dev/null +++ b/content/projects/bevy_terminal_display/index.md @@ -0,0 +1,28 @@ ++++ +title = "bevy_terminal_display" +[taxonomies] +categories = ["bevy plugin"] +languages = ["rust"] +[extra] +very_cool = true +github = ["exvacuum/bevy_terminal_display"] +crates = ["bevy_terminal_display"] ++++ + +this plugin allows you to render from a camera to the terminal using [unicode braille characters](https://en.wikipedia.org/wiki/Braille_Patterns) + +![sponza](sponza.png) + +it makes use of the [bevy_headless_render](@/projects/bevy_headless_render/index.md) plugin for headless rendering, and then uses the [bevy_dither_post_process](@/projects/bevy_dither_post_process/index.md) plugin to dither the captured frame before converting the black and white pixels into the appropriate characters and printing them to the terminal + +this plugin uses the [ratatui](https://crates.io/crates/ratatui) and [crossterm](https://crates.io/crates/crossterm) for rendering to the terminal + +this plugin manages a `TerminalInput` resource which keeps track of pressed keys + +this plugin also has facilities for creating and rendering ratatui widgets + +here's an example of a dialog box and option selection widget i've implemented in my [white (I)](@/projects/white_I/index.md) project + +![dialog widget](dialog.png) + +in that project, i also make use of the [bevy_outline_post_process](@/projects/bevy_outline_post_process/index.md) for additional visual contrast diff --git a/content/projects/bevy_terminal_display/sponza.png b/content/projects/bevy_terminal_display/sponza.png new file mode 100644 index 0000000000000000000000000000000000000000..6568cf33cf4d83664e8b8553b2aa1faed8b0d499 GIT binary patch literal 40621 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%0Dd6+9mCKgh9 z$Ue#U^58*AbU_COZIw#dk4ti}`F#2twK;%!wx=@!=D%n>7jc4}y!;K?ok&>OVywNf zTDxY-{Wxhs7Z3>~o)%*(bD*|e3U*&hv356HLs={^Ii~}%6^XFVTgDASPlqS~{0i-u z(ItH|-n^6Uiq&Wot;I8x&7yK9!P!_Zyuum!rK>#3veZ;Fe zfp1YHcDHl2;h}PS7x4Y`}7*ny{)M|u_A59>*830&}G=<3o$@$Aaqz5Iw$U= zA?WXgv*NZ^Z+4i4Xu%#)TP zhv(=pk`eiHH5v&gn~5R+AK`SbMcJY!zj7wipp{M=PI&Q&To}pTBcY-EBJ<388aRd? z@b^$=q7-h@_BU{IXt83{10nw1wGC?!cPs_B4=^EALP8EHXf8fJen8j)sG-!8L9mcO zZ?U#PCy&Af>BLL5tI_ro+e##!XGkf(?xk&lKOc~^i)^>WX(?d;K@3nM#%a?*e-5WX z_KgJZmY^+w`oYU4r9;BuT7|{X+Id%-jbeZkJXj_$KUfJhLQJpZ1cF?|YS@RT#px(# z2w;V;Zt-*(ltZ4NF3_@;DOhEX8@3IW(WCYFN+Cys1R%o?w4qW*!<$UQ*cUZmn8VY} zC3s4C56U$f1Lsu@1vX9t+}gHS9|qGba96w*qwn08D~Gi^krwVU-icxMqA>(OhIcW8 zi8NY)P2-`cfmurlwhaMa+5yg3Sq_l}Ynz{|;xW9{BPt&S*~5^*5`qwg1uD9##1dlILbkTfI3Ha6c03K0>cj;;s`7T z7)G$@=+4(9CW&j`q(AawtW-LY$uV6Hry2ij!@{FJ=eLP4$98PT} z&`&->HN-%8+E^4&?ha}~T?}Lo>a@{PdJncD-NrJ8BN`aH8Ni7V%Zo_?HQvT*r1{3y zD0-%oNHNsb)ZfR6NIXH-eR7Lo<>2@pOmNZyIsiJH@L^jGVkJjX?6h)*=&tsfn_Y<)m{K8a+NTY>ClY_Vq$z8gC$ss zd^qF=VGuIDW5t*Op_7fLV%gw>)1ckj#WZ4x;?*rYlOOL3Jj8AvQ^|_-EDLQl#_I9e~_%zzv znrh98uM2{0)aEiHt0%xDASXPP-)QyQ(3Mm4P4D;oF2*3t2)Q$ijnICa{1l%B5m8|My*yR zup0ceuKJ=Y)RJ){jtHQ0P=EAA4XeAC3%-laXUd!ssz-DyPg?Niauw)h0T0bdP%{Bz z4NnOvN389dQBQv0Chg;f!5oW5V72|ufT_(wvp$H3Mg*-b)*ReaLBfau*&$>gpP(A0 z1-^uk`>l>2kS-{LL3lcl8y1a(Ts~DW9aw5>V-9cw@S;W*1yV!R72^Py1~;pDZ$Bpo zj}Xv^aHzm8Z837#@*voPpeJW~3x~Z5^aa>~;#XE3qGo(PjIs*nzepnBE;rH55jRqh z$x`ECsF<0nKb-ToXyX^C#{+8~76i?(>L&S)X?z#`dz-?9OKI^C469M6jcV_eiw%0J zBp8%a@2j4j2OXh2y*{&%lMQwtwClnTtd}B(^fp%d801X|pKwgqu4l49|3aQ2rHLn- zw;lfc<8+3JNIs!~?zgfuoSUP*bC(XA!LjQ#6{%ztM;9hXO`1DC8p4}& z4_>gW5!ac$sP;TPVeBkIYzcxUk{LZ=Oxq#|v^610rMN42(`g2vJ+s7$$a*B(AgNxR7A6ofW}AP+5+ z1H5e-9P>mJjs|(~WMbw_x$WaZ_#iWyK?A98Ud6Pd%^dDYepW#ntGx-DAue8cnqWv; zJMx{21`EXen{rB%FGpBpHp1W#<|w()@c#%LS!S`ZBc{O~jz8dmcAV@;2)!A|8bpn_ zYqeQVje<=`I2NJi6)a26tU&S(Oj5@V5&vZ%Qrql-u24xxE`xuIa0PX0N~{Fv z3NKaU%o`_QGw3E#)+n|NZ=9jmpW%>XUk5Y4KZXdFsq5hQWTG)kX(*mZyq^rM-g`O>3@r<>0Q$sTniP zg#@-BG*P&@hqi^$kc2_`fdB;Gl;jJM_>oizKSCb_`00I(8Zm5;G|^|)X$1uuaxx(K z>=R3>xZ_&JHbr-hQ22u$Y+o4t+hN!btfOVaxm#-_9K=7n&}d47omNOf$t_*)u>DjwrzGvky%TtVMDWoI&Vau02+2R;uYj3`E!vK zz=i!GpgM3jn1`Gn#LMo3$WcI+4*Yw*M}UbdX5>G*rpf4Z1Ii9S1hnj+LqaiOi&03# z{TzIN0&Nm*Rzpkd$*}yN*1kQUsVm!?>Uiy~b9I<1R4UL)Td@j?iYTx2p`aDD_y|aV zSg=G15CnM!66}mE<(2vZK_RVC6hlZcCXq)7RsqW^gAhUzNECz!A;b`pkoULG3C`S^ zJAYjLE`K24$v$WAwbpO_)?@F(;1M$>)q8==;NmJ&c2SPMyf|mxyHol)fl>DT8MnfI zO<36s&Ufikznh?Su9=Fr04E05p82+52QmSGNOxpZ^VAevW*AXSnztAH}EFpNOeqcA8S zSif}sh{1Sa7NpRn{qna0nQx>4KkQYWP)vZRflQTU=oGr8h`mzlCG^OgCIj$6IDHBF zXrVYE39exQoC?d(nnAt>#2(gZX!UaOu#dT2mj)7it-$>ma6AyX!X0%w zP|Jo|zY%;WzYCX)AoT6RgLEd8_umCYlt4KUO(2k$fCI1Y0CJH88pDdM&)<|t+`nX4 z-Yo)c-ynGGgYvh_TfNh)gbX?9&KRF?2#P`gPXHl-ExilX#-Vm3z;c8O5ilRr{mBDl zdTt(d50MO92;jLGInbBG%P;02$Zy6o*Q99uy!-WsK_7!vVM~2AYLctx%pq{8Zc^QZ zhnq8AyfiEKl0jqu5@I~SwI&-3GCwGZkK@4!9Z)~ZBT`?3bpPm@bwi7pR5yS_xiV&T zu1~l26A}IM>tPbng14LrbbVU)MpFO8@?g#n-2`>aJedb(1WLyvz|PJ6`-y}R6&Ygg z#Oz*PBN+{s>qg|0lLQM!APoRDW5AWF7rJfg0xfJC_gtJ)_!<*iI3oZwzS=^6LU8} zHc8)KY1Tt2QmEI2+jNU)nX~|>2LjD~fDs-z2wIwL@Qwp36JSSttvwC@HF;jqB(u9V zHq8YbbN$k%oEa%EDd1(~q_P7{bmr8X5&bI5fuSZTNC@)kxIo?DDnHbPiQvEqPbiVN@F`;9`pr2*#3dXNPCC^t}A1@%Z&DW;WZ zF#OIiof=u>xEx@X9t8cXpx*{`4A{6VMAxe!OctlwwLE-{O3ELA5S2J^ zBuO53o!OdYn+!K#>C>t=vbO5$#sfo1=KeGU7xEZZvHDcMK;Vqdr9&A!5RO}=P{Ic$ zz@Xc3i-iLvQ{apW@V?n_?FHEBdgW9V&}KfoDF;FoP!_cc8$q`fw`tNyc6rmC8_B>{ z24R(*Arh4Yvz;9gWw71?Q9JsL4Y2?7eq~Xm3s(-Rl{bt=EtE{p06kwj!wiHQaH$l; z%{u{$@9Q_48Z}bS+(3|9hAVRy;go!TsuqB!1(-0Pmi>Cuvz@QuNk2Kchh!oE)Wn!_ zm)x(O)9I(zWY*2;o&iO8Qv+;N{*`0fD+9I4Kv6%W=Ad5yYBB`<6%a99C{J00AZrAY zqd%&OrK^EAwRO9|ZR?Q31V#fk=`h$ z)2M0H&FY>-2BPiejV4{$-btelG>qxqXs=ZD)dqtfwn-qMf%-nsUy#RL0fJ~HRc6|l zOMt5adiK>8>!hlDT!(=2Da6J(J(LEybq(WZG@kDTo)dH$S?A{MtjO1aoNYIPOM&I} zUbL8R0){to?HB=Jmwe4i*aG6Vmj6$aguEUokna=NC>3I4PKGs+fg^IeA-I zwBI~6v-2f>ipz#uG=py%E`eIW(!6!EQp60%4%ndRf4Lpaq}0y11gD=k_Q&LF*@kK6?A7dqrMx$F@AjF5~?z@T1TF^oPe6Kio&X-@oO6OunP9Jml`(JK+fF(m!<< zJw9GPHENV7g?;HIw?)P zm8$-xkWAO5Yjxa4OM)fd!lw}|LK8}ciBn_r<$OIR)gq4T09}p#clm%f>0gG3nui0l9~$G2IcWF#4nH zKnumss74qK>?-RE`1kH914B>Mm!o*-9-hC^bQGK;vK2bfKY=Q<&Zxs^b%?9n3i3|8 zk+}zIpmi9%%zPX9P@EJk6 zT$Y6pYRNh~sKv0H6Sf@;ko?b`_Nx7zAwn0zM zwcG*ktH`x5WEctjbC?WFic7!{3357(s5N20Rbeu6qQ)cz|IZK*GpGXMcAFq^7Ln;F zuLYc0bX3_ANV>@pzxXq!!MoJR95G~}#aV?fm)kbFKK)4YV6JUpwINM=Rp$f7^fC`g zKGp0?oEYo?XQTLV!5ie)^h*-Y{3scA>N1Ox%*}K~^X|;0w)rIgS$W(rx-hKW^3cC; zSzJ=>hu2_yd4bY+m#T8IQpYlwrP&smP2tEo?F<3|1ah{k(kvwj4GdFvf@LEjRcktm zp1itjdu&xVaJGx3!etR(CVNo1`!$Nqrh0F z)%v4vVjNGukK@hx`+-%=Ii8@A3Z`=G@`6+6bXR>_w9oSSWHN@lq7@&n+}^kgmsC7X zNMsWvf^^B+<^@ZRpzFb#yqzU`cYS_j$B!ACb5Acw+3pAT|E9f^GauPUt#uVI-_e{A@6WptQX7iDCpD?v|c9FmAA?;(%BWjB8mKR5g@uwuWk zsbjDITIIiol>$D-lMY&7sbpvhaR4v%lIeTV-pTs4m6O>itW0gcKRmO(#fOv*&F;P3X8WZ1NjHFAa zax&vERuh>MnA`v!1SKPnP>3xU1duQAQn*SoBobb_R$s}n+`%A-$GO@h%D=$n0?OxI z%v{?4&v5Dgv(Rlx9OOyBZs6@k^Y|bTBZ2P{knt~2w99rxeDa@3kB$Exiefb7UBJJ2 zqln%J2Jm(aI^+-ojD`t>&QuOPDlrX0Sd`SjYqCJbX>AZ7@RmD51I7l#z@Ygu`UG$S z^lYsLK<}qEIEK(F{xulF-+lWZ>{h&(#w-GBXZM-6(R`v5tn>=I=F5dH>vjKgzsGUQsAGSyuR+5c|1D`05XUAy18vw_IfUj0>e#9;Xwc|u@(2j%K&H$O9C zwfY%Nq$*gDVD6CH34;wCXdF6CKBg9#Os$?7)KkNU{s&;GCcQWgZj06CyaWA;<3J=3c^$R-t^c-4TZL zU{d8$J9kM-`%kW@j3YMml65@O#4tx#+WDqoi7~&~q020_%&U3UsaFPHI+x$9-P26s z<>Eu4XM%rB3|LENsh#(u6i!_#(Tv8;P+t?=@|Vf$D~=2l{t;fLsV1Y@r1E zunm5cOf`X8$u=#oW@#i32CzCw+uRrlVKw1iG06md&eDD^iLP6(k#LSkncJ{z#bduK zDSk?}h(p+g*si&gvANi@-QD(9t6w{A4<>K33`Ezr9^u{=@mMMFL)*EbyuYuYnr~(B z7WJPm^m$+0g?2LDN7_H4US55avm!i}iRR}h7G53_iv1(}Yw%p`ipjwx)g)db ziFTS3xv6wK#~J^;8LUU%Iv@Or{*5c_ei|@*N%I*nl}5KXVp%E2l+AThIPc^OqD`TJP_|ggW1{rjlmxLTFtax>h;_lWn4?hNupJb zc@LWYjLMyuwHXIcZd%;}3M&H_0+7E0^ps(OtFu`R@v??y?S=yr2AwDe5zcD00J0M6 zAc)wG+T4+;o58a=SJ=eF{uKMWLs(fo zO)5gwU%7YHsjH#ZQQ21A+X#^4q6f?KiDcQrOYE+P5#QsltDp^s3U;)AgIRS&d)x8( zi?SzM4HsTnqId#n%yPh&Qz_3K!-5kUS1s zSuC_jKO0q!K9Lrt^KcDt_Kt+89>WGgF7FV*dWfKWaz118?sbCamXm1l{!I>E zCAdbda|kuaHD;xh8{brek#|uWd~L>h zd>?IV(Ub%8lk>$ByMVfmcP~23*}+6y+>}G$9y-c>K0H$_otxpE0Px39v(x1oOb2-! zmzZV-VK`o^CZ+>#6pSX8BE%H3Yb#||dJySvA&RMYeELD|5}fXlnx9 zqQ{VNrLt!Oz7KDY+zZcLDX~w>QAqa_WPPEO21aHtJHu_9Pz>&)1JRFLTd)#s0Cw6m zkYase8RH?WWv@IGDp2}hjy@)9DvkK%HVgG^a%^jr^x-94T9;4%Jr5nK>30>NRZ}N( z`pYvmdsE(}tAyuHWjiv~g}uG7I*-r&JUAmn(evLEd=}4L-KLzdeeKJHAw!N@>FnE*-4SSl4%lH1C^~6y_ml`piQY zW{L=*q8ISVg~r+}5?$<%_ZNJ`ihp+}+dHXk_H-B^7PI!~CD)_v*LUDuckrB@DV<~1 zg8cbgMAHxG|A3#|?#w;WZ&fj&$PVHeR@|BH?4thZ_3hJreg`%=s8;dxp|$O(gnPSp znJf*sdg*^C266Sx^m>V@LS9^Wz_TL)k3|%G>m6-`2TQJw_*0F!I_$HWdPxflTf6G7 z*{ELrX___clpx$0Ew;BOT8CvS4z2i5 zsZjb$YD-C?*|)k~9mq}%y`@0q3?z-kpRSp~qdeA*)9$E3jo(xrJ8sBVF8OJVe4J6i zb8PO##)_}_Z+HC3Qa~mRQQK}teBC*g>hD-cFb=a_Z@Yd>7H1&}fZbv!!wV!puR1_v7Z&W%cx7I_qmK ztql_8pBJfMv zTHr%5xwlN0E~%yjj^aQ3IA#q`bS3?l`17C0uHQ?oD^A>f8<}9(Q-5dG1yRc?^4gXX zfgzD#4rxGhryZ10f8lt+_uPRp8#5lI*OnE|SMiL|zpT??&#xz8_1kZ)x||J;G%KST zoy1$5wiZZ7gn$nWdFIc}dJMJ{MRcEv_}ty`rwGE4jh(8<69$zqsg2^xZW9MOo+A{} zQ?ZD@?v#oJ>5u4$ZThV;LWv?&0N*jst;Dq7m#U6OjBY4R^&S+n(>)!SnUa*|;vU6& zkK}_Et?T+h(M~~3LuCh&6TZDmIsk5co-`l5O<%uN;(5}!OqX@QyeNA&;3rxVkKp-{ zreK@mO2cRT_8u)|s0vUAn9sC&@VO7dyb)8f%wmm}HnPD|#ESf^;E8fo+4X5`T}{0& zyS&Y{ld|ecU<^9+Mllxs6}AJ@bZW_U2P*mt&ky+XBwi#|my)RH8zdx)O&p`B&Ro&O zO5vZcho|y2pG(IHox~ej=M2oZw~E=?lZ7uFNuuqYZ665kH5_v}EXGeeXE>6OfJSGX zO?gJq$Xg~D>F0@$!t76-IC7$3-dpFEsOi1o&^5M}DR00jDE%coLQ)v2As=*RJ1v86 zQ&wSCWNjd)GPG5>^r&TD;$!hCiP*NA{_CjqgLGrH_Fx8W(P86pW`6xD<*EaBLz_?O zwc`WVLvRYylII%ihd`hi8*_6?R<~u7e#0svpWY#FpqKO3vx8?(-wm~ySnp;7O6OiR z?nR4=WlA@^97uQGTEO>4ovx`Fi_aO9Z0QtesL>l^)*z-MmQuAdf8=7wN>D&$JVrc#E!ZdS8R` z!=;6A+-fF*)#_#^Y>M%MudHWOy2*%l|Yr}O*ZaNrMtLgO-&wodsG1 zcP1AbD4B^;emQJ2g0*`=QZ+=>@Ob5V!Kh}R9^7O0v|CHTArFBz3tLi^A@9J{x=`1V zP6frnuHxyS)>PbRDGq#pJff+6YH)O?v~Zlz^6q-sRMb9|P=dM_uV}`_TfZ5hf=P^B z58l-BF|S6k$Lw%*RZ;{uS4I1IAcf;skuBq_>QY5>1(JRcW7wGQELD zNF*7u5QTh?4)!~Hm{QTPUM7Lg5uEIGCmhv%x>=#JH?KWVqKomaQU=|Lm6!3G{MIA3 zZ^Cw*>bRr-gnqt5V0K3uy#)Zp#NfOH@O7U}yWZg*X00ZJ_uqs_coVsg(x17H8lCrf zhsA=jgC^-V#4)qY{gF+7s!wYUO+tp$?7q^7Q;2vOYxz5OZg(nEb21ZyP1&`zC0+Ue zMKwhE;jv%3vkE@qMABbwi5KKvTo%w^t?!#zMM}Y6qSr@8-f0+=iohY!e0P`nO26l# z-9HLdL3-M6oygEQtdup3Q#8_1CA#)|;l17zuO4JA>nf+7Qg_-GE=vU7?>KN`yJI+7 zoQCC}ka@I&X-2CUj|V)X zyS$mMWOL+u6|^XR>dA;E7wjMo`T*>5^R^CfABItKib;l@E$apWu;N0*f>^et_Wrgl zPGQCs&m7wFg@r7xeiEBABghRvVg&>VDP}(|l85w+sX{z2-CaP7C8c<`@Rdw#tv0o} z_t=Oayhqp0Pe+b1x#N$+;Z?oQbZaa2WofU5J_8AZK;Qb|mUaTRSj02Zv{i(y1;Gh2 z&-AV@9u3x$o(Gu&R8CZ5cJN`Wz%tmvBwah02u^{SUfsWD^#bVm9{StRR#u5{N+;r| zP-9aqOe_LYS&G@c)JU1XO^&K)8uBPyj_Qzf?w;QCXw4}Sz;qDv~$-w!dr*Ej^gHj!1NCM`_x?Ffgwkbuv z=;8GI!Z5DI<`<7rnjFRAByD?8NfDeb%VRjN&z@`VjR_V}!h1;ViXRnV_80*AS(X^K zXGnJmaT}NKI-VWt=`1c}>UQj&_DebpB6Zq?4T$W!3tWQLOh7!e0|Y$r&@Q4$5yfUrq0{B!tjgFD8OHgZ;gay@Fz~V5Xi>M7N5)!hlU#<(qe3 z4XyK;csvw}KT{-1iqj{Ql7@UH)&jsupfN53c0f1hD@J>2-#bIie3b5a-4)=4wgmRG zdBH69+fUvHYf`k#-+pYEGs+wp2v>xm^t9olrs%~!TQ+>Zrbj?{M6a)qc6tYo*>fkR z%9xi6-*eTCrP_wb*lfHyKdqebX7jlpWo(NUGtsH`QZVJ7Ss$NIQ-*&_pi%T9z&}2s zO~m`hpzB!F=sHKgm^2$HkL-{C{Du$L5vz4LQ}Ucul6A^+6kn^Q@=ZsF8GowB(1cei zzyz|s!E7KFN77yE5lF@Ai_Xrr7iQ~{@4c+Y2hvmnUFPqq z3WzoaFuWKh{xyJ5j0q^qL109@9Z@Nr8|8%aB&W9u7UJ222IToz<>~CP?D~AA3YzKi z9)rDDebtF>j)!Ft-|Ox>eN279izyw*R0MY~+iTy^F=r6ow1Ir45322=TZ0H!;&3iI zHojI1eXEueJd6(~b5m*YEM?xKvfidr^s$+9 z#qZH~7Wi;-Ku`k~02+j>N#TSuF(HpEr^8YQK?GtfeE%OKAyeTChM2>%L-4aCW6M?s zX?rJ&M^Tr$!yj#t)d9Z|@RVnFagQcE+-8M;}Qwb5qTNPK}i zzJ1qRhbHD2_^3As38JI$!~6XYpItxd8yl>uE>pJM4JE83H=J>SKhk`CU*UR67A3R4 zOBW+_M-=GRtj6C7{`ACjKpAIjZ9Di(!nU}TytvpnJ!(g+?ft|O-s;^KgcXdON15I3 zRmJT^qXGDi8Rv|{q~xWCQ}5ZOoG=Xz(IU43&P^K5wsC{z3zW7?*kac<2F(lAF!gxo z2i3_XMHE?Tj|$b0fE`9A#eM5(d!)k4-*pcT(;`{kNgD*Ia+Qzz_U>YeEDgG{Dqu`k z)KH4AvnB2EBa9t)F|>f#yEN!OQ6z3duxHSk05)aJP1_^f`bm?<7H~h!>>GCgAFV0r z-RW!bbm81T{kuMD%eok8b3kkmazYzvv|X6|J=XDSWCw2- zejn-dWOGv%>$}ID`nv8O&z-#=gR?5ZS6)}-p`RO09N=}HMovihTO9(CysR{W=0%4M zRl<@Lqg@ndP|%MGNc9?Xk`anyi(V;NYan~$aOBt!NS=*wzOa8DL4Fp|Aq2;O!x-DT zp)up^M1(v_zT;Nr&9xogh%RqZ8jhDUV_WAsjOXo0a4vaPZGUr&*C>)aiR`c~t4jy% zozK|5GwY)pPNtA}=_GI4vx@Hr_sLwa!y|sH_RN@%DLFPJdO5;b=C6xZu2hEqA?p#( zlrOW@%SluAg*!-@2Ye{MsxHdmA?&6#$hI3U=Pm~dY_~coY5Doc`Ww@-2-`Eu4~K|8 z?|beW84O>a=~A$#aAnX;mj+Hh!)^zNOo^uV;@(YaulD-rWaw K)qQdNyZ;B#kxUZ+ literal 0 HcmV?d00001 diff --git a/sass/style.scss b/sass/style.scss index bab3a7b..0a6684a 100644 --- a/sass/style.scss +++ b/sass/style.scss @@ -1,5 +1,28 @@ @use "everforest"; +/// Stole this from Stack Overflow (https://stackoverflow.com/a/54702294) {{{ + +.rainbow_text_animated { + background: linear-gradient(to right, everforest.$red, everforest.$orange, everforest.$yellow, everforest.$green, everforest.$blue, everforest.$purple); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + animation: rainbow_animation 1s ease-in-out infinite; + background-size: 400% 100%; +} + +@keyframes rainbow_animation { + 0%,100% { + background-position: 0 0; + } + + 50% { + background-position: 100% 0; + } +} + +/// }}} + body { color: everforest.$fg; background-color: everforest.$bg0; diff --git a/templates/projects.html b/templates/projects.html index 4b042a4..7b2df74 100644 --- a/templates/projects.html +++ b/templates/projects.html @@ -11,7 +11,17 @@ {{category.name}} {% endfor %}