From 40f46eba1d4075f04f3a852ee543555e4297c306 Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Tue, 15 Oct 2024 16:39:24 +0200 Subject: [PATCH] kaas --- app.config.ts | 9 +- bun.lockb | Bin 209079 -> 323509 bytes package.json | 4 +- src/app.css | 4 + src/components/filetree.module.css | 23 ++- src/components/filetree.tsx | 67 +++++-- src/components/sidebar.tsx | 36 ++-- src/components/tabs.module.css | 32 ++- src/components/tabs.tsx | 69 +------ src/features/file/grid.css | 2 +- src/features/file/grid.tsx | 29 ++- src/features/file/index.tsx | 2 +- src/features/selectable/index.module.css | 5 + src/features/selectable/index.tsx | 236 +++++++++++++++++++++++ src/routes/(editor)/edit.tsx | 10 +- src/routes/(editor)/experimental.css | 7 +- src/routes/(editor)/experimental.tsx | 41 ++-- 17 files changed, 426 insertions(+), 150 deletions(-) create mode 100644 src/features/selectable/index.module.css create mode 100644 src/features/selectable/index.tsx diff --git a/app.config.ts b/app.config.ts index de7f831..e97501a 100644 --- a/app.config.ts +++ b/app.config.ts @@ -1,3 +1,10 @@ import { defineConfig } from "@solidjs/start/config"; +import { VitePWA } from 'vite-plugin-pwa' -export default defineConfig({}); +export default defineConfig({ + vite: { + plugins: [ + VitePWA({ registerType: 'autoUpdate' }), + ] + } +}); diff --git a/bun.lockb b/bun.lockb index 6e10afadcd8356ee129f9a1388045f01bab4867d..b7e234409b150221dc9eed04af00b43faedb6b8a 100644 GIT binary patch delta 106215 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

)l2+i5DJKAy5!3m3hA80P#zIbMmd?L*xn%$Do zW%(8HDXKC{S4pi-*k0Ou;%c3Ym}b(w2WL7R4a?_Fxga01nUz0efxaDc7Kd%-;#aI$ z;cq8)FbA)gxl?PZ?E4)_Q#NH=3(VV-Yp(uiXZ5bHNy|h&p4^)3qIcwkon=RY_e+br z?>0;f^kES^S|2L#VOFow66PTGPV-;&Q6GMn&$npJ4-1l0s}N+4S!rCdTjZjc`p?jW zH~)W4Nc?uz-Qw|vi;sOK|4orIs<2EvxCIWD%-HI zGcd%0C7;7tE*vnig&YhF(O}s>a8@`c14ATOYy+Id$;H4B4i-z`Vqgdcu^2Z`?o_vD zd^h=|x;>-KWKIox&N^-e1{(&32FA%3ODraLYS=Te^GrUaVaLkB$H3q>`K*RDYZxB` zgAbUs2+n#3XIb&XWZU=|7`(vhF7Pujcz{_F0x(troV5bZ`T%EH2*T7gz*#5YECC?~ z1~;&IVQ|(QIO`Fdr6J6~-~v{c17~f3v%bJt79vn}j5U)_>e(~Sp3JFl&vcu zAr5KiGETl|V9vxPF}cgoj?rQANkefkofx%)juc0+(m^7q$4Yr-LOB(JL6LZ!*(jb5GYFINd$V}!kvtxCU z0oi`m*qXCWhJnEiVyJ;R=Mfo5DqsOw!3mmoH)CLEU;^_zWf>U!7#JEDCI@Pmb556q zSjPoNzF)&y`%(O6P%%ALOVb94V577;Ae8A+B7WRyjCUaWab6%2%w2C2i zaw#w{IKb`nQh>CiS-`e*KzZzwFY22!zMt%AWzVUo2=OSyjlqf#-#~cF6d4$t;O=-a z+0)vdRY8e?!Dh0rg*9i45|S%9rztTofc(k^_Q4q?BsVd!C{OOPv11IKeA33AbCxnh z8`I=KBXiCx%CKO#sBg|Gqyh;(_Q`?P=A1Dq3=A#|3=OQ411-!sSE@ktv4bsm4COIS z7Bn>HlvRaT&I0lnXRIp36ef@czz_l!y9#G%YBMkdfy6kg zwITk1`0BDYBuW@TZeM}5Rfn!wA(ws9`7owdN zoJl6?g0-L2g#hhZqSFv zuD&_rr^%ddpzP}DX3sjyfPukbGOva;>n#Il;BiVALabl}1uAENA;cAsbh5$_lI9q} z5%mJ9k_p6PRWJf)9Rq956eEZUOp`B8wBRs;VjFSVc%voKG z85qpK8NF(9r>8yRn#m_U?K$rmLwe~D{ahvx(-9RNnepSu@5?KIv`GdD@hLAq`TLTbMH%PWJS%XUv`4>0{5j z$&7))WU{Z7HRoqDNZ>(A3sZAQ^s!AAv@~bzp4{nc&nP$fq^~_|kR_;m@zt>A?6QP( zVwopj)HCP2X$jE}iDDHihhPbH<3toB{TXt0sE}*mK^shU5gs$$=i`Ou{ykPX*Yqrr3bv)4-Z@vkfGFGftjp zXwLc5hJnEzoU$gWo3mQjGB5;8K5Jpk*z#l zk>Fej^2cX8$Y_V)>10*$YfI~yy5t5tPCSRIz9IoRb6f%{gzn!d+)*&Z+7Ki91MP9qk7395@>>PM*veWzTut4KhFiF4;Im+#xPz z0mU_=%jA<$_MBzz5HnaoDT7nWgMlFc>^e}DljQ+%9k`HTT?OKS@)hSR4+aJwaOi_n znR!BDjRox68c&$tL2?^BAt{q(@in9jRoSxnc45kbW4Sb-y&bi(j5g8hMa}IkPu}9na8+t^2r2y z#ut-06YW{${XlIr-b8EGTt84N48+4B%{#5()`i4p0(ioe|2wU^JQ6(wgzq zWX}wH#-EcrGweC7!XOa?DMfO^Ao|(B8DeP|BuRq{Hpa)3J2UM$rNbeK64F8m42QUZ zY4Sw_3l1oUb+Vu}m;)Lr1s7hN|HC0J0T3_obi#cR6NnsobzxbB-cSoRG}z{6InqHW(=5oGRK~?BMM>}Gq{}C1Ld)S z>S)%VQQ#U#!E=bD112+VjzhglKf`H zKoTRkg~a+i22_=RT9DGQ5XZ5C^e|>lKACUNIX@QS8E}otczd#Efjy^x97G+sTI8IJ z;8~k7s!-r)WGZOMn_qsqv7|2Ny$}v*RJIfK;`w;~^ujT$3kem~+M_FffF` zDn8E52@t=4gM{(-`8?9j}u(LUrmGrImEY`Nyx6vO@gRo1~>hW zO!h3X=VVKUh=J20=V}B`!<_SJGQ|JvpsdQNm;&K}GcIRr3d9HC77*v^6o@?x;0*sh z1riRNlP?;ZbLyr-c#xC{n&JWV(3mF+8k;k2n0&I#o|7XDqJjxjxw5*YLF-Azw#l94 z_MBVNAohY|f%8Ke#J!B*Vn-_-;tEIuG%Fn<$2$3z+nXE%^ZjinZfN&*4)WmwRW6gxe&K8fb-m>T!^iVlP^Y@bDqkD*a}Xrtp9Qu z7z`%+>RWT_X1%!Be+zzOU|6~q+A$%2XIoMP3GK!W7mm}-c-SivR6vT6nfe+GsINl=rERj~#X zbi5ii95pb*LHS~K4J2iAfQy3DH4x9Tg5y`XmI2g=Yhao@(aW5%d~#>EJtt!w1A`|6 ztefps2kAD03mL{4lRbOv8Q)Cq?6GGIo_w;$o^wt;B)x!Rg!3Mh#{%*)t3m^K{GiC1 z)wcm0a{AVwc37W1;#G(lpS8Jv-RH9-bSm?j6hnRA*pLxKZR-Q+`g>>!nlD<^YK zwC8-*3<(q_P~0%;P41j%&so<3F@qW0INUjzbCNxy@np|Q_MHB05N9xfvOHtsZ*t5><07aGWWNXg59gsZF4eHe} ziFQstHN}oKv=h|wI6K*zb!8{0^Kf>uHRtP2h%dl_#i`l_b3{tsu1YF_t<&a)GMB!UxIab#dpybDE zV9i+$Vu5{m(aD^1+X{#;!37N`&q_$`1LpC@tb`;~&{Vy^^n$~gIAlR0PgI><^7j>&-m=By9afjYCkR@SU~>%rw}p$*4+h{2FH(zf-G zGy*O_IRC6?V910NNg);-8yFa(85kN^CSR;H=giv(aUHlp$Gc}E1A{B5cK}+{I2q;x z#!WC+3YwX7`fP%`OW&NcYZE*|^vyYszMlq?Gk}H}d1H4$En;9`05#vian3q>7r4&wvF7C54T)2T zg{ixdOkzE~8(hE^+i>iG1!ACwIcpb)2M)F)dqCp}Ab0cZg|s)ojY7__y-4agC+vkf z0i0aV?S+SFl)0ePK176q{KO0KlM)AK{60v|2DjZgw<35J=A7L7VP=3l9KIj!1sikD z&HLdIXk*UHeSm=>2pVQglP4|$d!IA*0L+`95&y*pAOQxBNzU5`kbRlTzK;!ET$(`S+E=e1q`U`RC)-OenAb%t%o2MgIh$LzYoC;@G$2z zKMXSf|DfnyK{gW?9XPm}`| zKRkbrK{7lu0|Ue4023WhS;DJx9NL#>U|`^c=g-*VumBG9Fz1|l98y=ZfO>J9$B#qG zQg(3PnfnApC8UMsd;${9Op^n{%{dpGfH(!xq5OIR5*1*737VgTge1uAAgm5?ravdg zNr?AZCku93@SKDsM0U{9@yUWl+LI3yb8?)5bO0D8Uvx1Sj6MZ*4oC?D0|VT@ynnAi zQYy&5YLf#sz$uB>=_(}9Kw%>Rt}i%2_D{IVz>qbW*VUTU@)`p}E||6T8Ym9W+F0}c zz6Oa~ggYFRICulEGccrpDmIYS5ZASF@?3{R7((fR>6`*LARz%3ggf%UGESZw3=GMj zdX9mCfot+bCx{#OAc?X}4lL20d?1Ze{U!rLJX9$ta@j!6W?*2DzX@3`TD`>H$7*s) z-DCrONtTPljkuu zcU^tVz|e+aK=czxz#|NPC(lQ0 zF0lTD6z3qfPCj7HDewu&11KK${>;FTglb(Kr@&{VfJRX+{smi(ZT^BK8wx)B!oW}i zGaAK|*stIO+<=_@M2|!z z4&G2kMut78N+)viFflSrK^1HP3t}W1PIG2PNFfOto#kA>%m`k44<7vHya(kmfW{d( zWmp)&)BfN#7Ox)*BX~U-$Qy{pa~BIEcx4cz_j!bc5xk&@4Wys>3k&1q)5|SETOmQK z;z5Uofc61^3;@$S4B&AOFyE2^ymJQBr2+H3!6dkg17=acuP568Q0vYQtQ$OL3uYnn zLCg2S+jJNh7;w`N`|&6Mn@c-+sQp+i0Qms4cM{|T5DoG%Og%nYh=GA&B1jXI2I-pu z@r# zspVp1U|^mcyB3mC_!uDxlOH4n8stHuof#Myf*2VXKz+3cs5poQbyz@K=RrbgAcBE` z0htDk_hmr6oePx*(I9cqc{?DX0!C;`DPUw^07(=<9a0REWnf^yMuP&p94e1YgR*Q5 zBLf4dMbiwG$3}yacpFr{jS*V1_lrfV$KE;3=9m|XwJ!{>*c}TSPE5z zOoN1$fe28+hKB}8Ee8<{3=AL|6y0l~d?M(2a0$BsssTiUq7!tU5Xjdc8dL?GgvwK& z2K%3Zf%*o6oDVS<ECj1SteGKpX}J1`rK0P!r@O1_lN#s5poQF?B!$0|Nty2AOBX z1gYmuq3X?;tikp%m_a2hp&GE!pxCrwf)wWtAa#?^Zi3`0N2qa5P}&(J%fP^ZOoN)3 z{!sYPyrAPVzz(?1_lOfG)R3bR31cw_-#<{wnN21G^ot)hI*tQ8g3Jz@(3DQ2!I4Y za+9G7r-C>P3=AL|6wNcBd}JDA@l2@2v!Ed}7aHD+q3W^GAgQHLhphyKKdAQE05xbM zNS1+t0Yrmx*fyy6b|}3A>cCx4b;vZxLA#+2*$0)!MuQrxC!q56AO?ti3Tp5fs6}T% zf(#4{*l1AcbQP-Z8kD{cRgaApWME);0d?4GsQNb$_4N!O28jKRi2-!91H)eshk*er z4T=hItpUoUU=FCE1mZwwP)M>v#X&TP2|BY8WF!wWB&Q011VOD#W>D5=XJ8Np2~3{5 zO&(kzi-C9y3=AL|6rkczZPHM25DhX;mKoAKQ(}gcKq^pL4Jxk93~3+fK=pxWP?9tN zTg$*;3>8PBLGc2Wm~6XU9Go;wp~jj+wOK)pwT5a(ra{iNfr=y3d<+Z>Ud)gZCKzf? z7}T6_sQ03w{1~YI7-oigaPumT8B&6zKoz7y6(G}~gqj7F&xX=DP>1J1=>n*DA(SqH znuAP(JWvc3FJ^`|$g80N+5nZnMuRjqLVeZ(RR^L$;;m2%+nB){-5Dl8`4gET4gQ%> z{wydx8|vV>^-zQ6BGI4(wuBkHrJvy>R2)QuQp9Pf0cW7}S!l>zhC1vT)ZiOXeIOd- zz?)F@x1jWGXq437hiZ5Tm3Rcz2%7(g^A zu?a%?*l3Wv7z-rP%CJB(p)8b^gVORWpuEq(paeBv4Qd{U1~Iij@}T^u3*s>_Fo0-~ z;|-t&7_xwugfPUjKuUoWsCX)rPJ`+L(V&n@hw?!*h?x!5R{&LC2&IdlbTJD91E^|X zD1{1?fpjr2Fo0-K!=(l)UJLbUGt|Hikjohu7`mZ!AC#U5_32b7e+CPr*qQ|up9eJ` zM1z=%SQzTT0}qR#7A*mZGB7ZJXpoPVLJe3BrB^}?UIR671C$Rsq8Fro3zWYdO7DWw zd!h6J7D#qH0X6RwOFbm+PD3pQ(IA7)KrOfcb=XCyhRaa?6{va;4T>_*=2(!>Z4kl0 zz<^AH(#ivVX<4 z-2fGDg3>KeeeFf>w;e=-^8YSYNdDdrRd5hWABKvbfEsuPq=A8f;XG9SB9y)i zrLRKi>rnN#q3Z8J#UDWVkD>ghtkC@b94he&D)9!&e-GtYqu@7`{|`ztvOy9p zGn8g!gCu57D9y_TiF*MkUj(X7jEw=(KbM3GNJD8^Hb}0JgKAWSYE*^Ft3zo`sJsqT z-T+i;F)%P-qd|$-2r3VvL5b3s4HW*+rX4rrEIs-T)5GkiV0<6kRz)6`2l)q?4;taX zH9TLBOM*_~^;n1HK|Vls0LTZR;dziahz4adSjgd{2@liPGl1rez?Bg4@I1&O5Fb=r z({z{~IpM}129L~E^yKUj7K{CT)2M3C>cx7fm-1Alp!ALfc+FFJPMh`-eK6%UN! ze$Cr-++3<+MN8hiO9@(@JY5!*lRq0DeFt9K_KzR5BuxS|9RRBEKr3aREU3_UX0z_n z_iKf$Z^YjRZ}d5{R7j=4j|DL!S^8~Y=sjc%?-}?02 zU{gHH_sY8pl{f9bOV>?Rj(>3DSX8{b0pHU%ptT~53=juPftE2r9n8Rz&Av|gU)!rX zrYD`xFa2TPm8cs0m1W88zTY=yo@c%(Y0&<8%f0kvtVSCpUQT6nyu>aS5xj9T^Lj-G z*CXpJZySF_amgs#6ITiopg4333j}Bg$S+O*))ll}y*YX)W^_sp6Z47eZ zIWIq5`5)Kd!CU$||Iw)fM#)@#A5tC){QR&hV*!%EGROwYW!8Ux|Gd}rU{mz>vTL;w zLhZ`AKN*>dbVN&~H?q!>v!Cf6C)l{ zGxqI%ek%Lt{A;?C=9)j6)W)@~PpPGR(rY9KgVz7S&0X+J<(JdzPB$}W#V1Odg+ZY) zV)biecWiQe*Al7V9KGV>JeL38eG_k(Tu+m@QGE6Gsoi|HR(-1GN3tPd9~T0mo8^B?4JLltU`Rdn&p-j?S~eB zWJ;GG*>pVH=hsY*b@jiCs;;M2BN?oKY_O@+lgH|;<`>*!CR9ajTI5=L?LObngj;9V zn@slq}2m5>ddJ>iaFf5YpllT*Ij&JoUCGIvXN`SQuiYrWXy_y4SEfAA}D z+u06YV+~KHz{NTxmWB0AoKe@B=ezl=^7~n7rsw5|WUw-_!Hp;4HYOCG`q=LBKJ3$- zD-i*oih3-YIo^vb{}g`F^?sVQ_*|ouQ`Iy6PrjAp5fM}I-D1vag&jMeA2*JB@mi=O z6vTCqH>FH%l$|;4yL|7f$Y_q(d)<07 z8Oo2}vaXBxC;B2c;_Ot}ZRsDK;#f;xKo-|R^0O+kgJswXAVXP-ZHteYeTnadhu`RGgs=@Yun0RZf?1|SgUVIlla6<3!4wHJg`M_ zF=(|a%*8B^c^dM1^-cP(UwYcBCeWiTc|NPSs9o)i>ti0TFInTiA|~}w zs~XGoSbHY%UA(51Cfy;8;aw?ie~`>oX9CStK}}{6`)GO3Awc$PaN(ReXCH*RzDaD~ z6g*kQMuz)#Xy3BfyUTCzojYy+x28uuxz{T7z{5R$yrQ4ldh@ExI~coGY9l9N&~jR+ zu?#G0jy+g!JufujXo1((*Rc{OOm|o{gz|={-0`?Tfcdk=dxNQ)~7|iyvDTt zl~|IMjp;*yY0V2~%ROO~y7Bb*zCzt?qW>9XF4!G=vQGQR;{Sz}Hta|t0a}R+ckqsD z^SUcC&5PQrcx~eWk*z!{po21#1+{7layoY-oHmbn;uLf3jr`|%huJ=I&zSY~!bWAu%S=Z$#!Q>_ zZ(h*{%X~E?gY}UO&T4R&r=m8SJ4S2%Z+2_;4?4yB4|l(>Tlwy9QcK#;>I)~oxqOgJ zeC@Q=@%hX65S#k@QriR1mMi|!u+}M?ab?Q6bw~yqARC-E>(udQ2X(8zyxuyQgX#T8 zmCes$_r*y?a2?I{TIn;-LEJFm)$i|1LU)!nN%eo*%IP{y{Bx{*%j~CntNS+a%T6dr#t^u_dQq}{pydU^zr(l#AN&1fi>Q; zt&?*vG{&Yq+FzWS{ovX^CnN`(fY+))oy?-_${7Cj-1*Qa3KNe67)vtlIpim5FMr_U zO!a3a>0EZDiMvzd#a4ZPWcBy`z7r>x+}JO1uQVeoq+_XoHB-qyH_*NYMreBiv@RcN zECb7J%>}Po9G5=3m!=;Qa9hFoe0004sqc{|Gp-z~pL2Q7C(X$-w=6i_d4HGHgAhlr zsL8?t38q&Zp7`B+w&K}k+ZziMkX#H}-w!u9(tEcXuk*TQ>xJCMB0n!;Si5!pKDOp3 zKdM5HICk>2-RZ8(=oD*i(=9%w{6FDL$Gk7v1tB~49J*tbFx~64$l@x{mL!;q&5?sR zk-u@a^yJ2SQ(~uX|IyG^uQl;R>D4KAZd!yViQspO+o4#(ePG$9nr| z=V#vg3ol!3+P~H-!0w+Hl7lUf%`LUcIN)(-D&MJQxu6nBEqBxUL_rbpMgQ%mU(Ee_ z)#vNa1s8L<995%Y>w_QZtv#T8c5BB>!^?L(CsQleYVNHRw)mtT5U)Sv{(Tx(==YxNebRKCeqfA;SBKf5jO zZF*J__3`S~q_PLw&aBv?n!g~hE62s{_k*b}(O+l2Y2)z?GU*OrK9D^}$J+C_L#t4E zERw;Xy&RxW0AUu97?b-~o~@B;)jm1v|K{#{2R{FeSzC4~`*NSXqf@TD57)P_zdgJ5 zZkf|@)JNB$e&UC$y^X7GG(1w6=FMfRveOtjBy5pg+zgjF{{|xw{z##qRELn(tep*B01O& zZf-pT1Iw@VZ{K+8Uvao`E3U0{UALa<*GF4zePg#ou6-Q&H+3SzQGT&o1z-5!;fgyowPt$pxwH?BND8FtAJ$uRjpqJ^4O+TFaqrq1hSL z@$FM@bQvjUh2ELGTPo=GthoxG>UGYf%ZW@EFv^k__&w`L4ZnBOtd%K;45ogT{veNJ zFnF5`D11SEyC(mepXWB;%#Qy5m*baq>7{DL`#Gx+H}+t8ae>5a?$ zEPwE3YrGS9T$Q~t!8iG{lHwEZoUcrp_OE*6yNMg$JQ6v*k7<5%m#XxvnOQIO>zBW)|M0f;{GSQ#ZCjanJqog4 zA28RRy=(c+Nb7sS{|_eyuHnhMsImXOFp|Nrtw12dSxnB`+u!^iXZlca=GQ4ZQbZRp z`8*YLthm-1$H@F8-Ri&LKCZQ^CWwD&-Z4|e&|5ZeTA%J}^HurYeA9N%vev!33$!H> z78Iacnn8wwFpH$z{7VAAV{3X<*Y5P)@3^Dg_tN$3-wrkp}X{C;5aRyAX{d-Yd0 z>X?7v5iD8ez?QEnx%qyU)5VEBA8*EIFGg~(D{`8subS|!#ps)DLyP!+`KwOf>tncQ zEO6rVf57wdlnEQ#Gid|s4c=O|wzB8k6Yl&iNV5AanaQK1z`J5?*jaN%lbVM}2D>2} zJXK!n|JB{CvwWi2dpnq>ytyK`M)I>G)BEmI%Y97k>xFdfq$5L)oe!^!=H_^)6zo`i zA$tAPI*s~j#l4wRJ@R9YA{p$CY_O?&;>88G_V%u5-XzWPeR}ruzlwO{o7W z(f9G8+lPvO@7}+Ne)`(hh^d{S&p3Z=dxDkaPUo#{9Lv7%o&9LN^0f-?TayGUqa@{K z`?#^YzFsf|$zV@pgB8Vs+}@n**1R`^^?cIhdrzb|{t612wp9Ce?!0hdr_r*zcV=#Q zuJ`xSLG5JTtMxCnK8Z~D^>E*hl`J~nIe)V8Ke>lwuotqy&z>o6nD{4TLh$}wI@9iEIkb?K76N1TfSmhv6*uh%+P=b)@7Sus_uJ$Lh*_LP5*83JurPA@Dx8_NC@$zWe( zgH!*x-&m7-TjKKGP5Jg|VLDDsNB9>15>PWXQav?i$I$}`*FH_1FK-*I%a*IZq<*>q zXQ1oZ3$5*`mpFn$boJ(JMwnaA;D>CmM9C#nH4aX`HwATX(jS|xiPCgydid$?Y+cn| ztUI)~?3QYI#Q037A!PbrDbudI$AozoD?coETyi#sd6kE^)B4*8gBd_u1VLFDgjtrc z#5@wJ_;)xtLS@ny&gI^{hIcpn@LH)7+;v2mKrRwjK;yJO;p zA7*~@m+C8+w?n1#u7uOg15+Oct$I0gcH8EAwT<4-SLf>`Et#IM4!Kzzh#V6AVw-f9 zEL`KY>daiZT`AIGA~zh)?&kdR)xWN;L4#SW>CcTxZ{n7me81-X3tkDG7c6tO^6c63 zhVNjC-uAvH>FJ?sC$Bc$ z&{DJGwz&IV!xcSOSBu79ee#O$R zuDVaWpfsV>%=vRni#IcS-pzl$@^g)T%$kVg;80|9kDg=lbC1y>Mui>LLzT#~6ojiNfIws2QTVroz`2m)>r^cu$4-VyMFO$yku==+0Y%u$wGaVA=FDdxTy9v5(EN}n(Mc~)jdf`hB z2U?a}Os>^=U;pLgO?GFy_NhoN4o5clBj*IIg$y3sE9c9KT#?O~uu(PFd)>B6^-N`I zu4T7#60Wtco^;!vrN>Tu)%p|PnRf5?{$=ei-fFsh`_#9BTdE)@4?r3!5m0kMQ0w_ zxOlR%fweX7)0w(T=?`^~91Plt3(6TF%wm%HTATH=SGL(oSEcq(-071XS6sQ29Y1r% zzxh)aX}(xFNvJ-8<=gV~a+B>vD_-+;e-OR7VM8`|>B9u})q02D#(hIFI11`wu)&7& zl$;k8$UF$>U6J0;)^v5Y2TT37MH07W8}Qw0YcDL*TfS>!Pwf0|nf9N2U-z}PSG?r7 zwf^#)X)FFLzn;(*200S}6cY6e44^&3AVWczrTXE0le(>Jw&CA@oGzaIbun9a(!;wI zg_oQn6*(j(Yo9u}XW10J_}dl9hKDwb_f6B@-&K4&AvJm4m%ZWr%o!OEkQ@x!dkiuY zgjp8GD$j@xnXK0o`%|k*G@s@FY0spx&3gLv5hqr3I2WmG?_VRl|HPW9U*2?{R6n5A zt@u++MJcXWMLF{GKhC+QULv>SW06C`YymU-(PW#TGdE*J_ms*V=FvIq7RI_rwyA$n zMYY#Gu{HX3S`{kEiKphXFA!KGq2RJAQzM@HdH&UvS97fU4%bgdaxrL^G|06e%+j|^ zUT@yB#kWtKWdC!@b=&?8b~o+`^gfuUJiqz;)z?|dTe~>_T<3TszcKpTm%gYk@@6+D zWjB6vYY|?z_0is|lAzNQUW)=aReeqMdp>?wZEY`Bee0l} zI}ZyMm`7N59v9$`H-2Y#X-SWpZJ-xRROtVYKe(#iPWq(p>4W58*fwskgAaXGX1mg6 zzJIruapvm(J~u7QpSw!(SM9pd7^%C(!9DDfQNW6;)8<7#@cdzGd-0v3LYp`1k@~}t z?|9lf-Upa11}$8Kxfrw!9Aqd6vy^W&`1vejTKg7(f)h#Y`*Qih;tG4LW-dwzd1sig zVVTY63453OnR9h;TC~Xv_Z4ocPWce=(mb$wPWs!|c?nS;ksJ)#Rt_=~gjrrk`A?}= z_}e}=bkX)r>JEWb>T$-!%o>N5x38c2Wv|Ws+N5RcCVY4pp4zd>e&zqI8$Uie=ke`H zVzK%zwrx+kEg3;4h`=12j2y)IY_a26DDYxFq+>fRT5{DZZKcij*4s_K zT)W+dJT90DF&A9^FtBX#of2=czW3dVnyzoZ2LR zR(ji=7ga_|tXU^C^RNDX`D(uC1g-i5bru1ATt3nV6WU5kmHwt1EcB5NYAHWGQBJco zF9mcO2P}xwkqvGzlhP&eoh&eH-`OJ+3m3iRlP0`-+LXZk74<{kHtjyQ?Q>*&)TVi(gpBeB$tMwSpPU z$iR?^Z0=U=Ls}QIzeTcM@F~gU=>KxRZ)u!ycUJv>)8{+GT%2=Pt-n9TJK@ajgX~8= zr@3EpsdK%z{c*3=IFXw96CjXoL zRO{vYkX>9y?w`1qbl{RPl7n-Q&9!=Mvaj7edtU24wY?SYUeem(^4Shv!fy5c z;v7;cbDd+Z_U#6(F^7c&=p+fa!3{pkRGVgQS^D{m%$Y}4v%d39xH99}d)c|aPLzIO z&*AUUnsfMYvi65%hh%Q@|G7VteOK>6LB2!1FWp+dyjdXj%@E1K`N$y=Skhj9du@~F zG}EoWw@a7IE84eCVnb`lXGNujkEbzA*`hF~Nh6~8kJskw$%e)vmU|apOAV^@X9->$ zR{Udvre7O!tGEE!;N^SY=}&c%QQpQnt!mO90|(zH+{V@>D;I4(vj4vz)5|X!b5BI? z%9FESDOmr&=twW4-`&i|ccNE(xNI`v$>Pw9k0ECrf$C=lhC*b6Ck4LaxRYc!pJ&?P zMJ+Qt1%w7K=x*SEQw zgd9DN6cV7bIberpF|cr65bC+)zgKMcy5?Q3>mTSg1fT8sY_HQ8FT_)lx;;>Z`;=+R zw6hZ%^FmlnZ#hQQS?!ABSbJOd<(^I1X|1mWcOw~GjN;%gu}7>8(=3VuYpv6YK9!qn z_4U837IHpZxB6jNx5}$Nzga#(9gqAFg;7^3&m`T9@nr1%`!FWbcGGXhRJKnOlZz zZobaG;2oMjLJMZ=oU-i*yCs);_teW7_1T8gw|?7vX2+cl!##NlciE~qzaQRqIN)^X znwhf#a^7#s>t&dlcR6{%9abcRVdtlSLW5=H>6{(g(iC~^_Nw&MwdS7)-}WP=WnbmY zn{O`fnj6G+eDAM2Oq?%fO<%~;T^w^`VNCt{Rp%2O?JBNs@;7X$Uos1MqOk(m#dCNU z?w@+1WlQh32dE`?6r30G zvP+W(9dHCIfU1!VK6v6*)y5B()gur7NYdPTGGfDx4}71(H!bXCUYURPp%mkM#rwA$ z*9lwwF*;YevblVd>QCidwTRZtJThmA(~J9@ zXC$Ij>(wN8UdYn8%ym^^gZ?w))nD(o|8yz06KUelI>h0maOt_7^viXuHq6hP5_ypf zu0=Mu*+pV=Yqz?)cgw^Re0FptBM~x z;&0D+_p0u>!M=bFT>X@^g<6NQLI$O=vGNog6qE^=Lub)|_8-V0u(7{X~LqV7&=ZudA z$AjyIjGoalN6lt1cTOyxT^hi8>z3;yN#po*zrQlA(}kRtO=8S$|9Nud%2~Qv*R3c1 zhzLxvaqCu1dvgcLT+l&JATvRjB}-subWFmc_g%gf^&1}@;QO#*>rMW}^&MM&-CT0- zz`k?rM)OXj$jiKpy`;waA}O$`OT$LLCZcnCbmaEs8#W%Ef>cnn`VyU8}l8m&tblB zvTB>*se}LK`>O4#VGm`!7H9I>wqoAb6`D54xuX-=+`#%rX`-K3GqUWlnA)G-wYH&V zny}cG&*#r+OLfac)8Tlox3V%zRj}__B@1orz41-R29{)G_H?U_lCr zE@Xpm{1b9^e67nr|M1GxB|Fb$BI6+ zzEpj(U{cTeb1BLPel6s^n$!Alg8aoc&g}j-Ek)Vc+4beW{&>c5cE71Z?u_;@!P`F! z3@i&)-foGRs8|)U^Ua?QVYL%(JLc~Aq430Lm$?05{gmYW*FwGOl4XEyHgU5jr?NBxg=lv`if zQD~H(E#0JCQlVbF*PZ?F4Bc-Nyq|?UdNARJde|JUX11l)M?eR2!fMe8$PSkBmV7nq zm)|61xqQWMArn5$*u&yqA6oV7tiN-QdO_vRNj1yuzMK45Wp!ai^PjT6JZG*rJGFe; zXkd}#^u&GBa=U3rAptsf4dhr5X1V%VT)d3`(X`00o}-`aZ|eSj?tVB(DdO$(rHZ-p z{3{l2sgP0)VFD$FgUv?xKpenmxx1>_`9NJvaVcClb{!Sb>z zzwgT|^;2a`lhEH*{5wPYWa8JA+nxQ?L(5mBbjoe0@|MjxHuq%Fbd!%N4iVwTFG8)a z6*YCX$IWk0MshIdfH;t2L6{{X{H|`Q{n5~_%6buXtt19Vrz^^vR4=imvo!us3EuMh zj)dapcfZfPuA6_#Fjs0@BKJapS0BP2*_S$PI`7k>z4k4V!BdbOEM{e-`|jt1&q_%L zqs%AleRSKc<7K01%l%iAUOyH+&S;lcbn*7(yZvluo|kO6__V;jubv}dU!D4!$?Vg& zr}?ox`;KHV=m+yRx7-gJdzV)2>W!2+!v+cjl62YILRRQ(C zb&cmNTq;)cE=wb;W!t@ak{DtLb@ho-2<^csLwA zSWv_3bs>8~!7eEk0U3eo3)XV4y(cEyTIhPM?LwWxrxmUH3pQKID%F4Uw?Q5uor$vk z_onR5wQOPbYoANAHEiZSoNabK_Scy^HKGedPrWGDs#tYt&Hj@s5A0uKF8_UI#rjRx z^>v(M&+9puZF$|eF7HAE8A<9;w&Qy{$fY+_*3I>y(lsO}BP_2sHEZ>HILUgZa~*eGD9S z>o2h%I-t4Ml5Hw-+|5IF@TqI(^-k`SGSKF2J^8Uc`|9~qYOmM!#Llidd^V>oJ$*4( zu*CkI24=VJZkm-~5fO1yY{nyo!&{EM?zF34v~AvptH_Pa`N#&RomrEvdgGyG;ZMHu z*qi6XvNqJn2k;u+IJzt%%XH!bp?5kC2Fj@%d3XGJGwKV%W_@XzGW9?mkM)X8PVcnd zRjD9_!~$e<^XvX;$}aln5mEo_(6WfD0ZbKZ_pP3gb3N?zO3$)WUnXU(<5VX`1nU`*;lb-Y3sz4NZ89ydr8LvcVe;a^BwbrBU!w%Zp0sd3p@Yw>p$J zHTM5pyE=TA&g>g`R$`e!OV7uN=-dcbcw{erwmzTdz`Hc5wu}qKv-WXLF+pC%z6jZ1 zx$O!CjY4|)QHt^ww>3PUiq4wczx{=e7cB26}E_lBLciJEdZ&Mm<*{i?{Ht$+D9hIysddaxNHFFIR->|oXGJg)bm zPKQ-9?}VQJ{6pUGiiCo}vRAW;vJ4svbDmawRAO3ZW?6rFk&E%ph^Ky^j4jNXXU({L zuP27PU;mW93-Xf8rN{;|oSS@}O-n+<@9`|99lti{XO~_6c-KHT+vkJarUIvi50k`W z$`{=C3H1>O&)9UnCo5{Z?tyiICi>jrxl1w`dXtbsVj0T%U(TJ%iMKgT3R6D4S}Ek^ zv{%|ZQL1)pU+au8>jRsGk{-^Ov^}JI*SD$X><_KhpHjthuJn7vd=L8*N)o?zeYC%U z91_cs9h@k-XYuXNN;zunE#|J@?_R!k{P~akWUs>Jx9->Kb>-hMzX*I`dL!?joY3R1 z6MdDosWgZ_RMI%F{z&}P~Dfg zQK?-1hA$%5?R!Gh9b>F{UTfT)^K&kzl%Gih7e`*$97P`Lq;=vPB zHpg2%JwK6o&%I4Lmzj&R=FUe7;#J7zK4@QPURwXlQ~PQABoBiN(nq-KSG?U7H|bl< z-(ya~>ZQ+2wrn|LE!}iJIbxw9@_PQ&$Ob=io5{89 z<+IG$=Vvcvb9j>5E41PBVy&e?_ors+-(G6){nB)&lDL!mzIeZE`|q@%&Gpds-5Il_ zzBfqJzdGKdk?Q*t$;E4s4Ssd^{z4OuZ!7Qpc$N{$Q2$w8dvc~}Wz5z_(TCwxtj<$@ zxrb*t$K-a^USFwMc>jSgn`e^mlKPgKPPY8+kk3A!k<49-Y;Fm^SkCp?H`mp#a5fNl zK26ns_65eosb5piZPLB8$j zEB?!H{;)Ayev56Q+YdwMhGK^@{mC&74Lto5lN3XYa%$e+-MHb{?Z%29+??k@hjPPO zK%g^wL4^+ksQJDgZT@frW43^E)=uvy!i#eYE&H z7h~qFW${Aqomw~!y?efBvdsIOxBErY!s>k|v571{zV7pG^_@Qdm#Q86?<1nqvuWWR z^X~>o25&+RiF4cK+`m4QY_%`{rMW(l%X-^HS@%UO{aSt3kFQ|3d~kY|xA~{*E2Ca{ zHD5R+vU$$WcDaU(W&7-OGVQjMeZJpu0mS<3_9@( z7Q|bS9sFU^{N^7?J9uBkReB#kwRZo+Ypy$t#AO#6oX)K0v7T~k%biJ+mPoxbDp*&P zP@^Zfw(8&N>2*EsEDf4Mhl>m|-(Es;@m6Gm71J+%zH>+53mf~7#>f78Qdjz?vX`sP z+IppP&#SKrMJbbuS{picO!h>g4IT>UCb(hZ`>=um1&|1OW{Q z1{Rk4*8H1R=H6&v;a_{F?COe|Q;`m5@7`IayX3h|0ME(us^O1%?>{p(6Ad)Iu{=Zh zzynsT61ZCd?J*~h{2^7csC zWiq#!9zx&K}YKN@85wtY2RhEi3ViPc{AW)g#G0mTUY=6 zy1DGUS59Tw%dK>dWc=ma=s8(b<(yrM#G9X7w`S)e552;UyaqX%#VBu9wPweK`VWbZ zdwiAtzuMQYK69sLy7^YEFEvJvS~)E){8CDh7F$2g`qsB+zRMZr+A!Czzqs1{w$x^* zclW6x&v<~&&ITC@!YoU^oy|QF$>w~9e=gUhxhEwL`j~7D;d*M%ATxXR=VNAeoE=p! zXWUt}LMxHYPw9I7o$xJJOVlJ|9VX@Gs_xA6zKz^c*@GMsy{kQKZ6o_uKl~q9q;_r< zL(xBev)>!d{vF$Q;TN-M{@V<;!#a+9tP_J~zr2{L_UUQZX|0JeS1(U0uG;HN}f7MG4+%~&e(ukTuS zK<{I&{}Cq3zRASs-Tt>UggsJj;g7c|NCxkN8_dAKB6~V_vdmq(=lb`GU1xsoGyE9; zx@kel)U4S-v$%41mVE5d@yw|IR?WS)yi-6$;iJ#_9fI8_O&TuFdBt_%(wQYkkf&Vt zBO82K%v0o|Wy~oTvlH^NEgwFFU4P{L^IoF&{EY1}zqDRo`qbLe#4%xy;Ip2g@ zy;;O$kzU`v#r@{(kF7SZ{o=M|$6$)=63H z27#t2w?q$a+W+D3w$t;MT=aYTyjs96@Rt59byjP^@UP2m^>^03>XMjv*!S9sZE3$Y z%tLbU5oB{`F}!e4NnYD~UHe|h&bTdG>u0)hGENt|tni_}V`JX8sdr4fWRufmZp3cN zZ<1^fnqe6jkvKH(&wET0Xt-X4{hufrn?O_qA=9-T)ke5&#LpFFS zqg>U+u9}D~2g=@l&4+MPGqSL@Z~+vOiP42iz{HqE_aNwMv#e~l&ccCoH6id3{X@4Cb9 z%gh5C{3k2C>1Z_$8ir^^3UIjwPS2g)u$8`AZ)uBtVx2fE)`tm63rZgh%Gk zGsXQMgnx#=zJ1*G^pf_oX3MYbS+!n0$R}`duy?acjrq>`{bi4AmIZWAlxCi{XdBN# z=Gk259HqJbb}Az$w$sQCwyq7@WL~Mg(m&VqF9VyV$Euq%w$Ez1pLgiEqU!yQV|^1k zW$NcI`=J}kRkLct#jnn;z4PsO-u_5)&o+OMZd<;r0?Eao>kYsz2Ca0^>{V<}Oxzo|7~46Tg~L${k+m z-W~3mojnM1>*4n#fDC65?U=mJd)K}6y}yHt-x_ax*sL2}9TsnXz;t%@nTn9KJwM9( zjtE^AXgADAO%$rFZZJ6Vb2iW6$8WZpAMRzWTZ)`J&LM}yYCp%xJH)M}g5_FlTy>6l z$)A=Ds8w-N(WW-}GW_5TdGg`lnPWw+|Dqi9*|Jw8EO8QD$E^M0%%>lf$nA-X$mZ&~ z>RoudaIRCkhTs3Q%^meUGCkR?ftj&Q{NH7zZ5fXG7gRrWxaV-ViK*pGFW>nf?FIR} z8l8UyrMAcji>3O0MegNZLN<6^e$+EXR$DzKgPwhV_|JFh3YfbZ^?Z^G`*!7tv!uwP zNV)s^PGxKIW|{jJvKGr6s%+lEQhulYq11{6YBA4)YLGV)Uq&`KeQT#`dO-1+rYHur zp5BKi^mp18>E+ZHxvY6I{hEvPI&16O#?$Y-pRwrk(oMS4G!D*<2oC%kvs|@ttFL|3ianPQ&Yg5lxr^`8=6|Xx&c_AI zy9z5L55Li4zx^cQNo(QG|0?y^Y>U)ON>O_VDaAi@QXx zzy4+x8m`c#rZGd{m5D0wwhm?Q|7h( z$aQB)nqu}+`1xUVjl3h~d#*bO^zkE^3%hLuJparx`QQAHm)hQ7^$woIj$z8qQX@kAyth4PUH+qn>-3{cB z5c$|JVdka<8UYpOSMLz);Mcl*>(cy`$$L!C#Bx8FW-?>9dHwm&+lJh zY2)vm+Q!u(3%4hRbc=ooLf({e6WQR!K2A-O)7(1J=CyV?J1Ku?k1exl6!86F*|DvOVy;##@uOlOGu|9bTPnjaZ~o&%kgC+2HLrZYq69 zvnV(vJ+0X;OdTbWlQa897^n>|_omlB6l{F%@DpPLNaPBx-mbQA)=XovD zZ|@TdsO!Ie6?q5LZDe!xFV4x5*fL>ZMBE=a>y=*)p1mm@uyCnjY<)xiyztN&>GgLd zH+jAL{p5RKf)v}5k3E7-8`gCR)@<>=-t2c|!agVDb$xe`4d&vOo2u9(ZE<1Gng=b~ zhy8`x?JHI+e0h4wgma&J=e5;2-^hzsk==G{b~-NW{&z^tuw&}a zdgSKzU1Wp3u9r`&(Tx2PdXYQe^d!$hsgxD}?GNOM>+cBCoY^*A_$lAYm2nsO-7;L? zTc=MoSQ~KnUaTnR^4E-lGj1t}Mj#JD-$ORHe(Dw`k=Z%@o06ACO|-4I=*x*cZa-~9 z!lE!k|2{PHq3;pMAX3_ZbZ|MQXEf4u?rbV>evo!u& zwLB-W-g~Y)%cZqUq3(Z?H;+6(Hu%9~-u>I#{gTQOtIfClaj0E?;&FM>&v4cs=ft+J zoAdb~gMe+|g0%Tp>~<9FbDb#VtN*m{OL@-c&XkSWcmFeUATQm1h-~hY1CvebPaHB9 zvAS!X_iay+`ErJ+SFh?e+|3(A*B!Oq|MLdtG@+f9GT-+{a37jC z{h+>hW^HdLQht7fZ1DUqw>ktnk2Z$wo8(+~CaC|Wi-4a6OR%ZH$ITBGD*0&zH+iv! zhBM7J;J#PCz`FK|$oJ)$i#yorCmuZhX*u7oMaUZuA0r#Q;djK^+tU=TT=301y5-H@ zuK|;z=CR){6@T|lX4kz-50rQWOYNTboQl8Qv>=mvW9r*#wVrrW_h!@Cx?fBWH_imz z5D1I9ClGVN1PW#u+Rs64KQp0+2f3|v&n)ZbU8ir-|7c`yT-Q2r!G^~-6YDG9KW`E)7M*Db9{wzYx#wcLgFdJU{Ha{z;Zn&-tAe6A?+VywwrOL{D>+P3_*LS~+(~{e#udx4zdxb!Y+`1gu=Vx?I$y#65I4l$C zD}`k6Gh~CCEw3fNT>Wqg_aE2(!VLide-Fm$xgMNVP-XCD@wI9k4V zNpY=Hzu_l~gEJVomM_fkp6k%$((ngnE~x&0j%={pmt87xyN;^tTytr<-b$4>`(yr@ z)fZk8RXoKXw)5$SZqX$>6#Puze0Vx<;-=%9zvdoNLs~wD<|n{Mnm}vs3qez1SwVS1w?xl(|;j-SbAWvfI+G#?+rIg#`s81H&t1 zgO4ni*R}LabT=+tZ2I$6OqpzmSZv`xynS&x=ErN6iNsC2CVjrMP&Rq-)G zX|LbC%zIMIDn0vl-u*WMNalj>&Vq-8L-)U~Y@Z+AzQ_2lv(zv8-ln>^@zP_1motCX zTsWwq#`1@8`XV+$sj$!38(?n|=1Y z_!*pRCJI?{T~puB^L^f#F-Jje3D?ny5_`mN_hxxkMKd>Z9lKR8c>CzF;}&Q7@>kY> z`grDf$#y2rH~qE9BNT6uL!$cZg6SoP7HwPGzKpy6PRN1qg<(J5*DXved1dk2W2$1r zyWdOCbx%D$X+gPtg7{n=jY`umGE(BJXK;$$ez9fF(YZ(=0lF*`NP1H>adt`^_%tyEgqVS{tK*(kD9}|Kw-MI{kxm%_BE!fF_@N|d*C!Pr|D(# zLJK>$_hJIK!arXZIKdsZaG{BE>32IMgFk@{h6FOpM8THNH@xS3zjJ>1<#oX!zg{F1 zbAOp3Xd(6Y{Fmi>Cv2_vOq#KS;b^FUXZRjDr_5dFQ}fh0&hvlt+0?h^kg@YNq^*(+ zpOFnV;MHE3dr~~@@U__v88hD(E_)Le9N;A?pKN6=~^YWva0NdewQ|}I35qOttz>psV{YirKbJ^O($n$~UkPUvHcVmJB|3M`Izkf-ykFcMwUb$+1nX2i+&Pz<6L+&1L z^-SoF`x|*z^KX{c_UH42Pj~!K^tw8KkNzXk#Y|51@6IAmrF=&=m}zOo&l`GNoGZKk zK1&eK`xdF*@F3MW$82A5X7&pC4xNCMJy#!2d$_S;t$LdDG%vZUAqHDYW|<{PNk!J* zUM7aTaOnrKxoO`5+>%)?o1dIxqFx^&G~-N7xc|-w7TJqcf4)jR*}Y)vH6yMmwsmYj z3~u|^a&TxSZok?UUMCQ?Ezz5ATA617^6L1X$Od~nSyD6MZs}s{nJcXdK5A~}ne0|Q zaoWv_+c$jHE@5d3-Dl;cKS$?H*O|++PCZTj|4Jv~Q2kPdqi#R$&dy-AJOs~+1z-JdaJFoypNt!aR6y;OhdL+*EbZ~oMIKLl0$cb{H4B@B7w;}5dIhh?TUr$l6` zN;IX{8p^Vs6x>wtSU~uz@%k9!@*kFk|Dq4+J3RW=E_$K<*?V1|2J4LS@24$QZYHld z+!$*Ze7!OUnms_d19m_&C`YqM7+k9iI(t+|#nJNQ{48gSvzZe#BucgVD{Z5`{ir?B zweHrN&&|BWMGK{WH2Jmb&-D>jHNEn1jgiWxy(=!?T8+G)=pV?z(DH|YB{1H*dG6ej}4V%g!(9nVMTsoZC>{Bl2bp23P`xt9daJxl$%Z0}LWS#H69 z{XcXHe@}w0s)4NkWdt2$4KU@Q9a+EOy$0nctTDC^%hH`dmXI^xjv?s>OG_ z%bzM{%{el4K}_kRYTX;_ruA-IdE@Detzm5}Id2~Iz1oYsa*_$z+*QY;e$*@bE|oI> zQ@P)C+j?`mk1`hZJ}mYRRvdi1$Uu9l`;X4h%IAx#KWd~(CB=Qx>WSd`+#+AM`16(| z^AMq9SCB%28QI`ZU0;6)wv_osPVzD9(ydylvU_LL1(jd-p73YXpEaym%z|vN@dk(RC8@=FdB5^j*a`59 zF$JIDSP}oP@q$g!9?Ohx@pk@|r!{xoImbIq*JpEipZ7; zIE(Uga!Lyr7#3_dY+_u@D7uTAfq{>K0lY#zwK%CXGbe@N&-U7>jPXp<3zjglO!sMH zG+>-Ly|#^UGh^>`!*)ht){~M93}7SeK}K%xX=h|%WIR26Vh5uzqt5h+lNi0HU+7>= z0ZDRRRRG^r*>Hb*Vkcua6Yq6Z1_o{hhKBvx3=AUM8^QMUv@@1~6i>g<$H>7NWC}IC z8tj1WG5w4)7$x=X7#Mh=?qsuMV31&7Xeh8_VBiOtQO^j{4zb&x_l5-ngAfBlgPJP? z0~g5W+928KGLsoOSjF8K82CV9V5d*-X=mhM1*-!Y^BrsqCrU76GqLK0F);9e^i+e* z$(g~(!Fn(pYBnTP^C}B+LAgb5``j6f!HkTzrhlBtc$@L|_Or7Xotaq0GLTjC{>cDc z3dzvGk;%Xy05W*_^fwb2IT-b~zn#li%*Yr#J#ju`Hsh!1XXi7%XDr{ocLC#jCSF)b z>NJ9#GnH{WD12I2UE3HKxIoUYXPkavH6sh-{pq#K81)&8rmtPbI9>EaAH=fcoJ_r} zV#pP0`?p6fXPnQ>8ZwW8fqVPG1&q&`KrvPU@*ipnna&83Xd#ja0U4l}3bF=t?I0-p zp;4BVm<_&a3m(?&;IL)|yKZ~za>n&wzGBNANb>l250Y#^1!q=qYH>0H14B^{0|O_> zqtXzMvfl4zU=T$(AEzr5wqIDyn2|=LCvX}wD$&6>P+<_yy#ZW1GcfFsWS;IU#AH|h z?>_{9@*QZgCg?!<1<*nj#0MoE5MB%w1Feq)@j+aEkR}EO2G9~jkUka$1_n8(7-;n% zNDOothCEaZwD1qaXJcSs(1eK9Gk}(qffTYcFhK7rhpYwziGeQmS_ZO-fq?q+4d_xkkZ*gT>Od27Aaw!^3=EJC7Xt%mP7Ndtx~2^_ zg8-Uc0;vOCZg&^rV}`TP3$KM47#Qxs+DV{U9gsp11_lPucs58aXhH@gCd$CT02&Db ziGk))K)w@WU|;}EOM}EfmVwlP94P@}FfcHHW*R{1Bp4VNK!ZIXb)dm~kOL(d7#P%{ z>gqw`+90+R0|SF8h{3?X02-18X_jVSU~qwofku5nVloU23|~N|F)%QI##KQE$}%u8 zJYs>|$O#%@1gQh1gQuVb0g{7WB@Rjl&!A$UaWc?3oeT;L3=Geqf}k-jkbR1v`@x}N zpy4Tym=Xg6!%L_bXk-awi82EN!)vG*Xz&K4PKAMi;SE#_H0}ZtQ)OUacncK+jhTSN z)EF2T-hu9v1$hQE-T@L+XJBA>4^;>nssLG{!N9=q0V)O>4FHLOQtwBo7%2WhdbJoB z7(PM8Kz(J9m^K3g!)K@%sGAEC(*cDbRP0MVG%!*{3{s4D|9(13w~;RjR<)C~cN88R?1{Dg{udJrHnBL)VBUr;en;~ykeZ_L2J z@Ea-!DjPt8CJYP=f1qNZMmI>z6m$bSR1DN!28o$5Ffjasih-KCATe_W28RDoF;FuV zaYHYzwqsymV1tVBL2uEvXJBAphl&Y-?i2?Fs{;cA0|!)41Zs&R z0|NsmR7?~q=ET6jzy%e9T?p?Cx{DMl2D%&`cL?)B#iXF-xqQ)p>!+3aFSoR19=qsW4Pb z0V?Lhz`!8F3RyJJBq;seVPRkZRVw<>L=(lp zz;KlX+;Czrf{H~mFff2l_5f8Nrcli>3=9mgBd5)vVzCSi3^AZ2&%nT74i$?7r4Oi> z1yn2^R5^ii1t|V4p@Inv3=E)oQBVb91$A{IwB`fV0X9%|Nem1Ou>F*_P%%);4s?Pb zsJyp>ils0xF!(Tm8~F_OP%%*R(HE5B85kHGm>D21J5KufYFfcel6{a&VFo1UV zfE?)z70X~?V5owsbAgIwGB7ZJ*1~|)xkAOVK!pz|`WP4(+@NCFpz56s(mrr!hFqeY z14@5Npw=3BB0#F&i#=rn7 zvLm796@m&WXuL;5^%jAOV6a#{B)&kNDrR6{_{z$_04j=Op_)rT#VuGN14BGib15ja zpz0E!7MFp_epUtsP?4PqO*7>T3=E)aoIxRz0X46Jfq?;ZU@(NH)`?IbcQ7z8>;q*p1_p*HP<5T4;+C0#0hHCILe+IKFfi-@ z*~-AcFaxTtn}LC015|7#Sgf9bp@)Hi0W^aL%6_xJf(#73(EJX{Rgvg$wd0Ho z44|yG1Zv3?1_lPujq0E*1ZoX~G=nZY&S7O>0EsP!S~87+fgv9%25KRL?3>QOz>vwx zz>ouqR%jH@U|?X#f{N9zgIWT*IT>ULDEn=I8aRuAfdOO*NDS6&o(;7GB(@2vcMhml zgl5kzP>;+7m3nLp44|yL9h%_gK|KP>x_cmY)HBS7S^^T>3lU^k0JQ`pwhwB_LIwr~ z&~59WJbnP`lSK>+42M`57(il2pz0PgFfjB(6Xr3f*b)W?h6zxy6Hq&rGB7YqX02yn z02L4?p)Op;z`zjB%D@0BAkINGF9#(cRt5%8S#SZWZUxjQpt9g9)WDTckATFkLB&=< zJpvND4mA&Sg>(@s0|ThcxLFTX2)Z}A1S)t7s&Fj>0|V&(cThoc2kPT>3=9lUSQ!{V zVh^C|KzB`pq7GD!Jc61BO68!a1BpF`ifx2C1|;?bs<(a<0|Nu-QhQK=^9-tRGXn#| zZdL{ckl1sm*cJu`hP_a+7tm1H3e^iLnBGFwZG)-=#sQH#GP`rP^<(80bQ5kdHxPf1qM}p*{wQ z{e_Bw$_|i+L8ae6Q2P&*o%Ta50SW$xDm(!72}q2A1yW-j1eIK@3=E*skCg?|KRm?1 zz;Kp@fdN#~u|vfUGcYimgSLV>Ss)$GBMb}-=b`GjpkhZshJy+pP?5+D6+Fhkz|hUe zzyK=!c%Wj(85kHq%L_qbyilBOL7=Rn0T69WUN zq!Wi)avs!nWMW_dm2{F&^DZzjFtjr=Fn~%r8K~Zi3=9k%P%&8+hI$5&!!9u}Fo0Hl zfE3C>6<&rG%b*fb9x8T)fq|in6><%{0@UKG(6j(5>6D=Au0gXRNK6?jb{(o0RM4qF z_1*xr{{o-|1LzVtkYjE#Ffj14F))BiHFc=MTMP^gd{8k>sPArrn(0t69jLlHP{)8u zKRu|$png9nVS>c;pRv+ig2bGmVy~cjL1HdYy{|#-KTv#vic>eJ z;2UTtfQm^EsMuSmC7=?~3u@pys3jmVZ>ZRNs9sQs=mXXJ0a{0Z3OYZix{nMD3

