From 71b74c9b6ff8caa5fa559ef7a0b4fbe344ef25a0 Mon Sep 17 00:00:00 2001 From: Idrees Hassan Date: Wed, 11 Mar 2026 16:09:36 -0700 Subject: [PATCH] Add history for species changes --- dist/extension.zip | Bin 155446 -> 155511 bytes dist/extension/birb.js | 7 ++ dist/obsidian/main.js | 7 ++ dist/userscript/birb.user.js | 7 ++ dist/web/birb.embed.js | 7 ++ dist/web/birb.js | 7 ++ editor/editor.js | 145 +++++++++++++++++++++++------------ src/species.js | 7 ++ 8 files changed, 137 insertions(+), 50 deletions(-) diff --git a/dist/extension.zip b/dist/extension.zip index f2be9ad487296ddb06349194e413ebe672855897..cfcefadb85971e11c10663471ed17f8667f77753 100644 GIT binary patch delta 31586 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 delta 31550 zcmV(#K;*yoz6rLz39zIEe-gE8TmS$7000000000000#g70Agu!VlHZP5Be$+D z`rGR%D$ZQH)p1+a#n+xmW@K5m<(q6tzKLJ-4_~X9Y!?)jlbC%PYtz-)Sq?i9GZP3-&dmf`jf70y|q_tmu`L8AC7w3_PKq1=--y^2T`? zq(Y_BbP_+QaSM#4aeFkFI(={I6h@=LD6yM`A!N|jZI{lUdM3 zBaC554^2Ugc8{vMd%#yerCZg4Xm3h?B6P`*Ja_ClZr?eqo}M^f*Xw!xu`}(A+YVUa z_(QMWX?B1g6VMxbBVV|u2uf1bZ+&y>UDx-|AP2Ff_ap<1TYvm1zDB2^3XE6~Mg>6# zWC%0A=RSI>EMdC-;8@*!a5@b`21vUe+HX!{P@m8!lXV`v2D9AgJPFZN)g%LdKI!=5 zq}yl&-7sT_$yRTQ&$^{m0_t0TX`WJZjo*@P)oGw|r=ja8kyfP<#{Hq_zo!QCS3yxq z4>UyOg!j=YJYmf5o!@?Uo(7%9H^=3wA#r zIyGAU;3PcmL15z#rq$wRUqi_|Dp zk}i`_2)lzxzkzuHT7u|hlqZ-HJTd~m#E>CjRDR?9{u?wweVpui&9U=;zy4QDjbBxb zQK!|8t#WICj0eLw7`KjwQ5%fMgC2FFX=wN*WJJ+7!Z%KXT2%atR65aIltvZ$LjN8Q zpo+&tm&V9#IUdQL?+p4OsWf{39>RL^oo<8H2kHT= z34u<42p_TJ^lIMdgF|G0)qhzt;J)s5yEV7|_{qtuUk;S8!(Hf+paViB4BjHbHwW0a zv@-hS5EbZyK^S9UF&Vj?K7%qEw!`GG*ECXVdo&zc@q#(1NB~VTns^@^jW%QsOAaRV zSLfRY?zAAR5Vq1Z_(=^zFVH_s zNm12{uqTsj$?6ZhHnZmYLlAbvu6P#A|Fg%y(}DNbtZuh#=fE^kYO__>Z7H&<`&T4(=@md+*Tnf28+hX(bqo$-1 z8-G0Oda^$M=KT4Oucz*~odm{-)CWg?clrq$0mRBu7HYb^fB$Xx{3rLOr+Nr3rUP() z1?+7AmL{ElfW5WAl2pD?`eHb@fCS&sC9y+c6J~BKw$`{Y1GxD+WU)cnv@jIbq=+?N zWWf{*n6_{st3k;mmh^ge;Cs6h*h&3Qp(=sR0*hfVE%-~sqM7Tm+7+$aoC@*mg_f0*e?Aw^=hTc zU!C)R_Mq?KKW+p68Z`de?ZSNAg|RaGt5^^Kf0c&b$aPLT{mxn^ImYfj(RZIZSm_3% zB;k{5!9LRFHI0uwHQj-BWzejHLnKLGmc;;qqD>}~?x@8ZSAVWCJ1H#pgYk_hGHQ@g zZ!u6}5ZO=$D>1_aiUtxg%@$y$ojeCHBVDI|>(0Q2=4jBvAO3LEfy=>fdsH?WxjZ49 zKVT-3hejL<_n+=ReN$B{T$AkTP}5=O+3Ust5Tjo=F7_MVGaKcqafd#HrnGJ_<<*Az zkzd$%dTza~dX*+d+AK7q^BMcU6B_V2A?PQhUmnB<1&fjTAl(RU*VdeUCJ*G4NCFLi z4^p)Uqs|LWt!`-O9~^YSdmu$v>{*De?5e37eAOOS>ip*1^OlwNHwiNCG2LL+<3GO& z9{9PkqQr%pB!?5fZDW5w`;_#t&-c_vA?+{H99w@GsC-><((mEpV?v4(fM%~yPs9O> zp}oB%vbSZy#?Wc%cKYxvI5jxVXbw+*!MDMbnQ-0dcHt-ENH@44Qc&>mhko0AdmYG9L&Jl}U} z?#S^wFP@Va4&VYAcc9Q_PKzB%BeZ}+tx5Q(F};tGkqD|^K_5uLnO6sV!l>qd)m^9y z!qv%aIu*C+jyj~v;DZ}=us?*?uHj4v{dZ$H4x!bGzRW5EGB}u?AZw)Yji}cCR`LC!}Act z(wlfaiAm;YIenwx*=zO!c_Su&Dj_!ur2e6d3uPRJXbcII>FX(1yyGm_;GeE_Mvdi< z-@9gR-aME*yh6lU3GoYZV8MNX7~b2b>kkk0iy905Qy zNpPM#$e2HC=$*R|ANuSxwrq|e67TQ4lIPj9t zznA@Xr{@;>*n9@VFvP7;p(CYw%n`a)dYJ7ns=AYA6Y~^If}An2;Nc+|^!tP943n}2 zM!@!HI!7+#kI3v{LQ4awM#?HTJZWYd*?Kxs67VF`pnt4l zkfi6WG9hTU#(ZsTx%HiF4CBTVkf>4ZjCltd!@Me2a7>K_3=Ad)am!QF>3CLcyG`)9VzWaog8b%GV_TOboeXH&^ zY_LwJB^*DyJG>4V@qwvt<{^FEt<4r zw?*3EewmoF{K=YT-UJ>VoPX<;VONtrnp0z{+>r_zU}UldyqeNM8Pr~Z+tF--ey8;i zJp3~0;GEI-Whr(>)Me7Sm=IH%BRJU`U2tzUn7m`AV#&t(EbCzpr)};C-efHG?EM{# zdjEmB?E`L5uCvELbp7hh{bL6PwQB(Fh?8b+FVhDX^nbzD};z)S|gLqq!-W0 zS{lXmw@)`12fVr;41c-}$acLQ!z^O~1eF%BERW>}D-O&67|*bhJ1%_sGc4MJshWAD z>ztLcxk=#SYU` zA70g>hRbs^<_%oNs+ZZY$=-*nhh-+aP5)T)%kY1$B;fxXxPJ)$n;V|HX`45O|K7Hj z+OkD7JZaNA^pAy2{G_edQzQ<{AsU#olRB9v;39AgSvZfdgdhyqTutb-t`8ON?$IDSuH*gw`-q{9S4nakTF; znP9j>;9)*GIX_B#vhNY5FmPlFKqGFl*L#Qh&{qu^uf=1rPcNb77H{Sdrql8i}E)0Lwue6k-zU9j@7}6(%?)oDIhl zRz#$oUZuLB?fMS=qZwrHbg}=zKUPUV+h%=Z^EI(=)af6qsiAGAM*l=g0`uLg(LYvk z>{21U&nqKsI4t6TF&bXA)2|VZ;qlSDD^3-*!IiBbet(9j8-gte;?ck%*G5B6hYp2` zj40j)krVJXz#dFG#WC3vJ>Qx15x;`{FY05jOlt}L)5eVHzs@@|W4!I1W=K#CS9hA* zsrVT)w{H!&>eaT~tZNZJGGpe-4OiFse^$%zjDdNGf2`s-t}5vBT*b5*bYZh!!#5bC z@?f%av46wm-_?2OdeJ@^MOgB&J;sV=`8GuD(dv#0&~Ej~sDtne)|(VF1`k@N4!)D& z@U}U(*t=BQ*=mGrEMw9&w>;0YjXkqA&$Y2QihWjSL62~>zP01cEkbNT&H)W`bgRCx zp7lb@6TIMdQ0%!2Rfs(+%RSEu6>d464L#>8B7eySqsFhK)cP&h&-~xt$+tx(igZ9T zcFuDrg=)0`_daji1}T{I@R|jYKNq6 zsdQOADV`Njg7pqEg>!#=-7S^(3T1q(0VQw5-}Xx-0>BfB>lAXwRD*V9^mpNwpm;NZ zuz#P+)1PcHQ0ZZ*w1>Z$MXL60xpXZp=pcY$oRuonidjsx@`r^2b%F)elU{ZUCnvY~ zA{?bUmuEm#f3~JL?okZ7E`Lws+MOG-{!)DfB(2V_PJ zZQ*%~+&Ce@shpRK)dH|B6sn)|rIS+m^J(r}$x%os5RoN9mb3(i=&}4WwnHgwNUR!R z0W`Hx(W)gRltQ!*gHZCPO4BJ9_D;~jE@VuK(mOCf(pC|~O-hvN2pW-~N|EwRTYp86 zN-5ge@isQ>v5L)d)#G>ad`5xPP^?3%5d*l^x`XkCCC=BB#UOSTmwLro?g|hAS-4 zouX<|woN;wqxi8xlR2XW(i+E-l?_j#zW>6SPxQds{WtM1P`MKdV_r z46;jkgn7h8?xOJT|a7^xMKF|J2K zC?`qwkZDq*SXh^&#V7&@W1^`Ysk0O&9L?}Zjc^5?=P@-P`oIQ)?)>rU8qX`d5*nrQ zvBFbWNJu<5P(+JiAR=KUY=6*LSi$+%zcfW?Ikx^J0y%;-3$PM(`VWl+wupUdd@_K4 zArkX}^EFuZbdmz`#xW$kNfc?1YMH$t`XRKK*_Kc!P6S~dqq=ihKEZ~;X}Dt-zl*d) zVj&GLliVwA^)g_GE^IqPcqR(2+84og@H-N@J=*H&~OVJJ^pUr#h#Q84gf+yBcY=UIqxJa1+)^vO79R~qTcv9iCYCzp&AD8 z!9kd3N{^2*WO>>ni36Ufj~=)>eWIXH{GS=Q{FG6KfUsl{Wq%E{Bnh!iiMIEgv6#)D#BB93ycA(=wfBwhUL?Z3{`m2*!e~$qqM)W(q$-i6ldz*gN z-Y3Tc`2AqFCs3%ur_%4gsaRlj0U|u><1j|I-^Y+f9dE?nqx~nQ2W@_EI^?OlaTuRP zmpAodsQ5}(8dpU-z-1X0>H~l(mtv*F61tWYeq*5_QGdgs5KU*0J%JyVc2X0bK5}Jl zLP5}a30knEY7_JKZ`QWCa$d+63l;QIs*xT^Qn+HF58iox0$M?R#TgfW;b=S0e~%dO zVIpzgX}}W1%!R=R<#|t91fS?Xq>gll397<&pw!0FZ5fYTsF!a3gV$E9#IPd?7XKT= z(>wiY?tcL2enrV%VLx|yLVHtX3@n2ds79AE9S%n1Y75M13AU8U1Yp(@DGmm)fkj?axcxp@`bfhFG~9qBT%Dhw zV}EVrl;JRc<9WX`f^&)+J3X9N;Y?p$@O!6Z_8kd=y3(bzE(?i~o}g!iAI&{p+J1+7 zf2y>rUe^&!i7;)6I;Q&-5{VzUwv;dunU|*QyiQo%sj*{WG?dijm5rN1VbX^`rzutk z>o^+-5lPW7*~B4wB5vUkcB=sc>HMIF;C~f(RGDjxo?&(e0-gS+(*asitia>b%8J3y z;!;PrL@S}iCAyHKh-pQLL zf}kVCw21Dp9p@HMFvlZ{Ow>!19a0ob~WJP(AK1(_F{MFLM?NPo_&I;|u{k1KD6 zm488(LmQ&GY&2oc3g;6*gMAs6{AjmENG_?KqCPm!Qi^NMur52Rt6HvPKY^MwF4Vv8 zd=lD_$i`DZH`Q^q@wEgBQpjqQO7eA|>+!3M0E_KgY2WwdIbPf_{>J{msDa30!;2_+E|lK(|@D|8XfXx zsZNdHU>mEQ4{eCl=8d<0=rQ8#wV0v2+t0l;WMU6K%U1x}V? zsfhyl!Ia{eZ<-R>Z!4%=F*N*8)IR`bwG z0#RBtgqn*>?-Y~gb=@KT90Nxtxp9SQB}OHDS<0@8i!R8*0f(K!9!59DrvM1*NaCYG zRDp%`tGsX_lnkdqj(@!18W1}{-7AuaRe_sNnpU7EXCVlj7i0|4@&aQh%x$9%ETd?Q zpzQ$Gidt3;vBL`yQ2{{hCedZ6!$LuGMXlyG4@C~`#SqoP471fNv^&|UwBZ41$HE&@ z=0CGu&Epc9zLppWT0l0C;Vm*6>A&sOA1PA`NsaW~=WtEpg8Sj=BsLCB+94=`$FgIs4~%fTxRJu5Yt6VVSuZ(B8I13P=#$i zGnMxPEkGC8^>P}nWV8XvLzu++Mq~azZcNZT5hX)}9a z=wQvy$l@TkC4cF18)mSp%>Z7=DDG2Mv@nO?X239DUf>*`EgJIr(-k*bkVy^=-eKrr zQ-`6jQTm@;9UPwWRMv7@~wdOi3rm}A%O@H^Bvj?S_4VJuLTsU;%&X{nVD+|Ot(foe=g{m|swtSswh}Oi(bkQX zfPX*N;1eGN{2hy$aa*9T=emhhHd+NFFp5VJ401v=hN)iW1bTG!5tD}kcl82oNwkxo z$<-h9SAWUOAp_o2^WPI3wQl_+azh3d?&FiRQ9dcncj{W3g>0=K=Bl5si+j~WAehbs zE=hdHm#?UPR^o^u^en+X)zbNAl+pq9V7Q8Saz0t!FWliv(|h5+u8ViM@}8t=oC@ z_zo39o2S_Dku>2l9N(Nms5!Xt69%(Hw=9>qC&lwfXI049f^KLz>$#&xS$X(wE+tFo za-4iJ3_Qe+NEcVk8s{)zO=LV3L>+!`gnxr{ApytGl<97QG2m7oC1RxcfTfjoWmpD< z$uPtxxHR6LA)^>lP@w_eJf~HWmM>gVrn)UUFmJl>3l94K3ga9IVg%tl3*{oR+zuwR z4CA8r15zZIlp@4tB#OZ5MH20E0V4EdDIMZc1ryKxQ&QHgyQl6`4H&>oXIePpeV-(a=U?|jF98l^M(kdmoP>U-W~PiE`JzqSYh){ z?Cjw7GTl$7sBc`Jh$sxDcq1KFCP+^jub0lfQ4?+_wjgm}M_DMvNrlVnxX|w5ngxW5 zwpT(?q%!R`q5@#lcC=qo;fs3CNy<~iFhf&zT70{k`+Niu9G7$fCp?)#Dxh2B)*C`J zM-b;p7cMs96R8*kwF706VSmnZOExi(b;l7_*egf`&%9bq7Nd%RG&)3fOr#2~qIdi@ z_s{YG0~E?*2*p9U+Ke*8eJ$9gBtbqDA}C1rvlZ!rB`XwBqYZWP`$&wc^%Gbs-^X|oOjl>LUpJ@4riu0>kVhK`Ni7)g?`YY5 zr)^F^34#pRi6C&rbAosfcA*1H<;Mi1W6F@^04uT$2&}je4L&?{)Zm+Thl&(7sXh?P z0R_=0+S*Ky)C{i7mXJl{jDMZz)VM;*^>1Jd`bQ0}Cv7h^zYo9JEpq zJwicpxqm*-?d`!bN7*Jxqm*z0bE_!LK}u3ac4^RP18!9XK4`vMs#Z&fZ_C7)PHE^*lKC808p#1b@-U<(cWB)$;TADEL1pYN&MJh;y1cPPSgIK9$fz!XMg@1unXsIcxf!rp1O7K4{25E?% z{NGy{tJMN&Xd|4I*sD6&pr{-Dz-=M?0dZEL^C>HbH1Y3VP7Blss0t zmE6*Zzkem;$X*msANi&X$tC%k2o{b7PdKm!k|iL6I1#8K#(6~`l0Jf?hjz>a5G2J1 zW4Ku7pg_q^;AZzOYpukln6BS{Cmw~S0XnAqzr2|ca=ng&jK!Et!C9;sHU=z&2*zL? z!P3A(aT~x^kdFz&U}+_vltm8_4?s(c6p~=XP4a~k%v65s43HVg@B$^o zVNaxS?=0v_H#p%Hg5FaT9XLiH?9WtqBcaoA zT1dR8M6$R>CVor^qj6@f#SV3}<3H$M^#6K3@@ztNdyTD*5Q$;WIp`5MTPSNNyUuty zXJt+6JAFd|=a!%a>pN4^o^CkIx8`nizJ-hj8FVnS5F6dYMgDVb21~gP%%t(t{C}fb zc^C#1Bf)3-I{eaZty%XwWfJ{LQYk{)q&U(t-)9K*b|3mnw>FVBBqzFQlDu;>S1H2Yv#guc;cP7#Q& zkw8<()e|Khp~?Vl3klyLLp-hX6@Ly1%r?4GhX0tYtp6?eO}8wCyE>pes0O^O^9ZIq zg;zTX8darQJUPLk0RNW{K6XpH_#6LLM=`f@r+WW{e(*QG+J`#)UwA3x8;(>emMz zIMGz^Jy-)agdiHJxN>!7XNmyK{PvSf3*JDnry?$F0`BTs-uIEvq$>x_bKy6UgLsVM z`yLNI4yUVI7+&aJxJWhKBM8IM7O+&lrliNORgft1a1Bd6(5|-<+-0+|LCLEa(K$Oy zmJ0Z?=@WCpZh2p{D~6HRe}4#~>@%eoWN`3fg-v%o49e+^O>ENxPvfl&M z9(ixZYke^=%8W@TNpHn#BL>t5oSRdEO+|eAz4rqQ*!(_7ithC<>D8n+Nyb(TM1>qf z`Vs857sH}6s##(7X4>s61O=x*%?LAXNIl8SpwD7l;2XQ3XipG5bOdLyz47vXr54uoQ-980t|V>PeXd5JzG&g$i`@o4t|+&{;C)9Dw}9L+P-&{pL!~AW zs8mryjc_prEcyE9!IGqhzZyu9-l%=3H!XcJeZ4jWn}AA+BR$#U3M-tLuHHH-IDd>5mGi$3iRnP05LF3e zf2z}Ip2$s#0HvTwF%7I@y_VibO+XyYlK!O6iF<4M%Y@bEHA+$1tzkTe+On>YegzHD z4fCHtSf2e{LLLRFvYtt?Cu3;|zoaatSFzClUdMW>Ek;QpV3Q%x1rdC+8r^OE!+hCP zU$o%ZWYZ}{0)L{%qB9!9#E3yh&y0mdB(RGLNp=^NRsV+@28`C!Su%vnY-kex@GpRs zvmhQtzn0Ts$%cx3aBc+64pSG!!<%=zlw}a#1WJk$qqWgHhk?9og+lZXLDjgkMJocd|A>U2AK&t8yk$)CC@a zLCjMXP4(~jEuie*a2*i#guGbUhoU3zoZTe~RX5^zhIbN`5$2*psT<#mJmvEh zxv!=$<$t|f$k{`n!7pZj>Bbkm8r_ex4_157sIo-v3iIef9RD(I1NApmWS4{bTR39& zbhNo-isFeYdiMhA6;WLJ8%3cr(sZHr-8=2QCCkuoGB^g$X%>o8fmk%pUAS$S=(IT| zS(BJ((-aZfY(;8U5QQ#B2|;pCKA`{y+(r*^mVXA#>l|m$B-T^F7(&riy`Y=|f$3ct zOV|u9G7M8!q6SctPzNMaFA=I@Z^)yVgVmwB!3?I)@t&dZNDtHqWXW^}oXSDrZ=^Vq z32dKMdCJnGa0l7>6V%H*u?6rviFL;!KbD3h%9)<&-Pk-|2hmT>*}bZ7aoq~o?{>?V zEq^J3D_^N7H+FRJ%Ka15FMCrKcdqpDFEWp!evNoGC~7Fh`#13tJ^cz|3jAxBfv1YP zI7`)_WY0&}cD0TXd|!RRSk3;PqrD(|^4(~?=#^D=m*UQ923Ocu zGb(k0s7w}9ywnPz23|+Ul)RdWw=m0?G4=f}1pow7pY z6Qg+^8PxEMsQiv+lF?M^s_2}Y8f_J$DsJ@LQPV)A^%cFOI+>G**E+e4>x5+@Ufcrd zCUXRuiJt{Wc)r9-SZkM_d!_~GYkwB3Jp{?~4gQ2FwguCC1ozGF`H|Bc&^K}j9Z$WE zF87k?ZlxAVg#2m^!P02qY0k!VT^rBb+_^?VSF`brnsGi>N$a&(Ag#IWe|y|NPpWqO)Ls5 zf(oKD6xn{T65+0AF{U&zgb#Z<^n{Z(a!E>7YNTkMMHhA3Hm>Y{spvr#90Wdf_RXbvJh!+s*WPt+8FpHg>$t)cX3y z<{A|7IB1s~jDMTJ!n$BUGlwH6I=vyTbtT><*JvHWB{ULe;PUQ$5)PM|9>X_E?`Qtf z0Trw;X+_6!iJ+Z2Tq$g5h;q$~3n{8wgSx0}Z5wq`S-YdZzJ9aztgb)n*U8k>SZNb# z+(wuXD^kgcx_pYu!q`vX-X`*R;?jE$66diaE9y0{P?Ov=8GrtVFruv!`z%aP|A8LN zqN-yY5HN#_uW}KJcGW%%I!ga7FIP3;@Z^WvwVfv^7L@m9Uze&qThya)zl{8rctIOi zi5uR4ek5y zbn!T>a{fV5>3_}GA?PE) zDYaGV4%94ycf3i;c@diAC{g45#?DORDYNhcCrEn9+{RT$AsPub{GZs!v#CuJR~gre zCpiXi&gqab|A1l`f4pyoi*N$j8h~-+>K_Wb`9b8#jDNzzl$1MzDNFlMQ6Thaa|`5^ z>%ul!jTNf-!!7e_6v)6M6s0WJE=EY#{Z(_k7NOq#rY68Rq&c){=-4?_7&aV$F!nUsiTGID0M)@GLn#Xfd^#E&SHxZ(9w89H~?64=3W_dcDCUK>AJgIrG$a>2f zWooIwNpHy~PF-U%08^-IT!mmb$tMj=&*Ojqn18yUBmYYgN5|1IX>gCb!di@Y=;JwM z$bLg>jJO8D4ns;!6l$=&UqcDph6s$WC9BbvtBHu-OJkgqzymQ24AjDm>#+ zLmvx!UMMJc`1e5?ceTNTb%>>F6$2QMPajhU#zD`6kB>nn z$%Y``XX0MlYcP5fSYjt#E44f?x|DTZl?0V3Rozz#>?GLgzw)1mnvW0>QwC`bzW%$0 z1=A6>0FjZ-yl6H09{mVFy!MoykExOOXBTAqDl?ku_G^-v3 ze}oul>?x9zIF8LT-BxeO=Qy^+%u6h6uV{}2%tRnB30?546bOU+=0F;eqLX?Zj!t^x zdZt84O=vY!Fa*p<=MT*)G45i`ErwsF!z1d!l3>^m|3Uh5E;QMjzAjEbra!=@OMlQR zm|!(1NP0D(2?c;l?;NYUh#zYD%`2Y>gHQqXPy)#ykm(}4`B3i=DBWbX4Qftka{wC ze|*L7Z&+BcEyuE+c!y`b`?O8MQ-2HsV9Kec5&A+Ey6PkQy@GF?^PV`T$B0!4gs1Hu z4;JaSU{vE7Z+Zy?$Dpfx-4b?0+}(w5gjs|lkz+j}(ERHg=*(WA0Y}IqYdJgtqge$Z z_K@V?s1w_IkgT1wu>NG#dykV-eoj@T8drZ=H8hO>wfx>>b>uPQ^qBt}=znU#g3`ev zJq`IHCG|L|f`2x)MlbYi8LFaAY+bSPe{q zFs6d4EG~K?-4mjpKo}lIq<>5y8Y$Mu+yl`?MTDr7(KdsbsG{2GWdJtcVX9$=r@8=B z=`TRUFSskIJ^fM(0DIIpHm1{HmChd&82V4}F#xE31w{fK{|-K>e&|2+@mu8fh$3P@ zWNh$_6{naaGz)FeXtx+D#UhA%HBW<1;~P%TNVr}p-otK73y;hl*nfUDe35`49SAa< z;=#cHNz0O_`P4%AsdP&J73lU9ryZi&y@BLC_fh|)PAJ6OmRV-iO~xID2z6wq&MPOg z9$ZGS2!KNy=jo?~Awr(Gq77M22(W;{hT|ERSYBOaPe2?5`mcDzHjn!@y(88HDu2RYKHIb4br&Yq~Cy z6VR8nn>`rvmS6)!Pt<64fpXa^xl1hTD$-26hX_0U=SZnjyl#&FNCpcyl4u4BPT9mIkPzv))9SSqEl^+4N ziZwZPB&w`az@CPx<(`vN>RHx-6UIe~YPc|I*{I?>(00{aQ|M4M3GIF8j0xTnf=XJD z)+Pt%2bdfUuZBR7x|}O3*mUk)fWvM~hv4*Vabj5}Ay^x5bjjkJ5>R5RhQSktI~2cD zfQ2CyZ+~tSY6%NXn>R!%0^6h20^586vT(B$Zn=RSRI@fjwCb&rPf4B4mfp?6v18!Gz$Q| z*Hcls`q1Txm`mY4dCn~8l%u6$`{a^Pmjoy1(|^WN=@?3MLR%p);ZM9?k4gXJjuL9c zo^)3E8>RtY)~0s_6RZFDs<4KP%O9ZHxA*)E7_kM?sJ0DOe-N3F)jnsPah^3pD;zyo zMy+sau?a@~d~_|^3BF3hkpM}JUuP;9a>i`YlN-O2)l zp?`}g>C!V^maL^yc2dwcbncSFGdeNHBrM?}2uZN0fTYVftHgo_bCmvz?H9+QNTeHM zN46wmCsG$diqyYSBw#n&bL;5xn13ZgV)S$XSVaP2fAIZ1!vAI|l-P$e&l1JA zNFq_xW=9eRTE$4e<)NlUQ0_qR4pYrb;vP{$ILuo!9AK-g*})@!EQV4??bbql;*WD2 z7RZ9Asu>(0FXYD!kV@#iBkWzYYz%GD8kNSAtW1N`l87Wv~t+d)GQ*1#aDvfD{x1f-O!;(uD49kkM75f296Xe0MUpPLOYy_4au&1NILRaZZ2S@UzN zj-PyHrzR04!L!*x;tu*d|1J3H*Q99bsl`!H3SJc@DhjaE!rA5L;vT@swtopSKcQ`l zRa&?yR-;u`v1HJWN}mdyqFE8i8<`9XoJ)TtWO@jB-+yC64>&GZeCb4e5P3<%9LwIz zdPLpEyN_rE_&}+t0fV0TrPYgSW1yVdjS-bFNUBPo@gE|Ye3X{>EI)#R5UAh}s-V0= zCR9bIjy1$V4}3;uK72*11%K4~JLD1i8X|#*f- z53950BC3@qr%{ZrITvZ`toun&H};q{JVBpK3aWua3$p<=G*BZ{iff_w$k#NJ1)fX{ zzVe~S5g!J?cud*U&hrAQv?!y4E|CJQl3&~CkSGZ$Ex^1 z%+bSBHZu`L4GQX5>wh6l5w*uB{Fk^#(KpIt!JTPRsJ<{u>_sp~DI{slL$U3AqCgtt zQEv=9pAz7^T}tGR1nabw2uT3pM`Iv!RF5aTCDQ95`yxYanE)Tzdr%O2$=VK0I5ho4 zg)Zpr8KQPdI0MA*}} zLbu6HUFgP2=JlV(H$teWg1mvCN#N%|E% zsb%3!MB)H8_2{C_tUr`%j6lD>2K)y!y^jZ2>TTVXZ>#%w`I2$|eUbQy$qRk+6Zd7C z8?5Ap=3l3Lla$974^#MP<_$TLeXQ1WeV2%C_!>i*Kn;N5Cp4? zG>iC5RC-4R2bqVF!I97E6i8j5W-O;i(BG`eN-Wh3P?eQ|_x}x@A1^+l5-|FZ#K&Ay z2%HwaTvMRK4J)c6Hq3)UE6gl6Ky_S*9h0XlrhiCK2$@@xJ_5TR(Us&%h_Cof2b;cH z%LaGojD0hNm1uA0^u&tW{k5VZ-hM|6gZde*8leyMeQy!*6V;EWk21UW3j4Xs zlj`S6p;|?z%L*uLbp`VfVvKblS`E@lnvYKSPvMXGDE>xDxq?S=`VAE=i$}$Ah6uLP zl7DMl)#N^BsPt%(?x1pBE>;WXMYb$nWK&(MlEXsr;IN8*t)l%xu6l?k(-t@0EtYpb zZgppA+;S7kY6hw(9c7MR;fFjk~lS1XNP@qBo`H`dgL34FTqe3I- z*z2Q{8PZjIRnqrbtD(}m+pXK@J67R)czjm*1r*h|F__>8_=nnO$nLQEehY{Qj)aB{ z#>9+#bl|shv-Migg&h+@abo7!$~3a@p`CM!Gx$po3B&X14L5+->pbf+_RX#0Lw^Es zpZ=&-qX4!T_|8V^ze7dQZrBi3B;lj9kIp~7hPh9nZK{SoZ=*`KP@)R-<6^uvh?E%sU*rP)M@~=7$9Qz!hlpQDL+G?mANBntm&GtA z(bzOt9UyId2U#)&9Ex5L!vU`+gnur*zO}xc-OO$~p|%Lf_XlNt1yCGKyEQBt9D+k| zcXxMp*8suYorM4)xU;wfcV}@8BtUR?cXx-Myr10q@2#z^oj&LEBR$VlP3`n_|NhQJ zNP;m*a6$6LfA+4*nggU8c>ZMlEd5*(_Twd?qs3(9L z`w52T{dJmQ*w{xk=N=5ic01Fc4dL!cA1L5=o*yjkt<45eS)~2NJ@wPl%3j6{62e*t z;{?s?QE#EcyVeaKtI%Xx(o$UU2h~_zeL`S1yk{KSWFjun%gYV%l+(TQHT57@$(^75 zKA4T-T~*Zajy(Acs~i~UBUV+Ww2Y|?k0)H|0qM)_0zN(Tn7r}?qK$Ga@}OZyRHHur zA}BU}pdk$CSdtlTuBr{gb0rf&R5R#+FF`xn{LJuUDr3Dpd^1n(;y$G8XY3IEtpJkX z1RryILm5INP1TT{w3qBL<9<8J1oYcg#Pvi~Hu z>3z8q6}{hF<-RPSfJ|k5#dHu|Fh$4})tI+0vnj%8W9r2i^9`FoPJRT2Av^ zisqZ^=BBB5=h3sQ=Cm`)0(|Iw-z>11ahg|=TMARA;v*voRSkGPb5$@g@Tcx@jkuJD z#3exeR3R^V()pR+_EFG8OY)psOdTlUK1ghK5zzlfvEC!iw(vPM_eHGZ{O~yf8zbvt zorlYs?bjY?pQ7$SzK6-KjT)F7x^Pc zdv+)^Ged$Z%bRevg)oKPz-|44Y#k&{QmO;(06)7>mdb(!#?pA+#$pz)*9uzV5BWX7 zAa!D-0vlviVy8kEu&aK^yv=E$w_5&@eQs#a;UZ@xte46(YahsMne0-QO7L)WGlG~z zC_tQy_yk&=7;ZLR@}?^wa$MTV+WWQa)8YkUnvwd|aW%Z4X?wV&oX_;ZGSSi_0Vb=HWEVWyzWc_#tx0at?WfcZw7#0b)@Qd z1FmL`b1bx*lzkUW9vvt%yaj~#lr0Br!G&4LpyMGs7g(>8l@-6&edkHWLb=c@pBAU3 zm5SY`r()2KZos0~BEinL{*^zo?v^zfOT^KhM6UW-pqt1@W-us2dv9#-*UHVYmGIP> zKkssNrF%P2&w0zQiOrWU^Wi0)bZB_BA@uc!98I;v_c(SoN z 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 diff --git a/dist/extension/birb.js b/dist/extension/birb.js index c9a916b..2a47c40 100644 --- a/dist/extension/birb.js +++ b/dist/extension/birb.js @@ -226,6 +226,13 @@ return document.documentElement.clientHeight; } + /** @typedef {Object} Species + * @property {string} name + * @property {string} description + * @property {Record} colors + * @property {string[]} [tags] + */ + var species = { "bluebird": { "name": "Eastern Bluebird", diff --git a/dist/obsidian/main.js b/dist/obsidian/main.js index 90c4f97..5ce1d15 100644 --- a/dist/obsidian/main.js +++ b/dist/obsidian/main.js @@ -231,6 +231,13 @@ module.exports = class PocketBird extends Plugin { return document.documentElement.clientHeight; } + /** @typedef {Object} Species + * @property {string} name + * @property {string} description + * @property {Record} colors + * @property {string[]} [tags] + */ + var species = { "bluebird": { "name": "Eastern Bluebird", diff --git a/dist/userscript/birb.user.js b/dist/userscript/birb.user.js index 7f66563..3d45397 100644 --- a/dist/userscript/birb.user.js +++ b/dist/userscript/birb.user.js @@ -240,6 +240,13 @@ return document.documentElement.clientHeight; } + /** @typedef {Object} Species + * @property {string} name + * @property {string} description + * @property {Record} colors + * @property {string[]} [tags] + */ + var species = { "bluebird": { "name": "Eastern Bluebird", diff --git a/dist/web/birb.embed.js b/dist/web/birb.embed.js index fc0ff33..57d6149 100644 --- a/dist/web/birb.embed.js +++ b/dist/web/birb.embed.js @@ -226,6 +226,13 @@ return document.documentElement.clientHeight; } + /** @typedef {Object} Species + * @property {string} name + * @property {string} description + * @property {Record} colors + * @property {string[]} [tags] + */ + var species = { "bluebird": { "name": "Eastern Bluebird", diff --git a/dist/web/birb.js b/dist/web/birb.js index fc0ff33..57d6149 100644 --- a/dist/web/birb.js +++ b/dist/web/birb.js @@ -226,6 +226,13 @@ return document.documentElement.clientHeight; } + /** @typedef {Object} Species + * @property {string} name + * @property {string} description + * @property {Record} colors + * @property {string[]} [tags] + */ + var species = { "bluebird": { "name": "Eastern Bluebird", diff --git a/editor/editor.js b/editor/editor.js index db9e28b..c0cd2c1 100644 --- a/editor/editor.js +++ b/editor/editor.js @@ -5,13 +5,11 @@ import Frame from '../src/animation/frame.js'; import { Directions, getLayerPixels } from '../src/shared.js'; import species from '../src/species.js'; +/** @typedef {import('../src/species.js').Species} Species */ + const COLOR_MAP = SPRITE_SHEET_COLOR_MAP; const SPRITE_PATH = "../sprites/birb.png"; const SPRITE_SIZE = 32; -/** @type {Array<{tag: string, label: string}>} */ -const AVAILABLE_TAGS = [ - { tag: TAG.TUFT, label: "Tuft" }, -]; /** @type {Record} */ const DEFAULT_OVERRIDES = { @@ -46,15 +44,11 @@ let selectedColorElement = null; const colorElements = {}; -/** @type {Record} */ -let currentSpecies = { ...species.bluebird.colors }; -let colorHistory = [{ ...currentSpecies }]; +/** @type {Species} */ +let currentSpecies = JSON.parse(JSON.stringify(species.bluebird)); +let speciesHistory = [JSON.parse(JSON.stringify(currentSpecies))]; let historyIndex = 0; - -/** @type {Set} */ -const currentTags = new Set(); - /** @type {Frame|null} */ let baseFrame = null; const spriteCanvas = document.createElement('canvas'); @@ -93,30 +87,50 @@ function draw() { return; } drawBackground(); - baseFrame.draw(spriteCtx, Directions.RIGHT, 1, buildColorScheme(), [...currentTags]); + baseFrame.draw(spriteCtx, Directions.RIGHT, 1, buildColorScheme(), currentSpecies.tags || []); ctx.drawImage(spriteCanvas, 0, 0); } -function updateColors() { - const lastColors = colorHistory[historyIndex]; +function updateSpecies() { + const previousSpecies = speciesHistory[historyIndex]; let changed = false; - for (const part of Object.keys(currentSpecies)) { - if (currentSpecies[part] !== lastColors[part]) { + // Check for changes in colors + for (const part of Object.keys(currentSpecies.colors)) { + if (currentSpecies.colors[part] !== previousSpecies.colors[part]) { changed = true; break; } } if (!changed) { - for (const part of Object.keys(lastColors)) { - if (!(part in currentSpecies)) { + for (const part of Object.keys(previousSpecies.colors)) { + if (!(part in currentSpecies.colors)) { + changed = true; + break; + } + } + } + // Check for changes in tags + if (!changed) { + const prevTags = new Set(previousSpecies.tags || []); + const currTags = new Set(currentSpecies.tags || []); + for (const tag of prevTags) { + if (!currTags.has(tag)) { + changed = true; + break; + } + } + } + if (!changed) { + for (const tag of currentSpecies.tags || []) { + if (!previousSpecies.tags || !previousSpecies.tags.includes(tag)) { changed = true; break; } } } if (changed) { - colorHistory = colorHistory.slice(0, historyIndex + 1); - colorHistory.push({ ...currentSpecies }); + speciesHistory = speciesHistory.slice(0, historyIndex + 1); + speciesHistory.push(JSON.parse(JSON.stringify(currentSpecies))); historyIndex++; } updateJson(); @@ -131,8 +145,11 @@ function loadEditor() { const item = createColorSwatch(part, getColor(part) || color); editor.appendChild(item); } - for (const { tag, label } of AVAILABLE_TAGS) { - editor.appendChild(createTagToggle(tag, label)); + for (const value of Object.values(TAG)) { + if (value === TAG.DEFAULT) { + continue; + } + editor.appendChild(createTagToggle(value, getTag(value))); } } @@ -141,8 +158,8 @@ function loadEditor() { * @return {string} */ function getColor(part) { - if (currentSpecies[part]) { - return currentSpecies[part]; + if (currentSpecies.colors[part]) { + return currentSpecies.colors[part]; } if (DEFAULT_OVERRIDES[part]) { return getColor(DEFAULT_OVERRIDES[part]); @@ -155,6 +172,31 @@ function getColor(part) { return "transparent"; } +/** + * @param {string} tag + * @returns {boolean} + */ +function getTag(tag) { + return currentSpecies.tags ? currentSpecies.tags.includes(tag) : false; +} + +/** + * @param {string} tag + * @param {boolean} enabled + */ +function setTag(tag, enabled) { + if (!currentSpecies.tags) { + currentSpecies.tags = []; + } + if (enabled) { + if (!currentSpecies.tags.includes(tag)) { + currentSpecies.tags.push(tag); + } + } else { + currentSpecies.tags = currentSpecies.tags.filter(t => t !== tag); + } +} + function createColorPicker() { colorPickerInput.type = "text"; colorPickerInput.id = "color-picker-interceptor"; @@ -165,14 +207,14 @@ function createColorPicker() { if (selectedColorElement && selectedPart !== null) { const newColor = colorPickerInput.value; selectedColorElement.style.backgroundColor = newColor; - currentSpecies[selectedPart] = newColor; + currentSpecies.colors[selectedPart] = newColor; draw(); } }); document.addEventListener("mouseup", () => { if (selectedPart !== null && !jsonElement.contains(document.activeElement)) { - updateColors(); + updateSpecies(); } }); } @@ -199,7 +241,7 @@ function createColorSwatch(label, color) { colorPickerInput.style.left = rect.left + "px"; colorPickerInput.style.top = (rect.bottom + window.scrollY) + "px"; - colorPickerInput.value = currentSpecies[label] || color; + colorPickerInput.value = currentSpecies.colors[label] || color; colorPickerInput.dispatchEvent(new MouseEvent("click", { bubbles: true })); }); } else { @@ -211,10 +253,10 @@ function createColorSwatch(label, color) { labelElement.textContent = labelText; labelElement.title = "Click to remove from species"; labelElement.addEventListener("click", () => { - delete currentSpecies[label]; + delete currentSpecies.colors[label]; colorElement.style.backgroundColor = getColor(label); - updateColors(); - refreshEditorColors(); + updateSpecies(); + refreshEditor(); }); item.appendChild(labelElement); @@ -223,37 +265,34 @@ function createColorSwatch(label, color) { /** * @param {string} tag - * @param {string} label + * @param {boolean} enabled * @returns {HTMLDivElement} */ -function createTagToggle(tag, label) { +function createTagToggle(tag, enabled) { const item = document.createElement("div"); item.classList.add("editor-item"); const toggle = document.createElement("button"); + toggle.id = `tag-toggle-${tag}`; toggle.classList.add("tag-toggle"); toggle.textContent = "✓"; toggle.addEventListener("click", () => { - if (currentTags.has(tag)) { - currentTags.delete(tag); - toggle.classList.remove("tag-toggle--active"); - } else { - currentTags.add(tag); - toggle.classList.add("tag-toggle--active"); - } + setTag(tag, !getTag(tag)); + toggle.classList.toggle("tag-toggle--active", getTag(tag)); + updateSpecies(); draw(); }); item.appendChild(toggle); const labelElement = document.createElement("div"); labelElement.classList.add("label"); - labelElement.textContent = label.toUpperCase(); + labelElement.textContent = tag.toUpperCase(); item.appendChild(labelElement); return item; } -function refreshEditorColors() { +function refreshEditor() { for (const [, part] of Object.entries(COLOR_MAP)) { const el = colorElements[part]; if (el && !el.classList.contains("color--transparent")) { @@ -261,7 +300,13 @@ function refreshEditorColors() { } } if (selectedColorElement && selectedPart !== null) { - colorPickerInput.value = currentSpecies[selectedPart] || ""; + colorPickerInput.value = currentSpecies.colors[selectedPart] || ""; + } + for (const value of Object.values(TAG)) { + const toggle = editor.querySelector(`#tag-toggle-${value}`); + if (toggle && toggle instanceof HTMLElement) { + toggle.classList.toggle("tag-toggle--active", getTag(value)); + } } } @@ -276,17 +321,17 @@ document.addEventListener("keydown", (e) => { if (e.key === "z" && !e.shiftKey) { if (historyIndex > 0) { historyIndex--; - currentSpecies = { ...colorHistory[historyIndex] }; - refreshEditorColors(); + currentSpecies = JSON.parse(JSON.stringify(speciesHistory[historyIndex])); + refreshEditor(); updateJson(); draw(); e.preventDefault(); } } else if ((e.key === "z" && e.shiftKey) || e.key === "y") { - if (historyIndex < colorHistory.length - 1) { + if (historyIndex < speciesHistory.length - 1) { historyIndex++; - currentSpecies = { ...colorHistory[historyIndex] }; - refreshEditorColors(); + currentSpecies = JSON.parse(JSON.stringify(speciesHistory[historyIndex])); + refreshEditor(); updateJson(); draw(); e.preventDefault(); @@ -299,7 +344,7 @@ jsonElement.addEventListener("input", () => { const parsed = JSON.parse(jsonElement.textContent || ""); if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) { currentSpecies = parsed; - refreshEditorColors(); + refreshEditor(); draw(); } } catch (e) { @@ -307,7 +352,7 @@ jsonElement.addEventListener("input", () => { }); jsonElement.addEventListener("blur", () => { - updateColors(); + updateSpecies(); }); createColorPicker(); @@ -319,5 +364,5 @@ loadEditor(); new Layer(getLayerPixels(pixels, 0, SPRITE_SIZE)), new Layer(getLayerPixels(pixels, 5, SPRITE_SIZE), TAG.TUFT), ]); - updateColors(); + updateSpecies(); })(); \ No newline at end of file diff --git a/src/species.js b/src/species.js index 27ee8f5..3bf45d6 100644 --- a/src/species.js +++ b/src/species.js @@ -1,3 +1,10 @@ +/** @typedef {Object} Species + * @property {string} name + * @property {string} description + * @property {Record} colors + * @property {string[]} [tags] + */ + export default { "bluebird": { "name": "Eastern Bluebird",