From 932bbf0b1ef35f808d942afc1905b816ce088e2b Mon Sep 17 00:00:00 2001 From: Steve Ruiz Date: Tue, 30 Apr 2024 10:24:07 +0100 Subject: [PATCH] 3d example (#3647) This PR adds a little example of using 3D transforms in tldraw. ![Kapture 2024-04-30 at 09 52 18](https://github.com/tldraw/tldraw/assets/23072548/c7620384-629b-4914-a842-5783591c9a3a) ### Change Type - [x] `docs` - [x] `improvement` --- apps/examples/public/man.png | Bin 0 -> 23101 bytes apps/examples/public/shadow-man.png | Bin 0 -> 24390 bytes .../popup-shape/PopupShapeExample.tsx | 25 ++++ .../examples/popup-shape/PopupShapeUtil.tsx | 138 ++++++++++++++++++ .../src/examples/popup-shape/README.md | 11 ++ 5 files changed, 174 insertions(+) create mode 100644 apps/examples/public/man.png create mode 100644 apps/examples/public/shadow-man.png create mode 100644 apps/examples/src/examples/popup-shape/PopupShapeExample.tsx create mode 100644 apps/examples/src/examples/popup-shape/PopupShapeUtil.tsx create mode 100644 apps/examples/src/examples/popup-shape/README.md diff --git a/apps/examples/public/man.png b/apps/examples/public/man.png new file mode 100644 index 0000000000000000000000000000000000000000..85554ce6e7cda1b6e0698e4d40ecbbe365e06352 GIT binary patch literal 23101 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 LI-DuDK*j$bCad!5 literal 0 HcmV?d00001 diff --git a/apps/examples/public/shadow-man.png b/apps/examples/public/shadow-man.png new file mode 100644 index 0000000000000000000000000000000000000000..9d892a68a6ef1f17a3a1d6c380159ef984a10d2d GIT binary patch literal 24390 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 z%0AIT2$>~hr524QX-cViwDn%4nN)(Q87;7GNCO@6uzi%2OPf{o(&Oa$hGW*n#+4>t znnGRj{*~*1guOnXNFzM$Di}$?vKcds)39YzFrxqdMbdG>>$s?qFub>RH7`~_vuf$y zKfw2XYQyFkJ(UtVO*D;ZZ#DZr*jiz*KI!IHE5e%fBxAJgQL?td<;gxVzVc5}p?G9> zi1+<@m{;F`Mdezb^0)apZ`oQM*R}o1(iK;E?&Wys31HANM zq>%mG4blGXk7!xW)c`ZJWI5`0lyl@+)|FN9qsl1*_r%u;ef!mSihsW1E%N0)r z;@%NSmkG8I@|aeIQSd~na$a@wxf5QngZj0l_}f*wXI`rzQ1_+F7YC#6#|<4j%Zd3c z<8Iro6VLq_lE06$0Ozc^1ZK$ z*lOR;>o*5*y^j(ui2O?OZ}F0t!XZ~w;^iV&-|;QJl0I%}Y#HSRB{dRgkKVNXOI=#L zz5K}-c9Km}km%LPAx=T`&>hX6ecP{5oWR1oHWw<=@qObin*^W&WFE?5#fdkPz?){C-kb7^J_H!&Q8ZedK4RMbm34Q| z_*%Mr>iU+H*wtmn$2q`pr6Ca6C>3h{l#@%RWRk z-El!Hg|F;Zxodw9+2}^d5&uh9n$|qCmg5@^`_WanA6{ry)yxGSI)D|7{<)-pm0Ns^ z3b5DVWJ@_pgYtfSa-pm}7KP*ZTvVUxY`XQz^!kD5aovIWsgF70YC}#tc8F{@-3&GiP zo5Bd#0;)vgOt>uUH7R)*5uanBaqRy`lM#27lcog7ga#8wzI`ejZc z&29y<7?)+qgEtcMQG3I3udT|cK3GqgT96U~re8D`_xx1$FI?OZ-}CB0@aZ%jobIx} zAyL;}N$)CQU?PAYx#KnZIT>!W6R8MznXH7mp|C_~0sY0@7w=W{AF17U>uP@ES+mgu z!0NLx00)Wp-pYReiRpcA>m4P$H-;K|ofk=_`;u7X?7Sth)=y z{L$NJk&9U_HxwO8w4G(imNp-J$3-ykO(e^VK9CX0Fv&Oq$0aoTWenx@% zHK_WCjLG_zg@x-uj-T_guc~T3M|O{YapUV(;>2~61^wymcp#WdVSPV~gGEL>YU7D* z?d-f-nk*(KWFVyd76;z5KHuu8)4x!@MDv@w)QV=LYW)s&ckM^**Qcv*rcV+IVDb;h z!CbOAfv+7@6fWGRYYQb8W%^U&a9+zScqg$mEEzcf5~C*+yDLFOULuaNC=u~Bkl>`p zUjadHU)lV9at462Vlc9;HtGtYX((vXa^l?IUxp*08rOYUb(bo4$ZleZBX@W-#J13o z>7b-c{y~LBwR-Fa;d^tye8FCo90^!lp_RU>$yw=Qb!(^ro+ zD^*D0Io2&9zHCv>Bb~UQaz0FsnA>)uCP#S{ zq{(g@I4(V59tC{}xPED)o}_dcsqRqk**kJ=UxkB2 zUQ4Cj_*qUtY))eNQ}Kx=l|r2`Kf@9Nzub7-cwyYpv5&)y5*ku|O={niNttfg|1ZkL z`N9c^n|R;W#O&ezg46`{A$I5Q!7+8(9L4iaGyf8i&Pi(_k7P!ubIa?Oa5NYv-Xb}; z(w|LKOmx_9Xr(op7Tn@l;2=Ph2s(w%^KkBzHX75V{@c?2>PAtNqA3lWSzNUlG zihjFMWc_+-P>E{1O;G8bgTr$>v+W=JSsGZ;k00-{QYx>l2&BO>ivv%(E}B-28}p>8eJHT71fQa)Oh+ZaYwe3z3tA=`{r)CP zjyz>0>6J?2Z;#5^lK{qAYu|;-r!U<)%p~nfpov0&@j2o8R7NO`XuywkuU9f3&SaH!nc{YUKC&i?Y8bu~~W_9#P=wENV|xpK6+HACBb4F@RI4 z>*RZH52P8yhyV%@cK~o^RYS)4vlNX|{Obba=y|sCEBn(3Dd)dW^PhAvZHz@e2fp#S zh0Lm(zxyzT2&Pm8c1@M5Pel-y{Ueo+5AJ8vnn>LK;|U~s#DZwEpq~tN^5ab9AM>r$ zMk%11Rs34%?Z71Rva%XdJY6=s_Q}1~RMt_ounKc4Y~PjyrKXp}ZBtL@UI5&@+;Y{S zGvvaks&>Wr%Q<e_;6HEl*_&0AclETRkm+h2REU%XFRb1!Aq#MZxK|L!lj<9&my^B=)85~ zGLHJPsVN&q34UQ)KTQaG(PeUH-8^F|Jsc&Fv=!GodAIn<>+l!i++fP>g8RKh-dJ$< zKRh`9v1+Rb`A9I${m}#F1~q!KcWacV9z}Yw&!SW-GXC3R=nF1%145i*^A=YIeZJ51 zW~v41fSjrWeqv+C`gDK0>@Nmo^E2~l(5-yTUP+;Y$~EVJGes4gKz;tZ{~hF8JoIh6 zv+(5TOZ+YS3q96Y&8Fvl!O#*9783Z|hmx@5$G$GsIeBV~ATrMc_e81%?McVRbD)@9 z*uXDlEXPD%aKdh^OYeWwJy}bBKuAKykN4>D-~ne(HN2thcdF)+5j;<*CN3xzH|W|w zCXnx#{NRR?NQ0W>raA{j305WImioe;mvLU9KuZ2~Q#dw%Yjv~S?g9wr2-kP-Hv75b z6xz{+>s`PNFySh-T=*WA1SuZuyYECXel~pkR3*sBksK_oPPYOI2ST1BR=B?Smn5bJirh{&hVh)?meqM&l9~KF-f%D6S})zlqz#uj(>i-(m-#hb>qWaGVWX` zyPRY_rU9kC4l0SfC5kuqhfFVKH%;1ZLqSy%Evl*-?VXIOoe*T!a`e;~YryAK`MQjD z+FJ|M<%ceMvjO96V@}UfqF%Z2xOc>-d;0h>V>H5Cx)x{-ScnM7Lk*{v-{&F<^|Lxf zxEpLhvTM$s`4>%e1 zLnwbRB9z2?)mD7yFu^LL22Ck(y97fdA*e6y+#B?moE4c|Ip$dg} z^qtNzKNuOe|9$~p>1D=l#Uqx?WF{){*<`tc=rZ<@tTrbbhNyu{F~KMtz~sVJ_{YWD z7V%Ck1I~eKD4&U$R-)1trWyyH{%l%mP7CgiMMa?Uj%0=qcEzWK;Oiqo4sa@_5 zvb9c>za%#h{sAwj(Q$_wg03GOPKk11qB+Z$!8?URT^;6}|KnW^Pikt`J0KYS-@a4( z`5%(vMzdfu(h2>ge9DBHotr|PEE@5gDH-H&3|e<8{%1-x2?2hI6y9!QSkV1A!PX$6 zh~*%GY^NySPk~ANI*Jj%=6}Myj6!(*#|sW%clQ|^_@&4GvB;$ljBTTZ3>c^}!}U3xgoh6A?w2>|6A9Vcq`Qx8BMj2~H&bykHXe9YB6)$rNLN z*u{@d0`KEfDsk3i8mQ{()?$T@nw^xw^%T3$?suzOq;Qz3Q4n;w6EzNlG*t0haS1f< z_)8FJawF(tu4Zci-l1SSiGrR0F;(2xigok*yfLgJLh@jC|B`4vy@sIHtZ$Jz9LKx25JnH zGJ_!qoZHfxKGzpR?wrCLk9NBCbBeDU>$HKXBP)2J_9eeb>n_J^Zg}jeiV=sYt_p3l zJQB_5iX|9#)$}FRRBk$N?Q1ve|--& zzFjj@fTe&dxxzA~g`kAV6f*~=##Ooq8TEmX7x(2_GUZgDJ z8q+^fUixP)_nrcKSF6l_H<8yk1;+K(FFmK+Q55>Yojq4}X+q@ApFO2M2InNjx*UW@ zTx?3;VMprq_@DZzqJGohCFWcWo%iPcJs>SZVeQk%tj#dyXB3B3ACUwj^z)=%LdU_k zDf?59_vrVB?7WGNjFVBIS$9fmpN_3U8ql?qDx|ENQ2XuB>?8a#*!}FgDq9`rXo7>$ zbp7TRaxluOj?XpxfZPf!%XNWmYy3!tU$@=6y;_4W^ENe*UulDD7bhIfUNb-|+`@!b z-Q153J6h}74lFieaNQr7uK(!0Fl{rJ#kmy|7K@~Q(aoDlu+6WkTpW_ZUll)xKX!w5 z|97%CYg+{>T6i~M4T*HFB<#enxSxRsDXN$pZ#7_K*A{h4QzhJnPk8y*zgL*j ziy`F4>-3!tX`4^`5-srp>hvEN@=?Ivw8KzM68B;0b~~K{tYYyeS*b z>Mc`-C4ym4hP-%R4eayeTry}oA@d9>Gn#W(c@tdY4^K8sSJ4job7q{VL<@D^7M?~D zO8GJq_c_!dNO?1DPocuIE&grauZcz2m$zrb_IP@bgudsFv2$&L!*faMFNWHpLGwRe z!L3$!MIEr8OOLkVzdCkwEDcX<{)iA=>m?jP;YF*Nda*pi{-f-8qxq{YH!D)eY@cT; z=j)~i{PlZ$PDnK7Ybx8b!1mW*C-y>@g|Xnw3X)1*IWQzB*}e(b9`TCt!y|vZIhR^R z$Q&yoq~oM50+}TZU6Z}PD%x(X5c({&K&tu08>nCk=AF%7A@E@0?e$gt`24w>Hzo*8 zY79}J#^Pqau7y8SF!ENa>eAXo`XVI&B~jC`Z*(7ikIB6< zOJ>LM*Y;P$AJx%xp1uc(AtN3cw!f0?Q(6ko;Q3^;!(L=FF_V}Mp^*6 zpVbq|+`nX4zOSBu(?^@}Plc?etComRr;CHD2R;Y#wwcMQmOgrg;lFNZ5{+Go;*ryDYaj zwQFzH(=S zXP6mCK&8$}ur{T|Y@=wpl&1Zw+$U6DDDNBk$+yk~eo}|Wf=E$W6^Lh*8@<%?`>)`L zs$r+#ZC_P)gEtK_cela{Uyy^zF%De%UC+9+c&3$SGnr0Uj4_%3)b5^Jd;i^|IRin8M__I39G`ZtR6)@;d^W+WGQ^G4e2 z)9u^4l35$>>hD)HPB;x>)#!>iZSPyO!W!5|c2x-hS~NP?5=*Yh--S2+(} zVxnX_8t1D;#p!=A2o=ccCM&8zJ!mdUMkOlcDN~ zXJf^9Q@L(_agQ`Oo`{NtO30vs6pm zKkYSYhW+95sJBR!1HjkfX^SWXc40Th9-&r=b4|A|3YY(NV5;6VU};Bxan{2w?C7VC zyY7qvQ6lFZ%_@xQ2B`S1$+CvnK~`Iq`hyf$`c6DkhC1q9r1dlR44i(-GCoX4+s{rb zvl5wTSneoiyu4}`Zhq3B!%aNOrH7a0Z$fAcYw(i#q=9BxWluE7MHNW_Dc|qzaaZdX zqok78@WH=r9x(GQyz!EEuVnxYYyW8-vo7n4`^NC>d7BuSk5#6F0uhS)VF$lnCd-Gv zjK(oeCX%eb1(nZga;WG`!!I};yo|Bluwk`NLhV6Mqwz9P z2QruwG?^bX$qRwP^Up_}%kC9j=i2*SUo}hyKYg6IH|v06#K)GkKGxY0{Xxf?50_{<$6( zQOQt>o#?TRMh!&@p z>R%$--2y?q4llu&oVZS7GZLhHrD-$UoA5hSUjJ$5Mz_2&T)54M%K97Qn$&m(@djl7sl z*~$U;UJ@%h{=*$o`kNPZ1D_oqxwrYqs{1`_up9IQGxK#IiE@rvS5yON|M3_MHFw&wandwN z_gHwUDsfNxTj)grI^DHTzTl3VcuN%M(dfvB*M#Ze$NHi0X#CAg_sD&2;-+oc$syw6 zq^@YvulD4y+z=zKr(sWqLW92ISKLktUBqZ1S#qbmwxZO3jmfa0<$=vxH)BDtIZEiv z0@O7$fTb@BCLNodd&R>Qg~*<hPm}@(1f?|zqbFu&|?Ruzvkobq*i+z9dPCEO7*2J1V%V~WfY@lNikjzJLUp~%L=mgcq`*XyDjUp&wy%$6|D)E!@3|;sGj6cd~kyQo*W!8=P>>EeYNbsHg*f>dY>M3 z_en_{8Cdj@!Efue=Xa+Hg|Ygwk9uT0p<_OS1~&WCe_e(?8#lLivmM6axuxcw!Qc+# z6APg5^6>C>DmduT>e~<8;+W>ny)4T2xFcoAF04DeBH;8j!8dp6J}ow%*}JOol^5;8 z<@jbX`(i#Rs|juqyNgRFH}@2yCM?RFZdouxYpoW7QCfY3&)ufP)SrU?`~Qi_&Ho3Y;E36v}VhvzFn%Rmkb&qTL=^=c3{xxlBv008z)Oc$uB! zJeX_>Uq3j3e!;da$}5SVde5GWtlu$H0mL)~o2P~)!3KK*5 zpB#@eK$Z>Eur}(@Q|wkzrYH`!aKx=KRARl{f8NZO`NFk(g@zd9rRm#pJ=T7q6gMsq zz?S0AC7+J}VqxbuZ~P5q0;7UybWQ$jXOe)ah2JEAcC0HzO*oShp%OYJ$FnPbHyeJa=Lg@~c$tSIZ zrg4c;Z~kbPtA%#Dd^A_ee*2PKU|^~4R*PZb2d5BFEKbJfXPbg0iSiUN7$iLFxEJ$f znhZZOmlK19!9ikjwx!mVxH!<-Lm}d59}-4Ckih%TN!4EvC27-I+9dF9#}1redaM0s zwfx|^@^Dw(`5kH$+Jn9g5Zc;uFsFRn9Po-&$3TPJm=vWF7M7l$EL^Xp5z^o)mgduu zS?6%Wp{Y)*c=I3%=Vr85{re0%7>4Ut`YzmbTMN2h_mv0%JoLzc;PPxw#bQEFR;Ysf zAq8ysc?OQv_*C@f3K8{=U>J)-tO6PzI}p<`m^WBh7fV)z0$NRT%SU2|VY7t7_o-cw z1GIoJJ=HiDQK%OW_}7~}57Hmy-GFbR+Y7@VNs8=_hMu=PYgWTiLtEbDy~sNcz#jpf z8?2p{>nz1KmwQw4Iy4ivS9H2sZI-Q+kY+9NeT3}k#^xyiiYK|h_XkB|IP~0SX`ZV+ zbd{rHui9isarvtcLhDT_5H4h12STy*WL*cDDu8DT|8$`N5zvB)HIhNuRTWnf=nN@+ zwiB^zW|07X0ltf|WRnKF`7C}-bti$tI+_g+F4Ls;Nb_5Te@f~^`}bsB;O*$Zl6IwG z@XtOCuHMfIK|wlD;{x+7n5s991gvc`<-m>fj~w$qExwc1=9T=QgVqEL^;R0;V}!So zDW~y{28E}749&!Iv!&)PPA1ZXdanX zGrk)FuXTGr*VP#~4=ne)umVl|kWgNaL3j|FI?T=>YmR{D9cBC~JZmBuynC|P$P8nFlLEKIaFyFl?37iffG~qCkU5 zp?}rQ`w64k*?o(ITd8N3+4_O_ktMiIpsvEa^v43*UV>oD`|VgDJO+;2=elo z)$ScX%f@!koHy#H602Z%uP;Bo@^o%B7`XN2fOLRpk`F}g9=+dM(;=uP-Y_(to_gP7 zGwjO?-42yjez+MxF{J)M(L^tpAK{`%;zbUT#24Cp6A)sQHS>EX!B)xA2?_;{RSX%q*?EGU|WFM|afZgi|Z-JFzKmp1dw= zI)`xcJaM!K9EI!s#ww^_q^PRA`vb@_g~rr-C{5V!`!W5}OA z^(MhVt?xwFS=RM#S|Q2%6NOP;D|z$Q#rNy2gB!&vckllFNXZBZPWvJHdNjr8>ZnY6 zvCDk>@NFKEm_mOVBf_jAoIVB9#^(Du;a^ci-Q~nZv%RfWZLB|)<`^S^uZ#BcpV6$V zH_a@!Wz>QdNKc+>0^q-T6*F#QIe?Jr**2b*VN|ef;vQx#HdN_KM{5eYoox51wDVEq zip}m*A?bT(=#4m;kBRj}90gWUo#kZ1(^3^8L!`pnV2W zXm#B*dEE<*S=A1Bs6?%5HKw=16>uf->iYBDwY<%>K@mU<4Y72~Inkv(weeO9Mtb{r z@opRQ3&7Tc$W8EqyW%+GH%LeAMPfZ{6r0-#jwl!e&#F(`!GJO{0|H29Y+vAS{ zbjH%dkIsMC#ZCqmO&8&McbuT`-G>Sx)!#l!eIb8|P0c?0+wDaOm?eBa3tCk)5p45E zqB{>hPV=eIgtkoAC+zw|D>%Otf;aI263f2okOC(HIrk=9*Op@0L@5-?_pGq|ZgVeu7AD;aU9W@#87ho_Xm9d*S!3-(LVkc0|!9#`|=ESxbbvzM9Ly;G4Mb# z!7&(2WNrzHd?|l^S4{_@SArdG1?C)4tUHEI5)e=AyC%{x@W-k5$I=D}Jf0Z_X z5V)2HT{r{u>T*Z-e1Ey5jbe`O`qpfX*J{<(nBw|cuA6k2EcA;sS?=d%aY_F}To$Fl zl6vYHcCW;a55W0lmIXgDK{2`M#{lgPxx6P|SGJS5fGN!B?aaFp{;&c^C5DKO&_Ks5 zcs5yeABCiqbOz@%Td^YEK5p7zn*@`CQ||l^-g(A;PT0Rg`v4v0vVEsx5J3foA>Pdi zQ>8r{>nV)f=artkWi=Q2F7?yytVQ5hIVxF){+`ttls47up~D+7Mxy_SIGyQqRCpqy zbt$>Zu^QOEB7k6vzfnsCwmM)fFR&_~S|J%UVo$uKSD0+5tclF}Xqn;&A%*zU2!8i3 zB3|1MRA*MzWS3o$Fiip0zQ-~ZICttvvGFST`-t?C-HMK}Ja+Qr}kOpxC+CuM!MWJiuoTNd$7OEyUfmoQF>$zG1A@67~aIqE{@Z;p|ptS&j$2i7IUnOg?;0@(;)aw1KhPmQYg-|xQv z-?avhsSxiC0QfRk955IJ_V1!~jO-Ed%pk*;HL1o8)*!2}Ds*1# zvx#p)-`nS1-KzMM;gkrv=-oKNuh(7C2DSlEW}>^tHy?k~lLN)!MlZNo*-2eR(;DC5 z1`}LvNhrf{6mS)*#pWxX1K5U)dQv(`zV}UK9;T|a z|9Nu7p+XFoYq&pHT9>sNU z^xK(Kl??84WN6;`{k3nkD==M?oJ z*7)0&_e0W=rx&Rv@(MnIUyUDlT44$kK;cRKG)Dn-3AGmo0SFM*rofYfSPm%vx=1{E z7mnM0(ou!*nB#4K~6*)>U)|%pCX1dqX+tQBSxw=J5&w1)vqZ zR?@OOU1CXa+L+C&Dt7p4@`F}U>fRZ-fnxIclMoWP%>qo4SftZzeg8eT&FU63VV*$@ ziGJw-g_F>KGr1Ava%a`dDby1xB^BT|gtL}8f74CE>&O9xGyiI4XT^J>oX2js#N)Q7 zN2*MMQ1W4glU{SiaR@JF@iozpejPXbdVWqxITVuKU9G4lfhxYNz3iQ#fxP)3dYqkc zoP#FAGzCfYggs!vdp6S&OB`&+9`C>C%L*Ez!h=m>YdgiFTsA0v-K;Z){_rwur^jHT zK-bjIiK#C|2QzDAqp*igt`G=pk9y~c1Fu;vq)1G4!7WkpqxKbgnl4TN05AIA{{mQg z5W!%|*AKs=T(o~2va;gMs};Zv&(=N42hP;6FmAiCuEup2OmX@`(Pjom?!!=cn=yxI z{}Y+aKO>A&Zwsqvu=8)L{*sSw!)#l~@^928?h*CCtuV;7sDSF!We7zAvFtzILy}mn zSkNCdL<`-g!>q!1E6Zn1S&@wlYOk|PHK0SEn^wS(>xXB>Dkw1Gt&AtT+pwe{3AE*z z&~uK)9<*O=xSD5PG3ujdHYNB?3VBZ{F_wN5`V0ah(dwS4|8klA$INEb>JWE%zY%2- z(Vj*0@Kpc3yTn`oE}An$$N~r!myOer-Ht_!D3)W25ZBom9&-#(gC?0W*?*$#7q>2)YMU7x(c#5eV;Fn63M`YiYs66QN*PKHT3`e z82s#D`@9$l_P6U+8LO})1r|a6G5}Uo(21T{zncSv+lHGLpX+(COrp7_!kDFuiH2wV zt@^o3EMo1+#Uvqn>GsM<5dt>g%0zQYVpleG*9nD#iTbDoGikBtksur@t06VDuH zm> zJ?fs15%a*+j$?jjSqonGT&1HxT4khUKrrL8?-+xl9ZCaxc)m)jxn0gspa1oJCzmt1 zUKW2i<+iyR@%=J7;UwVy9{(R1341S$39ta5Dn?r+{;FVM$F()Nu{hX!3VRsw=n(yP zQC@7-c|Ye)kxTb*ddgtE#T&FQ7dw|NtT)z z%36^OA!M7u$WrtZO7`t((U7v0Eo)x^5OmP{s-?I#~kzF znVDy~ulu^rYdO!7zzd~@h$iWpquQP=oYJiq6olfchO z%-(wM#0Gl~ciR49ktxLbI$i{HN!VAE1Hpx{r)z0J+o=)GOQ6lpesaX+J#Y)|)t(J# z405;T*BDFWKAQyh2+PcO&F$9g-nh45a9;S`qgx;StvD)c?ml7K2A(7SJy z3WxxhtU!N{kAmu)>1tx6%+^dgu6(}`*d>`oRp9wwYKS=_i^mr?S*0 z#04%Cg+fv$((eT}hG*cd!1}+}FtT?9Nh3|^Fs-ES9wHR1Gim$a&tMoXv@>y<2VXG{ zs{L(eFTQ?=MlLj_TnZ3{+49`)4#|0yjSeXaAf*>3wHP4o$1 zw)OM7>|@OSI2J3|yi;algRRo^a|Msyh#Lv?P>5Z^!ysDHv@i04=6BypE=X+MB?8(| z7$gff&1}Ab2}nG80L@fY{_HV>i=Z7_Sf9y^i}(|m68g+)H2J_divwa=UsM*|(H!9I zK|`CtjSP2^Om)Y1e}^wjGi{8$zL1XP-W}Uu{rV^SRu?M`2rHti;PzN+~fkxP%b)06x^xcvxC3|TfXCN{0+5a2MJ>F8djN1JUJ%^-Y^5wZTD z&}A@m%_6^DGnCcX=NHoXtr-Qi|5S%nAjI5)jIH%Nq+i1pM$@-#SpflAAd1c)!b39< z@c3`swcexg(#?%E%%mFqQR40I-pf9#%ibFkwAWpUQYwp3=Mfq0r@i#DvmQxaBvTOa ztiNHekQ2{%Aj>?GfU*%^j^!h>4xYN93K!HJ#lzQCOlxmq+%(vsZ16MxHUZ>C=;HI| z+>J?AD5mQB&(?sO5eKYEsh_N3#=|V=Ry<^QRsr;S20gf!ItVjCtvoR9lFB_mVHirO z%OW|bUdeJ9yrKP{e^+t#hvN9fJPv52BoPQTD0mLS17NZ0_$ntrGr6fHGp3$^aKm}N zFY>;twr0akC8Pg}3k^$vsijN%fzwhsX5ayqEj^-M3*n;vBQbqD_yP>L0MglsGarXk z>)9StSF_%oYLhVcl=xo$HyQb9Y7xQ}2L@~~FRJ~wq?iRw{N^MSl)6NiNS}BtPZjTb zllgcL{*+_xwgDUL-$<{!#LzNQW>tI~e;S9=a%;0(e zxitJ<9tsgDm{Q7_7Ng$3xAd}AlN%`tz(-|iG)^B>^D`xva;l)=E1U)(Hz=lcg1Z#x z{!(BC+`%oI_HIF#20KhcJ~;I-8v1NX9xwRt2)T#9hgtkR1I?{LiyS_?NB8Y8H^&?| zGrg|qUzs9+gZPPb$DFNB)*h|bpi0`Uh6dNr98Ei1xPlvSz2DT!d%BGs=5}qod=1U? z=<%pD(C)%0gyTFh0s`;p;Y_nyb7>eiDfQ%P2s!bfMW=ojKZ1VQ?zX$9L`MSh(Yn;R zt&r;xhKmi_-^>ZIPo(2_PR0SL{FFD2LE+^SPTqVSMhnP++IF_s$)3m=4*aQm)+4MM z2|SOQSl=0%)}E16iSJ5GvpR=e|LaU28z~R^M&?IXLqdqP zvB51Ydj<)L0O7xX{5Trf@NACEqs#l}I|i4-wEN~!97waoG!5fMbs@EAr{{n*pA1-W zFghK7R5u`SbaU|C#>-xRhgXi;RB?B^W||5h<(z!4eDM^%XN)VO0h@0xkX{%l`TL-r zc!}w!0U;P?H7aN9h(hE(&Y1RU(5iF{l#Y88i@{AXo1Qrkm^0bV)>0ss`pmJzk?5z~ z82iWe!2=wSd*!pd5D~mOQZ5jzEH?uM9_2hfq)LN2AGEDyHHXyf8)BJ#GS>|S7@~jd zBpMl3>lJ|>SeOt$?H6a-2Y*?f;llTnD+}#os^-*K7rg;#G=$_*m8KHxJgb(WMd4`c z$YRAqsiGT$->FJ2Z48)wFx>bIRRsRRD{afuM z7TCT3nGKP|8}hgJL7Z18ztuU#MPsiut%k4ySaq;7f;}gix_>g79+qb&V4TWJO}{dt zs#F|B@7lizDs+#P1gULU0YJyc7c|?Bzph$FPEsP_|cVN!`qi!`M?~ z?8R26{HvJ$B=HJb6s_dN^J&7h-AIV&dtvw5I2_o2_s;!FXSm{n7)$flM@}D9Mq&PI zULoUTU#H0;a5u)~j``kUIHl=FOLdJD-#K#;{Jm?-XvDF>l|a$yTdpcv&Pm~(NC7Y* zu9AoBTYqbL`!;Ezz5q8Mcf2>V%N0Om(&SS7Xc+PyDnWXXb)5<;HV7ORDk+`10 zi8!BD8C5p~l(PlrFxqjxGm&||PxFYn&-1u}?>B8^br480l>t0Y2Q)Li*g+dLI5jUp z1jcpjK)S%SW)L5N?!mp40E{_O%7tHjxv|=LGhPGWlQ~9K7;bd+P!r{J!4(}~;zgJD z>+M+js1_Qjrk{^gp!-zx#TnJc1W(lB1Mnu=3nfG*G#*-*9Ar@B@X>u1^y>Kz@bLg7 z^~q7)Go)COS!?@28b79PxXZyanr0J7m~YhlhpX(BDZPvl@H@Np;B4eft2udmm04{~Y>efw7%l;PXbkIYc^k z!sX}_3joA~lT83~&s6E?GcPM<+1M3JGOIus1{wi$nY6knKz;E`bT&o-7<>5zlLIqu zf)_zbt?=?8t*-rSMHFQy4B(kyb3FeJ z1V~Eb2f%}`5BCf>-wg)(OJ^8hEj*;a@L(f_D~zyce|}t+S^Hy?HCFMiyx_z$!;?w$ zYZ^V5P|R2h9Uo`1<_EG;q6`g^$xOC4(M|9T-duasKSj94g-IP?M4zG>yA6;4hlP|R z`ZcgNzN*+z(EUY)i%1q3TAJj{c<%Ju(O=`w--Nr)Bxtad26sMgd@IwL8IWqd=P*jX>a#818(9m z1J}JBCE0$}t{JRY02Y|ox$&WIym*FPx2DH<6`dExxsHF`E5Ph{b^kRq9EQ7rTK0w2 z2yhLSi%@RbYbKDX3Uqkf^6aKS&|gpWpUwe{!R^(Gk{CY&Ll3VX7^`}~aPb(OV6%J@J*rZw*h4>B2UlwQjwYO(?De@u? z-n73=InOd~Q%R;r@5?Zn^v;Bg?RLWLVJF}f+Kywb9MOPqs(*A3RcR0MHJc|mg*A3* zxj zz!+TS=93C}ASt60L^#i)3L{=VO{lH}q5OZ2HiDTuQ2)F=DlHrwRU?iM{cAnP@Y2eS z8*SOI33l~;RVxgr6iC~Zm}t~z?ZVqyY7Uo7h;KR$eSp0hzFsIVUTtDI`^R*IqmhmX z(>vEW;7!`d1MdN~1(yZ+37a-brv;t0XBIdzTXE(OyJNgTp?F$E{HKcsI~mNGgx$?t z(C)|T33qs)BVFDLKMKkw2{TfmT)KMpB5=Q3WNo!^S-U0)4ZH>2iCOzIx*}C+4fAvA z(YYtgvIm1pzxrLTD_-*;m!>WIh*xqVTN2YZcgAZZAJsJOzF1_g&tT`0?Cg>jVS1Et zT5@BMUD-bb@#~`_16h?LM{-ZtU;amfHf!sH6x!vCzPbeTiDW;v;=U0}>yYo8y=wXP zMTawBt)^Ou>CA_D)9f7h=flnk=fZG%hbA@Y6ZthpKwWIA7lo;`)EKs=DC~?DRw)e# z3Ni~Cc+qzh0j)&o@Kahkp;%$fV2YROCLs<~Xnsnjzed674^z5w4e);ok~Vx=%Qu-@ zv!X{y{@$eP6s)8rLeX7F53D|%N{oLd0E}{fs}@G{uPgC;k8Y@?4B(IwEt4aWO4?`u zRtQSA=qEU3N>$+I(a77?jAI(q^s7ITjJX@I{}xJfL-ZRI`|u8?vu?X;S=x+-mN-0e z9|bFInwx<=5F5lfDH4feuCLYx>ud(bN=j@vxS0MH=9Ypp1?V6zhP7($%n#~mNeS7ny zkwUysno$SqK!Lep1*|xSN?%>Q#*B{ps?iKWp0?~=LiO7)T#o#UhD2H)56X$Qy{b&r z8vFRSBQ2%$rTj#)U8ayI{NxoFh;SDLDj4OldG?--nuwqu8q-pX)4*#S(!FxXUhe|X zU%@GG?nty$S|&G^#?-+^VYK`Fr^f9+R8AZsTLFIl_m*SokJEZ^G8GHcHcfqgzWDny zI#23vJG(_!X2Qq(ia%rmFJ$}ZYOV^D&T=z2k5wok&eFspq&Z=x?k=fUw*<+hFMq$X zc{=c2hcP+8h42>T+L0-jE@Z8l%@Xb#@nA>N#x*m5hR(1&A|}A}=>F9Ja+$40I&k}| zB44(?b_!JySYq`9y$(R>r9fY?oh{1@!7?kB>l}j@=_c+-;;(FlRS2+{bHzP$gRIZV z`Xx_+s4%s!{Z0v5f$Fw@&6_E?N-WYfAyg3C%Eu;20JYwtpt*MBCv-~or&jN^?=HRD z&XVg2=KXb8*Ka}eX#rL?%r#$q4?e{LepW1yf!*hf=gm?-z={pSZFJQyLhj)>vdg-m z=1_L&m131wZLl&A)#g=Ie)kj^>s?QAt^ph8;`(y-4=&8NTHJjkk!P_^zRKOGkfA~( zaSVa(jPPfld>xtaJQiBd4- zzP-Lx-u->dB)`3VhcexjD*vYol-Z`-C zk}=(kS)I@i@!u~Q0Mhh%KJwO7xJ6)-d|>zsgeAOs_V5lU+}n-Q^a6$R+cLS>wK~V* zCzm&jNU?vI7nCyAK`7IG#PRpu=v}#Ie{L9=p}JfqW+gOeOOR1wDMN1XgwQBo_xv)- zeBA59Aji>O1<~n+Fa<->*JBnER ztFq@RWw_7v=CQ`c(TLazj}MlR$toyho`9ogYZ*|`;)U=rU_XUH)vhdAtN$LsGAQ{WpQ}g~gz0nu<{jDIhF8!9l2z+04 zrEpnKnG`zYncNkC4%-N3o#KEH!9E_J`{BOq$TD>~VD)Y^9ZqIMFy$^s+h=BT!bI(> z!!^Ye2P0HcccG|03RC3tklCem+Th2tgVzyFfis6E((4l$zht%;A&>7wO#Y5qdg8dL zCc6FP+Bf{m)fbgSYUAGcFDOjBZF5Pf-Pk|J|BVpG%iCIEjsaLG-p^Rj_<5Rq^Z_85 zmM}Qw9!MB}j*B&4`xVIsH_Ct0vX_Y|(o-DO0R>fOtJX>*p9jC~#9;07YrIkP;6k5? zxB!#wIE&G|3Z9~MjO{j+Xpw-zTO`XywbT4F)(gkS(pl~6OY??IKBdkTH|>!e6vhdA zKWIDW^oAErh0#tPnW!0`%d!YtGcFgP8e7E(sw4I^z6@-_{RT>)u(vYu$Az^F#|`ku z6EGRLi>^FX5w0tjlvcWF#GVE%QqtJPDmjyM0l>O0s-$qyP8PoAhiA@;``|N12pz@P zwH3n$r?$1re+M%=7WtnJ@Ee8GZaw4P&_Mas6Z2neT5g;lym1r%A_)v$T3E_P8EcLc z(nlX_e%`abx=`c$j3VxOQ|dA94Y6%c2Ysw&<`(F)+%66Ag=sxvnX^f08&f4hB(*+C zE~ao<{J`Yi4tF@o3$0*Y(d9hKG}9Y*<2C#c>B%e0b*k#*Sla^c_fMr8V%3`-U|LYv zX)C+OO}s4uJZjVY#{q&XyJSZSpUte4|GFZ0_#}&Og zxC>4pAdz^O_+)m3gKGR!X9BnxZ+gLTN=Gn5SmR$E?}>Le6H5g|S!xE)sBY@46I4`}O>pcQ?n0=e_1F0eeCCLT==fE+y+y z)6d!5rR{I4-ix0(@KNG&{zkEA910;k;ed$SLd<0);ooZ>O>6Sh^vc5)6IJz+T0cy8 zd&nu}T!!+P~FisAWa(B!)X z-UkdHUE=S4H(}#ad~k?m@38N_BBIF)uj}E>vkR^QxSPmqJ7{|Z>KoVDQCl_Zx%Y8` z?8_iZ?}90-q`6aO7@9M5qvFw8rmS)aMQC4i~VHM}Gg!-))~kdAe~ z$v^M>E+H@WTdbJuT$avRYP!SHp{53*lQasA))&b;StqNmXm$6^;{4VYTTBn@jt4&8 zE+w7~S%3AZiLrQ8maT;owqLz#lm7tQ2o+Pr)&qiAzTk~Q}p6VmcY3(sFc>>fz8ZZ+!+ zPmH4%=muw6xQ+NI+n-h4(Kbw2SFn2=qj-Im|LZDr_?Ip8>)S|HYP6nn^g!DO06)#& zH9;brGJ7z zyn6Jf2vPq~WFjxS!l@QtPHw0w#!5t*`QyL^GArqYQP<$T-%bA5Gkb=rCGDPT*6BL=vUv+=7(s-IPxJdWb;i>|PbuDd&TJ!xsD z(5}p%NN$fQ@RZ6vzG&|)B^Vc!!}H`q0-pouU-MoQ)JsU+f3-9yDl8pZauVc|$;G&+ z>DBG)Ccguz_O(0lC5_H(oUgo3Hn3LMN$LpCqZFPcvRuy#70kATS5XWo?0TD|?P4Zf z{os9Ig8N16szs@rq3ToW84gPldend+h07KGSJeaxW}>+@z-^jk5T}Y=J7FL zxcfKveloaRmF|H?T+F7Ax@ukOUFb`qw0NCf7ewXO=8gazIZ0()$Kgd0sm$G0)851f zV&gR-Ni`O`QZ!%ku0LuionDzM-@`n1-ea!__s$a@wkE6*`%A0U9iQpf&;`ytzq*EZ zL&2@3`QNy^tFH|RxSCkzJAu*Bm^dM98T#c~i_wge#m6r?DXmI{{5{&ypr+eESJmUT z{rhis!{wM?R?{NF}E{>$A?>3HAB7vqltFJr?i7m5sS GMf?YHXimQX literal 0 HcmV?d00001 diff --git a/apps/examples/src/examples/popup-shape/PopupShapeExample.tsx b/apps/examples/src/examples/popup-shape/PopupShapeExample.tsx new file mode 100644 index 000000000..b05fd8615 --- /dev/null +++ b/apps/examples/src/examples/popup-shape/PopupShapeExample.tsx @@ -0,0 +1,25 @@ +import { Tldraw } from 'tldraw' +import 'tldraw/tldraw.css' +import { PopupShapeUtil } from './PopupShapeUtil' + +const customShapeUtils = [PopupShapeUtil] + +export default function PopupShapeExample() { + return ( +
+ { + for (let i = 0; i < 9; i++) { + editor.createShape({ + type: 'my-popup-shape', + x: (i % 3) * 220, + y: Math.floor(i / 3) * 220, + }) + } + editor.zoomToContent({ duration: 0 }) + }} + /> +
+ ) +} diff --git a/apps/examples/src/examples/popup-shape/PopupShapeUtil.tsx b/apps/examples/src/examples/popup-shape/PopupShapeUtil.tsx new file mode 100644 index 000000000..184552e79 --- /dev/null +++ b/apps/examples/src/examples/popup-shape/PopupShapeUtil.tsx @@ -0,0 +1,138 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +import { useEffect, useRef, useState } from 'react' +import { + BaseBoxShapeUtil, + HTMLContainer, + ShapeProps, + T, + TLBaseShape, + stopEventPropagation, +} from 'tldraw' + +type IMyPopupShape = TLBaseShape< + 'my-popup-shape', + { + w: number + h: number + animal: number + } +> + +export class PopupShapeUtil extends BaseBoxShapeUtil { + static override type = 'my-popup-shape' as const + static override props: ShapeProps = { + w: T.number, + h: T.number, + animal: T.number, + } + + getDefaultProps(): IMyPopupShape['props'] { + return { + w: 200, + h: 200, + animal: 0, + } + } + + component(shape: IMyPopupShape) { + const [popped, setPopped] = useState(false) + + const ref = useRef(null) + const ref2 = useRef(null) + + useEffect(() => { + const elm = ref.current + if (!elm) return + const elm2 = ref2.current + if (!elm2) return + if (popped) { + // man + // elm2.style.transform = `rotateX(0deg) translateY(0px) translateZ(0px)` + // note + elm.style.transform = `rotateX(0deg) translateY(0px) translateZ(0px)` + } else { + // man + // elm.style.transform = `rotateX(-50deg) translateY(5px) translateZ(0px)` + // elm2.style.transform = `scaleY(.8)` + // note + elm.style.transform = `rotateX(20deg)` + } + }, [popped]) + + const vpb = this.editor.getViewportPageBounds() + const spb = this.editor.getShapePageBounds(shape)! + const px = vpb.midX - spb.midX + spb.w / 2 + const py = vpb.midY - spb.midY + spb.h / 2 + + return ( + { + setPopped((p) => !p) + stopEventPropagation(e) + }} + > +
+
+ {/* {shape.id.slice(-1).toUpperCase()} */} +
+ + ) + } + + indicator(shape: IMyPopupShape) { + return + } +} diff --git a/apps/examples/src/examples/popup-shape/README.md b/apps/examples/src/examples/popup-shape/README.md new file mode 100644 index 000000000..138491462 --- /dev/null +++ b/apps/examples/src/examples/popup-shape/README.md @@ -0,0 +1,11 @@ +--- +title: Popup shape +component: ./PopupShapeExample.tsx +category: shapes/tools +--- + +... + +--- + +...