From 15993914f1a4272ae9b1efbab8343cbb25f08a85 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 2 Oct 2025 18:54:37 +0200 Subject: [PATCH] perf: create optimized thumbnails for project cards - 96% size reduction (615KB -> 24KB) for card preview images --- package.json | 1 + public/images/projects/cloud_1_thumb.webp | Bin 0 -> 2690 bytes public/images/projects/cub3d_thumb.webp | Bin 0 -> 4262 bytes .../images/projects/homemade_nas_thumb.webp | Bin 0 -> 2974 bytes public/images/projects/minishell_thumb.webp | Bin 0 -> 2252 bytes public/images/projects/pong_thumb.webp | Bin 0 -> 4756 bytes .../mookup/3-devices-white (1)_thumb.webp | Bin 0 -> 3104 bytes .../mookup/3-devices-white_thumb.webp | Bin 0 -> 4062 bytes scripts/create-thumbnails.js | 83 ++++++++++++++++++ src/components/ProjectCard.tsx | 10 +-- 10 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 public/images/projects/cloud_1_thumb.webp create mode 100644 public/images/projects/cub3d_thumb.webp create mode 100644 public/images/projects/homemade_nas_thumb.webp create mode 100644 public/images/projects/minishell_thumb.webp create mode 100644 public/images/projects/pong_thumb.webp create mode 100644 public/images/sites/avopieces/mookup/3-devices-white (1)_thumb.webp create mode 100644 public/images/sites/etsidemain/mookup/3-devices-white_thumb.webp create mode 100644 scripts/create-thumbnails.js diff --git a/package.json b/package.json index 1048b52..178db69 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "lint": "eslint .", "preview": "vite preview", "optimize-images": "node scripts/optimize-images.js", + "create-thumbnails": "node scripts/create-thumbnails.js", "analyze": "node scripts/analyze-bundle.js" }, "dependencies": { diff --git a/public/images/projects/cloud_1_thumb.webp b/public/images/projects/cloud_1_thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..80f35ba1dca4b8ee9912f359a66419e53b6886ad GIT binary patch literal 2690 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 literal 0 HcmV?d00001 diff --git a/public/images/projects/cub3d_thumb.webp b/public/images/projects/cub3d_thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..8f57cd1c2447127acbac914665d8f92599ebabd6 GIT binary patch literal 4262 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 IGPYm<0G2RHH~;_u literal 0 HcmV?d00001 diff --git a/public/images/projects/homemade_nas_thumb.webp b/public/images/projects/homemade_nas_thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..97bc8c2706740d31aa5dc2926400ed513205c47f GIT binary patch literal 2974 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 literal 0 HcmV?d00001 diff --git a/public/images/projects/minishell_thumb.webp b/public/images/projects/minishell_thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..1522bbb91186e57a1aa687c458779cdc332364e3 GIT binary patch literal 2252 zcmV;-2s8ImNk&G*2mkSxySRtact3$&DqQ6H{~AxVdC^X_W^-BdFH!Nm z4#ZdJ=dlehguMq*f$jQQ*IK~@qFp+7puQUT@g4yrQ~~nZ<0l)T`WY~mh4j)}nDo+h z$2svIlSyP$M~@SUd}97r6$*#!KbVMQ9W<8xTa^zub)QCh+wYmUJKfAtM*FGGzPz-d z_Hm>&`|QKwR4ffIN@B9f6llTFd~{1QW3sXOEaD%4!)lrhKEGIBxf0%kiq*`nnyAB^ zy}LtHdi1+E*sxMFO?CZm%pbY?epzZ2e%FJ`a_nITBhq~M!t(MOGvV!m|7kzZ{Potu zcwi}yEG`%O*BhbZ2Xfq<17NnA>VsoFoy#P&`tJ`b7>p2(Hhp0O5~_wnKj6);5wFUf z|2dZay20QgzkmS#|A;kPHh%ZV9px;RLj!pN#~t+SRhQlj^siDHPW|@~iYU{j6A?Lv z>xQvZ3IRlyA8z?j^a5!3RzHkF1O+W2PO@{EiC9YZyur%vl)zi5YLOT>`ZP`R1hXi2 zZJ1H}PRhmPu5}(-MEw?8vK}pzk@XBk@&A%i(%dfa60t;257_*{6c624va9lENeujurA@)UEa;h zKIS-b>;k9^Es(Z;*03*gL^57^Ny^P;ckPMMITvKc01{osK1%CZ%Rs-PV>3sa_$Hsm zX?01phYv?SzOp+=2G_XpX%5*A16-Mkh3HS5Y{d?}s3v>PnCBDL7?<5+m{5q1`hN*9 z5G#?*zjLB>`#%F2&9knHpn!CY?pP#HdQkrj!dnqok{+{ec2fFi193?rRrTvK{<$_U)u5hk{7Tok{2APUKHdXESq496>#0 zR`F-?pBy!-uH{`G>awrEg&3~teeehcGeaFj*itTooY7?09?H;+pKEVk9Wb(AfDbtS znI_3;>z>Xg$Q{(1#XPsLZpB1+ubJpqTT3U>eXRAH$qU~7N%sCqz2#y65K;O% z5zqGeymFesSNk`at2DPeapO-(XF~&YkC+@r%9Qd?-9@8DJrSI}QM$gm!d!`*~p)q*PoG&TIItN6k@RL-eLOOT>1jAaYyY=Bj(F7P<9+|CaPwkJcX@5a6aPSYcKL2{fMhc?fDwI!u*9Y3e*uJGe^RCRSYCZIYcL7rLbcTE9 zhQ^O{#7em0FpEffMmS~jm*7BXujKIQ%65fc;|B07|DTGaBfa~X;9fBNyKjIsbKLqU zXKX%>c$@B!Iw$4uj=Itr-Jw9A@hJc0QxlB>Z9^lbTx}ncGwb!4yO6z7T@3jz@i(;9 z8Nimt&YR-9KU;gHf9G0%=26`r-JUG&65lmtr+qaOUgTL)?YFIIwVE`#en^--E;jAj z;bcL4=9VEicRoD!P!OJ{O%X;T#1{A%)bp#&TZkI`-X_nO_wpCqxkbK%QFHFq>vVJNPtm@l#=+Zh?U zJ=XV>&pq!Glfp@O%P7ads0OeJ!2j+(c)XB;Z=%;x^~0% z5>K_0XRFtp9Mvk)GirbWAD(^r+iE{vq9={-#bfN$9O=n;9%7Ie{fyMn*Q*LQ&EjAAFz9E!8?egUTTKB`*dxoTcj-55RkW$OM-PyK>rHtraB9mFcL-a|8@0vaNnVY2V*o&P_4#96K2gDbhDMWUWcjqL-*TZ#tkf4|mR a!aR?KxtweBGd~63TGaXt)b&nq=l}rZ=WdYz literal 0 HcmV?d00001 diff --git a/public/images/projects/pong_thumb.webp b/public/images/projects/pong_thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..6fc7ee6f381603ba9e6de14a74eb7de4db7f0809 GIT binary patch literal 4756 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 literal 0 HcmV?d00001 diff --git a/public/images/sites/etsidemain/mookup/3-devices-white_thumb.webp b/public/images/sites/etsidemain/mookup/3-devices-white_thumb.webp new file mode 100644 index 0000000000000000000000000000000000000000..25dfeae3379a697dd1083b3a86383a5d9988b89c GIT binary patch literal 4062 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°lp~3LObBk{`5Mnjxg=Bsdxr{)WKHw0qTjm z>J46IX<#g_lsQ3*THnuo(Agvnx8Ga?QP2H;D>Msfs!{j#7177LUyP537R_dKX?d2e zA2KqY4CTMYOm6*GyJ{XjG9lxte-M;?M;)Qbn`okc9?a{4ctH?XxKL_sjG?FR4vJe# z+vzi;0II?P(}*Mr>GwsxSvpPn7yc*-*2GF5i27i%sm>iZMI-M=Wbnh><^)oKB0H^y zG?IiK8gUWE8XnBPe$!%~V_fMO!MxTAmIYM3&j0#>>%IrR-f6=4Z|QXmTC5f~uoL97 zc`O>0ii66t5*YueK=-fPgi<%2q|nwhhliEvSY(1}9=x4*`@Z|RuLNK2l_Ay(RZ|6N zpP1p_BnQSP5griKxY9H2<>dW9x5rdG_6FJ`zkMF-y~FCQry*)($GkGT)DAOP|A2%ajOFlW`V5CS@;`&N)<29vt1{$z^=e)3r(%_iVN0i9(}`E& zn>^Rg(jR=nM;+LI|DG>R66`SD{uTkKeKq||$i*R1QNNuF$SQ5G)WV6-_z&O!(~s{- zPWN()b4wHN!$bvo14;iK&4FgLk5U1V-NY;