From f83eb9af29f4e3e98471761a810fc6978c026467 Mon Sep 17 00:00:00 2001 From: wallace Date: Tue, 19 Nov 2024 21:49:28 +0900 Subject: [PATCH] =?UTF-8?q?layout=20=EC=9E=91=EC=97=85=20=EB=B0=8F=20navba?= =?UTF-8?q?r=20=EB=94=94=EC=9E=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image-ai/bun.lockb | Bin 170438 -> 192045 bytes image-ai/package.json | 10 +- image-ai/public/logo.svg | 5 + image-ai/src/components/ui/dropdown-menu.tsx | 200 ++++++++++++++++++ image-ai/src/components/ui/separator.tsx | 31 +++ image-ai/src/components/ui/tooltip.tsx | 30 +++ .../src/features/editor/components/editor.tsx | 22 +- .../src/features/editor/components/footer.tsx | 8 + .../src/features/editor/components/logo.tsx | 17 ++ .../src/features/editor/components/navbar.tsx | 45 ++++ .../features/editor/components/sidebar.tsx | 10 + .../features/editor/components/toolbar.tsx | 8 + .../features/editor/hooks/use-auto-resize.ts | 2 +- logoipsum-291.svg | 1 + 14 files changed, 383 insertions(+), 6 deletions(-) create mode 100644 image-ai/public/logo.svg create mode 100644 image-ai/src/components/ui/dropdown-menu.tsx create mode 100644 image-ai/src/components/ui/separator.tsx create mode 100644 image-ai/src/components/ui/tooltip.tsx create mode 100644 image-ai/src/features/editor/components/footer.tsx create mode 100644 image-ai/src/features/editor/components/logo.tsx create mode 100644 image-ai/src/features/editor/components/navbar.tsx create mode 100644 image-ai/src/features/editor/components/sidebar.tsx create mode 100644 image-ai/src/features/editor/components/toolbar.tsx create mode 100644 logoipsum-291.svg diff --git a/image-ai/bun.lockb b/image-ai/bun.lockb index 2b32c5f9ec88e67141492f16c85b804d63da6976..e6235a2aed92652a5f779c164be104fa8e49eaa4 100644 GIT binary patch delta 46004 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 delta 33144 zcmeHwd3;UR`}H|TF1aBjNF)*&%u^!s4dF)2NlZZ`s3D1vXh>ur#soE%lAf~ZU@EPu zR#lbGw6vsER86f8rq(=DL-DS4h9vdl`+bK$-=0s_efG2V{OrA-z0bWj_q=nw>eri{ z76mqo{ia~N`xpB&OJ;A_Qm@VWpp?Q>k=JK5i~OLiN1sWrKl^^fGDYIGt|ZB~XwK`h zrbtre=#-J^0V$b3K(8f9#a$q)LbgQeI*`m&9WpI1FFh|!l02a^-BJ`_g`AKwI*UbF z!Mi}e51#3Bvh(thM|#aclANJ$0q+DkCS^=^X3=m-x@08GP0!2D8ka6LsVqspNKg-w z32Q*Ipp2Bf?D1nHDW!^D&{q~cJ|}a;1XjEedTpfp%_#3jNOoY4Av5y=MrLKFN~vfq z%l!g;5d)_|uw`$9pq`Bv_9!(sB`rNqlKy~Bz9mXyL#9G9ewC5lw7^2>aEA(9PPt2R@7iypzs>~BtHZc0AdIeH?kAW6Tv>iy2oNFT#$zBcp&knHAVkWCloHH;38~i;ar+z;lNkWmuQIM#r z*ag$G4yJQ)V|7m@-=du`3j6a3B(vqFr=;a0T+?6I$D|ihm5$YyB(%8r3q!sE$>Lss zMAwSP8FDBjtBr-^z=T7>=EZp#DY-c)=X4WE0#&>d(vJhN76Go9*^p>rai$@=L)L>H z1c|N|*EZz6#(G0eLbBp-Az9%TNLIMQknEAOOo3!WdKj{`CNU6A5#W>>5vY%F zeqL5)Dq30(JO?H(ee}5WTuDmH&dP?6mbB7G@+2fJ7Z#+aYld!dgk22jV90y0BnNbS zu%7OkVOh<$6v4Tq7UZR7PmrVqSavMnB~(H=DsOo9XoQo)FdQr(4+^fH&{?35!RP0O zMUc-a7&9R)dw6;@cuv(ILlz>I>A#0$xz6C(VHvWBM1I!re3pH}rYF1|YV`OZe^2}Wm*P7fHKDjkE)o@{8Vn>rsZeMCxXZYJD&T2@{mE6fHsM@)SX^xDvUqxCtJAgO&E-HU2M&$))8&*p0NNp%4gXcKDAFs=` zkn~0EyX$7n962UC7v7K6q-5nuR}4NqFDEyhd=EWcN?LaA7?>z!)Hu9iY&!PT*IFw` zcBBa!!tp4`%?ucoCrJ^8?g`1I;0(!z$c9|fTkr4!NRIFA7`;OmA!)FahCG*`_d6?n z9P5{UgYG0Xl#0L80#fl|NER?WJv}ENGfz5dWZV~{#yR;Ejqj(In`OwHfUN8^>?@F& zqciiRtVBINJ#TD5dhP@XvpMTo)Kjm&-fry90T`5#2`JVd)g&kB2J8;W{yc!>0JetY zgfJ&|Go3Fg&QHlnNzF=^d-L7r}}&x{_JfeoS09H=|JaOh0e2|6oU z1IhFmkaT{%AsO$EaySDY80D;kB(LwVTL8=?F-#hCYvclq0fp1F$1xY&6neL%HNC^ui~QpXJ{|dQP=c z=|NIj3Qvutk+Xa8e&e3z^|-NcQMsNRI7FNLHjmGUK*f zogWOH`MN?fUjs;Xs5T_i2j%NMR-n@YU!h}c_`8N&o&x)`qR}8YNfII1LmPU=49y`~ z;lpt{U(e8Yjo0~2kQ}n%h5DH88LC(4gmj$ke;Yb>g8+Dl^vi~R1d50iQy$=bIs|kfU*?8l9P!KPoSKOt>UT=FVE*NIyI~Ek8GNOu7X+XaD_)db#~j zE*r9Us$Ss-ko2?Wp}Xic5Nv>Uc!7Vg73&r6g=EDG5zisYf@DFfr|FiFrt2mj1xZU; zX6Tk23CZ#X8xnIPFCD`GIXVU7e--ID1jis@fsVzy5#XfhhYD!=wuZ!7*M!rRi8QdA+*FFIu_ipgQ^6({d?7ptiA8rZGgj*`?HB--j{vt~hKi}ZfH2hColT{g7JTG1^r6C$*H zC0UVj<&v!$zT|(q0M>~8uM0R zUTYgT6*j=aT*~aKYH5gF-l4`eiMBpK6b-4UC8)%v?r9P&m#EgJ(bip97Hp?QrHL!4 zbDKuXiRvD_&QYz+qUF!k*k;kz8kn=~kxJIAJw)Aum^G@kd9?KuVj>ZPUi;eQX6jsU zDR35Sh*q2BLuhg8f(B7mPQdcCk?PzQ(XvqY;I)=&Z5b^OS7Y(|vO2eAwDlY&G24Z) z^0iq*u_kD-N~&vPn>7=f9#_)9W_=SHjfGM0w<+gps-*#TOfYL;v~??%SU;^0Sj1Yj zwj_1a3SqWPXe`8mCb7P0XjRmNj**U7Q6Y#z`zKdWI6ZR_)kTYKaFDl-KPGZ30F`DR9{d%~ivC&B17(^THx=A=8280lyzl{G8A1dY=~n@rY|&^Qew zZFw|?A7zzRHKB>kI^58(Ah2{+Lt_Q{5FW3mI@#=Uwi;`T#{8XYi?%lL#T-I{N;IHl zEVM4_UcV^$OEoq!+Ijv=Tw^4I6d|5oBOBxcDh7UnOzo>a1RI}!&YaShGv{ToP9QknM7KQxDi zl9X5$Hvn4SGHt^@v`5eq%Hn!AlB8Z`+6rj#rly>4q?Wd`TPiojIa_sZ7G)WYP?{Fn zk5Gyh3T`GzL$%PNvd|TT25VgR=8`msA?uqAp=fx7<~EDc0yl^1-gZ%zfe7`}LhmBf zM+-?UVIwWnyDYR4p`IFdxh&K+K$5y^+?=w|k7Xf03^7K%U6i!|A$|SB8z`FtRi}=2 z>luTD_ikuYf?BEbKn`!EuVifvD63nkPMz%5s~|g}>5?`Rql5IqB=tZOn=&OxE$w7i zb_S_Vo$Xc*R+N?!6HAE-R_B4-2$HoUJJ#GKXyMSbAyw*!sBvBF)&cMyVIXzqwG3K& zO~dk0j)kaBU9lI1N)rBxJ+)FsA$50Xn6n`^<-;(w6iM!bYzMNswp~S{78oZa%K98a zXtbW#@&U9+)wyw$^&&#_BtSegf%?2_jJFmz4EmN-2#wh> z3*qNKfQG3@4cqv6Xj~;|5(dl%nP@Z26Kq$R&{&Gzu}uiVP{zPqfkunUxB6@$rbkh z3mRLipAZ7zNcCE|?9-t!A8ds!^K(PfE$|Rp2gK=ZkHxw+tco&cKx3b=y5McLc30=6 z+m$=r)l!Ji9;(v_yEO-+Y|Jkt+1o>%H^Q#KSC%4fFk1HvvZL$ik&aMkckHiCZ5AsA zq>H+sMU=G{LaYP*1wTXMX@@-sVHVKd@Q}{E)p;3qYY&vbj^N;fZFwa$W6Ggh$Dy$$ zFaR`n>@qYQ)&oq{51KwNxYidXs7|Bo*1I4%YB;xIrpI9R1!);L0mnkqGjKV*LycRw za;}dW_pII80Q(z_t(C3}=*#JCc>!b_Z47rKMC+sNST#J_@pd==%aXEHnO|m*K$8J50I802o47O@Mpsar| z?yv!B+*rG^Vt_httlfGUai|1Gw**+?(m=gTT^l<{l7^UZmVMB$6_0J}h$%xSqbJIQ z#u0~;!Kl6kt-QEL&@kvm%3gyjXal&ZpTk#pH zIu+QJQA5?Z0=rcV)AMQfG>UtQT8g+@!&RqocFXADoV!@H*3AfU6kvDU-&}*n8KkWw zi+?)SmAW?|%9@4{>(NuaR;IB-N1$;$u+w4ts4>DUuO!E2=>e?`Z}}`QBh*vv(Im?H zH$pHz%NiExI8xt-p{=@ypasJ1BZBLZ}4i ztKakxI8V%pZd(2ngy2_D9j21yZD@MhGYHu=6Et|%Yy%fjHnh%KdRMr&51{qeQaNRr zTLs*aWf(LZ4$!_02w@P}9k?mS(fSDLt?dadj*HH+6d}9n>>p)4jF8cN+6s%2SK-WRj-3TYaRcQKrrQ;3C)td%KFg?-%N(arX zI}tJx!AuT$^e!BN_6T7Oz%VZ%#EA~WceYv1L(^^{toD3!)8}zxIyAUw!?S!3t&iR; ztTn#^Q*%v=bcDh->Q4S+Xk2*c3|j0l&a`Psqew?6Mu{-+r{mPpnRdl}yy`T|Zp|LA z8wTseX0!faX!@>NyHH<>D6)yoG9DU^%XqV5SD_j=+itZ^(6=f?!zxM8I-!1jt9k`m zYfVciuvvdJ;^0}4(qp1&1{7-@1FbDm>f6!!iK^3FyE0~y8V9j^k~(iL4giz&wWfJq zOIv7>>Vl?GmVAUlG|Rq$P#6lqTQS(xe}cxQ=%(;MMp?HZ6t1O$ zw^c4pQA?k!{KV_FbdjLQL<*Z zZLI}3wQ3h7`SzOjM2RuQ)gEBN7(;e|Ryhk`(Q^S7H4orLNqzwpToonLy#P=y1b9(aQWr1w z)oidtPQW&6))^}HA8nMiHnlK z>W2O#$x>a6bgo9aijq`KgQsLYZZg~$GuAO8D62tl0NEHa*5E5jrjIvxN*2`9&?y=0 zg%_qvF!-lSOd+P}gBKQ*Xk?&dus>etI-W83CrMT`#E7S4aHt`N89b#Ge5RpOGB~Qp zAVxv5pe#eDWN@^hSCpj27(68#J{FQxuEA4s=No6}Pm+u(8gC?cl4OG>81a-0PBiq2 zk`^j9cuMA*4oPZ;!9PV7{UZU>K4)a0WI?kGosz-XhMZ%_xg>E>GB^(}%s1cA7m&n7 zSrwAs)g!e`lNkS(so|nz@D)S83dw?&lYEL~fo~z67T5^MEp@Ar?;|50C4(Ou{HKr{ zn(dGl)GzHqfMd8D5`Wsa1}RJN!cBi46+^l}^6QOEe-bhf(gm$#IyXorb!V#$NxhB{ z?``lEr8fWS84;8$s6Hfn)D)5hG&5v#NLCzR=z);DDA}VBNanX0@sWmXZOAr|_>u=}-AbC+T-7}DE&@e+!gT$YdZt$5@ zaAhi}p9x1B5o3)AO7aDUPRR<#8FIYAQ<5))BsCE)Y`_#q=AUNpGYo!~!Ot`F1@ylx z;01#yG2}~z6oz~ml9OvSB>to|cwq(WAesLyl7=Mz4s#~ zCrK9cg^`ewhxLPy-eevb<18HrxiudRjxG|7PHyk`=T;0?H^u zwuNNDF_7#*SA*{c$pYgbc~z9mA8+ucWSX+uo~BUT03Ih=04yi~;8jund*7p(OjL{CnTS2_*e{-!qKs0T<=J_dT@4 zWA{J*-uL`_-}CQ%&%gIQ|6kqrJgo81*cYVD&hH&<0kMByx98FT^9ClV89PM1B zC&9<2WtYRl7U%1%Q{vptwW!=~=Dpo9b0!bl?Q`|B!}pytI(_n}?YVisf3;}2@61hK zPky%R0k^P4$-O?@cO)SE`JFAJv!hcI@1RNb5h>*8;1woU-zhV zuTQ}*W9we3R&@B!8#kpX+s~XXxVxfsY3Rm~KmE71Z@TxJ8hM@0&pcGHYwaIZV+McI zEyLEj4c`}H!F)?5uVTRstF=A(=C?QcFLG*rr0GMq7p<%2v`K1wzRL^0IrfOHvf)g+ z<+rV~mo=Dt|EJS?1AJ4aG+nc@k-YQuu@mB7DeCBZblg`J3eK-s@TT|H)qG`1@4Cq= zKUkUiQJ7Qv>}#&sCzkcv^=b1?6CYWI?P&aR-^vFj9FM=a{MgXF%9N?kdkh`C>9xSM zTirdr{7Qa7D_3$XMw#ZvEiB&Qm|OpxPqNlmuezmZz4cf7ftBk=CKq~dv?qOjrgE)M zcBJ%JeRi)Xj84Ah8J{ua{{Bslv85NpSM>&#PF(eKhx1=Q!#5l8=SWM8V~NJ)F!}rS ztG-^bZ|134J`bGEyM&)u_+0SU4sKorgNB9m>Dhaq9{?`>SadqVvgADk`n zU-ydF+b*MK?R)6c_1eJT3I*d6=CaFS<4bRh@3F6_?$=Gfd9R?(?aqDM|JbOt7Tejlw|2krd;e$ZrI z4n=h%TOR-QxZAs7&;D5Jrd(zDiFt2tEE;pY`if4^dxTG2y>-;V52{Dc4fhCLJmFxK zn&Cs<4(RIeQPt~P{tSkQTZwzst52oOKtXhk~~|ThSxdjF}%)IgHI&M^VGR`eO^6**ZFGelS%Rd zwFIv(sORvyP>ng2Brj5z;k87)hSwL>*waa}s;)Ynq@F$LtXj^*%Zt^7GfC>wQ_kuZ zXhN0$NK(6h?keCo1oo+=JscNk5^19K{^C~`*-?)=ca{j9ewJg?_YDT1fOpo zA5q+V*?|uAj(K-o8g%^P-))vx`C-F}^qtvtsxMjo&AHoNr%UZSrK0R=QCHe}sjr>! zP>OR##ntouFB+#>-pOgsZUA zW!MSYR#m@v|iA zR|T=|zO$HF6~r%+_<=<7-_9bu8i?N{F})fH#|O^h42ctx2yq6n4a8z+5T_(@l0?Qs zXVJMjh%=ISu{sEkN6z9Fi9aRLp$3TEAlB9ZaZVD~K`btmokgMxhzpWf?IQOVO=U0^ zS1^|((Z?0cQ8HV|T#inaE0D+-iZj0h`nUbC%35GPhuq+F+JC zfGMaA<}X-B2h)e)CIAd#M-(btl}Dp z!m1z=y+BkItGqxotp>v44Z>L@c!M}fVhf2HLaqm5jx&h#dLUfICK8d=LAd#Vs3lT- zK%6D9i-enS^#!rC28aS*5Ou^365U)tH1Y%CDaQJNxI^L)2`}OA4`Q7wh?)K%>WKp+ zl52tpuMfgkOsfyVu@;CkB>Y8i0}$ItEN%dzfjB`Tqc(`n4M8*#B@ID%xPiDuqKSxU z1Y$RdwT(bD6W2%-x`Rk;45Ect)fhz6Iv^}fKm>?{CLoTI*g~R}keh;-;{hVQDTrXP ziA1C)2)AY+LPbh55NAp3A`vcJn}b+d7eqmG5H_)cL^m%Gjaqdjx zC5Uz2AZE4%(M}v7kz5Z%cmRlKF)aXuqYsEPBw|ExAc$=w76*dpC{B>b@CDJi6^PEF zq!kDcKM=P_bQLi{Aa;{j8w4U&Tq9BF4tEQwtt5`}9xh^37{6oi9F5<5tAYYd`M1c(7* zYy^lqBo2`nB>Zh4)-?e!(*|O&I6xw~DTwe$5JSbZNDz+AK%60wB7$3k*hXS;YY=JT z1c{91AUd}JkuFNwfbeJm;ueXKA|?vNZW3#wKxB$*Bnn%CNNfw@S+S}uh^7G`EbTyy z776V@93`=ZM7EIaAm#*uNVkI+D>jjcYz4wC8bqE*i3V|ZvA!nHk!r9mJH+JhJ` zc97^645CpChzVkB42U}<4w0B7{5ybH7Xo5t2M|-l0TRifAi_I>C=$~;f^ZB2afZY+ z5!?yHHWG_FftVpqkjMxJ(YZ5-nWCgK2#*L5w@AzuFZG!~qu}GkbO-yi> zgj*bl#UdpR#L_4byGRJ($~n@lEr z+d<6i0b+$XK*BK^M0igStHiXPAhwY>L*jK2+zUiTdk~9zfmka}kno5B(YZH>H$_Qr z`3uVhe9Yq{g8RrVUi5Jg&n3vkmZtbA%oM`f>NYhWMwhe~h=-CA)TK0yYc$xphtTj)dj)fJBz>Wn%uVyROKFPxmQDg>+k_4=^@^r(U3LHKD4EwAvT*IE)Drdg$<4L5>>obTFGiYQ13(kB%hcJN8V09-ML_>}kzY;W z#cv5P4Nv$U24{X#fS(R}8JvE1sDDz3+YS9AgB6HmJU^H826(MBIDWcYPh;?dJO;>HzUk)`Qu59t_frVEMtSg)nfmr0=(D&Cgg{p#Q?8& z4UV6MPSY6u3l&Vq4{4?Y{FL}TBV8SYp96Sp0>_Sc05eJ8VxySX6Hoy=EBnA8>mpnN zun_(j6%%>^vjG0PkxUx;1qBgI0O6v{0W=|&H?8o@xnnY&({!M0jva8 z0jq)6fi=Kd;0@qSU>)!lupW3D*Z}bUk#9ld0|h`aFb&{0fu08(0Dey@8<-0`2h0RU z12M>(NvrmRG6|Rr@Jlgs5y3Y}_j9nLWjF<#2F?I~0_TA9 zz(wE^a2dD)Tm!BHHvoR8Vh8XgzlOr~y9d|{><112{N~ROz(L?g;1F;aI0hUCegU`? zx%9ZyxUyCP^c8D>1;9e!ML-3j(CD^63Xlq<0mFfGF3%CbNFWhN0+NA&z%xKB&>iRu zbO0g%8^Et9@M{Y#0V^tS0;&R)0qr}9ko+>^ec%r8E5L7G9tAc7TYwJ%|E+l027Cm3 z415B73Va594tycp4$Do7_%*f#Q2FJqSwJtKH^BE=3V~4wKMV9lI05LxFwhU+S6@B^ zwgTILkARPXPFToY09T+UP#bUq+<`iP2jB_Rt%PavHZt%VDOCXe#KQyV{Q8LuC;-16 z^CNHwI1KRnIjO*_XuxX#x0EHwB7mj9XkZMG1Mpo>zC)P-i~_mAy^10c^g&-UNI_;pEd8W0YHreA9p#z;nP%pc|_=g1``D=J(A)fiR#MGPD3%0>Qvyq?r%! zYd>K?I1mBwv)Sd~|3IFrz)oNnum}7uU;yIcfk5B`;AL>%0o-^t154#j`u3IxWik>F z(*f=>&jT+43juC0vkjdb<0830aSi{N8%q6{H=(WtxL&#Ee~-AmKve*3lD-2`vpuy?^6JCUx43$Gr%d}B)~i;fZqY~rw#lG$zGeiW#_H}7Xfw< z`HHmT!v!dpflI&@;5u*%xCyXv4BrFTyF0*N0LNTH?;k-BRS@Rh^aU5v>w z57V$hmP4N7%?izO+1Og(tS)$AMSqAn(5#fq!?4+4Hjb8Hp-<|N8UJ{mB4#4VR-0jtC&!5#d&D83X_?N9 zGs7HrrZvk*GQwtK*=u%SfWb3A%N+!u>>^Eh1_~=N3uOkgLULxqSQs;NUZg{sm6GT9 zvv8WWB5#(-hCTyu=tcpwY#7I%nb}$vYG&j_ds>*Yykenj5X;~s<)maB!xhueLU}+T zFb?1(EdaFfXRA#UGR&5a2h0YU9MiBO&WnnLGwob}h0g(40he<xE+ zxs;1$A%ZQL3G@Ss0j}%kAZGy6foVp#Vx{z~6?IyH4P;~3kd*)%u>xQtRDe#GjmSrs z4S12`KNbob@B**^U_<5u&jW0T+50C|Mr&}qIbY}}xb8WzI5*hSnt&^?2zoT+LdX)p zEGvQIZz?o9dqMAHuIUj7b7FG&n3cSQa5BJ#u>s^41FZP*vKY@YmH_Z}+B{nh$qD!x z@G94T5-=1P0MG{rAQX57co|p*ECpCN3*=;F*p#M)*!b~ATt&_tmeq(`1H2Br0WAGk z*1ixgMYwFed`|X|>tJw-&EMBkEhW7a%a3Hyy=4M;iSNh+Vzq+ctLKF z92_1P#8l>QC!4?Cr^qXj3`dr-UspDN->*DoCsI^Lig(jR^#==n@JF2?f#HE+JOqfG zi*j?kh5E`x`G^+>&WeP=(Q6t_p5a;-2}1)zS?yA>;F9d=wF(KGkYJOu&*`}f-U`rK z9}*aXqovq^1o9TKP*yy>zcA8yy;bzvyMJ!M(P~H-+8@jt3E^^C_K5fqDXOBRdAXxL z8yt7;Ypp7+hrc0)t({zX@GI@+uN_k!b4eCMkk{+Jkz&Bx4bD5y9QP?wMChekMagBf z!c)9W(NgTXjL%M%iMtd_MZgug2gpef;aiLr=FRQ)@PoAtC!-8w9L(QgZ*l1L+yl?P z|BMzB!nSV|53b0b%2yWQaaHb)5AF_hS3L1STG3Th)-ZT@0<;;@U4?k!5WjWR=ESd{sPlURNYeKLPL-61)o-`>jWcOeBw94V%X11Jig za$KO8Cj0{wPX%W5yDo>wn%Uh&=5>6A*g?#`F8A;^MXTFL zH$=qVmP3^@wZ+ui81-%9+uL#r>r~{ai)>59BP0qpf4Y6Z7nd!s{(7mYVImBl`D5-$ z2|xB2e0|S}^731W9)HQ6z0F^DUpL`lcIZm47zeGx902q8+#h7g@8#6*^b@j%!xUI; z7d*5#oQv<=o0Rco@=I$K`A0By(4PAqBImB`(W|bfzKVtq`0C5$HC9>_*#ZU*x9msX z6AxZ&I5FF007{M2$GbC9;9j#h*y-AZ=3Qz#C~`0udaL=O-W`nd6B-nzXElF{zFz$k z4YphBe}qE0Br!GzJw?_Xj13z0T|LDEpFFNWQQ`V;)Z=Hjvx7g#x}3Hg8Q^G`!Tgc> z)UgfQwXa$u5;2^>Fy*V_5?f*Zntjh!U#|8n{i?QBmo{Oa&^}`k8D{Y|e=2{V{OZqL z{#ub^v=fCJDbT*?K*iIm?5FR)j_7kf?(Rh-3<^X$aO@YK-Nn2yf9rn2wJk?~j{a1i zr=fu%VNySF4GClyQS}~#rq%HblWO|w&eiCB-s1K9vcFe2A~?v?f)C}_ZlNYSl+_k1e!DNb z7opQbk%rUj$aMEj)`Kk_%F~QP4CY?(qO0q^>oV@U2IVm?7%|80|Mj)grBgG@W8Odv zW>)dWqN1}ktyl2n4zqt>Aco7T+bk)r<(tVWW7_KT;+PTD{n%R*y7p0g$}{Dq;1}+3 z_4%{IJlB$p!rF8U+O~D0zIg9%*`sTv2HGj5c+h)}$?2KTWoaq2DdUD18b0j9wM%~Y zb;+$QH)m0}J^{EHn)|7X93*NykUcFy$kJG(JdkY>=I{4s+?`zP5WS_VF;`)2^B4br z-{JP~xuY4U9WV}|p>)Ho8;kEBUXe@doMTGgNf_u-$G?;pDSwVRU^I-;WeKPF)>(fV! zD~~zZSS)8=^YI5)l7CrTJ#I^#@)YI+624jeaQ~n`&aA;0U~ss%1T|S~S3JDUCo1%E z@Txbu>X#{c0&E0QW)tD}2!3F86LA&N+k7TN#}DuSa^TYydF3g0HW6cxBI0xt?ZcGf zVg34eTp~Xg*p5EsXfs1pM5bviutR<}$Z&y4b%*SmU zNM64`_U4K+m?bnDmet8tx|gm}duZ)R=Q?aOybL^iSdgeLDbm> zRg~_^g;4Rgf{xq{6+x9ymW;{3y?Jtvi({5lxqH04J?1kb#go&xl zYd&pa@?eLJg?W>)Ox}ud@L|UN*j@7QASYyXh9`GVZyO8>DliyDA<_swyp&sAy4K zO$o6_;SMbj4eZxmyLl@5rb?(e=oU$^&=!1BBaF=D5e z(n-mU+3Mu2B+Fj=kd$6~=YXKUoaTSHP-_|n7q`j6zpLUIaTEzS_U@Je^?KHufxR^{ zFxv`=RUi1n$0(cozlLxo(vTAQRXUB%~q%J;Z2z|?T}MPqt)(+AG- z=i-PlOW&<#G!sS`&`o^lkHvc(5=Q!d^~{bgt^N8V@{E~~Cdx~D{Fmgj9#Bk=ooXESJWuVM$C_~BWCoWPS-%nI-taSG_ADYtYP5bsg zW~Smys@?3t+-S|1#@w9XGq{o}9QKV{j(YvY>c%M3HAx(X3^yK>Qk-$+gDZW)@|&S7 z9DM1}%txwJ{h(JpuVq;UTFY_IgLkS#yC!(M!h8mcTlLt1X&Fb_AVFB5jpv%=B$3;M zLjoUF(I=K46VsE#_9k%d50XUnrjWh^#50iIPj^I}28!>R!wBXw?mbZKZ-K79j=`jd zJTd3z{7pSe9ko`#s|HCK14YYb$T4%^5+qdC3>3qfDb0O%;-eK;WO&@Qy2ytRxo~CF124*tkp+8K#LapK0?}y+!Dn8E@Z+Z7r3S)*eIfo**o_P+UT<|Koctt>MJK7^?3f-PVqI_o#1Wx=Le# zn$IKn7$96tNi_iI<+SM zfE?WHkwd!^4fU>v1iUNn_w&T2ExaQ~Xhmvw63vH+7f^)hf^5S?+pee~c9`%Bg-jkM zZU-vOoyMX7+))%?8zzczMpy0)6G5FItEPynJ>awxQ}jK%)2_c;M}IpOZvdIDc{F0^ z@UIqs+q-$=yDu9taJq9+#D-QV!z^=oiufIR#JkAhh8+7NF3LT>b&D%6>nkJXrx`mu z+`qrZrEVN*j;4sfAe41JMJx)3ypbZRML{a5VlsH|+NrveyEOdtx!ZFlb=Pug?xjJh zc#k>Tq>A6$B4t;kbVuzq9G0IP8sc4S)B(piI8{6hg4IW+iupZ}qbOB$4~CqRDtdRv z>9BpcQl~Z2sVITQZqetX6}=lzj5SKI;hlD)6{BDN)W0O<^Dhy@H!Lt4Hl~X2S=Ps? zVtWka*Qo+Eg?Jw}TH`Tu_p;BE-#TTK1?ycztszKxD^=vQLAxuZ>GSDW9T8Zwc*N=Q zb~~qutA+Y2s7l^*(_VHIc$nGk@F4SGt&U2iwJsG;x*lQyDI% zCO|$mmxNy%B}^GIT+9z+q&`3#;_cLpNus~c>dA4e&N)+I9P26=kY`9fHnGe+#%xh$ zj}X5inYZ~ksYBk|kN5px=Nhdq+F|Xn%8ZO+NCaGzIg`vv%u-F=$Sdw4vA6kzs!s~f zCmikaAlfh&{4W+zkPVG6pFt(HzBz7n*XJjdo7%KM)l4xJDI;<-^_~2D%Da|!`EML5 zH@*2>tEwlX&c~}I`WvJe7JSl^DZWEqMW1+X7R;AdGnYh`8P3guF@?!{k}{>yv@%`F z6t6PgSo8WgnG4CB%1`g9KHTmOVUIhHCl>S{YcV6u*r==Us&4PJu&VX@kF?fEmwF)SIA~I*X*0=#Efdihs;!=Igh6|ZKbDovtR=2X0BbC zZr|uwg!#Og0FPX4g!SZxrsb!$G(%)869ac7SzzU50qoAv*g?Penlha>98RA^lJ zD3*D5bKuNIe{6Vtvp@eci}%wvSTj?FF)8n9sAl92FsxyBUu+#u--ZsSieH)7DAN~Z zK0UG73v(u*)?poy*;p{%=5ySFE4{zt?9f@iz=F8h3JeL7_6!y8B4vd6M7L2HUGI$l zJ?dl4#@a_(PuZieQ|=ls{$?$Y*KRITz3Ju&<$nzP@ItY_GdAnePES}PkM+Pj6BsVf zG|PW0JHmV(+|~&Hou_Y3>|{(TOu?rg?JSdoPZxNVrjE zf1Zzvrt0s4=^}KGsd=p}aO#l*Yk8Z%!4r<8U)=KJst%j*}A_AABJk zRcY@E21|RVija7vdBf8v7~d8vd){NWo$cIv=Jrf78iiqj$%^BjFvHE+`M9+V@1q|n z40r7P^h2n5$TKzq9~jwu#G|wOoq<>9|8AbE;fDV4`LuVF%KGC#|K4u9`)zu{aIMYS z@Y{-oAMOJbe2Utp2TZ=VSU+Hx5BXE%&%n5#-;YlabIc#-(OceGlx@$(N&c||nD=1p z!h9<(7P?uEp4Kyv+wYPWtP5z>cAB@CJ`>tYBdV<%@TF!?7GgSv+kAF7U43kH^)SL%rU6O`6s(0HYx$Q-BC z5XDrZCo17$#dxK)9JKY=cx8Yr=1ovsM1Pbd7EV-bB5{}E$B>h_I#CJur&>+)ouv4d zaV}!@B&9)_s^zFGZasnPHd*nnkWQVfG^(JsC`4@+C!@uzd~1U#ibpj)y8Te4im(h+ zYHS@lSJ_le99)KG-WF)^#U)BLF+?Z>^iZRh72mDlZzzTB#k6rs6S4abrHxoOPEkd4 OhEjQ} + + + \ No newline at end of file diff --git a/image-ai/src/components/ui/dropdown-menu.tsx b/image-ai/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..0fc4c0e --- /dev/null +++ b/image-ai/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,200 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/image-ai/src/components/ui/separator.tsx b/image-ai/src/components/ui/separator.tsx new file mode 100644 index 0000000..12d81c4 --- /dev/null +++ b/image-ai/src/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/image-ai/src/components/ui/tooltip.tsx b/image-ai/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..30fc44d --- /dev/null +++ b/image-ai/src/components/ui/tooltip.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/image-ai/src/features/editor/components/editor.tsx b/image-ai/src/features/editor/components/editor.tsx index 99e1ca2..81565a4 100644 --- a/image-ai/src/features/editor/components/editor.tsx +++ b/image-ai/src/features/editor/components/editor.tsx @@ -4,6 +4,11 @@ import { fabric } from "fabric"; import { useEditor } from "@/features/editor/hooks/use-editor"; import { useEffect, useRef } from "react"; +import { Navbar } from "./navbar"; +import { Sidebar } from "./sidebar"; +import { Toolbar } from "./toolbar"; +import { Footer } from "./footer"; + export const Editor = () => { const { init } = useEditor(); @@ -21,12 +26,25 @@ export const Editor = () => { initialCanvas: canvas, initialContainer: ContainerRef.current!, }); + + return () => { + canvas.dispose(); // clean up the canvas + }; }, [init]); return (
-
- + +
+ +
+ +
+ +
+
+
); diff --git a/image-ai/src/features/editor/components/footer.tsx b/image-ai/src/features/editor/components/footer.tsx new file mode 100644 index 0000000..9f9530d --- /dev/null +++ b/image-ai/src/features/editor/components/footer.tsx @@ -0,0 +1,8 @@ +export const Footer = () => { + return ( +
+ +
+ ); +}; \ No newline at end of file diff --git a/image-ai/src/features/editor/components/logo.tsx b/image-ai/src/features/editor/components/logo.tsx new file mode 100644 index 0000000..9e79c1f --- /dev/null +++ b/image-ai/src/features/editor/components/logo.tsx @@ -0,0 +1,17 @@ +import Link from "next/link"; +import Image from "next/image"; + +export const Logo = () => { + return( + +
+ Image AI +
+ + ); +}; \ No newline at end of file diff --git a/image-ai/src/features/editor/components/navbar.tsx b/image-ai/src/features/editor/components/navbar.tsx new file mode 100644 index 0000000..6f4ade4 --- /dev/null +++ b/image-ai/src/features/editor/components/navbar.tsx @@ -0,0 +1,45 @@ +"use client"; + +import {Logo} from "./logo"; + +import {ChevronDown} from "lucide-react"; +import {CiFileOn} from "react-icons/ci"; +import {Button} from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuItem, + DropdownMenuContent, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export const Navbar = () => { + return ( + + ); +}; \ No newline at end of file diff --git a/image-ai/src/features/editor/components/sidebar.tsx b/image-ai/src/features/editor/components/sidebar.tsx new file mode 100644 index 0000000..fd2d412 --- /dev/null +++ b/image-ai/src/features/editor/components/sidebar.tsx @@ -0,0 +1,10 @@ +"use client"; + +export const Sidebar = () => { + return ( + + ); +}; \ No newline at end of file diff --git a/image-ai/src/features/editor/components/toolbar.tsx b/image-ai/src/features/editor/components/toolbar.tsx new file mode 100644 index 0000000..1d2fca2 --- /dev/null +++ b/image-ai/src/features/editor/components/toolbar.tsx @@ -0,0 +1,8 @@ +export const Toolbar = () => { + return ( +
+ +
+ ); +}; \ No newline at end of file diff --git a/image-ai/src/features/editor/hooks/use-auto-resize.ts b/image-ai/src/features/editor/hooks/use-auto-resize.ts index 5b26b4b..7623392 100644 --- a/image-ai/src/features/editor/hooks/use-auto-resize.ts +++ b/image-ai/src/features/editor/hooks/use-auto-resize.ts @@ -23,7 +23,7 @@ UseAutoResizeProps) => { const localWorkspace = canvas.getObjects() .find((object) => object.name === "clip"); - //@ts-ignore + const scale = fabric.util.findScaleToFit(localWorkspace, { width : width, height: height, diff --git a/logoipsum-291.svg b/logoipsum-291.svg new file mode 100644 index 0000000..8a164e4 --- /dev/null +++ b/logoipsum-291.svg @@ -0,0 +1 @@ + \ No newline at end of file