l 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 VFQ;S{>6(EJ1urC?{y?AkIsnHS6&e5l delta 29486 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�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 XM{SpS#T>I>`hjK^_UZTDv0MiLT}ipF diff --git a/package.json b/package.json index 4d2d8fc..5fd20f6 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ }, "type": "module", "devDependencies": { - "@types/wicg-file-system-access": "^2023.10.5" + "@types/wicg-file-system-access": "^2023.10.5", + "vite-plugin-pwa": "^0.20.5", + "workbox-window": "^7.1.0" } } diff --git a/src/app.css b/src/app.css index 61a752b..507ad65 100644 --- a/src/app.css +++ b/src/app.css @@ -25,6 +25,10 @@ --text-l: 1.25rem; --text-xl: 1.6rem; --text-xxl: 2rem; + + --padding-s: .25em; + --padding-m: .5em; + --padding-l: 1em; } @media (prefers-color-scheme: dark) { diff --git a/src/components/filetree.module.css b/src/components/filetree.module.css index 933a142..faf656a 100644 --- a/src/components/filetree.module.css +++ b/src/components/filetree.module.css @@ -2,24 +2,29 @@ display: flex; flex-direction: column; list-style: none; - padding-inline-start: 0; & details { - & > summary::marker { - content: none; - color: var(--text-1) !important; + & > summary { + padding: var(--padding-s); + + &::marker { + content: none; + color: var(--text-1) !important; + } } - & span { - cursor: pointer; + &::details-content { + display: flex; + flex-direction: column; + list-style: none; + padding-inline-start: 1.25em; } - } - & ul { - padding-inline-start: 1.25em; } & span { + cursor: pointer; white-space: nowrap; + padding: var(--padding-s); } } \ No newline at end of file diff --git a/src/components/filetree.tsx b/src/components/filetree.tsx index 00d0a11..e6a9f33 100644 --- a/src/components/filetree.tsx +++ b/src/components/filetree.tsx @@ -1,6 +1,7 @@ -import { Accessor, Component, createSignal, For, JSX, Show } from "solid-js"; +import { Accessor, Component, createContext, createSignal, For, JSX, Show, useContext } from "solid-js"; import css from "./filetree.module.css"; import { AiFillFile, AiFillFolder, AiFillFolderOpen } from "solid-icons/ai"; +import { SelectionProvider, selectable } from "~/features/selectable"; export interface FileEntry { name: string; @@ -38,27 +39,61 @@ export async function* walk(directory: FileSystemDirectoryHandle, filters: RegEx } } -export const Tree: Component<{ entries: Entry[], children: (file: Accessor) => JSX.Element }> = (props) => { - return

+const TreeContext = createContext(); + +export const Tree: Component<{ entries: Entry[], children: (file: Accessor) => JSX.Element, open: TreeContextType['open'] }> = (props) => { + const [selection, setSelection] = createSignal(); + + // createEffect(() => { + // console.log(selection()); + // }); + + const context = { + open: props.open, + // open(file: File) { + // console.log(`open ${file.name}`) + // }, + }; + + return + +
<_Tree entries={props.entries} children={props.children} />
+
+
; +} + +const _Tree: Component<{ entries: Entry[], children: (file: Accessor) => JSX.Element }> = (props) => { + const context = useContext(TreeContext); + + return { + entry => <> + { + folder => + } + + { + file => context?.open(file().meta)}> {props.children(file)} + } + + } } const Folder: Component<{ folder: FolderEntry, children: (file: Accessor) => JSX.Element }> = (props) => { const [open, setOpen] = createSignal(false); - return
setOpen(o => !o)}> + return
setOpen(o => !o)}> }> {props.folder.name} - + <_Tree entries={props.folder.entries} children={props.children} />
; +}; + +const sort_by = (key: string) => (objA: Record, objB: Record) => { + const a = objA[key]; + const b = objB[key]; + + return Number(a < b) - Number(b < a); }; \ No newline at end of file diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index e5cfaf4..4b1b4e9 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -1,29 +1,25 @@ import { TbLayoutSidebarLeftCollapse, TbLayoutSidebarLeftExpand } from "solid-icons/tb"; -import { createMemo, createSignal, onMount, ParentComponent, Show } from "solid-js"; -import { Dynamic, Portal, render } from "solid-js/web"; +import { createMemo, createSignal, ParentComponent, Show } from "solid-js"; +import { Dynamic } from "solid-js/web"; import css from "./sidebar.module.css"; export const Sidebar: ParentComponent<{ as?: string, open?: boolean, name?: string }> = (props) => { - const [open, setOpen] = createSignal(props.open ?? true) - const cssClass = createMemo(() => open() ? css.open : css.closed); + const [open, setOpen] = createSignal(props.open ?? true); const name = createMemo(() => props.name ?? 'sidebar'); - const toggle = () => setOpen(o => !o); + return + - let ref: Element; - return - - - -
- -
-
- - {props.children} +
+ {props.children} +
}; \ No newline at end of file diff --git a/src/components/tabs.module.css b/src/components/tabs.module.css index 38d0765..a2f28ed 100644 --- a/src/components/tabs.module.css +++ b/src/components/tabs.module.css @@ -1,6 +1,10 @@ .root { display: grid; - grid-template-rows: auto 1fr; + grid: auto minmax(0, 1fr) / repeat(var(--tab-count), auto); + justify-content: start; + + inline-size: 100%; + block-size: 100%; .tab { display: contents; @@ -8,13 +12,37 @@ & > summary { grid-row: 1 / 1; + padding: var(--padding-s) var(--padding-m); + &::marker { content: none; } } &::details-content { - grid-area: 2 / 1; + grid-area: 2 / 1 / span 1 / span var(--tab-count); + display: none; + grid: 100% / 100%; + inline-size: 100%; + block-size: 100%; + + overflow: auto; + } + + &[open] { + & > summary { + background-color: var(--surface-2); + } + + &::details-content { + display: grid; + } } } +} + +@property --tab-count { + syntax: ''; + inherits: true; + initial-value: 0; } \ No newline at end of file diff --git a/src/components/tabs.tsx b/src/components/tabs.tsx index 35dd2e2..507bc07 100644 --- a/src/components/tabs.tsx +++ b/src/components/tabs.tsx @@ -1,72 +1,21 @@ -import { Accessor, children, Component, createContext, createEffect, createMemo, createSignal, createUniqueId, For, JSX, ParentComponent, useContext } from "solid-js"; -import { createStore } from "solid-js/store"; +import { Accessor, children, createContext, createMemo, createSignal, createUniqueId, For, JSX, ParentComponent, useContext } from "solid-js"; import css from "./tabs.module.css"; -import { Portal } from "solid-js/web"; interface TabsContextType { - isActive(): boolean; -} - -interface TabsState { - tabs: TabType[]; -} - -interface TabType { - id: string; - label: string; -} - -const TabsContext = createContext(); - -export const Tabs: Component<{ children?: JSX.Element }> = (props) => { - const [state, setState] = createStore({ tabs: [] }); - - createEffect(() => { - const tabs = children(() => props.children).toArray(); - - console.log(tabs); - - setState('tabs', tabs.map(t => ({ id: t.id, label: t.getAttribute('data-label') }))) - }); - - const ctx: TabsContextType = { - isActive() { - return false; - } - }; - - return -
- { - tab => - } -
- - {props.children} -
-}; - -export const Tab: ParentComponent<{ label: string }> = (props) => { - const context = useContext(TabsContext); - - return
{props.children}
-} - -interface TabsSimpleContextType { activate(id: string): void; active: Accessor; isActive(id: string): Accessor; } -const TabsSimpleContext = createContext(); +const TabsContext = createContext(); -export const TabsSimple: ParentComponent = (props) => { +export const Tabs: ParentComponent = (props) => { const [active, setActive] = createSignal(undefined); + const numberOfTabs = createMemo(() => children(() => props.children).toArray().length); - return { return createMemo(() => active() === id); }, }}> -
+
{props.children}
- ; + ; } -export const TabSimple: ParentComponent<{ label: string }> = (props) => { +export const Tab: ParentComponent<{ label: string }> = (props) => { const id = `tab-${createUniqueId()}`; - const context = useContext(TabsSimpleContext); + const context = useContext(TabsContext); if (!context) { return undefined; diff --git a/src/features/file/grid.css b/src/features/file/grid.css index f312d29..db53694 100644 --- a/src/features/file/grid.css +++ b/src/features/file/grid.css @@ -33,7 +33,7 @@ border: 1px solid transparent; border-radius: var(--radii-m); - &:focus-within { + &:has(textarea:focus) { border-color: var(--info); } } diff --git a/src/features/file/grid.tsx b/src/features/file/grid.tsx index 81a15e1..a3725cd 100644 --- a/src/features/file/grid.tsx +++ b/src/features/file/grid.tsx @@ -25,9 +25,9 @@ export interface SelectionContextType { select(key: string, select: boolean): void; } export interface GridContextType { - mutate(prop: string, lang: string, value: string): void; - add(prop: string): void; + rows: Record; selection: SelectionContextType; + mutate(prop: string, lang: string, value: string): void; } const SelectionContext = createContext(); @@ -77,9 +77,7 @@ const SelectionProvider: ParentComponent<{ rows: Map; }; const GridProvider: ParentComponent<{ rows: Map, context?: (ctx: GridContextType) => any }> = (props) => { - type Entry = { [lang: string]: { original: string, value: string } }; - - const [state, setState] = createStore<{ rows: { [prop: string]: Entry }, numberOfRows: number }>({ + const [state, setState] = createStore<{ rows: GridContextType['rows'], numberOfRows: number }>({ rows: {}, numberOfRows: 0, }); @@ -96,30 +94,27 @@ const GridProvider: ParentComponent<{ rows: Map { - console.log(state.rows.toplevel?.nl.value); - }); - const ctx: GridContextType = { + rows: state.rows, + selection: undefined!, + mutate(prop: string, lang: string, value: string) { - // setState('rows', prop, lang, ({ original }) => ({ original, value })); setState('rows', produce(rows => { rows[prop][lang].value = value; })); }, - - add(prop: string) { - - }, - - selection: undefined!, }; createEffect(() => { - console.log(ctx); props.context?.(ctx); }); + const mutated = createMemo(() => Object.values(state.rows).filter(entry => Object.values(entry).some(lang => lang.original !== lang.value))); + + createEffect(() => { + console.log('tap', mutated()); + }); + return ctx.selection = selction}> {props.children} diff --git a/src/features/file/index.tsx b/src/features/file/index.tsx index e481ae3..7633d33 100644 --- a/src/features/file/index.tsx +++ b/src/features/file/index.tsx @@ -62,7 +62,7 @@ export const FilesProvider = (props) => { return {props.children}; } -export const useFiles = () => useContext(FilesContext)!; +export const useFiles = () => useContext(FilesContext); export const load = (file: File): Promise | undefined> => { switch (file.type) { diff --git a/src/features/selectable/index.module.css b/src/features/selectable/index.module.css new file mode 100644 index 0000000..7520d87 --- /dev/null +++ b/src/features/selectable/index.module.css @@ -0,0 +1,5 @@ +.selectable { + &[data-selected="true"] { + background-color: color(from var(--info) xyz x y z / .2); + } +} \ No newline at end of file diff --git a/src/features/selectable/index.tsx b/src/features/selectable/index.tsx new file mode 100644 index 0000000..c54575c --- /dev/null +++ b/src/features/selectable/index.tsx @@ -0,0 +1,236 @@ +import { Accessor, children, createContext, createEffect, createMemo, createRenderEffect, createSignal, createUniqueId, onCleanup, onMount, ParentComponent, useContext } from "solid-js"; +import { createStore, produce } from "solid-js/store"; +import { isServer } from "solid-js/web"; +import css from "./index.module.css"; + +export interface SelectionContextType { + selection(): object[]; + select(selection: string[], options?: Partial<{ append: boolean }>): void; + selectAll(): void; + clear(): void; + isSelected(key: string): Accessor; + add(key: string, value: object, element: HTMLElement): void; +} +export type SelectionHandler = (selection: object[]) => any; + +enum Modifier { + None = 0, + Shift = 1 << 0, + Control = 1 << 1, +} + +const SelectionContext = createContext(); + +const useSelection = () => { + const context = useContext(SelectionContext); + + if (context === undefined) { + throw new Error('selection context is used outside of a provider'); + } + + return context; +}; + +interface State { + selection: string[], + data: { key: string, value: Accessor, element: HTMLElement }[] +} + +export const SelectionProvider: ParentComponent<{ selection?: SelectionHandler }> = (props) => { + const [state, setState] = createStore({ selection: [], data: [] }); + const selection = createMemo(() => state.data.filter(({ key }) => state.selection.includes(key))); + + createEffect(() => { + props.selection?.(selection().map(({ value }) => value())); + }); + + const context = { + selection, + select(selection: string[]) { + setState('selection', selection); + }, + selectAll() { + setState('selection', state.data.map(({ key }) => key)); + }, + clear() { + setState('selection', []); + }, + isSelected(key: string) { + return createMemo(() => state.selection.includes(key)); + }, + add(key: string, value: Accessor, element: HTMLElement) { + setState('data', data => [...data, { key, value, element }]); + } + }; + + return + {props.children} + ; +}; + +const Root: ParentComponent = (props) => { + const context = useSelection(); + const c = children(() => props.children); + + const [modifier, setModifier] = createSignal(Modifier.None); + const [latest, setLatest] = createSignal(); + const [root, setRoot] = createSignal(); + const selectables = createMemo(() => { + const r = root(); + + if (!r) { + return []; + } + + return Array.from((function* () { + const iterator = document.createTreeWalker(r, NodeFilter.SHOW_ELEMENT, { + acceptNode: (node: HTMLElement) => node.dataset.selectionKey ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP, + }); + + while (iterator.nextNode()) { + yield iterator.currentNode; + } + })()); + }); + + createRenderEffect(() => { + const children = c.toArray(); + const r = root(); + + if (!r) { + return; + } + + setTimeout(() => { + console.log(r, children, Array.from((function* () { + const iterator = document.createTreeWalker(r, NodeFilter.SHOW_ELEMENT, { + acceptNode: (node: HTMLElement) => node.dataset.selectionKey ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP, + }); + + while (iterator.nextNode()) { + console.log(iterator.currentNode); + + yield iterator.currentNode; + } + })())); + }, 10); + }); + + const createRange = (a?: HTMLElement, b?: HTMLElement): string[] => { + if (!a && !b) { + return []; + } + + if (!a) { + return [b!.dataset.selecatableKey!]; + } + + if (!b) { + return [a!.dataset.selecatableKey!]; + } + + if (a === b) { + return [a!.dataset.selecatableKey!]; + } + + const nodes = selectables(); + const aIndex = nodes.indexOf(a); + const bIndex = nodes.indexOf(b); + const selection = nodes.slice(Math.min(aIndex, bIndex), Math.max(aIndex, bIndex) + 1); + + console.log(aIndex, bIndex, nodes,); + + return selection.map(n => n.dataset.selectionKey); + }; + + const onPointerDown = (e: PointerEvent) => { + const key = e.target?.dataset.selectionKey; + + if (!key) { + return; + } + + const shift = Boolean(modifier() & Modifier.Shift); + const append = Boolean(modifier() & Modifier.Control); + + // Logic table + // shift | control | behavior | + // ------|---------|---------------------------------------------------| + // true | true | create range from latest to current and append | + // true | false | create range from latest to current and overwrite | + // false | true | append | + // false | false | overwrite / set | + + context.select(shift ? createRange(latest(), e.target as HTMLElement) : [key], { append }); + setLatest(e.target); + }; + + const onKeyboardEvent = (e: KeyboardEvent) => { + if (e.repeat || ['Control', 'Shift'].includes(e.key) === false) { + return; + } + + setModifier(state => { + if (e.shiftKey) { + state |= Modifier.Shift; + } + else { + state &= ~Modifier.Shift; + } + + if (e.ctrlKey) { + state |= Modifier.Control; + } + else { + state &= ~Modifier.Control; + } + + return state; + }); + }; + + onMount(() => { + document.addEventListener('pointerdown', onPointerDown); + document.addEventListener('keydown', onKeyboardEvent); + document.addEventListener('keyup', onKeyboardEvent); + }); + + onCleanup(() => { + if (isServer) { + return; + } + + document.removeEventListener('pointerdown', onPointerDown); + document.removeEventListener('keydown', onKeyboardEvent); + document.removeEventListener('keyup', onKeyboardEvent); + }); + + createEffect(() => { + console.log(selectables()); + }); + + return
{c()}
; +}; + +export const selectable = (element: HTMLElement, value: Accessor) => { + const context = useSelection(); + const key = createUniqueId(); + const isSelected = context.isSelected(key); + + context.add(key, value, element); + + createRenderEffect(() => { + element.dataset.selected = isSelected() ? 'true' : undefined; + }); + + element.classList.add(css.selectable); + element.dataset.selectionKey = key; +}; + +declare module "solid-js" { + namespace JSX { + interface Directives { + selectable: any; + } + } +} \ No newline at end of file diff --git a/src/routes/(editor)/edit.tsx b/src/routes/(editor)/edit.tsx index e5e1144..186ef9b 100644 --- a/src/routes/(editor)/edit.tsx +++ b/src/routes/(editor)/edit.tsx @@ -1,6 +1,6 @@ import { Menu } from "~/features/menu"; import { Sidebar } from "~/components/sidebar"; -import { Component, createEffect, createResource, createSignal, For, onMount, Show } from "solid-js"; +import { Component, createEffect, createMemo, createResource, createSignal, For, onMount, Show } from "solid-js"; import { Grid, load, useFiles } from "~/features/file"; import { createCommand, Modifier, noop } from "~/features/command"; import { GridContextType } from "~/features/file/grid"; @@ -108,6 +108,12 @@ export default function Edit(props) { }, { key: 'a', modifier: Modifier.Control }), } as const; + const mutated = createMemo(() => Object.values(ctx()?.rows ?? {}).filter(row => Object.values(row).some(lang => lang.original !== lang.value))); + + createEffect(() => { + console.log('KAAS', mutated()); + }); + return
@@ -131,7 +137,7 @@ export default function Edit(props) { { - file => {file().name} + (file, icon) => {icon} {file().name} } diff --git a/src/routes/(editor)/experimental.css b/src/routes/(editor)/experimental.css index 986e858..9f0b3d2 100644 --- a/src/routes/(editor)/experimental.css +++ b/src/routes/(editor)/experimental.css @@ -1,6 +1,6 @@ section.index { display: grid; - grid: 100% / auto 1fr; + grid: 100% / auto minmax(0, 1fr); inline-size: 100%; block-size: 100%; @@ -17,6 +17,11 @@ section.index { } & > section { + display: grid; + grid: 100% / 100%; + inline-size: 100%; + block-size: 100%; + padding-inline: 1em; } } \ No newline at end of file diff --git a/src/routes/(editor)/experimental.tsx b/src/routes/(editor)/experimental.tsx index bb89adb..a79539a 100644 --- a/src/routes/(editor)/experimental.tsx +++ b/src/routes/(editor)/experimental.tsx @@ -1,11 +1,12 @@ -import { createEffect, createMemo, createResource, createSignal, For, lazy, onMount, Suspense } from "solid-js"; +import { Component, createEffect, createMemo, createResource, createSignal, For, lazy, onMount, Suspense } from "solid-js"; import { useFiles } from "~/features/file"; import { Menu } from "~/features/menu"; -import "./experimental.css"; import { createCommand, Modifier } from "~/features/command"; import { emptyFolder, FolderEntry, Tree, walk } from "~/components/filetree"; import { createStore, produce } from "solid-js/store"; -import { Tab, Tabs, TabSimple, TabsSimple } from "~/components/tabs"; +import { Tab, Tabs } from "~/components/tabs"; +import "./experimental.css"; +import { selectable, SelectionProvider } from "~/features/selectable"; interface ExperimentalState { files: File[]; @@ -21,7 +22,7 @@ export default function Experimental() { }); const [showHiddenFiles, setShowHiddenFiles] = createSignal(false); const filters = createMemo(() => showHiddenFiles() ? [/^node_modules$/] : [/^node_modules$/, /^\..+$/]); - const [root, { mutate, refetch }] = createResource(() => files.get('root')); + const [root, { mutate, refetch }] = createResource(() => files?.get('root')); createEffect(() => { setState('numberOfFiles', state.files.length); @@ -84,12 +85,6 @@ export default function Experimental() { }, { key: 's', modifier: Modifier.Control | Modifier.Shift }), } as const; - const Content = lazy(async () => { - const text = Promise.resolve('this is text'); - - return { default: () => <>{text} }; - }); - return ( <> @@ -107,23 +102,31 @@ export default function Experimental() {
- + { - file => -
-                  
-                
-
+ file => + + }
-
+
); } + +const Content: Component<{ file: File }> = (props) => { + const [content] = createResource(async () => { + return await props.file.text(); + }); + + return +
{content()}
+
+}; \ No newline at end of file