From 11575c9811e396bf88a83d8e158c639a0944b1c8 Mon Sep 17 00:00:00 2001 From: Lynnnnnnxx Date: Mon, 4 Nov 2024 03:33:24 +0800 Subject: [PATCH] fix: background-clip:text should compatible with transform and mask (#639) --- src/builder/rect.ts | 8 +- ...uld-render-background-clip-text-1-snap.png | Bin 0 -> 1614 bytes ...-clip-text-compatible-with-mask-1-snap.png | Bin 0 -> 1205 bytes ...-text-compatible-with-transform-1-snap.png | Bin 0 -> 1610 bytes test/background-clip.test.tsx | 105 ++++++++++++++++++ 5 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-1-snap.png create mode 100644 test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-compatible-with-mask-1-snap.png create mode 100644 test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-compatible-with-transform-1-snap.png create mode 100644 test/background-clip.test.tsx diff --git a/src/builder/rect.ts b/src/builder/rect.ts index 1db7732b..49686cdf 100644 --- a/src/builder/rect.ts +++ b/src/builder/rect.ts @@ -298,11 +298,13 @@ export default async function rect( (imageBorderRadius ? imageBorderRadius[0] : '') + clip + (opacity !== 1 ? `` : '') + - (style.transform && currentClipPath && maskId - ? `` + (style.transform && (currentClipPath || maskId) + ? `` : '') + (backgroundShapes || shape) + - (style.transform && currentClipPath && maskId ? '' : '') + + (style.transform && (currentClipPath || maskId) ? '' : '') + (opacity !== 1 ? `` : '') + (shadow ? shadow[1] : '') + extra diff --git a/test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-1-snap.png b/test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..c89b761b43cdc8b080d67a01d906cfe01a7e219c GIT binary patch literal 1614 zcmd6o`8N~_6vv%1Gj<-v*a?j#Yh#(jlr5udLsYV-F~b-$k}MC|664{Cp z(J*8QW2YQL%NJYZq<} z_&4}~+)SYVahZn)2)47fxEx8^m<_gfy(3NCQQ9P1DfBSfg{)?#dG#9LOJuTgV%~-g zv7mqg|3IHFxG4!C7hKYY3KEA=;-zok2@pIqh=KNWw!O=ww?hCk=}l=-UAg={)yTW8 ztMU04PYo@%$IO})mra_Pua5uhWcJW5d{R$$MkUvE-{fKc3Y~0eu5t>=0+=*sO2&R;8wx&*L)g+rv;wK*^(+X= zz@YEUS~)+#zw&tJrk17N#?fbls3{%;Z!P7CkDBM$E4*4Y@SP>$rV$!edjyFMur|y@ z;BB)5I!Jf-3Vg@QK~pP;gxUJGcI&oKi%*w7XtHdDrg&Io8vsD*e$-#uY>|pZd@lo8 zsps#!m<)nst?1DpXNYbHG}sg?E3fu_!joj~S)ycXAdBszq`u?HPg*)9XVufjlhoX*&)#H9g!j)R0X^+sIL@%~#)JL7y3!%BA+-?2n6I{TcRg_6Mj1AsB_E(rDN z*}zy^Ti-Q|tqTcoWzI-Gh~PKi2bzsB{Y@dn^3YV&KlM+HQ#66g?SpF4p6BQ`b&xj} zK?k4mW>4DCeA61mM`mjLFrH?$Zn6i*lB}K5scT+%p;EB~{7dZBqq;5j+TrpehZa6b z>E%Q4$-e$(n&Gs&Kx5l$@f50{f-{#ekh#7`|J|jw zLti!TYHl;l#W;UoU#+lS5%)jaa>~K(#G?uKBXeYKL1V9ZB z8ZSizXLKNg=0>l%56*9ruLB<{_sWQbl~WQ1%569*)ghHQ-S?C!9G^|1bRZnbaue<> zhcYtCUV25Qde<>j2^!**R*=P>PvHnNq9wAT#^azEc1dU3cuF-Q7YvJN#fW>*y23o! z)$*~;+Ao}$r{WDB!Dv!4 zm5#t?tS1n47YW8vJ;b%MmNH$7%ipy&S2>5A`y6HnUKyon0I_&I2R2y|6%KY60x(Mh z(_-ud@IF)e=qO!is3s_IT=o8chOXMO8V7nk*l)d9{KAwO{wDhCe!@v7aE4`H!GdfY$3V`t-NU1#Z=_zyB)@-YAa literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-compatible-with-mask-1-snap.png b/test/__image_snapshots__/background-clip-test-tsx-test-background-clip-test-tsx-background-clip-should-render-background-clip-text-compatible-with-mask-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..e47358aa4014accbbd13a8dcf82614679f41fcbe GIT binary patch literal 1205 zcmeAS@N?(olHy`uVBq!ia0vp^DImUrzNjk4&QGqnBYE`FnCbd)_P!0`e*^IzkdNB5O~xCqQyU?iy}ysY@qs^IIK z+S-fnrremdA-~TvWOIhN1rtsI=ntQ4$HN_fF_E@MtpX3mH=>L`m75{3jCXH@| zQ%W71I2Ns`7hO{KvG|JlwTnEh59U>StM!|GRPflJ^?rZ*t-ZT5EX)?Y-=jU*eRhSw zl6V$L8OJHE0;z&7kt~7N>iHhYvOU+U=~Csekfu3V2w_;Uy zH{Q9G%aY>SuD)Dw=A4Nu&saOWIWeQcgypbXfEZ#q&&gIE*?fz4$;8{ouBFRM3Pc+mV|n_}X#c;4 zWq(+e16Af%xT&qRaoMD}OFB%8M@LmDb_`9#7gsVHhqtWyJRjXO#V8Y(mt*6r{ZeE5kDLD^8b!Ax1G8l z>6ZC;AEW0vS?3GAC$@x&dnl#OyWPnS^f&*K$dwAeU$(Oyxo6(}JDcvIc|7+yc!J$Yr(yp1Pf_H&)kDf_^2sNeVGBx}JV z?#&Kb-@_*EE<4)Lb9R24wQ={Q_p48=zh|cK__*Im@$K5)?_31rd6_<*im~W#lkv4Q zW*3-m-@I13d&RTuf?g^UZLIXYOWc7g&V_d>fXEi-jaefJi~(`jso z3CU5HWBI9`b!}A|cjl>AJ@(aHep6aq}|QtPr=M%}%9AR*Pod72Q=TZ%ww<)Vxd=F{*i~ zk;uzvBXaGYZRy3>;!+X9gzJ5U%GJHU+&|&|@I2phzUO?-dCvKs^L=g{@xtptOd$XO zK#$<*;j^kCKSoD;byEkkeE|S%eS!zpH@0B1Hz4ZhMYwc^yxR~s;-Wti`k8Y}8x!p{~yfC6;+uS1Td7kUTkUI7om?q%X zgU_@h6JD{^y`~-!d5^N4BX9XD8Q&iy-zPH!#(O&I8%-xITU2w;SI(5NfFd(+r!%-U z6-dF+QT7oG^tXzk%^B}a3YYICvQPKEtC}EY^3yX)26O*nrPHVihG26CZ*Cxlt>2Oc`uuo4X%l6@a zqE8yfYGOU0=)5K%F{0y~rPgr8=IJ1Kj-vXMQ`f^0!Ld<@qU&=zDNAlaxS(L{#PfTp z10U^zT_edl?$WpNfT486C2Ml2v9^J+t#m${#+7J4k2`O13aDFOb z_c!mfGY;z;aTf*`F&m2T6<#?0p?Hq3sI^Lc8wg#F$Ol@{1?Jr|%jiZs^F^la=V+Zy zbk}9AOX%I7;M_bd;{9~55rkM8M(M%niE*Sc{iP9|=;@k`^|DZ=a&gS>5Vini2NH!~ zJHGpTiQE)C0fF42KT%zmt$%qs4tC5_(-@oe%k1VoMDm(Cl;|0TBAfK%;_g&*R}GD+ zmR~l_pI?xV)3~@ihOo;wa4`5R7v~M#no<*`@lf?;?-H@{*ItNoT0<^fIne_ErB!B% zG+);nPLy1cW7}&kln37nU4db++~&3WY-i!vnwu}EqeX5p4-?wi+VLVEsZo?8Gj*c; zOxU{FcYNo}VQP`VLX}(+2+@ReIuIM^B}MUvEell1j-JduJjqYYLIxU?6g#GhdrWW~ zL7YvA>~hhTTAILbQ2jYz(hYir(wmgjuS26YnEUPi!Pv z9i$b*KijH1?-B_d;Jk5(=;xH{p}J|(sYT)1%PvQCTt46@xm)Uv=hnI~^@pNRzahXX z>y+~-=}q=%ex_^pwdeOh)l*tKyrv#YrU^$mjAcu`SCi%TW~jG~P*ZJsE01J8sSRgShKf?D+)WVu7F$^|TU{t@jY0N)JeF>?0w zk4tmG>wZMa#We{5w1$rZJoa@J&3ac7_@VFmr3Q3E%;5bF2T4Uqu=R8~BIa%jPZ-ll z%&etM+==98JfrNLKA|Ns6h_7mmEwtB)=`CEZ_~6qs%D2UzYgRd~S{t>kS2Oc+9Rd_35k-*0IRc6xaeh t7OUD0&qTcZPqqD9Q(LjQ|9g88dZ1$X7VQW(ZS_Y02>ZP}D%}F { + let fonts + initFonts((f) => (fonts = f)) + + it('should render background-clip:text', async () => { + const svg = await satori( +
+
+ lynn +
+
, + { + width: 100, + height: 100, + fonts, + } + ) + + expect(toImage(svg)).toMatchImageSnapshot() + }) + + it('should render background-clip:text compatible with transform', async () => { + const svg = await satori( +
+
+ lynn +
+
, + { + width: 100, + height: 100, + fonts, + } + ) + + expect(toImage(svg)).toMatchImageSnapshot() + }) + + it('should render background-clip:text compatible with mask', async () => { + const svg = await satori( +
+
+ lynn +
+
, + { + width: 100, + height: 100, + fonts, + } + ) + + expect(toImage(svg)).toMatchImageSnapshot() + }) +})