From 87f8e5ca190c1a5fe548ab35afa2be9a0dbac0f5 Mon Sep 17 00:00:00 2001 From: Thomas des Francs Date: Tue, 14 Apr 2026 08:23:20 +0200 Subject: [PATCH] few website updates (#19663) ## Summary - refresh pricing page content, plan cards, CTA styling, and Salesforce comparison visuals - update partner and hero/testimonial visuals, including pulled carousel-compatible partner testimonial data - improve halftone export and illustration mounting flows, plus related button and hydration fixes - add updated website illustration and pricing assets ## Testing - Not run (not requested) --------- Co-authored-by: Abdullah <125115953+mabdullahabaid@users.noreply.github.com> --- .../home/three-cards/diamond.glb | Bin 258500 -> 258892 bytes .../pricing/plans/organization-icon.png | Bin 0 -> 7179 bytes .../public/images/pricing/plans/pro-icon.png | Bin 0 -> 5704 bytes .../ContactCalModal/TalkToUsButton.tsx | 7 +- .../halftone/_components/ControlsPanel.tsx | 22 + .../halftone/_components/HalftoneStudio.tsx | 134 +- .../_components/controls/ExportTab.tsx | 102 + .../src/app/halftone/_lib/exporters.test.ts | 153 +- .../src/app/halftone/_lib/exporters.ts | 490 +++- .../twenty-website-new/src/app/layout.tsx | 1 + .../BecomePartnerButton.tsx | 13 +- .../app/pricing/_constants/engagement-band.ts | 4 +- .../src/app/pricing/_constants/hero.ts | 18 +- .../src/app/pricing/_constants/plans.ts | 76 +- .../src/app/pricing/_constants/salesforce.ts | 4 +- .../src/app/pricing/page.tsx | 54 +- .../src/components/VisibleWhenTabActive.tsx | 40 + .../components/Button/BaseButton.tsx | 82 +- .../components/Button/ButtonShape.tsx | 11 +- .../components/Button/LinkButton.tsx | 4 +- .../components/Button/SubmitButton.tsx | 7 +- .../src/icons/informative/Check.tsx | 12 +- .../src/illustrations/Plans/Organization.tsx | 355 --- .../src/illustrations/Plans/Pro.tsx | 355 --- .../src/illustrations/ThreeCards/Connect.tsx | 366 --- .../src/illustrations/ThreeCards/Diamond.tsx | 1227 ---------- .../src/illustrations/ThreeCards/Flash.tsx | 1222 ---------- .../src/illustrations/ThreeCards/Grow.tsx | 366 --- .../src/illustrations/ThreeCards/Lock.tsx | 1250 ---------- .../ThreeCards/PartnerThreeCard.tsx | 2103 +++++++++++++++++ .../illustrations/ThreeCards/Programming.tsx | 366 --- .../src/illustrations/illustration-mount.tsx | 7 +- .../illustrations/illustrations-registry.tsx | 49 +- .../EngagementBand/components/Strip/Strip.tsx | 30 +- .../sections/Hero/components/Body/Body.tsx | 18 +- .../PartnerVisual/PartnerHalftoneOverlay.tsx | 4 +- .../PartnerVisual/PartnerVisual.tsx | 5 +- .../WhyTwentyVisual/WhyTwentyVisual.tsx | 4 +- .../src/sections/Hero/components/index.ts | 7 +- .../BillingToggle/BillingToggle.tsx | 111 +- .../sections/Plans/components/Card/Card.tsx | 411 +++- .../sections/Plans/components/Cards/Cards.tsx | 4 +- .../SelfHostToggle/SelfHostToggle.tsx | 12 +- .../src/sections/Plans/types/PlanCard.ts | 8 +- .../src/sections/Plans/types/PlanFeatures.ts | 1 - .../src/sections/Plans/types/PlansData.ts | 5 +- .../src/sections/Plans/utils/get-plan-card.ts | 3 +- .../Problem/components/Visual/Visual.tsx | 5 +- .../PricingWindow/PricingWindow.tsx | 269 ++- .../components/Carousel/Carousel.tsx | 16 +- .../IllustrationCard/IllustrationCard.tsx | 7 +- .../twenty-website-new/src/theme/colors.ts | 6 +- .../src/theme/css-variables.ts | 1 + 53 files changed, 3817 insertions(+), 6010 deletions(-) create mode 100644 packages/twenty-website-new/public/images/pricing/plans/organization-icon.png create mode 100644 packages/twenty-website-new/public/images/pricing/plans/pro-icon.png create mode 100644 packages/twenty-website-new/src/components/VisibleWhenTabActive.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/Plans/Organization.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/Plans/Pro.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/Connect.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/Diamond.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/Flash.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/Grow.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/Lock.tsx create mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/PartnerThreeCard.tsx delete mode 100644 packages/twenty-website-new/src/illustrations/ThreeCards/Programming.tsx diff --git a/packages/twenty-website-new/public/illustrations/home/three-cards/diamond.glb b/packages/twenty-website-new/public/illustrations/home/three-cards/diamond.glb index 59f504bd6b6cdad8240a50017b8c30b30bd75c2f..81079b74b6b26dabe36dac1e994fb901a1086e6d 100644 GIT binary patch delta 173100 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 XdVdGVF(*lg{{sL3{{a913IG5A!!U}K delta 172743 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

_J@e-B(irZ`7;Wj-!4r`y4P@;{AEWh&m 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 SZFWbpx&H$I0RI61015yAX*xsz diff --git a/packages/twenty-website-new/public/images/pricing/plans/organization-icon.png b/packages/twenty-website-new/public/images/pricing/plans/organization-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b73f3bb1371689ab148327217a958231704971 GIT binary patch literal 7179 zcmZWuc{tQx)SnrHv1ROA82fIKFURxiS?P$PM=7UmPr$ zv1|1kRuEIqUMgL`F;>yku$HSZ<9mH-eR};cbY}I$_wsd7uUSnb1d23Cf)EYfzY@5K zbQ4P&WKan#52@_!Mxs-jqb3V3&!TuAeKZgfz~PGZ&rwV0J|KwLcBrLV9vktUi0^B+ zRZpQeQ*!U4 z3{DcMlYoN2ULZ}(T9~^W)3&U|eVJI{SS%-0q|*b_u)~LA(L>TbfFK@fV`<4w0W@3b z9A;|E3ifC@Oc4(>q^h=+=u9y&nuR}ded!(ctUK)1OqniU*n*VD?n@-v>IVvqL}X&+ zLl4w)(tpoUb8PH&JMC-mg=K^Y;N%0S8^Z}Y@bMyySgjfFYw2oqw1q=469PUW(yr5o zq3?!C=h`Kl(O}eW38spj2PQ=bK*+R_3i$-W7x;L5wHKvH@Z{H7t|&ZtC<2XeGbF^M zq)^7|@sK4)y+fY6{~Yb}5>kZ8qGqqO->-GO6zjA2IesTPv2JaSVv_XNE{?uOi=PNN1hG$9Au6uLsr!icSqBn9AVk2Q zvZ5)^3*C&NK`ANGU|U93cwSRMS7{K;RVzOtlP`qdvf4REL=B`>WaP{&ajU-K&eGbx z85)^9_9x(noEgTR#^rZVbKNfdP>f#auj?PqE-m)>3Ez`Ha?iq0_IH^~HydT%^)1$` zU#*o{(HemPL5h=(=E;ZOllH2z07?!#SWzrL+^5b=_P)I)*vZ~mh(~m}E)^|N`IDP1)qRm-S zp;d=zWf(mD@g? zA><`40rsJ6$YBAq!qj=VohDJrjTFss9%inBzEp|np^L!lPorK^!{k{I3M$bS>3^7b z;MjHr;AN$4IqM>eLEd)aWtO4e>X_>uCJbzXI4zOHb3m5^W&(bHJV=@nhC-f&MqB(> z&O`$aUIL2qJ32`qA>p%#Q*AqPyx48~kUcTju!Z*)n~iox0pHD*n-UT!_9v@TFC5zIxXX`h6Wx6lrBQH#xm&ajDOWzy8cROiCh0 zpLLp=BoP<~zH2FrumYB&uwoE$er<#pNKzd*06ry(5&|R~Vk-)gR8(u067DPD5Rg(b ztYp;~&0KX+K8A5pOOCGpz47b^?%K@{90+kO!mfJ0j_E_;N6~4NJ~pyj17#A=1{v0c z=V&;PCYgk~L08kZHZwWgGL=PQP6=WGJj!epdu*fzD|E%fQ_1<;v_FAaFHPS7B zGhN3l(WPQF8Y=kQVG$9FKB|Vd$a|m15VSvTqQ zuV{aG!_rE-<%3}2+hK&x_Djb*VbRt+%{*bf4Su#Y8g&^)9qC@TYE8W2uLdsf(~`f` zt`}dx!VKNSzh->7OdcA!eD~QljcXIzl}p=x2TOQaofh%@@`8R{99>Q_mEr^W&{vvVq~7tm-f~7Mo)&f#p>b5e=I@=c320LpAGla zzBAnNTs?6)dN{9kJn=_UU88nAm1gOA_=O!QTqQOdPMm+a zN*NY%>~w+LkdoBC2zLlcCkrdtxZ+!1NRLlf zIs(RwY!|z`D2mabn7H&Vsc-VGkxFf_o{YzZs*#Xu#dwBW{4-CkJokI!DD0${Rmi-^ zM+aS=W_|oo&*8qtQAYCsHUEA@}eY#|SOARPN8g|sS zRW^F%QLM$3ZNSzX!`-{fbyH69U0ux);z&7cyEp7BE}^kPpM2Nm;wahaW~ZS0+Gv+h z&LiVud>vc+vF&#+&x_~a&}{_f?mhW!$xRh!G38ZfmQ)XReEf=5OH1UYH!g^rpYXSj zUFx?XcI5bJ;8fm$%p-ipfKk|N4Qh77D*<&+n;s;8EBqz0O8d7R^~U)0pSy67ol>C2 z8CdKIjKy!D@)SWR3aMa5KQZ#Mittel^Y-9E;xiv7MWlQY~sWa8HSo zhc8T-`V}>FscoZaw|H4WQ}21JS^R!&3;t;0Y^kPAR(Ebi-%(?Ht5%~}qfz=1+{wC% zHR~Y6pVfY$V_8$F$ZP(h5_`e>pX*)lpPx|g1D80MsuXH9=$<1gv2`La*KL$G}llxCKWo3 zCHY|Cua0+(us@KIao9OxT-p6|53tnXpR!U^BkxKw0W)<5u#x~Zd|}$eGV3rGyQ$z? zbe*N!>zX#DQya+6hWV{BBj@?u3d{gUy}9ShbL*_b!67Q6qNV%?W*w8&aZC1Pg$!eRXa<;dlgLFedhqet7Si5?V~Dmth>I?(c;BdjX!vNPjoLbI3ISX9jA6NYFLl|Q%1BjS1qLF-nRY-XTki|!ZVLu z>4F0V&8i9j5x5l7K-}Vq)Lm7J#v5~IVDd-;zGsMX4q$D&5rotkPtO7n;}@J5sNF)W z>FfpWgu{lt>G^V6w8r;SWek|n=s4#DgRg8%c zqLkWBv@}z=_U}Iwrxe5}^Q|xxl)KADoD!c@>%25tW1I>PJT++~j2==#Z_^|Z`__t> zDj7QOJ34T7x_0++@N3oF+nyOr^{2l5%o45MJvlwCuzECJFBHS!^DrC&iijcn2#L;E z(vk&sWdhT0e{p+C12Y8x8EbvXlo8>kO%TR;1@Jph{@t&@aZ%RrGj(KRt3rsuVbfCO z=E7vB1k7nukQ4*Vc;$sk8$z555xl|~WyfyqgqTc)5X+>v=?U1lb_cK3)(RorHjgKw zM1vH)0>gE|kUd;%XFEg)zfhQL2+`vL<8xrM z_^Cz40sLih^{p@Ta;9<*&0I7EjF5=O5d9WdpPpsjOHn^sis(nHG{WV5{>!IQ_W3oTUA-T#Timmvy2IarI1oJ z)82nt^q+t&+OsQQu`;mV#MHQ^o6iRs4maBzmS3hAaMasqGz5A!yyYD`RQ*(^nax_2 zeBwR@3HZ-2NDu;n@xl##f?oW5QZ$@QGIb5i9M4pozW;t#0ti>~iyb4-pq>lEtu2^+YSoRDzlM4R+*vo@^Y(8YURn5=dCJLDh46%S4fqAh;;rCZnzyt6+^I~p zxTE<(_a3=*%MuA^6~i*4J3Vv`P^jl1!mmO|Y-&C_a42#k9761)j<$rsu_!zs$+HJJl`SUXGq1&=U{B|Sz;%fjKbu%dZS&B`&uL%cnU>ftK}aGA zGB>E8NaSU(L{@GZ6hM$kr;$%uKq&#pUIScaYQg~y>aP=EaWPpBMzHPtu+O%XB({Mz zDznrm*Yi<&v6phR>aej`l}r5P3n-u*0V_lglzRtPWJQNT zolYhHhrqUc_>oWy;#(ciMo?dzh8f>1osV|=z`vbwzdU+zw3pZZe?$LD#@}ZF^&aJ0kl#2Yi&eMrGzF?4ZmWRq_7b>RRDf1D7@wF8Ow$j{v~5fB1$wa;AVl z=-!;p0#+B)C<-K*95nOB8HL2mOZcu-BGI%Wd*jT-BkMs;j+Ni9)L1)jZ*}%|uf5!p z&u!Z8XaAn}76D5E-cCWe1kxxl7Uh2PckWy&8swD84HEC{lCsFXcKc|y02DBV8*Q`I z$t2amA9a|00sm@n=>4XiqAV=zsKjxD+X8Y<$`C>-{BJAi0^--{%4gTK`5esB>KurH z|A+{raCk;z{7pVOc@^Sj8bO&fx_V~IYwU05*-!3M?zPPtNg+;UQ+}hBosYxm6CVw8 z>1;m$U(HjOi&rH-&OImAyIo?LHOzR1ZJDgP=s@gSFR$T4=sX8Jw1|1CD|TVymX0LW_>xGwV|m|3CCV%!(1C{yFg@1k(8{kx)C$_GLbtK>|f z8PEN$U_^`v7KMR*i{=RO*|c=vMe?{&gCA?`YZUQ&I-O~w4CX07p~721NlFNW05V2b z0GI406bpg=1wr*^`Me}m_+@~Zy7}?qF!&#Unez1CD{EEL1N;4xlhB)URb}2EWwiJB zz}NQ)Q6;GMOL^;x9n}iXN#4A81rSquP%2mi%^QsgFI?8(#KeE$@pQ%l_xdij2#%SB z&^@W!JnnC>Pf}7z-HO1MOsdaS!o$hE*Tuw>i=FhfTUb3fzg$m&1PMBpA8|;n+5>gO=9B<()s!rJ9RXZ>VJ##r-$OjAGWf0SxKXmtcUs^o$a2{Y|CFgZaRqk zhJvpH>@E`vPNxU$6gzOA2}T=Za^S%6hq9 z*TPKRueG@(A9~3+lm+y0My$)XwFn{ZKJp#o>(VmVhnB)bDV@FS7l#S~t?km;!MpL< z&gasiAS^NscQzZxa(%bni7g9sIoaRfiiDC!6=}Il7$MnB9~wU1^hz?o?w! z=(niN$Lga{l;I5q-E;2oMYz=*!D^Oq$?Lj`E_F-UwlERtLtSCOgXL3f?3n zZ6tmlJ{8Ks*x6*aD^dPae#+_R!F1a>7%^`I+-cTu>0mAig?Ok30FwJY96;KyN5Fd= z_tWWs_qc)g+C17mb`=^s zlF?D&x{*wYem04ntICnfD3k)Yu78Rw(omBYY(*7EAh-Y-PZVEnRR-`6b4vhv_ra?* zvN2RF&O;^A1BE)RCM&#~0-D2<8-Ai@*~->9=GCy4L27?XZ5#;bz#taYpo!m9hEMZg{dGwnf1dRhYx@ZK#{7v7L9_(rH}Q&UW)K?4GSmg_u{Abr6xe?H0EIe(5S9CKO^^7w2GzZex8R^!cH zA4LTo{h)&hf_)v6RF?tpTn2k)JuMFg`KQ&9?IV0Z!~1aYE#Kkb-yTno#{0xYH0JtY?$)YA(|&!ItJt^2Sx)!|6d30{xUb{%Y*~uGOeK^| z)!AF8dg5As5I$%goN={+OpJ_n(B_Ijd=$h*^me=!qzKf1j?i8)Mlz2;$kTs>JWM8S4YX^?sp-9d+}6 z`Z)RK)v#HQkC$on*_YBnP|AA|c!{BxJFF8$1$Pc|(O1MOZAWhZ{e4*J{B!jfIJ6jC zt6NuFOa~V<21!vvrIK}`!c_CbpurlJ8Rs-f0QTY2tP-VXzOt*AHKG z0{_4Sfp>MjFaQ>G^)}~Xn3w$AGr?dUkVZW8XZ5lnOL5F#{j@2@8jBSIFCU*7Z>EL1 z0)okONz@$*RY$CpFq7)29~{k4$2?F*YBGrMsAdL85hMot6XJBnz&kN?(2Vk|di)17G z+hg(!s%;EX%P-WemuBq(jHa_&O3{0I5ji6}z(1Q!5q9j#JC**Z-cb=jPyUkEBhCcR z2V{q>voc>4IYc15Ar(S{o+4nVAqrp-;|7Ke5Gpm0ARFU8x_tc_jSm*Nn%n055;yk- z`_=7d$-4{9aevR~chAI)x2<7!Y6eypy}BDmwl#gWZu93(G&r{WwI#|~r2OdD1_#IxCIELLlQV2R2D2$u%u zl^T6_;rKvz2~mIs4?&y7=1+~}2O~Tda8B$_I_TMv%D_$Iyx1cQ4XXYF zkU^`2c0BtZbkx#{#`)8ihjIa2ozf?kA2^$mNPWT5C+7jUX7HN#W2o4zd~TTq+h{}u z4{fSgch7N4hgD{>un%sP$dv~#aO)l5n@;+7EqyjbqCp5CE#IXLEJkKMXiVcTwC+1; zq^9;6RKv>k&7AFTeVh4Db_Iao!5Zh-c^{rJOCLS)Hkn+%nTDf^%-j35=VgHOW%fb- znnu>zuQSgFJww95AyBA7*LF49?+1YZ-+7H#{dnJe{MdkwA|ndNC?f$1M-R=LxU{(v zJq2}9+bKx{(NDpb{tZ*6zyaSGXfZ#WRRkn)>RjhPx>(}Yye0D8h;22 zM%9Be>)lTg^?oRn7bFzx@7LLHe{kn`UUNC5)d#&3T#B6%FmB*okxa~2YG@T4Gnfp> zJQE`oKnoWj{7Id{M>^p3|GS%)fbY42$!i(U-m7-}-d*gnz&x}wBo7AVbM?)wWacg{ zj;QB?A07~%f;SPUe?*gJv-f`T;L>C;<_zotNci95+a?}*{~w{3B0z!=1;r#>J#!Nr7uvdU365n5Yn-z5aoS6Z0b$ulRUu! z^eTGu@@qCVrC%-owoFX!D0eQ!D|s7^X!!Ai@kK4U;xp+szZdVY(__{}8BCUq{(iL| zXnd!KF!tZxCrI2V`P)5Mx*e5UuqV&o`15o%xhgeEe79bPj~K4rxzA!A=+ag&{>W_%+B<*=5hZHkGkupD?nM zA=%23eaTjY_tg8(`+5JEJLleW?>Xmrp6~N~zvo068)`8#ax+385M~{1jT_*91^jm4 z^x$gBct#5XK|pjguHJk|vyyT0#ci|Hj=t^s%gl0LSQzZ18PLUM+O7|45uw5-&x#;m zu=nS=X~N3PBJP;;EpxYCu)HD!zr}EYC?JTW(V@_?Ax?5~oivs|8|nyS6YSK^*6HhB zZLB`nUHM%wl;=G7e0_ZF;L4Mw;2^tWT(5ud)S*A?B~cZbkYfx4c1;~ZV74rdi=4cg zxZrZUPOQpr-?L&{)%5?>m!`HA)mR%zB)-Jg^yyg#c7aL;@s=^SEjs=q3c?0 z5m-S8nNVy+F$;uBd*JzKx*C6s(CD5hhP{9=E#Eb{p=qSoYrDhf9FZX7y@db0o;Bkl zl-M^YowRZ!gklE{O8wU}z>jYet`-QDgY{-v;hsG&2;PeGQUD6tB#tqsaojjC9)K zM|#{gJB-=_X22|QXc!Od4`|41@W;5HD%xY$EU&7uNQE$2x99(%k@yg;j({@(`^q@x zn%2*Q+i)0@`+(5!D=zx#m68XnBc<$kZ0Y-!40?u?-}!dpPuS0^O=hI3RmMTyQ(M0W?D(}BINEb`xNZwjiyNqf;o|-j_lxjm;y{s*Qw{^b zMf^4UR|9AWSu-~_<*5iv^e@ZXF?c~KP`SoX_uAOzRZi}sp178??Xz#3ZNKH;kqY@_G z*tZRjYm3-gPjTA$(^`P5pN;I>IfdIQi?dtmE!!8Q$H`1bZw5A@39TXv6TAfh8GVR3*J=VD$ix z0oS=_@ECSrrvX0V0;X94YK5wj{xu&sF1_XNK{XbU<*95FhmXE!XygN>rU)#^Od3Z~pP;G5{3H!WN(F*mzf4=7J zxOCb2lSV0JcR`D+-prpSa!-ET0ycSUj)c4RF$?)mMEgG2JzJrgp`tTiIqLzes(R>5 zw_5wM(hyu3Q`^} z{gM`5V*nxerAhCf2oV7pm`2OqfX9o%?pPX0+anMzEa1JQr0O$N(sQRRg*U~ggTBad z#WgCy2TsBtYN2Hb!VXSH6*yVy_o3zMjT@~yd7?vt&+O)TKH-Y*Fl5NEj(-z>^WnpLsZ?bZDeW?;KjaS!LWWGxtQ^skc6IQ1#6`8KSpxG>V-k5yHL3y z7GR1PzGwsllq1M9JO>7^hjAxYJ%bIJMr^64Q__vaGAB6 zN649`a~;Tzk<++1&&qK@m(dFL|B!OI0TB+xgAo2MdaUnt9~?h+9%q!@u+R?#+z3|sLqcCq(3sYk8Z|pDl|5xm=+W2 zR`)J>L@-cVSw+~bgX8t#=~nmFav_QJSvcBRmEMzhK9$W!Sc(%`|je9v^s z7o(GRK)=C7&y&q}(G!Q4^eEiesaQ=_5Z#Q%5kaMlopren) z;YH^+U$i^YDW-h32!@Umt^3d)~K zS4)gl8qiXj8@b&+kaY3d_OVrdugRdB=jb_3HrzlMgsD_3BTP-tfdY!lJL#)1XbUKr z^tmh)D9jR8DSy5^_8M&YWNYot9hHew9Il?Da4Ng$GsTc+1m=Tu_XfT2pnDWM;A1(D z(qE&G0+Ko2KbH-moS|}k<&XAhkydD6(C8)J>`gE^Tvl9Eg~D2O(Q$;G_ehZL<7cx; zSoa{d8QYz#8==kZ2Bxsu`{m52*;cdyqDTWmDA%AH!JxB22H?3gJ1V7r?1SchbT%ZU z83A~JWUleemN}WcF_*~u>E`z2_*)V? z#;XCsk`*Bs1cSyPaTrq=9cfxRLH0wyX+yNRtHyMB1j=Ht=NNrpA#N~1*HO3lHqfU` zQ_gI?8eh}0Ea|d-ba|GD>T^A^LQ%yoR?^Zmfz%Iv*-?X@#si9iaKFOi?Lf(CqS%k? z!o12^XnL5x%3O!vi{R??sSgc){kbdVtJ-2-dPd(1+e?Ky7oksB)a@xEyy074;QdAh$;)BL0vBjmbnS?`DUqXb#{x;{*nsP|Qmp3TE*Z z2sj-uEUoK!o9^DWqjRvR`^1K#MONqWbmYVr_Qsas_zRBP(YY!L`|q-v28k7Rox{#Q zt5s6v3!h|^ie_{#V#aW}Qh`gu1iuOU+d(2v4)!Z$JXI}>E~m!-A(@=}GrWD4B=6Bg zy2GvT^XakmdHxEyhx>Fx@2CcaT#Qc|)4(8QYZu0FLUs@5xc-q#5Vg*`%JY70_`mUO z{&oEpk!zZby4~=YJ>4-%VQmJmG;S#|XRd&RC6y_P@VWt0i@L&R{QzMunR|CDeEw@_ zvedIqdqWZ&s1Aov>Y89{yTCx>MzIyEU&1l zr?~*>NxoY+4Z98Utq#Iz6N zngO%qk@xRc8NM4oxlYvslVrHECTM~WV~{08AR z%?$8g`ggLzKmU0A_zWQIRkR&_dp0^-JG%nQd2q74e#|Ys-w+<`9r7IMw_-^IE#`Lh3tNb(&I6GK&n_G@M!bKhkwl5k3{O}qe*!)gisG|>Y0z{K$ z;5&7+AXV-iW`!f=2?bqi?3WR(%S)06)zSNPp*;Mr3mA=E=i zpbt0~x{M-eZ?w-Y)-RmNl8V(p) zFDJ(;z3h}a3YDx7i?2nGLv<5CP++lsvsn5(TI{g5QB4T=+nsADtgyhu0YX4fNY3?(YM+nSmChn6LW- zxxssxU+rrwLn(gDWcs4Kw@ID$v|aXyeM+t?BV5=(FU>3^(O{={&v)X&-uR0f10r@ew{Kh+A2ew*7dwfAxFi6cr>mdAyPoM7cF{SCnZ@8vDnr`3oA?1#(z zzj68BW9vmerlbb8w5v^ui)31>h;&bsnkkRTRS55mBNN8bnK)HQ-g-udH;yaj^E63C z1!j)pE>XOjZ+EFfs>73)XQXYruhiEN>T=ECw!T$8Y3AMC6C)I)x$10~XL(jecS|Br zKbhNYqx;EgAN5$xo=?3&XRP?gF?pb;CH~4s&u4>`))RcRhZbnO9vL8m>@^L8g#xka zNG+VI+X&Yeb3jjX|5L*U-eSzpcwGlgXHQBs3je2KDa4r9H8*0@yUKqV;T45(VA8`= zEYp8AD=If(TObg+&A(>>cP}oA?Z3mZ=$zq?8ICX?REkXS{uQl%ltdbTQCsZ@#PzqO zq4rZhw$rwfy>WtQ_9r>KVNkTO;B+e1m89d^ZxvXadtaeQxJ3og zpM-ZN2)7PK`z7z{WJszz04mi91j~P(HMfvW6GCL)_)HWhzN5yxSE3i~!PjnRj0q8* zTvd1oOACL-uWMySP8!3qLebN-0L&*AkZiDYP#rSj)B%)VK*|k_8Ms*p!i;bPoPnl~ zsr0Ae_or3LjrY<{&m_c{_#3P&{35K12S`;;Y&uVF-sMS@shjCryEzb;!>h7X+f*Do zGpq7i0Bi%o`iv^29+y~A{rxRw%s)qg-I4tM-w(%x)$SAu6Bu0Wgn%V zR#K8b-;m}j8eCoW{xGfZ=E-8Qm8sv;%eMM3`@hcPK_#6mY}lDK@*?$zK;WN6rt7fo ztj|B7n*|{Qe9&0tG+7a&sUfW%-twwqv1S86xAHU{1kTs%k7Vr|?l?mQ;CPG;lo?rd zZ;A}tiHs&TK^7Ov`6jQ3RYaR1xljzSr3 zi+gHIoJ-B2O-y$1Z5$s`)qHVGR6Ak?g;m~DLDddYzXPl$PUFW%0ginbOem&jJ)IH z?|Ef@sg~WKIqby8hldpFmLkv##$RduK%SaHq*~u8&E7UpJ2UT>aljuJTIoN z8$~%>J_KTIZz3x{#we?EINs1_sat%`cl&eAjb+}dt^2`z3y9}kvszx|SNI|U6(Yy$gP zb4&RZDW>-ZbW+DJl@Z&jPLz$)p7z@LGTw0P5jANBjvvm7O5`RCrFBUjw49XdR&v0p zsahPZ_qhE#RFMN+)?Mcha(=eA1Jd5lNX4PXp1@JVL2+>j!=hTl+tJ2n`-guo6nrWEB%V3$0-@d7HjWFZR^k=I>0Y;GD-l?}8)G_|`l&jj5CF-HF4x?_7(*aveSGe`bEuST5OJcW + ); diff --git a/packages/twenty-website-new/src/app/halftone/_components/ControlsPanel.tsx b/packages/twenty-website-new/src/app/halftone/_components/ControlsPanel.tsx index ba63b2ef2c..edef1421b2 100644 --- a/packages/twenty-website-new/src/app/halftone/_components/ControlsPanel.tsx +++ b/packages/twenty-website-new/src/app/halftone/_components/ControlsPanel.tsx @@ -1,5 +1,6 @@ 'use client'; +import type { ReactExportSettings } from '@/app/halftone/_lib/exporters'; import { IconLayoutSidebarRightCollapse, IconShare } from '@tabler/icons-react'; import { styled } from '@linaria/react'; import type { @@ -33,6 +34,11 @@ type ControlsPanelProps = { onExportNameChange: (value: string) => void; onExportReact: () => void; onImportPreset: () => void; + onReactAssetPublicUrlChange: (value: string) => void; + onReactExportSettingChange: ( + key: keyof ReactExportSettings, + value: boolean, + ) => void; onHalftoneChange: ( value: Partial, ) => void; @@ -49,10 +55,14 @@ type ControlsPanelProps = { onToggleVisibility: () => void; onUploadSource: () => void; previewDistance: number; + reactAssetPublicUrl: string; + reactExportSettings: ReactExportSettings; visible: boolean; selectedShape: HalftoneGeometrySpec | undefined; settings: HalftoneStudioSettings; shapeOptions: Array<{ label: string; value: string }>; + defaultReactAssetPublicUrl: string; + showReactAssetPublicUrl: boolean; }; const TABS: HalftoneTabId[] = ['design', 'animations', 'export']; @@ -129,6 +139,8 @@ export function ControlsPanel({ onExportNameChange, onExportReact, onImportPreset, + onReactAssetPublicUrlChange, + onReactExportSettingChange, onHalftoneChange, onLightingChange, onMaterialChange, @@ -139,10 +151,14 @@ export function ControlsPanel({ onToggleVisibility, onUploadSource, previewDistance, + reactAssetPublicUrl, + reactExportSettings, visible, selectedShape, settings, shapeOptions, + defaultReactAssetPublicUrl, + showReactAssetPublicUrl, }: ControlsPanelProps) { return ( @@ -226,8 +242,14 @@ export function ControlsPanel({ onExportNameChange={onExportNameChange} onExportReact={onExportReact} onImportPreset={onImportPreset} + onReactAssetPublicUrlChange={onReactAssetPublicUrlChange} + onReactExportSettingChange={onReactExportSettingChange} + reactAssetPublicUrl={reactAssetPublicUrl} + reactExportSettings={reactExportSettings} selectedShape={selectedShape} settings={settings} + defaultReactAssetPublicUrl={defaultReactAssetPublicUrl} + showReactAssetPublicUrl={showReactAssetPublicUrl} /> ) : null} diff --git a/packages/twenty-website-new/src/app/halftone/_components/HalftoneStudio.tsx b/packages/twenty-website-new/src/app/halftone/_components/HalftoneStudio.tsx index d68ae1c200..940ec1abf2 100644 --- a/packages/twenty-website-new/src/app/halftone/_components/HalftoneStudio.tsx +++ b/packages/twenty-website-new/src/app/halftone/_components/HalftoneStudio.tsx @@ -13,11 +13,13 @@ import { } from '@/app/halftone/_lib/geometry-registry'; import { REFERENCE_PREVIEW_DISTANCE } from '@/app/halftone/_lib/footprint'; import { + DEFAULT_REACT_EXPORT_SETTINGS, deriveExportComponentName, generateReactComponent, generateStandaloneHtml, getExportedModelFile, parseExportedPreset, + type ReactExportSettings, } from '@/app/halftone/_lib/exporters'; import { DEFAULT_IMAGE_HALFTONE_SETTINGS, @@ -203,6 +205,25 @@ function downloadText(filename: string, content: string) { downloadBlob(filename, new Blob([content], { type: 'text/plain' })); } +function getFilenameExtension( + filename: string | null | undefined, + fallbackExtension: string, +) { + const sanitizedFilename = filename?.split(/[?#]/, 1)[0] ?? ''; + const match = sanitizedFilename.match(/(\.[^.\\/]+)$/); + + return match?.[1] ?? fallbackExtension; +} + +function getAssetFilenameFromUrl(assetUrl: string, fallbackFilename: string) { + const sanitizedAssetUrl = assetUrl.split(/[?#]/, 1)[0].replace(/\/+$/, ''); + const assetFilename = sanitizedAssetUrl.split('/').filter(Boolean).pop(); + + return assetFilename && assetFilename.length > 0 + ? assetFilename + : fallbackFilename; +} + function createInitialExportPose(): HalftoneExportPose { return { autoElapsed: 0, @@ -291,6 +312,9 @@ export function HalftoneStudio() { ); const [exportBackground, setExportBackground] = useState(false); const [exportName, setExportName] = useState(''); + const [reactExportSettings, setReactExportSettings] = + useState(DEFAULT_REACT_EXPORT_SETTINGS); + const [reactAssetPublicUrl, setReactAssetPublicUrl] = useState(''); const [imageFile, setImageFile] = useState(null); const [imageElement, setImageElement] = useState( null, @@ -362,6 +386,38 @@ export function HalftoneStudio() { () => resolveExportArtifactNames(exportName, defaultExportName), [defaultExportName, exportName], ); + const reactExportUsesExternalAsset = useMemo( + () => + state.settings.sourceMode === 'image' || + selectedShape?.kind === 'imported', + [selectedShape?.kind, state.settings.sourceMode], + ); + const defaultReactAssetPublicUrl = useMemo(() => { + if (!reactExportUsesExternalAsset) { + return ''; + } + + const assetExtension = + state.settings.sourceMode === 'image' + ? getFilenameExtension( + imageFile?.name ?? DEFAULT_IMAGE_FILENAME, + '.svg', + ) + : getFilenameExtension( + selectedImportedFile?.name ?? selectedShape?.filename, + selectedShape?.loader === 'fbx' ? '.fbx' : '.glb', + ); + + return `/illustrations/generated/${exportArtifactNames.fileBaseName}${assetExtension}`; + }, [ + exportArtifactNames.fileBaseName, + imageFile?.name, + reactExportUsesExternalAsset, + selectedImportedFile?.name, + selectedShape?.filename, + selectedShape?.loader, + state.settings.sourceMode, + ]); useEffect(() => { halftoneBySourceModeReference.current[state.settings.sourceMode] = { @@ -831,6 +887,16 @@ export function HalftoneStudio() { exportPoseReference.current = pose; }, []); + const handleReactExportSettingChange = useCallback( + (key: keyof ReactExportSettings, value: boolean) => { + setReactExportSettings((currentSettings) => ({ + ...currentSettings, + [key]: value, + })); + }, + [], + ); + const handleExportReact = useCallback(() => { const componentName = exportArtifactNames.componentName; const kebabName = exportArtifactNames.fileBaseName; @@ -839,28 +905,45 @@ export function HalftoneStudio() { const exportBackgroundColor = exportBackground ? state.settings.background.color : 'transparent'; + const effectiveReactAssetPublicUrl = + reactExportSettings.includePublicAssetUrl && reactExportUsesExternalAsset + ? reactAssetPublicUrl.trim() || defaultReactAssetPublicUrl + : undefined; - const modelFilename = importedFile + const defaultModelFilename = importedFile ? `${kebabName}${importedFile.name.replace(/^[^.]*/, '')}` : undefined; + const modelFilename = + effectiveReactAssetPublicUrl && defaultModelFilename + ? getAssetFilenameFromUrl( + effectiveReactAssetPublicUrl, + defaultModelFilename, + ) + : defaultModelFilename; - const imageExportFilename = imageFile + const defaultImageExportFilename = imageFile ? `${kebabName}${imageFile.name.replace(/^[^.]*/, '')}` : undefined; + const imageExportFilename = + effectiveReactAssetPublicUrl && defaultImageExportFilename + ? getAssetFilenameFromUrl( + effectiveReactAssetPublicUrl, + defaultImageExportFilename, + ) + : defaultImageExportFilename; downloadText( `${componentName}.tsx`, - generateReactComponent( - state.settings, - selectedShape, - componentName, - modelFilename, - exportPoseReference.current, + generateReactComponent(state.settings, selectedShape, componentName, { + assetUrl: effectiveReactAssetPublicUrl, + background: exportBackgroundColor, + imageFilename: imageExportFilename, + importedFile: importedFile ?? undefined, + initialPose: exportPoseReference.current, + modelFilenameOverride: modelFilename, + exportSettings: reactExportSettings, previewDistance, - importedFile ?? undefined, - imageExportFilename, - exportBackgroundColor, - ), + }), ); if (isImageMode && imageFile) { @@ -869,10 +952,14 @@ export function HalftoneStudio() { downloadBlob(modelFilename ?? importedFile.name, importedFile); } }, [ + defaultReactAssetPublicUrl, exportArtifactNames, exportBackground, imageFile, previewDistance, + reactAssetPublicUrl, + reactExportSettings, + reactExportUsesExternalAsset, selectedImportedFile, selectedShape, state.settings, @@ -928,12 +1015,14 @@ export function HalftoneStudio() { state.settings, selectedShape, componentName, - modelFilename, - exportPoseReference.current, - previewDistance, - importedFile ?? undefined, - imageExportFilename, - exportBackgroundColor, + { + background: exportBackgroundColor, + imageFilename: imageExportFilename, + importedFile: importedFile ?? undefined, + initialPose: exportPoseReference.current, + modelFilenameOverride: modelFilename, + previewDistance, + }, ), ); @@ -1124,6 +1213,8 @@ export function HalftoneStudio() { }} onExportNameChange={setExportName} onExportReact={handleExportReact} + onReactAssetPublicUrlChange={setReactAssetPublicUrl} + onReactExportSettingChange={handleReactExportSettingChange} onImportPreset={() => { void handleImportPreset(); }} @@ -1150,9 +1241,16 @@ export function HalftoneStudio() { void handleUploadSource(); }} previewDistance={previewDistance} + reactAssetPublicUrl={reactAssetPublicUrl} + reactExportSettings={reactExportSettings} selectedShape={selectedShape} settings={state.settings} shapeOptions={shapeOptions} + defaultReactAssetPublicUrl={defaultReactAssetPublicUrl} + showReactAssetPublicUrl={ + reactExportSettings.includePublicAssetUrl && + reactExportUsesExternalAsset + } visible={controlsVisible} /> diff --git a/packages/twenty-website-new/src/app/halftone/_components/controls/ExportTab.tsx b/packages/twenty-website-new/src/app/halftone/_components/controls/ExportTab.tsx index e23351a785..6530ecd4d9 100644 --- a/packages/twenty-website-new/src/app/halftone/_components/controls/ExportTab.tsx +++ b/packages/twenty-website-new/src/app/halftone/_components/controls/ExportTab.tsx @@ -1,5 +1,6 @@ 'use client'; +import type { ReactExportSettings } from '@/app/halftone/_lib/exporters'; import { resolveExportArtifactNames } from '@/app/halftone/_lib/exportNames'; import { formatAnimationName } from '@/app/halftone/_lib/formatters'; import type { @@ -28,6 +29,48 @@ const RESOLUTION_OPTIONS = [ ]; const DEFAULT_IMAGE_FILE_NAME = 'twenty-logo.svg'; const DEFAULT_IMAGE_LABEL = 'Twenty image'; +const REACT_EXPORT_SETTING_OPTIONS: Array<{ + description: string; + key: keyof ReactExportSettings; + label: string; +}> = [ + { + key: 'includePublicAssetUrl', + label: 'Use public asset URL', + description: + 'Bakes the public asset path into the React export instead of using a relative file path.', + }, + { + key: 'includeStyledMount', + label: 'Use Linaria wrapper', + description: + 'Wraps the mount node with a StyledVisualMount using @linaria/react and keeps the Twenty-ready mount shape.', + }, + { + key: 'includeUseClientDirective', + label: "Add 'use client'", + description: + 'Prepends the Next.js client directive so the exported component can be dropped into the Twenty website directly.', + }, + { + key: 'includeTsNoCheck', + label: 'Add @ts-nocheck', + description: + 'Prepends // @ts-nocheck so generated self-contained files do not need hand-cleaning to satisfy strict TypeScript.', + }, + { + key: 'includeNamedAndDefaultExport', + label: 'Named + default export', + description: + 'Exports both a named component and a default export to match the current Twenty illustration import pattern.', + }, + { + key: 'includeRegistryComment', + label: 'Add Twenty header comment', + description: + 'Adds suggested destination and registry wiring comments at the top of the generated file.', + }, +]; function sectionLabel(label: string, description: string) { return ; @@ -44,8 +87,17 @@ type ExportTabProps = { onExportNameChange: (value: string) => void; onExportReact: () => void; onImportPreset: () => void; + onReactAssetPublicUrlChange: (value: string) => void; + onReactExportSettingChange: ( + key: keyof ReactExportSettings, + value: boolean, + ) => void; + reactAssetPublicUrl: string; + reactExportSettings: ReactExportSettings; selectedShape: HalftoneGeometrySpec | undefined; settings: HalftoneStudioSettings; + defaultReactAssetPublicUrl: string; + showReactAssetPublicUrl: boolean; }; export function ExportTab({ @@ -59,8 +111,14 @@ export function ExportTab({ onExportNameChange, onExportReact, onImportPreset, + onReactAssetPublicUrlChange, + onReactExportSettingChange, + reactAssetPublicUrl, + reactExportSettings, selectedShape, settings, + defaultReactAssetPublicUrl, + showReactAssetPublicUrl, }: ExportTabProps) { const [resolution, setResolution] = useState('1920x1080'); const isImageMode = settings.sourceMode === 'image'; @@ -170,6 +228,20 @@ export function ExportTab({

+
+ {`// Public asset URL: ${reactExportSettings.includePublicAssetUrl ? 'on' : 'off'}`} +
+
+ {`// Linaria wrapper: ${reactExportSettings.includeStyledMount ? 'on' : 'off'}`} +
+
+ {`// use client: ${reactExportSettings.includeUseClientDirective ? 'on' : 'off'}`} +
+ {showReactAssetPublicUrl ? ( +
+ {`// Asset URL: ${reactAssetPublicUrl || defaultReactAssetPublicUrl}`} +
+ ) : null}
{`// Animation: ${animationLabel}`}
@@ -190,6 +262,36 @@ export function ExportTab({ + {REACT_EXPORT_SETTING_OPTIONS.map((option) => ( + + onReactExportSettingChange(option.key, event.target.checked) + } + /> + ))} + + {showReactAssetPublicUrl ? ( +
+ + {sectionLabel( + 'Asset public URL', + 'Used as the baked-in public path for the downloaded image or model asset when "Use public asset URL" is enabled.', + )} + + + onReactAssetPublicUrlChange(event.target.value) + } + placeholder={defaultReactAssetPublicUrl} + type="text" + value={reactAssetPublicUrl} + /> +
+ ) : null} + Download React Component diff --git a/packages/twenty-website-new/src/app/halftone/_lib/exporters.test.ts b/packages/twenty-website-new/src/app/halftone/_lib/exporters.test.ts index 26f1cbfb79..f2f86a4fc6 100644 --- a/packages/twenty-website-new/src/app/halftone/_lib/exporters.test.ts +++ b/packages/twenty-website-new/src/app/halftone/_lib/exporters.test.ts @@ -1,14 +1,33 @@ import { generateReactComponent, - parseExportedPreset, generateStandaloneHtml, + parseExportedPreset, + type ReactExportSettings, } from '@/app/halftone/_lib/exporters'; import { resolveExportArtifactNames } from '@/app/halftone/_lib/exportNames'; import { DEFAULT_HALFTONE_SETTINGS, normalizeHalftoneStudioSettings, + type HalftoneGeometrySpec, } from '@/app/halftone/_lib/state'; +const IMPORTED_GLB_SHAPE: HalftoneGeometrySpec = { + key: 'userUpload_connect', + label: 'connect.glb', + kind: 'imported', + loader: 'glb', + filename: 'connect.glb', +}; + +const GENERIC_REACT_EXPORT_SETTINGS: ReactExportSettings = { + includeNamedAndDefaultExport: false, + includePublicAssetUrl: false, + includeRegistryComment: false, + includeTsNoCheck: false, + includeUseClientDirective: false, + includeStyledMount: false, +}; + describe('halftone export naming', () => { it('normalizes free-form export names into safe component and file names', () => { expect(resolveExportArtifactNames('hero export 2026')).toEqual({ @@ -17,15 +36,17 @@ describe('halftone export naming', () => { }); }); - it('sanitizes generated React component identifiers', () => { + it('sanitizes generated React component identifiers for the default Twenty export', () => { const output = generateReactComponent( DEFAULT_HALFTONE_SETTINGS, undefined, 'hero export 2026', ); + expect(output).toContain('// @ts-nocheck'); + expect(output).toContain('export function HeroExport2026({'); + expect(output).toContain('export default HeroExport2026;'); expect(output).toContain('type HeroExport2026Props = {'); - expect(output).toContain('export default function HeroExport2026({'); expect(output).not.toContain('type hero export 2026Props = {'); }); @@ -56,4 +77,130 @@ describe('halftone export naming', () => { normalizeHalftoneStudioSettings(parsed.settings).halftone.hoverDashColor, ).toBe(DEFAULT_HALFTONE_SETTINGS.halftone.hoverDashColor); }); + + it('uses the initial pose as the export runtime rotation baseline', async () => { + const reactOutput = generateReactComponent( + DEFAULT_HALFTONE_SETTINGS, + undefined, + 'rotation baseline export', + ); + const htmlOutput = await generateStandaloneHtml( + DEFAULT_HALFTONE_SETTINGS, + undefined, + 'rotation baseline export', + ); + + expect(reactOutput).toContain('let baseRotationY = initialPose.rotationY;'); + expect(htmlOutput).toContain('let baseRotationY = initialPose.rotationY;'); + }); +}); + +describe('halftone react export presets', () => { + it('emits a Twenty-ready GLB export with Draco support and no torus fallback', () => { + const output = generateReactComponent( + DEFAULT_HALFTONE_SETTINGS, + IMPORTED_GLB_SHAPE, + 'PartnerConnect', + { + assetUrl: '/illustrations/generated/partner-connect.glb', + modelFilenameOverride: 'partner-connect.glb', + }, + ); + + expect(output).toContain('// @ts-nocheck'); + expect(output).toContain("'use client';"); + expect(output).toContain('DRACOLoader'); + expect(output).toContain('export function PartnerConnect({'); + expect(output).toContain('export default PartnerConnect;'); + expect(output).toContain( + 'modelUrl = "/illustrations/generated/partner-connect.glb"', + ); + expect(output).toContain( + '// Suggested public asset destination: public/illustrations/generated/partner-connect.glb', + ); + expect(output).not.toContain("createBuiltinGeometry('torusKnot')"); + }); + + it('emits a Twenty-ready image export without model loaders', () => { + const imageSettings = normalizeHalftoneStudioSettings({ + ...DEFAULT_HALFTONE_SETTINGS, + sourceMode: 'image', + }); + const output = generateReactComponent( + imageSettings, + undefined, + 'PartnerLogo', + { + assetUrl: '/illustrations/generated/partner-logo.svg', + imageFilename: 'partner-logo.svg', + }, + ); + + expect(output).toContain( + 'imageUrl = "/illustrations/generated/partner-logo.svg"', + ); + expect(output).not.toContain('GLTFLoader'); + expect(output).not.toContain('FBXLoader'); + expect(output).not.toContain('DRACOLoader'); + }); + + it('keeps pointer cancel wiring and removes window listeners from window in the model runtime', () => { + const output = generateReactComponent( + DEFAULT_HALFTONE_SETTINGS, + IMPORTED_GLB_SHAPE, + 'PartnerConnect', + { + assetUrl: '/illustrations/generated/partner-connect.glb', + modelFilenameOverride: 'partner-connect.glb', + }, + ); + + expect(output).toContain('const handlePointerCancel = () =>'); + expect(output).toContain( + "canvas.addEventListener('pointercancel', handlePointerCancel);", + ); + expect(output).toContain( + "window.removeEventListener('pointerup', handlePointerUp);", + ); + expect(output).toContain( + "window.removeEventListener('pointermove', handleWindowPointerMove);", + ); + expect(output).not.toContain( + "canvas.removeEventListener('pointerup', handlePointerUp);", + ); + }); + + it('parses Twenty exports with header comments and named/default exports', () => { + const output = generateReactComponent( + DEFAULT_HALFTONE_SETTINGS, + IMPORTED_GLB_SHAPE, + 'PartnerConnect', + { + assetUrl: '/illustrations/generated/partner-connect.glb', + modelFilenameOverride: 'partner-connect.glb', + }, + ); + const parsed = parseExportedPreset(output); + + expect(parsed.componentName).toBe('PartnerConnect'); + expect(parsed.modelAssetReference).toBe( + '/illustrations/generated/partner-connect.glb', + ); + }); + + it('keeps the generic React export available with relative asset paths', () => { + const output = generateReactComponent( + DEFAULT_HALFTONE_SETTINGS, + IMPORTED_GLB_SHAPE, + 'PartnerConnect', + { + exportSettings: GENERIC_REACT_EXPORT_SETTINGS, + modelFilenameOverride: 'partner-connect.glb', + }, + ); + + expect(output).toContain('modelUrl = "./partner-connect.glb"'); + expect(output).toContain('export default function PartnerConnect({'); + expect(output).not.toContain("'use client';"); + }); }); diff --git a/packages/twenty-website-new/src/app/halftone/_lib/exporters.ts b/packages/twenty-website-new/src/app/halftone/_lib/exporters.ts index a18ec2fad9..9bf2d07f20 100644 --- a/packages/twenty-website-new/src/app/halftone/_lib/exporters.ts +++ b/packages/twenty-website-new/src/app/halftone/_lib/exporters.ts @@ -13,6 +13,35 @@ import { } from '@/app/halftone/_lib/state'; import { GLASS_ENVIRONMENT_DATA_URL } from '@/app/halftone/_lib/glassEnvironmentData'; +export type ReactExportSettings = { + includeNamedAndDefaultExport: boolean; + includePublicAssetUrl: boolean; + includeRegistryComment: boolean; + includeTsNoCheck: boolean; + includeUseClientDirective: boolean; + includeStyledMount: boolean; +}; + +export type ReactExportOptions = { + assetUrl?: string; + background?: string; + exportSettings?: Partial; + imageFilename?: string; + importedFile?: File; + initialPose?: HalftoneExportPose; + modelFilenameOverride?: string; + previewDistance?: number; +}; + +export const DEFAULT_REACT_EXPORT_SETTINGS: ReactExportSettings = { + includeNamedAndDefaultExport: true, + includePublicAssetUrl: true, + includeRegistryComment: true, + includeTsNoCheck: true, + includeUseClientDirective: true, + includeStyledMount: true, +}; + const passThroughVertexShader = ` varying vec2 vUv; @@ -1021,7 +1050,7 @@ function createBuiltinGeometry(shapeKey) { } `; -const IMPORTED_RUNTIME_SOURCE = String.raw` +const IMPORTED_RUNTIME_SHARED_SOURCE = String.raw` const EMPTY_TEXTURE_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO8B7Q8AAAAASUVORK5CYII='; @@ -1098,6 +1127,9 @@ function extractMergedGeometry(root, emptyMessage) { return normalizeImportedGeometry(mergeGeometries(geometries)); } +`; + +const IMPORTED_FBX_RUNTIME_SOURCE = String.raw` function parseFbxGeometry(buffer, label) { const originalWarn = console.warn; @@ -1117,10 +1149,26 @@ function parseFbxGeometry(buffer, label) { console.warn = originalWarn; } } +`; + +const IMPORTED_GLB_RUNTIME_SOURCE = String.raw` +const DRACO_DECODER_PATH = + 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/'; function parseGlbGeometry(buffer, label) { return new Promise((resolve, reject) => { - new GLTFLoader(createLoadingManager()).parse( + const loadingManager = createLoadingManager(); + const dracoLoader = new DRACOLoader(loadingManager); + dracoLoader.setDecoderPath(DRACO_DECODER_PATH); + + const loader = new GLTFLoader(loadingManager); + loader.setDRACOLoader(dracoLoader); + + const cleanup = () => { + dracoLoader.dispose(); + }; + + loader.parse( buffer, '', (gltf) => { @@ -1133,14 +1181,29 @@ function parseGlbGeometry(buffer, label) { ); } catch (error) { reject(error); + } finally { + cleanup(); } }, - reject, + (error) => { + cleanup(); + reject(error); + }, ); }); } +`; -async function loadImportedGeometryFromUrl(loader, modelUrl, label) { +function createImportedRuntimeSource(loader: HalftoneGeometrySpec['loader']) { + const loaderSource = + loader === 'fbx' + ? IMPORTED_FBX_RUNTIME_SOURCE + : IMPORTED_GLB_RUNTIME_SOURCE; + + return `${IMPORTED_RUNTIME_SHARED_SOURCE} +${loaderSource} + +async function loadImportedGeometryFromUrl(modelUrl, label) { const response = await fetch(modelUrl); if (!response.ok) { @@ -1149,13 +1212,14 @@ async function loadImportedGeometryFromUrl(loader, modelUrl, label) { const buffer = await response.arrayBuffer(); - if (loader === 'fbx') { - return parseFbxGeometry(buffer, label); + ${ + loader === 'fbx' + ? 'return parseFbxGeometry(buffer, label);' + : 'return parseGlbGeometry(buffer, label);' } - - return parseGlbGeometry(buffer, label); } `; +} type ExportedShapeDescriptor = { filename: string | null; @@ -1175,6 +1239,147 @@ export type ParsedExportedPreset = { shape: ExportedShapeDescriptor; }; +function getExportedShapeLoader( + shape: ExportedShapeDescriptor, +): HalftoneGeometrySpec['loader'] | null { + if (shape.loader) { + return shape.loader; + } + + const filename = shape.filename?.toLowerCase() ?? ''; + + if (filename.endsWith('.fbx')) { + return 'fbx'; + } + + if (filename.endsWith('.glb')) { + return 'glb'; + } + + return null; +} + +function createImportedGeometryRuntimeSource(shape: ExportedShapeDescriptor) { + if (shape.kind !== 'imported') { + return ''; + } + + const loader = getExportedShapeLoader(shape) ?? 'glb'; + + return createImportedRuntimeSource(loader); +} + +function toIllustrationRegistryKey(componentName: string) { + return componentName.charAt(0).toLowerCase() + componentName.slice(1); +} + +function toPublicAssetDestination(assetUrl: string) { + return assetUrl.startsWith('/') ? `public${assetUrl}` : assetUrl; +} + +function normalizeReactExportSettings( + exportSettings?: Partial, +): ReactExportSettings { + return { + ...DEFAULT_REACT_EXPORT_SETTINGS, + ...exportSettings, + }; +} + +function getReactImportBlock( + exportSettings: ReactExportSettings, + isImageMode: boolean, + shape: ExportedShapeDescriptor, +) { + const imports = new Set(); + + imports.add("import { useEffect, useRef, type CSSProperties } from 'react';"); + imports.add("import * as THREE from 'three';"); + + if (exportSettings.includeStyledMount) { + imports.add("import { styled } from '@linaria/react';"); + } + + if (!isImageMode) { + imports.add( + "import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';", + ); + } + + const loader = getExportedShapeLoader(shape); + + if (shape.kind === 'imported' && loader === 'fbx') { + imports.add( + "import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';", + ); + } + + if (shape.kind === 'imported' && loader === 'glb') { + imports.add( + "import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';", + ); + imports.add( + "import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';", + ); + } + + return Array.from(imports).join('\n'); +} + +function getStandaloneThreeImports( + isImageMode: boolean, + shape: ExportedShapeDescriptor, +) { + if (isImageMode) { + return `import * as THREE from 'three';`; + } + + const imports = [ + `import * as THREE from 'three';`, + `import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';`, + ]; + + const loader = getExportedShapeLoader(shape); + + if (shape.kind === 'imported' && loader === 'fbx') { + imports.push( + `import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';`, + ); + } + + if (shape.kind === 'imported' && loader === 'glb') { + imports.push( + `import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';`, + `import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';`, + ); + } + + return imports.join('\n '); +} + +function getTwentyReactHeaderComment( + componentName: string, + registryKey: string, + assetUrl?: string, +) { + const lines = [ + `// Suggested component destination: src/illustrations/${componentName}.tsx`, + ]; + + if (assetUrl) { + lines.push( + `// Suggested public asset destination: ${toPublicAssetDestination(assetUrl)}`, + ); + } + + lines.push( + `// illustrations-registry.tsx: import { ${componentName} } from './${componentName}';`, + `// illustrations-registry.tsx: ${registryKey}: ${componentName},`, + ); + + return `${lines.join('\n')}\n`; +} + function createDefaultExportPose(): HalftoneExportPose { return { autoElapsed: 0, @@ -1318,6 +1523,8 @@ export function parseExportedPreset(content: string): ParsedExportedPreset { const componentName = extractFirstMatch(content, [ /export\s+default\s+function\s+([A-Za-z0-9_]+)/, + /export\s+function\s+([A-Za-z0-9_]+)/, + /export\s+default\s+([A-Za-z0-9_]+)\s*;/, /([^<]+)<\/title>/i, ]) ?? null; const modelAssetReference = extractFirstMatch(content, [ @@ -1817,7 +2024,7 @@ ${HALFTONE_FOOTPRINT_RUNTIME_SOURCE} ${isImageMode ? '' : GEOMETRY_RUNTIME_SOURCE} -${isImageMode ? '' : IMPORTED_RUNTIME_SOURCE} +${isImageMode ? '' : createImportedGeometryRuntimeSource(shape)} ${isImageMode ? '' : GLASS_MATERIAL_RUNTIME_SOURCE} @@ -1891,8 +2098,12 @@ function resetInteractionState(interactionState) { } async function createGeometry(modelUrl) { - if (shape.kind === 'imported' && shape.loader && modelUrl) { - return loadImportedGeometryFromUrl(shape.loader, modelUrl, shape.label); + if (shape.kind === 'imported') { + if (!modelUrl) { + throw new Error('No model URL was provided for ' + shape.label + '.'); + } + + return loadImportedGeometryFromUrl(modelUrl, shape.label); } return createBuiltinGeometry(shape.key); @@ -1926,7 +2137,7 @@ async function mountHalftoneCanvas(options) { geometry = await createGeometry(modelUrl); } catch (error) { onError?.(error); - geometry = createBuiltinGeometry('torusKnot'); + return () => {}; } const renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true }); @@ -2204,6 +2415,14 @@ async function mountHalftoneCanvas(options) { interaction.velocityY = 0; }; + const handlePointerCancel = () => { + interaction.dragging = false; + interaction.velocityX = 0; + interaction.velocityY = 0; + canvas.style.cursor = followDragEnabled ? 'grab' : 'default'; + handlePointerLeave(); + }; + const handleWindowBlur = () => { handlePointerUp(); handlePointerLeave(); @@ -2211,6 +2430,7 @@ async function mountHalftoneCanvas(options) { canvas.addEventListener('pointermove', handlePointerMove); canvas.addEventListener('pointerleave', handlePointerLeave); + canvas.addEventListener('pointercancel', handlePointerCancel); window.addEventListener('pointerup', handlePointerUp); window.addEventListener('pointermove', handleWindowPointerMove); window.addEventListener('blur', handleWindowBlur); @@ -2228,9 +2448,9 @@ async function mountHalftoneCanvas(options) { const elapsedTime = initialPose.timeElapsed + clock.getElapsed(); halftoneMaterial.uniforms.time.value = elapsedTime; - let baseRotationX = 0; - let baseRotationY = 0; - let baseRotationZ = 0; + let baseRotationX = initialPose.rotationX; + let baseRotationY = initialPose.rotationY; + let baseRotationZ = initialPose.rotationZ; let meshOffsetY = 0; let meshScale = 1; let lightAngle = settings.lighting.angleDegrees; @@ -2476,7 +2696,8 @@ async function mountHalftoneCanvas(options) { resizeObserver.disconnect(); canvas.removeEventListener('pointermove', handlePointerMove); canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointerup', handlePointerUp); + window.removeEventListener('pointerup', handlePointerUp); + window.removeEventListener('pointermove', handleWindowPointerMove); canvas.removeEventListener('pointercancel', handlePointerCancel); window.removeEventListener('blur', handleWindowBlur); canvas.removeEventListener('pointerdown', handlePointerDown); @@ -2915,65 +3136,87 @@ export function generateReactComponent( settings: HalftoneStudioSettings, selectedShape: HalftoneGeometrySpec | undefined, componentName = 'HalftoneDashes', - modelFilenameOverride?: string, - initialPose?: HalftoneExportPose, - previewDistance?: number, - importedFile?: File, - imageFilename?: string, - background = 'transparent', + options: ReactExportOptions = {}, ) { const isImageMode = settings.sourceMode === 'image'; + const exportSettings = normalizeReactExportSettings(options.exportSettings); const shape = createShapeDescriptor( selectedShape, settings, - importedFile, - modelFilenameOverride, + options.importedFile, + options.modelFilenameOverride, ); - const pose = normalizeExportPose(initialPose); + const pose = normalizeExportPose(options.initialPose); const normalizedComponentName = normalizeExportComponentName(componentName); - const defaultModelUrl = - modelFilenameOverride ?? shape.filename ?? 'model.glb'; - const defaultImageUrl = imageFilename ?? 'image.png'; - if (isImageMode) { - return `import { useEffect, useRef, type CSSProperties } from 'react'; -import * as THREE from 'three'; - -${serializeRuntimeSource(settings, shape, pose, previewDistance)} - -${createImageMountScript()} - -type ${normalizedComponentName}Props = { - imageUrl?: string; - style?: CSSProperties; -}; - -export default function ${normalizedComponentName}({ - imageUrl = ${JSON.stringify(`./${defaultImageUrl}`)}, - style, -}: ${normalizedComponentName}Props) { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - - if (!container) { - return; - } - - const unmount = mountHalftoneCanvas({ - container, - imageUrl, - onError: (error) => { - console.error(error); - }, - }); - - return () => { - void Promise.resolve(unmount).then((dispose) => dispose?.()); - }; - }, [imageUrl]); - - return ( + const background = options.background ?? 'transparent'; + const assetUrl = + exportSettings.includePublicAssetUrl && options.assetUrl + ? options.assetUrl + : null; + const defaultModelFilename = + options.modelFilenameOverride ?? shape.filename ?? 'model.glb'; + const defaultImageFilename = options.imageFilename ?? 'image.png'; + const defaultModelUrl = assetUrl ?? `./${defaultModelFilename}`; + const defaultImageUrl = assetUrl ?? `./${defaultImageFilename}`; + const importBlock = getReactImportBlock(exportSettings, isImageMode, shape); + const headerComment = exportSettings.includeRegistryComment + ? getTwentyReactHeaderComment( + normalizedComponentName, + toIllustrationRegistryKey(normalizedComponentName), + isImageMode || shape.kind === 'imported' + ? (assetUrl ?? undefined) + : undefined, + ) + : ''; + const mountScript = isImageMode + ? createImageMountScript() + : createMountScript(); + const serializedRuntime = serializeRuntimeSource( + settings, + shape, + pose, + options.previewDistance, + ); + const directiveLines = [ + exportSettings.includeTsNoCheck ? '// @ts-nocheck' : null, + exportSettings.includeUseClientDirective ? "'use client';" : null, + ] + .filter((line): line is string => line !== null) + .join('\n'); + const mountStyleBlock = exportSettings.includeStyledMount + ? `const StyledVisualMount = styled.div\` + background: ${background}; + display: block; + height: 100%; + min-width: 0; + width: 100%; +\`; +` + : ''; + const assetPropName = isImageMode + ? 'imageUrl' + : shape.kind === 'imported' + ? 'modelUrl' + : null; + const assetPropDefaultValue = + assetPropName === 'imageUrl' + ? defaultImageUrl + : assetPropName === 'modelUrl' + ? defaultModelUrl + : null; + const propsTypeBlock = assetPropName + ? `type ${normalizedComponentName}Props = {\n ${assetPropName}?: string;\n style?: CSSProperties;\n};` + : `type ${normalizedComponentName}Props = {\n style?: CSSProperties;\n};`; + const propsSignature = assetPropName + ? `{\n ${assetPropName} = ${JSON.stringify(assetPropDefaultValue)},\n style,\n}: ${normalizedComponentName}Props` + : `{\n style,\n}: ${normalizedComponentName}Props`; + const mountOptionsBlock = assetPropName + ? `const unmount = mountHalftoneCanvas({\n container,\n ${assetPropName},\n onError: (error) => {\n console.error(error);\n },\n });` + : `const unmount = mountHalftoneCanvas({\n container,\n onError: (error) => {\n console.error(error);\n },\n });`; + const effectDependencies = assetPropName ? `[${assetPropName}]` : '[]'; + const returnBlock = exportSettings.includeStyledMount + ? `return <StyledVisualMount aria-hidden ref={mountReference} style={style} />;` + : `return ( <div ref={mountReference} style={{ @@ -2983,30 +3226,9 @@ export default function ${normalizedComponentName}({ ...style, }} /> - ); -} -`; - } - - return `import { useEffect, useRef, type CSSProperties } from 'react'; -import * as THREE from 'three'; -import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js'; -import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -${serializeRuntimeSource(settings, shape, pose, previewDistance)} - -${createMountScript()} - -type ${normalizedComponentName}Props = { - modelUrl?: string; - style?: CSSProperties; -}; - -export default function ${normalizedComponentName}({ - modelUrl = ${JSON.stringify(`./${defaultModelUrl}`)}, - style, -}: ${normalizedComponentName}Props) { + );`; + const componentFunctionBlock = exportSettings.includeNamedAndDefaultExport + ? `export function ${normalizedComponentName}(${propsSignature}) { const mountReference = useRef<HTMLDivElement>(null); useEffect(() => { @@ -3016,31 +3238,46 @@ export default function ${normalizedComponentName}({ return; } - const unmount = mountHalftoneCanvas({ - container, - modelUrl, - onError: (error) => { - console.error(error); - }, - }); + ${mountOptionsBlock} return () => { void Promise.resolve(unmount).then((dispose) => dispose?.()); }; - }, [modelUrl]); + }, ${effectDependencies}); - return ( - <div - ref={mountReference} - style={{ - background: ${JSON.stringify(background)}, - height: '100%', - width: '100%', - ...style, - }} - /> - ); + ${returnBlock} } + +export default ${normalizedComponentName};` + : `export default function ${normalizedComponentName}(${propsSignature}) { + const mountReference = useRef<HTMLDivElement>(null); + + useEffect(() => { + const container = mountReference.current; + + if (!container) { + return; + } + + ${mountOptionsBlock} + + return () => { + void Promise.resolve(unmount).then((dispose) => dispose?.()); + }; + }, ${effectDependencies}); + + ${returnBlock} +}`; + + return `${directiveLines ? `${directiveLines}\n\n` : ''}${importBlock} + +${headerComment}${serializedRuntime} + +${mountScript} + +${mountStyleBlock ? `${mountStyleBlock}\n` : ''}${propsTypeBlock} + +${componentFunctionBlock} `; } @@ -3048,39 +3285,30 @@ export async function generateStandaloneHtml( settings: HalftoneStudioSettings, selectedShape: HalftoneGeometrySpec | undefined, componentName = 'HalftoneDashes', - modelFilenameOverride?: string, - initialPose?: HalftoneExportPose, - previewDistance?: number, - importedFile?: File, - imageFilename?: string, - background = 'transparent', + options: ReactExportOptions = {}, ) { const isImageMode = settings.sourceMode === 'image'; const shape = createShapeDescriptor( selectedShape, settings, - importedFile, - modelFilenameOverride, + options.importedFile, + options.modelFilenameOverride, ); - const pose = normalizeExportPose(initialPose); + const pose = normalizeExportPose(options.initialPose); const normalizedComponentName = normalizeExportComponentName(componentName); - const defaultImageUrl = imageFilename ?? 'image.png'; + const defaultImageUrl = options.imageFilename ?? 'image.png'; const embeddedImportedModelUrl = - !isImageMode && shape.kind === 'imported' && importedFile - ? await fileToDataUrl(importedFile, shape.loader) + !isImageMode && shape.kind === 'imported' && options.importedFile + ? await fileToDataUrl(options.importedFile, shape.loader) : null; const defaultModelUrl = embeddedImportedModelUrl ?? - modelFilenameOverride ?? + options.modelFilenameOverride ?? shape.filename ?? 'model.glb'; + const background = options.background ?? 'transparent'; - const threeImports = isImageMode - ? `import * as THREE from 'three';` - : `import * as THREE from 'three'; - import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js'; - import { FBXLoader } from 'three/addons/loaders/FBXLoader.js'; - import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';`; + const threeImports = getStandaloneThreeImports(isImageMode, shape); const mountScript = isImageMode ? createImageMountScript() @@ -3189,7 +3417,7 @@ export async function generateStandaloneHtml( <script type="module"> ${threeImports} - ${serializeRuntimeSource(settings, shape, pose, previewDistance)} + ${serializeRuntimeSource(settings, shape, pose, options.previewDistance)} ${mountScript} diff --git a/packages/twenty-website-new/src/app/layout.tsx b/packages/twenty-website-new/src/app/layout.tsx index 41d1243edd..f6637d3a77 100644 --- a/packages/twenty-website-new/src/app/layout.tsx +++ b/packages/twenty-website-new/src/app/layout.tsx @@ -85,6 +85,7 @@ export default async function RootLayout({ <html lang="en"> <body className={`${cssVariables} ${hostGrotesk.variable} ${aleo.variable} ${azeretMono.variable} ${vt323.variable}`} + suppressHydrationWarning > <ContactCalModalRoot> <StyledMain>{children}</StyledMain> diff --git a/packages/twenty-website-new/src/app/partner/components/PartnerApplication/BecomePartnerButton.tsx b/packages/twenty-website-new/src/app/partner/components/PartnerApplication/BecomePartnerButton.tsx index a0c88c4153..11bfbba962 100644 --- a/packages/twenty-website-new/src/app/partner/components/PartnerApplication/BecomePartnerButton.tsx +++ b/packages/twenty-website-new/src/app/partner/components/PartnerApplication/BecomePartnerButton.tsx @@ -24,12 +24,13 @@ export function BecomePartnerButton({ const { openPartnerApplicationModal } = usePartnerApplicationModal(); return ( - <StyledTrigger type="button" onClick={openPartnerApplicationModal}> - <BaseButton - color={color} - label="Become a partner" - variant={variant} - /> + <StyledTrigger + data-color={color} + data-variant={variant} + type="button" + onClick={openPartnerApplicationModal} + > + <BaseButton color={color} label="Become a partner" variant={variant} /> </StyledTrigger> ); } diff --git a/packages/twenty-website-new/src/app/pricing/_constants/engagement-band.ts b/packages/twenty-website-new/src/app/pricing/_constants/engagement-band.ts index 82016d4577..d0a10ead89 100644 --- a/packages/twenty-website-new/src/app/pricing/_constants/engagement-band.ts +++ b/packages/twenty-website-new/src/app/pricing/_constants/engagement-band.ts @@ -2,10 +2,10 @@ import type { EngagementBandDataType } from '@/sections/EngagementBand/types'; export const ENGAGEMENT_BAND_DATA: EngagementBandDataType = { heading: { - text: 'Want a tailor-made plan?', + text: 'Need help with customization?', fontFamily: 'serif', }, body: { - text: 'Help customers implement, customize, and succeed with Twenty. Combine sales and services to grow your business.', + text: 'Find the right partner to implement, customize, and tailor Twenty to your team.', }, }; diff --git a/packages/twenty-website-new/src/app/pricing/_constants/hero.ts b/packages/twenty-website-new/src/app/pricing/_constants/hero.ts index 876d70bd56..385aa324c5 100644 --- a/packages/twenty-website-new/src/app/pricing/_constants/hero.ts +++ b/packages/twenty-website-new/src/app/pricing/_constants/hero.ts @@ -1,11 +1,13 @@ import type { HeroBaseDataType } from '@/sections/Hero/types'; -export const HERO_DATA: HeroBaseDataType = { - heading: [ - { text: 'A pricing that scales ', fontFamily: 'serif' }, - { text: 'with your need', fontFamily: 'sans' }, - ], - body: { - text: "We're building the #1 open-source CRM, but we can't do it alone. Join our partner ecosystem and grow with us.", - }, +const PRICING_HERO_SUBTAGLINE = { + text: 'Start your free trial today without credit card.', }; + +export const HERO_DATA = { + heading: [ + { text: 'Simple', fontFamily: 'serif' }, + { text: ' Pricing', fontFamily: 'sans' }, + ], + body: PRICING_HERO_SUBTAGLINE, +} satisfies HeroBaseDataType; diff --git a/packages/twenty-website-new/src/app/pricing/_constants/plans.ts b/packages/twenty-website-new/src/app/pricing/_constants/plans.ts index f1b4716307..d4f5cd1b37 100644 --- a/packages/twenty-website-new/src/app/pricing/_constants/plans.ts +++ b/packages/twenty-website-new/src/app/pricing/_constants/plans.ts @@ -4,37 +4,36 @@ const ORGANIZATION_HEADING = { text: 'Organization', }; -const PRO_FEATURES_TITLE = { text: 'Key Features' }; -const ORGANIZATION_FEATURES_TITLE = { text: 'Everything in Pro +' }; - const PRO_BULLETS_DEFAULT = [ { text: 'Full customisation' }, { text: 'AI Agents with custom skills' }, { text: '1K automation credits' }, { text: 'Standard support' }, - { text: 'Add-on AI (1-month trial)' }, ]; const PRO_BULLETS_SELF_HOST_MONTHLY = [ { text: 'Full customisation' }, - { text: 'AI Agents with custom skills' }, - { text: 'Standard support' }, - { text: 'Add-on AI (1-month trial)' }, + { text: 'Community support' }, ]; const PRO_BULLETS_SELF_HOST_YEARLY = [ { text: 'Full customisation' }, - { text: 'AI Agents with custom skills' }, - { text: 'Standard support' }, - { text: 'Add-on AI (1-month trial)' }, + { text: 'Community support' }, ]; -const ORGANIZATION_BULLETS = [ +const ORGANIZATION_BULLETS_DEFAULT = [ + { text: 'Everything in Pro' }, { text: 'Roles & Permissions' }, { text: 'SAML/OIDC SSO' }, { text: '2K automation credits' }, { text: 'Priority support' }, - { text: 'Add-on AI full time' }, +]; + +const ORGANIZATION_BULLETS_SELF_HOST = [ + { text: 'Everything in Pro' }, + { text: 'Roles & Permissions' }, + { text: 'SAML/OIDC SSO' }, + { text: 'Priority support' }, ]; import type { PlansDataType } from '@/sections/Plans/types'; @@ -44,40 +43,42 @@ export const PLANS_DATA = { cells: { cloud: { monthly: { - featureBullets: ORGANIZATION_BULLETS, + featureBullets: ORGANIZATION_BULLETS_DEFAULT, price: { - body: { text: '/month, paid monthly' }, - heading: { fontFamily: 'sans', text: '$25 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$25' }, }, }, yearly: { - featureBullets: ORGANIZATION_BULLETS, + featureBullets: ORGANIZATION_BULLETS_DEFAULT, price: { - body: { text: '/month, paid yearly' }, - heading: { fontFamily: 'sans', text: '$19 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$19' }, }, }, }, selfHost: { monthly: { - featureBullets: ORGANIZATION_BULLETS, + featureBullets: ORGANIZATION_BULLETS_SELF_HOST, price: { - body: { text: '/month, paid monthly' }, - heading: { fontFamily: 'sans', text: '$25 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$25' }, }, }, yearly: { - featureBullets: ORGANIZATION_BULLETS, + featureBullets: ORGANIZATION_BULLETS_SELF_HOST, price: { - body: { text: '/month, paid yearly' }, - heading: { fontFamily: 'sans', text: '$19 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$19' }, }, }, }, }, - featuresTitle: ORGANIZATION_FEATURES_TITLE, heading: ORGANIZATION_HEADING, - illustration: 'planOrganization', + icon: { + alt: 'Organization plan icon', + src: '/images/pricing/plans/organization-icon.png', + }, }, pro: { cells: { @@ -85,15 +86,15 @@ export const PLANS_DATA = { monthly: { featureBullets: PRO_BULLETS_DEFAULT, price: { - body: { text: '/month, paid monthly' }, - heading: { fontFamily: 'sans', text: '$12 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$12' }, }, }, yearly: { featureBullets: PRO_BULLETS_DEFAULT, price: { - body: { text: '/month, paid yearly' }, - heading: { fontFamily: 'sans', text: '$9 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$9' }, }, }, }, @@ -101,21 +102,24 @@ export const PLANS_DATA = { monthly: { featureBullets: PRO_BULLETS_SELF_HOST_MONTHLY, price: { - body: { text: '/month, paid monthly' }, - heading: { fontFamily: 'sans', text: '$0 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$0' }, }, }, yearly: { featureBullets: PRO_BULLETS_SELF_HOST_YEARLY, price: { - body: { text: '/month, paid yearly' }, - heading: { fontFamily: 'sans', text: '$0 USD' }, + body: { text: '/user/month' }, + heading: { fontFamily: 'sans', text: '$0' }, }, }, }, }, - featuresTitle: PRO_FEATURES_TITLE, heading: PRO_HEADING, - illustration: 'planPro', + icon: { + alt: 'Pro plan icon', + src: '/images/pricing/plans/pro-icon.png', + width: 60, + }, }, } satisfies PlansDataType; diff --git a/packages/twenty-website-new/src/app/pricing/_constants/salesforce.ts b/packages/twenty-website-new/src/app/pricing/_constants/salesforce.ts index ac11f0908c..9f4386033f 100644 --- a/packages/twenty-website-new/src/app/pricing/_constants/salesforce.ts +++ b/packages/twenty-website-new/src/app/pricing/_constants/salesforce.ts @@ -148,7 +148,7 @@ export const SALESFORCE_DATA: SalesforceDataType = { rightLabel: 'Out of stock', tooltip: { title: 'Out of stock', - body: "Your data prefers someone else's servers.", + body: 'Self-hosting, now for rent!', }, }, { @@ -219,7 +219,7 @@ export const SALESFORCE_DATA: SalesforceDataType = { }, ], basePriceAmount: 100, - promoTag: 'Best for\nSalesforce', + promoTag: '1‑800‑YES‑SOFTWARE', featureSectionHeading: 'Add-ons', productIconAlt: 'Retro help document icon', productIconSrc: '/images/pricing/salesforce/help-icon.webp', diff --git a/packages/twenty-website-new/src/app/pricing/page.tsx b/packages/twenty-website-new/src/app/pricing/page.tsx index 7f7817560f..0b8d7759c5 100644 --- a/packages/twenty-website-new/src/app/pricing/page.tsx +++ b/packages/twenty-website-new/src/app/pricing/page.tsx @@ -18,8 +18,21 @@ import { Plans } from '@/sections/Plans/components'; import { PlanTable } from '@/sections/PlanTable/components'; import { Salesforce } from '@/sections/Salesforce/components'; import { theme } from '@/theme'; +import { styled } from '@linaria/react'; import type { Metadata } from 'next'; +const PricingPlansContainer = styled.div` + display: grid; + margin: 0 auto; + row-gap: ${theme.spacing(8)}; + width: 100%; +`; + +const PricingBannerContainer = styled.div` + margin: 0 auto; + width: 100%; +`; + export const metadata: Metadata = { title: 'Pricing — Twenty', description: @@ -50,28 +63,35 @@ export default async function PricingPage() { </Hero.Root> <Plans.Root backgroundColor={theme.colors.secondary.background[5]}> - <Plans.Content /> + <PricingPlansContainer> + <Plans.Content /> + </PricingPlansContainer> </Plans.Root> <EngagementBand.Root backgroundColor={theme.colors.secondary.background[5]} > - <EngagementBand.Strip - fillColor={theme.colors.primary.background[100]} - variant="primary" - > - <EngagementBand.Copy> - <EngagementBand.Heading segments={ENGAGEMENT_BAND_DATA.heading} /> - <EngagementBand.Body body={ENGAGEMENT_BAND_DATA.body} /> - </EngagementBand.Copy> - <EngagementBand.Actions> - <TalkToUsButton - color="secondary" - label="Contact us" - variant="contained" - /> - </EngagementBand.Actions> - </EngagementBand.Strip> + <PricingBannerContainer> + <EngagementBand.Strip + desktopCopyMaxWidth="60%" + fillColor={theme.colors.primary.background[100]} + variant="primary" + > + <EngagementBand.Copy> + <EngagementBand.Heading segments={ENGAGEMENT_BAND_DATA.heading} /> + <EngagementBand.Body body={ENGAGEMENT_BAND_DATA.body} /> + </EngagementBand.Copy> + <EngagementBand.Actions> + <LinkButton + color="secondary" + href="https://app.twenty.com/welcome" + label="Find a partner" + type="anchor" + variant="outlined" + /> + </EngagementBand.Actions> + </EngagementBand.Strip> + </PricingBannerContainer> </EngagementBand.Root> <PlanTable.Root backgroundColor={theme.colors.secondary.background[100]}> diff --git a/packages/twenty-website-new/src/components/VisibleWhenTabActive.tsx b/packages/twenty-website-new/src/components/VisibleWhenTabActive.tsx new file mode 100644 index 0000000000..e2e6b12468 --- /dev/null +++ b/packages/twenty-website-new/src/components/VisibleWhenTabActive.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { useEffect, useState, type ReactNode } from 'react'; + +type VisibleWhenTabActiveProps = { + children: ReactNode; +}; + +function getIsTabActive() { + if (typeof document === 'undefined') { + return true; + } + + return document.visibilityState !== 'hidden'; +} + +export function VisibleWhenTabActive({ + children, +}: VisibleWhenTabActiveProps) { + const [isTabActive, setIsTabActive] = useState(true); + + useEffect(() => { + const syncTabVisibility = () => { + setIsTabActive(getIsTabActive()); + }; + + syncTabVisibility(); + document.addEventListener('visibilitychange', syncTabVisibility); + + return () => { + document.removeEventListener('visibilitychange', syncTabVisibility); + }; + }, []); + + if (!isTabActive) { + return null; + } + + return <>{children}</>; +} diff --git a/packages/twenty-website-new/src/design-system/components/Button/BaseButton.tsx b/packages/twenty-website-new/src/design-system/components/Button/BaseButton.tsx index d21b1627a7..a4a7320100 100644 --- a/packages/twenty-website-new/src/design-system/components/Button/BaseButton.tsx +++ b/packages/twenty-website-new/src/design-system/components/Button/BaseButton.tsx @@ -3,6 +3,9 @@ import { styled } from '@linaria/react'; import { ButtonShape } from './ButtonShape'; export const buttonBaseStyles = ` + --button-label-color: ${theme.colors.primary.text[100]}; + --button-label-hover-color: ${theme.colors.secondary.text[100]}; + align-items: center; background: transparent; border: none; @@ -15,11 +18,39 @@ export const buttonBaseStyles = ` height: ${theme.spacing(10)}; justify-content: center; letter-spacing: 0; + overflow: hidden; padding: 0 ${theme.spacing(5)}; position: relative; text-decoration: none; text-transform: uppercase; + &[data-variant='contained'][data-color='secondary'] { + --button-label-color: ${theme.colors.secondary.text[100]}; + --button-label-hover-color: ${theme.colors.secondary.text[100]}; + } + + &[data-variant='outlined'][data-color='secondary'] { + --button-label-color: ${theme.colors.primary.text[100]}; + --button-label-hover-color: ${theme.colors.primary.text[100]}; + } + + &[data-variant='outlined'][data-color='primary'] { + --button-label-color: ${theme.colors.secondary.text[100]}; + --button-label-hover-color: ${theme.colors.primary.text[100]}; + } + + &:is(:hover, :focus-visible) { + --button-label-color: var(--button-label-hover-color); + } + + &:is(:hover, :focus-visible) [data-slot='button-hover-fill'] { + transform: translateX(0); + } + + &[data-variant='outlined'] [data-slot='button-base-shape'] { + z-index: 1; + } + &:focus-visible { outline: 1px solid ${theme.colors.highlight[100]}; outline-offset: 1px; @@ -27,16 +58,10 @@ export const buttonBaseStyles = ` `; const Label = styled.span` + color: var(--button-label-color); position: relative; + transition: color 220ms ease; z-index: 1; - - &[data-color='primary'] { - color: ${theme.colors.primary.text[100]}; - } - - &[data-color='secondary'] { - color: ${theme.colors.secondary.text[100]}; - } `; export type BaseButtonProps = { @@ -45,31 +70,51 @@ export type BaseButtonProps = { variant: 'contained' | 'outlined'; }; +const secondaryContainedHoverFillColor = theme.colors.secondary.background.hover; +const secondaryOutlinedHoverFillColor = theme.colors.primary.text[100]; +const secondaryOutlinedHoverFillOpacity = 0.05; + +const HoverFill = styled.span` + inset: 0; + overflow: hidden; + pointer-events: none; + position: absolute; + transform: translateX(calc(-100% - ${theme.spacing(4)})); + transition: transform 260ms cubic-bezier(0.22, 1, 0.36, 1); + z-index: 0; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } +`; + export function BaseButton({ color, label, variant }: BaseButtonProps) { let fillColor: string; + let hoverFillColor: string; + let hoverFillOpacity = 1; let strokeColor: string; - let labelColor: 'primary' | 'secondary'; switch (`${variant}.${color}`) { case 'contained.primary': fillColor = theme.colors.primary.background[100]; + hoverFillColor = theme.colors.primary.background.hover; strokeColor = 'none'; - labelColor = 'primary'; break; case 'contained.secondary': fillColor = theme.colors.secondary.background[100]; + hoverFillColor = secondaryContainedHoverFillColor; strokeColor = 'none'; - labelColor = 'secondary'; break; case 'outlined.primary': fillColor = 'none'; + hoverFillColor = theme.colors.primary.background[100]; strokeColor = theme.colors.primary.background[100]; - labelColor = 'secondary'; break; case 'outlined.secondary': fillColor = 'none'; + hoverFillColor = secondaryOutlinedHoverFillColor; + hoverFillOpacity = secondaryOutlinedHoverFillOpacity; strokeColor = theme.colors.secondary.background[100]; - labelColor = 'primary'; break; default: throw new Error(`Unhandled button appearance: ${variant} ${color}`); @@ -77,8 +122,15 @@ export function BaseButton({ color, label, variant }: BaseButtonProps) { return ( <> - <ButtonShape fillColor={fillColor} strokeColor={strokeColor} /> - <Label data-color={labelColor}>{label}</Label> + <ButtonShape + dataSlot="button-base-shape" + fillColor={fillColor} + strokeColor={strokeColor} + /> + <HoverFill data-slot="button-hover-fill" style={{ opacity: hoverFillOpacity }}> + <ButtonShape fillColor={hoverFillColor} strokeColor="none" /> + </HoverFill> + <Label data-slot="button-label">{label}</Label> </> ); } diff --git a/packages/twenty-website-new/src/design-system/components/Button/ButtonShape.tsx b/packages/twenty-website-new/src/design-system/components/Button/ButtonShape.tsx index 1c5617f3c6..9b4454ace3 100644 --- a/packages/twenty-website-new/src/design-system/components/Button/ButtonShape.tsx +++ b/packages/twenty-website-new/src/design-system/components/Button/ButtonShape.tsx @@ -1,6 +1,7 @@ import { styled } from "@linaria/react"; interface ButtonShapeProps { + dataSlot?: string; fillColor: string; strokeColor: string; } @@ -38,14 +39,18 @@ const RightCap = styled.svg` flex-shrink: 0; `; -export function ButtonShape({ fillColor, strokeColor }: ButtonShapeProps) { +export function ButtonShape({ + dataSlot, + fillColor, + strokeColor, +}: ButtonShapeProps) { const isOutline = fillColor === "none"; return ( - <ShapeContainer> + <ShapeContainer data-slot={dataSlot}> <LeftCap width="4" height="40" viewBox="0 0 4 40" fill="none" xmlns="http://www.w3.org/2000/svg"> {isOutline ? ( - <path d={LEFT_OUTLINE} fill={fillColor} stroke={strokeColor} strokeWidth="1" /> + <path d={LEFT_OUTLINE} fill={fillColor} stroke={strokeColor} strokeWidth="1" strokeLinejoin="round" strokeLinecap="round" /> ) : ( <path d={LEFT_FILL} fill={fillColor} stroke={strokeColor} /> )} diff --git a/packages/twenty-website-new/src/design-system/components/Button/LinkButton.tsx b/packages/twenty-website-new/src/design-system/components/Button/LinkButton.tsx index 9abccf4320..1736a2080d 100644 --- a/packages/twenty-website-new/src/design-system/components/Button/LinkButton.tsx +++ b/packages/twenty-website-new/src/design-system/components/Button/LinkButton.tsx @@ -32,6 +32,8 @@ export function LinkButton({ if (type === 'anchor') { return ( <StyledButtonAnchor + data-color={color} + data-variant={variant} href={href} rel="noopener noreferrer" target="_blank" @@ -42,7 +44,7 @@ export function LinkButton({ } return ( - <StyledButtonLink href={href}> + <StyledButtonLink data-color={color} data-variant={variant} href={href}> {inner} </StyledButtonLink> ); diff --git a/packages/twenty-website-new/src/design-system/components/Button/SubmitButton.tsx b/packages/twenty-website-new/src/design-system/components/Button/SubmitButton.tsx index 94bc6cda0b..357b0873ab 100644 --- a/packages/twenty-website-new/src/design-system/components/Button/SubmitButton.tsx +++ b/packages/twenty-website-new/src/design-system/components/Button/SubmitButton.tsx @@ -20,7 +20,12 @@ export function SubmitButton({ variant, }: SubmitButtonProps) { return ( - <StyledSubmitButton type="submit" onClick={onClick}> + <StyledSubmitButton + data-color={color} + data-variant={variant} + type="submit" + onClick={onClick} + > <BaseButton color={color} label={label} variant={variant} /> </StyledSubmitButton> ); diff --git a/packages/twenty-website-new/src/icons/informative/Check.tsx b/packages/twenty-website-new/src/icons/informative/Check.tsx index 3801583f05..cb7a23da3b 100644 --- a/packages/twenty-website-new/src/icons/informative/Check.tsx +++ b/packages/twenty-website-new/src/icons/informative/Check.tsx @@ -1,6 +1,10 @@ -type CheckIconProps = { size: number; color: string }; +type CheckIconProps = { size: number; color: string; strokeWidth?: number }; -export function CheckIcon({ size, color }: CheckIconProps) { +export function CheckIcon({ + size, + color, + strokeWidth = 2, +}: CheckIconProps) { return ( <svg width={size} @@ -13,12 +17,12 @@ export function CheckIcon({ size, color }: CheckIconProps) { <path d="m11 6-3.75 4L5 8" stroke={color} - strokeWidth={2} + strokeWidth={strokeWidth} /> <path d="M8 14a6 6 0 1 0-4.243-1.757" stroke={color} - strokeWidth={2} + strokeWidth={strokeWidth} /> </svg> ); diff --git a/packages/twenty-website-new/src/illustrations/Plans/Organization.tsx b/packages/twenty-website-new/src/illustrations/Plans/Organization.tsx deleted file mode 100644 index 684e353425..0000000000 --- a/packages/twenty-website-new/src/illustrations/Plans/Organization.tsx +++ /dev/null @@ -1,355 +0,0 @@ -'use client'; - -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const GLB_URL = '/illustrations/pricing/Price/organization.glb'; - -const scanlineVertexShader = /* glsl */ ` - varying vec3 vWorldPosition; - varying vec3 vWorldNormal; - - void main() { - vec4 worldPosition = modelMatrix * vec4(position, 1.0); - vWorldPosition = worldPosition.xyz; - vWorldNormal = normalize(mat3(modelMatrix) * normal); - gl_Position = projectionMatrix * viewMatrix * worldPosition; - } -`; - -const scanlineFragmentShader = /* glsl */ ` - uniform vec3 uColor; - uniform vec3 uLightDir; - uniform float uStripeScale; - - varying vec3 vWorldPosition; - varying vec3 vWorldNormal; - - void main() { - vec3 normal = normalize(vWorldNormal); - vec3 lightDir = normalize(uLightDir); - float ndotl = max(dot(normal, lightDir), 0.06); - - float y = vWorldPosition.y * uStripeScale; - float cell = fract(y); - - float shadowWeight = mix(1.0, 0.5, ndotl); - float lineWidth = 0.58 * shadowWeight; - float edge = 0.035; - float band = 1.0 - smoothstep(lineWidth, lineWidth + edge, cell); - - float highlight = pow(ndotl, 1.35); - float dash = fract(vWorldPosition.x * 20.0 + vWorldPosition.z * 6.0); - float dashMask = mix( - 1.0, - smoothstep(0.15, 0.45, dash) * (1.0 - smoothstep(0.55, 0.88, dash)), - highlight - ); - band *= dashMask; - - float speckle = fract( - sin(dot(vWorldPosition.xz, vec2(127.1, 311.7))) * 43758.5453 - ); - band *= mix(1.0, 0.55 + 0.45 * step(0.4, speckle), highlight * 0.85); - - if (band < 0.015) { - discard; - } - - vec3 lit = uColor * mix(0.72, 1.18, ndotl); - gl_FragColor = vec4(lit, band); - } -`; - -function createScanlineMaterial(lightDirection: THREE.Vector3) { - return new THREE.ShaderMaterial({ - uniforms: { - uColor: { value: new THREE.Color('#1e5bff') }, - uLightDir: { value: lightDirection.clone() }, - uStripeScale: { value: 16.0 }, - }, - vertexShader: scanlineVertexShader, - fragmentShader: scanlineFragmentShader, - transparent: true, - depthWrite: true, - depthTest: true, - side: THREE.DoubleSide, - }); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - - const material = sceneObject.material; - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - } else { - material?.dispose(); - } - }); -} - -type MeshRestPose = { - position: THREE.Vector3; - quaternion: THREE.Quaternion; - wobblePhase: number; -}; - -function applyScanlineMaterials( - modelRoot: THREE.Object3D, - lightDirection: THREE.Vector3, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.material = createScanlineMaterial(lightDirection); - - const mesh = sceneObject; - const rest: MeshRestPose = { - position: mesh.position.clone(), - quaternion: mesh.quaternion.clone(), - wobblePhase: mesh.position.y * 4.2 + mesh.position.x * 1.7, - }; - mesh.userData.planOrganizationMeshRest = rest; - }); -} - -export function Organization() { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - if (!container) { - return; - } - - let cancelled = false; - let animationFrameId = 0; - - const pointer = { x: 0, y: 0, inside: false }; - const targetRotation = { x: 0, y: 0 }; - const lightDirectionWorld = new THREE.Vector3(4, 8, 6).normalize(); - - const scene = new THREE.Scene(); - const readSize = () => { - const nextWidth = container.clientWidth; - const nextHeight = container.clientHeight; - return { - width: Math.max(nextWidth, 1), - height: Math.max(nextHeight, 1), - }; - }; - - const { width, height } = readSize(); - - const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 100); - camera.position.set(0, 0, 5.05); - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true }); - renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); - renderer.setSize(width, height); - renderer.setClearColor(0x000000, 0); - renderer.outputColorSpace = THREE.SRGBColorSpace; - const canvas = renderer.domElement; - canvas.style.cursor = 'default'; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - container.appendChild(canvas); - - const pivot = new THREE.Group(); - scene.add(pivot); - - const clock = new THREE.Clock(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - GLB_URL, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const modelRoot = gltf.scene; - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - const scale = 2.35 / maxAxis; - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(scale); - - applyScanlineMaterials(modelRoot, lightDirectionWorld); - pivot.add(modelRoot); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - const delta = Math.min(clock.getDelta(), 0.1); - - const influence = pointer.inside ? 1 : 0.22; - targetRotation.y = pointer.x * 0.52 * influence; - targetRotation.x = pointer.y * 0.42 * influence; - - pivot.rotation.y = THREE.MathUtils.damp( - pivot.rotation.y, - targetRotation.y, - 8.2, - delta, - ); - pivot.rotation.x = THREE.MathUtils.damp( - pivot.rotation.x, - targetRotation.x, - 8.2, - delta, - ); - - const hoverLift = pointer.inside ? 1 : 0; - pivot.scale.setScalar( - THREE.MathUtils.damp(pivot.scale.x, 1 + hoverLift * 0.06, 7, delta), - ); - - const mx = pointer.x * (pointer.inside ? 1 : 0.22); - const my = pointer.y * (pointer.inside ? 1 : 0.22); - - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - const rest = sceneObject.userData.planOrganizationMeshRest as - | MeshRestPose - | undefined; - if (!rest) { - return; - } - - const phase = rest.wobblePhase; - const wobble = pointer.inside ? 0.55 : 0.22; - sceneObject.position.x = - rest.position.x + mx * 0.12 * Math.sin(phase * 1.8); - sceneObject.position.z = - rest.position.z + my * 0.1 * Math.cos(phase * 1.4); - sceneObject.position.y = - rest.position.y + (mx + my) * 0.03 * Math.sin(phase * 2.5); - - const twist = (mx * 0.18 + my * 0.14) * wobble * Math.sin(phase); - sceneObject.quaternion.copy(rest.quaternion); - sceneObject.rotateY(twist); - }); - - renderer.render(scene, camera); - }; - - renderFrame(); - }, - undefined, - undefined, - ); - - const setPointerFromEvent = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const normalizedX = ((event.clientX - rect.left) / rect.width) * 2 - 1; - const normalizedY = -(((event.clientY - rect.top) / rect.height) * 2 - 1); - pointer.x = THREE.MathUtils.clamp(normalizedX, -1, 1); - pointer.y = THREE.MathUtils.clamp(normalizedY, -1, 1); - }; - - const handlePointerEnter = () => { - pointer.inside = true; - }; - - const handlePointerLeave = () => { - pointer.inside = false; - pointer.x = 0; - pointer.y = 0; - }; - - const handlePointerMove = (event: PointerEvent) => { - setPointerFromEvent(event); - }; - - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - - const syncCanvasToContainer = () => { - if (!mountReference.current || cancelled) { - return; - } - - const nextWidth = mountReference.current.clientWidth; - const nextHeight = mountReference.current.clientHeight; - if (nextWidth < 1 || nextHeight < 1) { - return; - } - - camera.aspect = nextWidth / nextHeight; - camera.updateProjectionMatrix(); - renderer.setSize(nextWidth, nextHeight); - }; - - const resizeObserver = new ResizeObserver(() => { - syncCanvasToContainer(); - }); - resizeObserver.observe(container); - - const handleWindowResize = () => { - syncCanvasToContainer(); - }; - - window.addEventListener('resize', handleWindowResize); - - return () => { - cancelled = true; - resizeObserver.disconnect(); - window.removeEventListener('resize', handleWindowResize); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.cancelAnimationFrame(animationFrameId); - disposeObjectSubtree(scene); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, []); - - return ( - <div - aria-hidden - ref={mountReference} - style={{ - display: 'block', - height: '100%', - minWidth: 0, - width: '100%', - }} - /> - ); -} diff --git a/packages/twenty-website-new/src/illustrations/Plans/Pro.tsx b/packages/twenty-website-new/src/illustrations/Plans/Pro.tsx deleted file mode 100644 index 53361771d9..0000000000 --- a/packages/twenty-website-new/src/illustrations/Plans/Pro.tsx +++ /dev/null @@ -1,355 +0,0 @@ -'use client'; - -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const GLB_URL = '/illustrations/pricing/Price/pro.glb'; - -const scanlineVertexShader = /* glsl */ ` - varying vec3 vWorldPosition; - varying vec3 vWorldNormal; - - void main() { - vec4 worldPosition = modelMatrix * vec4(position, 1.0); - vWorldPosition = worldPosition.xyz; - vWorldNormal = normalize(mat3(modelMatrix) * normal); - gl_Position = projectionMatrix * viewMatrix * worldPosition; - } -`; - -const scanlineFragmentShader = /* glsl */ ` - uniform vec3 uColor; - uniform vec3 uLightDir; - uniform float uStripeScale; - - varying vec3 vWorldPosition; - varying vec3 vWorldNormal; - - void main() { - vec3 normal = normalize(vWorldNormal); - vec3 lightDir = normalize(uLightDir); - float ndotl = max(dot(normal, lightDir), 0.06); - - float y = vWorldPosition.y * uStripeScale; - float cell = fract(y); - - float shadowWeight = mix(1.0, 0.5, ndotl); - float lineWidth = 0.58 * shadowWeight; - float edge = 0.035; - float band = 1.0 - smoothstep(lineWidth, lineWidth + edge, cell); - - float highlight = pow(ndotl, 1.35); - float dash = fract(vWorldPosition.x * 20.0 + vWorldPosition.z * 6.0); - float dashMask = mix( - 1.0, - smoothstep(0.15, 0.45, dash) * (1.0 - smoothstep(0.55, 0.88, dash)), - highlight - ); - band *= dashMask; - - float speckle = fract( - sin(dot(vWorldPosition.xz, vec2(127.1, 311.7))) * 43758.5453 - ); - band *= mix(1.0, 0.55 + 0.45 * step(0.4, speckle), highlight * 0.85); - - if (band < 0.015) { - discard; - } - - vec3 lit = uColor * mix(0.72, 1.18, ndotl); - gl_FragColor = vec4(lit, band); - } -`; - -function createScanlineMaterial(lightDirection: THREE.Vector3) { - return new THREE.ShaderMaterial({ - uniforms: { - uColor: { value: new THREE.Color('#1e5bff') }, - uLightDir: { value: lightDirection.clone() }, - uStripeScale: { value: 16.0 }, - }, - vertexShader: scanlineVertexShader, - fragmentShader: scanlineFragmentShader, - transparent: true, - depthWrite: true, - depthTest: true, - side: THREE.DoubleSide, - }); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - - const material = sceneObject.material; - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - } else { - material?.dispose(); - } - }); -} - -type MeshRestPose = { - position: THREE.Vector3; - quaternion: THREE.Quaternion; - wobblePhase: number; -}; - -function applyScanlineMaterials( - modelRoot: THREE.Object3D, - lightDirection: THREE.Vector3, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.material = createScanlineMaterial(lightDirection); - - const mesh = sceneObject; - const rest: MeshRestPose = { - position: mesh.position.clone(), - quaternion: mesh.quaternion.clone(), - wobblePhase: mesh.position.y * 4.2 + mesh.position.x * 1.7, - }; - mesh.userData.planProMeshRest = rest; - }); -} - -export function Pro() { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - if (!container) { - return; - } - - let cancelled = false; - let animationFrameId = 0; - - const pointer = { x: 0, y: 0, inside: false }; - const targetRotation = { x: 0, y: 0 }; - const lightDirectionWorld = new THREE.Vector3(4, 8, 6).normalize(); - - const scene = new THREE.Scene(); - const readSize = () => { - const nextWidth = container.clientWidth; - const nextHeight = container.clientHeight; - return { - width: Math.max(nextWidth, 1), - height: Math.max(nextHeight, 1), - }; - }; - - const { width, height } = readSize(); - - const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 100); - camera.position.set(0, 0, 5.05); - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true }); - renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); - renderer.setSize(width, height); - renderer.setClearColor(0x000000, 0); - renderer.outputColorSpace = THREE.SRGBColorSpace; - const canvas = renderer.domElement; - canvas.style.cursor = 'default'; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - container.appendChild(canvas); - - const pivot = new THREE.Group(); - scene.add(pivot); - - const clock = new THREE.Clock(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - GLB_URL, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const modelRoot = gltf.scene; - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - const scale = 2.35 / maxAxis; - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(scale); - - applyScanlineMaterials(modelRoot, lightDirectionWorld); - pivot.add(modelRoot); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - const delta = Math.min(clock.getDelta(), 0.1); - - const influence = pointer.inside ? 1 : 0.22; - targetRotation.y = pointer.x * 0.52 * influence; - targetRotation.x = pointer.y * 0.42 * influence; - - pivot.rotation.y = THREE.MathUtils.damp( - pivot.rotation.y, - targetRotation.y, - 8.2, - delta, - ); - pivot.rotation.x = THREE.MathUtils.damp( - pivot.rotation.x, - targetRotation.x, - 8.2, - delta, - ); - - const hoverLift = pointer.inside ? 1 : 0; - pivot.scale.setScalar( - THREE.MathUtils.damp(pivot.scale.x, 1 + hoverLift * 0.06, 7, delta), - ); - - const mx = pointer.x * (pointer.inside ? 1 : 0.22); - const my = pointer.y * (pointer.inside ? 1 : 0.22); - - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - const rest = sceneObject.userData.planProMeshRest as - | MeshRestPose - | undefined; - if (!rest) { - return; - } - - const phase = rest.wobblePhase; - const wobble = pointer.inside ? 0.55 : 0.22; - sceneObject.position.x = - rest.position.x + mx * 0.12 * Math.sin(phase * 1.8); - sceneObject.position.z = - rest.position.z + my * 0.1 * Math.cos(phase * 1.4); - sceneObject.position.y = - rest.position.y + (mx + my) * 0.03 * Math.sin(phase * 2.5); - - const twist = (mx * 0.18 + my * 0.14) * wobble * Math.sin(phase); - sceneObject.quaternion.copy(rest.quaternion); - sceneObject.rotateY(twist); - }); - - renderer.render(scene, camera); - }; - - renderFrame(); - }, - undefined, - undefined, - ); - - const setPointerFromEvent = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const normalizedX = ((event.clientX - rect.left) / rect.width) * 2 - 1; - const normalizedY = -(((event.clientY - rect.top) / rect.height) * 2 - 1); - pointer.x = THREE.MathUtils.clamp(normalizedX, -1, 1); - pointer.y = THREE.MathUtils.clamp(normalizedY, -1, 1); - }; - - const handlePointerEnter = () => { - pointer.inside = true; - }; - - const handlePointerLeave = () => { - pointer.inside = false; - pointer.x = 0; - pointer.y = 0; - }; - - const handlePointerMove = (event: PointerEvent) => { - setPointerFromEvent(event); - }; - - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - - const syncCanvasToContainer = () => { - if (!mountReference.current || cancelled) { - return; - } - - const nextWidth = mountReference.current.clientWidth; - const nextHeight = mountReference.current.clientHeight; - if (nextWidth < 1 || nextHeight < 1) { - return; - } - - camera.aspect = nextWidth / nextHeight; - camera.updateProjectionMatrix(); - renderer.setSize(nextWidth, nextHeight); - }; - - const resizeObserver = new ResizeObserver(() => { - syncCanvasToContainer(); - }); - resizeObserver.observe(container); - - const handleWindowResize = () => { - syncCanvasToContainer(); - }; - - window.addEventListener('resize', handleWindowResize); - - return () => { - cancelled = true; - resizeObserver.disconnect(); - window.removeEventListener('resize', handleWindowResize); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.cancelAnimationFrame(animationFrameId); - disposeObjectSubtree(scene); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, []); - - return ( - <div - aria-hidden - ref={mountReference} - style={{ - display: 'block', - height: '100%', - minWidth: 0, - width: '100%', - }} - /> - ); -} diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/Connect.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/Connect.tsx deleted file mode 100644 index 15b4463135..0000000000 --- a/packages/twenty-website-new/src/illustrations/ThreeCards/Connect.tsx +++ /dev/null @@ -1,366 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const GLB_URL = '/illustrations/partner/three-cards/connect.glb'; - -const halftoneVertexShader = /* glsl */ ` - varying vec3 vWorldNormal; - - void main() { - vec4 worldPosition = modelMatrix * vec4(position, 1.0); - vWorldNormal = normalize(mat3(modelMatrix) * normal); - gl_Position = projectionMatrix * viewMatrix * worldPosition; - } -`; - -const halftoneFragmentShader = /* glsl */ ` - uniform vec3 uColor; - uniform vec3 uLightDir; - uniform vec2 uResolution; - uniform float uNumRows; - - varying vec3 vWorldNormal; - - void main() { - vec3 normal = normalize(vWorldNormal); - vec3 lightDir = normalize(uLightDir); - float ndotl = max(dot(normal, lightDir), 0.0); - float lum = mix(0.35, 1.0, ndotl); - - float rowH = uResolution.y / uNumRows; - float rowFrac = gl_FragCoord.y / rowH - floor(gl_FragCoord.y / rowH); - float dy = abs(rowFrac - 0.5); - - float cellW = rowH * 2.2; - float cellFrac = (gl_FragCoord.x - floor(gl_FragCoord.x / cellW) * cellW) / cellW; - - float fill = pow(lum, 0.45) * 0.95; - - float dynamicBarHalf = mix(0.15, 0.34, smoothstep(0.05, 0.8, lum)); - - float dx2 = abs(cellFrac - 0.5); - float halfFill = fill * 0.5; - float bodyHalfW = max(halfFill - dynamicBarHalf * (rowH / cellW), 0.0); - float capR = dynamicBarHalf * rowH; - - float inDash = 0.0; - if (dx2 <= bodyHalfW) { - float edgeDist = dynamicBarHalf - dy; - inDash = smoothstep(-0.03, 0.03, edgeDist); - } else { - float cdx = (dx2 - bodyHalfW) * cellW; - float cdy = dy * rowH; - float d = sqrt(cdx * cdx + cdy * cdy); - inDash = 1.0 - smoothstep(capR - 1.5, capR + 1.5, d); - } - - if (inDash < 0.01) { - discard; - } - - gl_FragColor = vec4(uColor, inDash); - } -`; - -function createHalftoneDashMaterial( - lightDirection: THREE.Vector3, - resolution: THREE.Vector2, -) { - return new THREE.ShaderMaterial({ - uniforms: { - uColor: { value: new THREE.Color('#1e5bff') }, - uLightDir: { value: lightDirection.clone() }, - uResolution: { value: resolution.clone() }, - uNumRows: { value: 65 }, - }, - vertexShader: halftoneVertexShader, - fragmentShader: halftoneFragmentShader, - transparent: true, - depthWrite: true, - depthTest: true, - side: THREE.DoubleSide, - }); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - - const material = sceneObject.material; - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - } else { - material?.dispose(); - } - }); -} - -type MeshRestPose = { - position: THREE.Vector3; - quaternion: THREE.Quaternion; - wobblePhase: number; -}; - -function applyHalftoneDashMaterials( - modelRoot: THREE.Object3D, - lightDirection: THREE.Vector3, - resolution: THREE.Vector2, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.material = createHalftoneDashMaterial( - lightDirection, - resolution, - ); - - const mesh = sceneObject; - const rest: MeshRestPose = { - position: mesh.position.clone(), - quaternion: mesh.quaternion.clone(), - wobblePhase: mesh.position.y * 4.2 + mesh.position.x * 1.7, - }; - mesh.userData.partnerCommunityMeshRest = rest; - }); -} - -const StyledVisualMount = styled.div` - display: block; - height: 100%; - min-width: 0; - width: 100%; -`; - -export function Connect() { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - if (!container) { - return; - } - - let cancelled = false; - let animationFrameId = 0; - - const pointer = { x: 0, y: 0, inside: false }; - const targetRotation = { x: 0, y: 0 }; - const lightDirectionWorld = new THREE.Vector3(4, 8, 6).normalize(); - - const scene = new THREE.Scene(); - const width = container.clientWidth; - const height = container.clientHeight; - - const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 100); - camera.position.set(0, 0, 5.05); - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: false }); - renderer.setPixelRatio(1); - renderer.setSize(width, height); - renderer.setClearColor(0x000000, 0); - renderer.outputColorSpace = THREE.SRGBColorSpace; - const canvas = renderer.domElement; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - canvas.style.cursor = 'pointer'; - container.appendChild(canvas); - - const pivot = new THREE.Group(); - scene.add(pivot); - - const clock = new THREE.Clock(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - GLB_URL, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const modelRoot = gltf.scene; - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - const scale = 2.75 / maxAxis; - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(scale); - - const canvasResolution = new THREE.Vector2( - renderer.domElement.width, - renderer.domElement.height, - ); - applyHalftoneDashMaterials( - modelRoot, - lightDirectionWorld, - canvasResolution, - ); - pivot.add(modelRoot); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - const delta = Math.min(clock.getDelta(), 0.1); - - const rotationDamp = 6.8; - const influence = pointer.inside ? 1 : 0.38; - targetRotation.y = pointer.x * 0.78 * influence; - targetRotation.x = pointer.y * 0.62 * influence; - - pivot.rotation.y = THREE.MathUtils.damp( - pivot.rotation.y, - targetRotation.y, - rotationDamp, - delta, - ); - pivot.rotation.x = THREE.MathUtils.damp( - pivot.rotation.x, - targetRotation.x, - rotationDamp, - delta, - ); - - const hoverLift = pointer.inside ? 1 : 0; - pivot.scale.setScalar( - THREE.MathUtils.damp(pivot.scale.x, 1 + hoverLift * 0.12, 7, delta), - ); - - const mx = pointer.x * (pointer.inside ? 1 : 0.32); - const my = pointer.y * (pointer.inside ? 1 : 0.32); - - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - const rest = sceneObject.userData.partnerCommunityMeshRest as - | MeshRestPose - | undefined; - if (!rest) { - return; - } - - const phase = rest.wobblePhase; - const wobble = pointer.inside ? 1 : 0.36; - sceneObject.position.x = - rest.position.x + mx * 0.22 * Math.sin(phase * 1.8); - sceneObject.position.z = - rest.position.z + my * 0.19 * Math.cos(phase * 1.4); - sceneObject.position.y = - rest.position.y + (mx + my) * 0.055 * Math.sin(phase * 2.5); - - const twist = (mx * 0.34 + my * 0.24) * wobble * Math.sin(phase); - sceneObject.quaternion.copy(rest.quaternion); - sceneObject.rotateY(twist); - }); - - renderer.render(scene, camera); - }; - - renderFrame(); - }, - undefined, - undefined, - ); - - const setPointerFromEvent = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const normalizedX = ((event.clientX - rect.left) / rect.width) * 2 - 1; - const normalizedY = -(((event.clientY - rect.top) / rect.height) * 2 - 1); - pointer.x = THREE.MathUtils.clamp(normalizedX, -1, 1); - pointer.y = THREE.MathUtils.clamp(normalizedY, -1, 1); - }; - - const handlePointerEnter = () => { - pointer.inside = true; - }; - - const handlePointerLeave = () => { - pointer.inside = false; - pointer.x = 0; - pointer.y = 0; - }; - - const handlePointerMove = (event: PointerEvent) => { - setPointerFromEvent(event); - }; - - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - - const handleResize = () => { - if (!mountReference.current || cancelled) { - return; - } - - const nextWidth = mountReference.current.clientWidth; - const nextHeight = mountReference.current.clientHeight; - if (nextWidth < 1 || nextHeight < 1) { - return; - } - - camera.aspect = nextWidth / nextHeight; - camera.updateProjectionMatrix(); - renderer.setSize(nextWidth, nextHeight); - - const rw = renderer.domElement.width; - const rh = renderer.domElement.height; - pivot.traverse((sceneObject) => { - if ( - sceneObject instanceof THREE.Mesh && - sceneObject.material instanceof THREE.ShaderMaterial && - sceneObject.material.uniforms.uResolution - ) { - sceneObject.material.uniforms.uResolution.value.set(rw, rh); - } - }); - }; - - window.addEventListener('resize', handleResize); - - return () => { - cancelled = true; - window.removeEventListener('resize', handleResize); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.cancelAnimationFrame(animationFrameId); - disposeObjectSubtree(scene); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, []); - - return <StyledVisualMount aria-hidden ref={mountReference} />; -} diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/Diamond.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/Diamond.tsx deleted file mode 100644 index 40f9884d92..0000000000 --- a/packages/twenty-website-new/src/illustrations/ThreeCards/Diamond.tsx +++ /dev/null @@ -1,1227 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const VIRTUAL_RENDER_HEIGHT = 768; -const REFERENCE_PREVIEW_DISTANCE = 4; -const MIN_FOOTPRINT_SCALE = 0.001; -const MODEL_SCALE_TARGET = 2.75; -const DIAMOND_MODEL_URL = '/illustrations/home/three-cards/diamond.glb'; - -export type ModelHalftoneRotateAxis = - | 'x' - | 'y' - | 'z' - | 'xy' - | '-x' - | '-y' - | '-z' - | '-xy'; - -export type ModelHalftoneLightingSettings = { - ambientIntensity: number; - angleDegrees: number; - fillIntensity: number; - height: number; - intensity: number; -}; - -export type ModelHalftoneMaterialSettings = { - metalness: number; - roughness: number; -}; - -export type ModelHalftoneSettings = { - dashColor: string; - power: number; - scale: number; - width: number; -}; - -export type ModelHalftoneAnimationSettings = { - autoRotateEnabled: boolean; - autoSpeed: number; - autoWobble: number; - dragFriction: number; - dragMomentum: boolean; - dragSens: number; - followDragEnabled: boolean; - followHoverEnabled: boolean; - hoverEase: number; - hoverRange: number; - hoverReturn: boolean; - lightSweepEnabled: boolean; - lightSweepHeightRange: number; - lightSweepRange: number; - lightSweepSpeed: number; - rotateAxis: ModelHalftoneRotateAxis; - rotateEnabled: boolean; - rotatePingPong: boolean; - rotateSpeed: number; - springDamping: number; - springReturnEnabled: boolean; - springStrength: number; -}; - -export type ModelHalftoneIllustrationSettings = { - animation: ModelHalftoneAnimationSettings; - cameraDistance: number; - halftone: ModelHalftoneSettings; - lighting: ModelHalftoneLightingSettings; - material: ModelHalftoneMaterialSettings; - rotationOffsetX: number; - rotationOffsetY: number; - rotationOffsetZ: number; -}; - -export const LOCK_FLASH_EFFECT_SETTINGS: ModelHalftoneIllustrationSettings = { - animation: { - autoRotateEnabled: false, - autoSpeed: 0.1, - autoWobble: 0, - dragFriction: 0.08, - dragMomentum: true, - dragSens: 0.008, - followDragEnabled: true, - followHoverEnabled: true, - hoverEase: 0.08, - hoverRange: 25, - hoverReturn: true, - lightSweepEnabled: true, - lightSweepHeightRange: 0.5, - lightSweepRange: 28, - lightSweepSpeed: 0.2, - rotateAxis: 'y', - rotateEnabled: true, - rotatePingPong: false, - rotateSpeed: 0.1, - springDamping: 0.4, - springReturnEnabled: true, - springStrength: 0.06, - }, - cameraDistance: 4.27, - halftone: { - dashColor: '#4A38F5', - power: 1.11, - scale: 11.06, - width: 1.03, - }, - lighting: { - ambientIntensity: 0, - angleDegrees: 46, - fillIntensity: 0, - height: 2, - intensity: 2, - }, - material: { - metalness: 1, - roughness: 0, - }, - rotationOffsetX: 0, - rotationOffsetY: 0, - rotationOffsetZ: 0, -} as const; - -export const DIAMOND_EFFECT_SETTINGS: ModelHalftoneIllustrationSettings = { - ...LOCK_FLASH_EFFECT_SETTINGS, - rotationOffsetZ: 0, -} as const; - -const INITIAL_POSE = { - autoElapsed: 42.43333333333221, - rotateElapsed: 89.98333333332951, - rotationX: -8.99639917695435, - rotationY: -8.99639917695435, - rotationZ: DIAMOND_EFFECT_SETTINGS.rotationOffsetZ, - targetRotationX: 0, - targetRotationY: 0, - timeElapsed: 851.4676000003166, -} as const; - -const passThroughVertexShader = /* glsl */ ` - varying vec2 vUv; - - void main() { - vUv = uv; - gl_Position = vec4(position, 1.0); - } -`; - -const blurFragmentShader = /* glsl */ ` - precision highp float; - - uniform sampler2D tInput; - uniform vec2 dir; - uniform vec2 res; - - varying vec2 vUv; - - void main() { - vec4 sum = vec4(0.0); - vec2 px = dir / res; - - float w[5]; - w[0] = 0.227027; - w[1] = 0.1945946; - w[2] = 0.1216216; - w[3] = 0.054054; - w[4] = 0.016216; - - sum += texture2D(tInput, vUv) * w[0]; - - for (int i = 1; i < 5; i++) { - float fi = float(i) * 3.0; - sum += texture2D(tInput, vUv + px * fi) * w[i]; - sum += texture2D(tInput, vUv - px * fi) * w[i]; - } - - gl_FragColor = sum; - } -`; - -const halftoneFragmentShader = /* glsl */ ` - precision highp float; - - uniform sampler2D tScene; - uniform sampler2D tGlow; - uniform vec2 effectResolution; - uniform vec2 logicalResolution; - uniform float tile; - uniform float s_3; - uniform float s_4; - uniform vec3 dashColor; - uniform float time; - uniform float waveAmount; - uniform float waveSpeed; - uniform float footprintScale; - uniform vec2 interactionUv; - uniform vec2 interactionVelocity; - uniform vec2 dragOffset; - uniform float hoverLightStrength; - uniform float hoverLightRadius; - uniform float hoverFlowStrength; - uniform float hoverFlowRadius; - uniform float dragFlowStrength; - uniform float cropToBounds; - - varying vec2 vUv; - - float distSegment(in vec2 p, in vec2 a, in vec2 b) { - vec2 pa = p - a; - vec2 ba = b - a; - float denom = max(dot(ba, ba), 0.000001); - float h = clamp(dot(pa, ba) / denom, 0.0, 1.0); - return length(pa - ba * h); - } - - float lineSimpleEt(in vec2 p, in float r, in float thickness) { - vec2 a = vec2(0.5) + vec2(-r, 0.0); - vec2 b = vec2(0.5) + vec2(r, 0.0); - float distToSegment = distSegment(p, a, b); - float halfThickness = thickness * r; - return distToSegment - halfThickness; - } - - void main() { - if (cropToBounds > 0.5) { - vec4 boundsCheck = texture2D(tScene, vUv); - if (boundsCheck.a < 0.01) { - gl_FragColor = vec4(0.0); - return; - } - } - - vec2 fragCoord = - (gl_FragCoord.xy / max(effectResolution, vec2(1.0))) * logicalResolution; - float halftoneSize = max(tile * max(footprintScale, 0.001), 1.0); - vec2 pointerPx = interactionUv * logicalResolution; - vec2 fragDelta = fragCoord - pointerPx; - float fragDist = length(fragDelta); - vec2 radialDir = fragDist > 0.001 ? fragDelta / fragDist : vec2(0.0, 1.0); - float velocityMagnitude = length(interactionVelocity); - vec2 motionDir = velocityMagnitude > 0.001 - ? interactionVelocity / velocityMagnitude - : vec2(0.0, 0.0); - float motionBias = velocityMagnitude > 0.001 - ? dot(-radialDir, motionDir) * 0.5 + 0.5 - : 0.5; - - float hoverLightMask = 0.0; - if (hoverLightStrength > 0.0) { - float lightRadiusPx = hoverLightRadius * logicalResolution.y; - hoverLightMask = smoothstep(lightRadiusPx, 0.0, fragDist); - } - - float hoverFlowMask = 0.0; - if (hoverFlowStrength > 0.0) { - float hoverRadiusPx = hoverFlowRadius * logicalResolution.y; - hoverFlowMask = smoothstep(hoverRadiusPx, 0.0, fragDist); - } - - vec2 hoverDisplacement = - radialDir * hoverFlowStrength * hoverFlowMask * halftoneSize * 0.55 + - motionDir * hoverFlowStrength * hoverFlowMask * (0.4 + motionBias) * halftoneSize * 1.15; - vec2 travelDisplacement = dragOffset * dragFlowStrength * 0.45; - vec2 effectCoord = fragCoord + hoverDisplacement + travelDisplacement; - - float bandRow = floor(effectCoord.y / halftoneSize); - float waveOffset = - waveAmount * sin(time * waveSpeed + bandRow * 0.5) * halftoneSize; - effectCoord.x += waveOffset; - - vec2 cellIndex = floor(effectCoord / halftoneSize); - vec2 sampleUv = clamp( - (cellIndex + 0.5) * halftoneSize / logicalResolution, - vec2(0.0), - vec2(1.0) - ); - vec2 cellUv = fract(effectCoord / halftoneSize); - - vec4 sceneSample = texture2D(tScene, sampleUv); - float mask = smoothstep(0.02, 0.08, sceneSample.a); - float lightLift = - hoverLightStrength * hoverLightMask * mix(0.78, 1.18, motionBias) * 0.22; - float bandRadius = clamp( - ( - ( - sceneSample.r + - sceneSample.g + - sceneSample.b + - s_3 * length(vec2(0.5)) - ) * - (1.0 / 3.0) - ) + lightLift, - 0.0, - 1.0 - ) * 1.86 * 0.5; - - float alpha = 0.0; - if (bandRadius > 0.0001) { - float signedDistance = lineSimpleEt(cellUv, bandRadius, s_4); - float edge = 0.02; - alpha = (1.0 - smoothstep(0.0, edge, signedDistance)) * mask; - } - - vec3 color = dashColor * alpha; - gl_FragColor = vec4(color, alpha); - - #include <tonemapping_fragment> - #include <colorspace_fragment> - } -`; - -type ViewportRect = { - height: number; - width: number; - x: number; - y: number; -}; - -type DiamondInteractionState = { - autoElapsed: number; - dragging: boolean; - mouseX: number; - mouseY: number; - pointerInside: boolean; - pointerX: number; - pointerY: number; - rotateElapsed: number; - rotationVelocityX: number; - rotationVelocityY: number; - rotationVelocityZ: number; - rotationX: number; - rotationY: number; - rotationZ: number; - targetRotationX: number; - targetRotationY: number; - velocityX: number; - velocityY: number; -}; - -function clampRectToViewport( - rect: ViewportRect, - viewportWidth: number, - viewportHeight: number, -) { - const minX = Math.max(rect.x, 0); - const minY = Math.max(rect.y, 0); - const maxX = Math.min(rect.x + rect.width, viewportWidth); - const maxY = Math.min(rect.y + rect.height, viewportHeight); - - if (maxX <= minX || maxY <= minY) { - return null; - } - - return { - height: maxY - minY, - width: maxX - minX, - x: minX, - y: minY, - }; -} - -function getRectArea(rect: ViewportRect | null) { - if (!rect) { - return 0; - } - - return Math.max(rect.width, 0) * Math.max(rect.height, 0); -} - -function createBox3Corners(bounds: THREE.Box3) { - const { min, max } = bounds; - - return [ - new THREE.Vector3(min.x, min.y, min.z), - new THREE.Vector3(min.x, min.y, max.z), - new THREE.Vector3(min.x, max.y, min.z), - new THREE.Vector3(min.x, max.y, max.z), - new THREE.Vector3(max.x, min.y, min.z), - new THREE.Vector3(max.x, min.y, max.z), - new THREE.Vector3(max.x, max.y, min.z), - new THREE.Vector3(max.x, max.y, max.z), - ]; -} - -function projectBox3ToViewport({ - camera, - localBounds, - meshMatrixWorld, - viewportHeight, - viewportWidth, -}: { - camera: THREE.PerspectiveCamera; - localBounds: THREE.Box3; - meshMatrixWorld: THREE.Matrix4; - viewportHeight: number; - viewportWidth: number; -}) { - if ( - localBounds.isEmpty() || - viewportWidth <= 0 || - viewportHeight <= 0 - ) { - return null; - } - - let minX = Number.POSITIVE_INFINITY; - let minY = Number.POSITIVE_INFINITY; - let maxX = Number.NEGATIVE_INFINITY; - let maxY = Number.NEGATIVE_INFINITY; - let hasProjectedCorner = false; - - for (const corner of createBox3Corners(localBounds)) { - corner.applyMatrix4(meshMatrixWorld).project(camera); - - if ( - !Number.isFinite(corner.x) || - !Number.isFinite(corner.y) || - !Number.isFinite(corner.z) - ) { - continue; - } - - hasProjectedCorner = true; - - const x = (corner.x * 0.5 + 0.5) * viewportWidth; - const y = (1 - (corner.y * 0.5 + 0.5)) * viewportHeight; - - minX = Math.min(minX, x); - minY = Math.min(minY, y); - maxX = Math.max(maxX, x); - maxY = Math.max(maxY, y); - } - - if (!hasProjectedCorner) { - return null; - } - - return clampRectToViewport( - { - height: maxY - minY, - width: maxX - minX, - x: minX, - y: minY, - }, - viewportWidth, - viewportHeight, - ); -} - -function getFootprintScaleFromRects( - currentRect: ViewportRect | null, - referenceRect: ViewportRect | null, -) { - const currentArea = getRectArea(currentRect); - const referenceArea = getRectArea(referenceRect); - - if (currentArea <= 0 || referenceArea <= 0) { - return 1; - } - - return Math.max( - Math.sqrt(currentArea / referenceArea), - MIN_FOOTPRINT_SCALE, - ); -} - -function getObjectFootprintScale({ - camera, - localBounds, - lookAtTarget, - meshMatrixWorld, - viewportHeight, - viewportWidth, -}: { - camera: THREE.PerspectiveCamera; - localBounds: THREE.Box3; - lookAtTarget: THREE.Vector3; - meshMatrixWorld: THREE.Matrix4; - viewportHeight: number; - viewportWidth: number; -}) { - const currentRect = projectBox3ToViewport({ - camera, - localBounds, - meshMatrixWorld, - viewportHeight, - viewportWidth, - }); - - const referenceCamera = camera.clone(); - const currentOffset = referenceCamera.position.clone().sub(lookAtTarget); - const referenceOffset = - currentOffset.lengthSq() > 0 - ? currentOffset.setLength(REFERENCE_PREVIEW_DISTANCE) - : new THREE.Vector3(0, 0, REFERENCE_PREVIEW_DISTANCE); - - referenceCamera.position.copy(lookAtTarget).add(referenceOffset); - referenceCamera.lookAt(lookAtTarget); - referenceCamera.updateProjectionMatrix(); - referenceCamera.updateMatrixWorld(true); - - const referenceRect = projectBox3ToViewport({ - camera: referenceCamera, - localBounds, - meshMatrixWorld, - viewportHeight, - viewportWidth, - }); - - return getFootprintScaleFromRects(currentRect, referenceRect); -} - -function createEnvironmentTexture(renderer: THREE.WebGLRenderer) { - const pmremGenerator = new THREE.PMREMGenerator(renderer); - const environmentTexture = pmremGenerator.fromScene( - new RoomEnvironment(), - 0.04, - ).texture; - - pmremGenerator.dispose(); - - return environmentTexture; -} - -function createRenderTarget(width: number, height: number) { - return new THREE.WebGLRenderTarget(width, height, { - format: THREE.RGBAFormat, - magFilter: THREE.LinearFilter, - minFilter: THREE.LinearFilter, - }); -} - -function disposeMaterial(material: THREE.Material | THREE.Material[]) { - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - return; - } - - material.dispose(); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - disposeMaterial(sceneObject.material); - }); -} - -function setPrimaryLightPosition( - light: THREE.DirectionalLight, - angleDegrees: number, - height: number, -) { - const lightAngle = THREE.MathUtils.degToRad(angleDegrees); - light.position.set( - Math.cos(lightAngle) * 5, - height, - Math.sin(lightAngle) * 5, - ); -} - -function normalizeModelRoot(modelRoot: THREE.Object3D) { - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(MODEL_SCALE_TARGET / maxAxis); -} - -function applyPhysicalMaterial( - modelRoot: THREE.Object3D, - environmentTexture: THREE.Texture, - materialSettings: ModelHalftoneMaterialSettings, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - disposeMaterial(sceneObject.material); - sceneObject.material = new THREE.MeshPhysicalMaterial({ - clearcoat: 0, - clearcoatRoughness: 0.08, - color: 0xd4d0c8, - envMap: environmentTexture, - envMapIntensity: 0.25, - metalness: materialSettings.metalness, - reflectivity: 0.5, - roughness: materialSettings.roughness, - transmission: 0, - }); - }); -} - -function createInteractionState( - settings: ModelHalftoneIllustrationSettings, -): DiamondInteractionState { - return { - autoElapsed: INITIAL_POSE.autoElapsed, - dragging: false, - mouseX: 0.5, - mouseY: 0.5, - pointerInside: false, - pointerX: 0, - pointerY: 0, - rotateElapsed: INITIAL_POSE.rotateElapsed, - rotationVelocityX: 0, - rotationVelocityY: 0, - rotationVelocityZ: 0, - rotationX: INITIAL_POSE.rotationX, - rotationY: INITIAL_POSE.rotationY, - rotationZ: settings.rotationOffsetZ, - targetRotationX: INITIAL_POSE.targetRotationX, - targetRotationY: INITIAL_POSE.targetRotationY, - velocityX: 0, - velocityY: 0, - }; -} - -function applySpringStep( - current: number, - target: number, - velocity: number, - strength: number, - damping: number, -) { - const nextVelocity = (velocity + (target - current) * strength) * damping; - - return { - value: current + nextVelocity, - velocity: nextVelocity, - }; -} - -const StyledVisualMount = styled.div` - display: block; - height: 100%; - min-width: 0; - width: 100%; -`; - -type ModelHalftoneIllustrationProps = { - modelUrl: string; - settings: ModelHalftoneIllustrationSettings; -}; - -export function ModelHalftoneIllustration({ - modelUrl, - settings, -}: ModelHalftoneIllustrationProps) { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - - if (!container) { - return; - } - - const getWidth = () => Math.max(container.clientWidth, 1); - const getHeight = () => Math.max(container.clientHeight, 1); - const getVirtualHeight = () => Math.max(VIRTUAL_RENDER_HEIGHT, getHeight()); - const getVirtualWidth = () => - Math.max( - Math.round(getVirtualHeight() * (getWidth() / Math.max(getHeight(), 1))), - 1, - ); - - let animationFrameId = 0; - let cancelled = false; - let modelRoot: THREE.Object3D | null = null; - let modelLocalBounds: THREE.Box3 | null = null; - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: false }); - renderer.outputColorSpace = THREE.SRGBColorSpace; - renderer.setPixelRatio(1); - renderer.setClearColor(0x000000, 0); - renderer.setSize(getVirtualWidth(), getVirtualHeight(), false); - - const canvas = renderer.domElement; - canvas.style.cursor = settings.animation.followDragEnabled - ? 'grab' - : 'default'; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - container.appendChild(canvas); - - const environmentTexture = createEnvironmentTexture(renderer); - - const scene3d = new THREE.Scene(); - scene3d.background = null; - - const camera = new THREE.PerspectiveCamera( - 45, - getWidth() / getHeight(), - 0.1, - 100, - ); - camera.position.z = settings.cameraDistance; - - const primaryLight = new THREE.DirectionalLight( - 0xffffff, - settings.lighting.intensity, - ); - setPrimaryLightPosition( - primaryLight, - settings.lighting.angleDegrees, - settings.lighting.height, - ); - scene3d.add(primaryLight); - - const fillLight = new THREE.DirectionalLight( - 0xffffff, - settings.lighting.fillIntensity, - ); - fillLight.position.set(-3, -1, 1); - scene3d.add(fillLight); - - const ambientLight = new THREE.AmbientLight( - 0xffffff, - settings.lighting.ambientIntensity, - ); - scene3d.add(ambientLight); - - const pivot = new THREE.Group(); - scene3d.add(pivot); - - const sceneTarget = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const blurTargetA = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const blurTargetB = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const fullScreenGeometry = new THREE.PlaneGeometry(2, 2); - const orthographicCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); - - const blurHorizontalMaterial = new THREE.ShaderMaterial({ - uniforms: { - dir: { value: new THREE.Vector2(1, 0) }, - res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, - tInput: { value: null }, - }, - fragmentShader: blurFragmentShader, - vertexShader: passThroughVertexShader, - }); - - const blurVerticalMaterial = new THREE.ShaderMaterial({ - uniforms: { - dir: { value: new THREE.Vector2(0, 1) }, - res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, - tInput: { value: null }, - }, - fragmentShader: blurFragmentShader, - vertexShader: passThroughVertexShader, - }); - - const halftoneMaterial = new THREE.ShaderMaterial({ - fragmentShader: halftoneFragmentShader, - transparent: true, - uniforms: { - cropToBounds: { value: 0 }, - dashColor: { value: new THREE.Color(settings.halftone.dashColor) }, - dragFlowStrength: { value: 0 }, - dragOffset: { value: new THREE.Vector2(0, 0) }, - effectResolution: { - value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), - }, - footprintScale: { value: 1 }, - hoverFlowRadius: { value: 0.18 }, - hoverFlowStrength: { value: 0 }, - hoverLightRadius: { value: 0.2 }, - hoverLightStrength: { value: 0 }, - interactionUv: { value: new THREE.Vector2(0.5, 0.5) }, - interactionVelocity: { value: new THREE.Vector2(0, 0) }, - logicalResolution: { - value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), - }, - s_3: { value: settings.halftone.power }, - s_4: { value: settings.halftone.width }, - tGlow: { value: blurTargetB.texture }, - tScene: { value: sceneTarget.texture }, - tile: { value: settings.halftone.scale }, - time: { value: 0 }, - waveAmount: { value: 0 }, - waveSpeed: { value: 1 }, - }, - vertexShader: passThroughVertexShader, - }); - - const blurHorizontalScene = new THREE.Scene(); - blurHorizontalScene.add( - new THREE.Mesh(fullScreenGeometry, blurHorizontalMaterial), - ); - - const blurVerticalScene = new THREE.Scene(); - blurVerticalScene.add(new THREE.Mesh(fullScreenGeometry, blurVerticalMaterial)); - - const postScene = new THREE.Scene(); - postScene.add(new THREE.Mesh(fullScreenGeometry, halftoneMaterial)); - - const updateViewportUniforms = ( - logicalWidth: number, - logicalHeight: number, - effectWidth: number, - effectHeight: number, - ) => { - blurHorizontalMaterial.uniforms.res.value.set(effectWidth, effectHeight); - blurVerticalMaterial.uniforms.res.value.set(effectWidth, effectHeight); - halftoneMaterial.uniforms.effectResolution.value.set( - effectWidth, - effectHeight, - ); - halftoneMaterial.uniforms.logicalResolution.value.set( - logicalWidth, - logicalHeight, - ); - }; - - const interaction = createInteractionState(settings); - const lookAtTarget = new THREE.Vector3(0, 0, 0); - - const syncSize = () => { - const width = getWidth(); - const height = getHeight(); - const virtualWidth = getVirtualWidth(); - const virtualHeight = getVirtualHeight(); - - renderer.setSize(virtualWidth, virtualHeight, false); - camera.aspect = width / height; - camera.updateProjectionMatrix(); - sceneTarget.setSize(virtualWidth, virtualHeight); - blurTargetA.setSize(virtualWidth, virtualHeight); - blurTargetB.setSize(virtualWidth, virtualHeight); - updateViewportUniforms( - virtualWidth, - virtualHeight, - virtualWidth, - virtualHeight, - ); - }; - - const resizeObserver = new ResizeObserver(syncSize); - resizeObserver.observe(container); - - const updatePointerPosition = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const width = Math.max(rect.width, 1); - const height = Math.max(rect.height, 1); - const localX = (event.clientX - rect.left) / width; - const localY = (event.clientY - rect.top) / height; - - interaction.pointerInside = - localX >= 0 && - localX <= 1 && - localY >= 0 && - localY <= 1; - interaction.mouseX = THREE.MathUtils.clamp(localX, 0, 1); - interaction.mouseY = THREE.MathUtils.clamp(localY, 0, 1); - }; - - const handlePointerEnter = (event: PointerEvent) => { - updatePointerPosition(event); - interaction.pointerInside = true; - }; - - const handlePointerDown = (event: PointerEvent) => { - updatePointerPosition(event); - interaction.dragging = true; - interaction.pointerX = event.clientX; - interaction.pointerY = event.clientY; - interaction.velocityX = 0; - interaction.velocityY = 0; - canvas.style.cursor = 'grabbing'; - }; - - const handlePointerMove = (event: PointerEvent) => { - updatePointerPosition(event); - }; - - const handleWindowPointerMove = (event: PointerEvent) => { - if (!interaction.dragging || !settings.animation.followDragEnabled) { - return; - } - - updatePointerPosition(event); - - const deltaX = - (event.clientX - interaction.pointerX) * settings.animation.dragSens; - const deltaY = - (event.clientY - interaction.pointerY) * settings.animation.dragSens; - interaction.velocityX = deltaY; - interaction.velocityY = deltaX; - interaction.targetRotationY += deltaX; - interaction.targetRotationX += deltaY; - interaction.pointerX = event.clientX; - interaction.pointerY = event.clientY; - }; - - const handlePointerLeave = () => { - interaction.pointerInside = false; - - if (interaction.dragging) { - return; - } - - interaction.mouseX = 0.5; - interaction.mouseY = 0.5; - }; - - const handlePointerUp = () => { - interaction.dragging = false; - canvas.style.cursor = settings.animation.followDragEnabled - ? 'grab' - : 'default'; - - if (!settings.animation.springReturnEnabled) { - return; - } - - const springImpulse = Math.max( - settings.animation.springStrength * 10, - 1.2, - ); - interaction.rotationVelocityX += interaction.velocityX * springImpulse; - interaction.rotationVelocityY += interaction.velocityY * springImpulse; - interaction.rotationVelocityZ += interaction.velocityY * springImpulse * 0.12; - interaction.targetRotationX = 0; - interaction.targetRotationY = 0; - interaction.velocityX = 0; - interaction.velocityY = 0; - }; - - const handleWindowBlur = () => { - handlePointerUp(); - handlePointerLeave(); - }; - - canvas.addEventListener('pointerdown', handlePointerDown); - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - window.addEventListener('pointermove', handleWindowPointerMove); - window.addEventListener('pointerup', handlePointerUp); - window.addEventListener('blur', handleWindowBlur); - - const clock = new THREE.Clock(); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - - const delta = clock.getDelta(); - const elapsedTime = INITIAL_POSE.timeElapsed + clock.elapsedTime; - halftoneMaterial.uniforms.time.value = elapsedTime; - halftoneMaterial.uniforms.interactionUv.value.set( - interaction.mouseX, - 1 - interaction.mouseY, - ); - halftoneMaterial.uniforms.interactionVelocity.value.set( - interaction.velocityY, - -interaction.velocityX, - ); - - let baseRotationX = settings.rotationOffsetX; - let baseRotationY = settings.rotationOffsetY; - let baseRotationZ = settings.rotationOffsetZ; - let lightAngle = settings.lighting.angleDegrees; - let lightHeight = settings.lighting.height; - - if (settings.animation.autoRotateEnabled) { - interaction.autoElapsed += delta; - baseRotationY += interaction.autoElapsed * settings.animation.autoSpeed; - baseRotationX += - Math.sin(interaction.autoElapsed * 0.2) * - settings.animation.autoWobble; - } - - if (settings.animation.rotateEnabled) { - interaction.rotateElapsed += delta; - const rotateProgress = settings.animation.rotatePingPong - ? Math.sin(interaction.rotateElapsed * settings.animation.rotateSpeed) * - Math.PI - : interaction.rotateElapsed * settings.animation.rotateSpeed; - const axisDirection = settings.animation.rotateAxis.startsWith('-') - ? -1 - : 1; - const axisProgress = rotateProgress * axisDirection; - - if (settings.animation.rotateAxis.includes('x')) { - baseRotationX += axisProgress; - } - - if (settings.animation.rotateAxis.includes('y')) { - baseRotationY += axisProgress; - } - - if (settings.animation.rotateAxis.includes('z')) { - baseRotationZ += axisProgress; - } - } - - if (settings.animation.lightSweepEnabled) { - const lightPhase = elapsedTime * settings.animation.lightSweepSpeed; - lightAngle += Math.sin(lightPhase) * settings.animation.lightSweepRange; - lightHeight += - Math.cos(lightPhase * 0.85) * - settings.animation.lightSweepHeightRange; - } - - let targetX = baseRotationX; - let targetY = baseRotationY; - let easing = 0.12; - - if (settings.animation.followHoverEnabled) { - const rangeRadians = THREE.MathUtils.degToRad( - settings.animation.hoverRange, - ); - - if ( - settings.animation.hoverReturn || - interaction.mouseX !== 0.5 || - interaction.mouseY !== 0.5 - ) { - targetX += (interaction.mouseY - 0.5) * rangeRadians; - targetY += (interaction.mouseX - 0.5) * rangeRadians; - } - - easing = settings.animation.hoverEase; - } - - if (settings.animation.followDragEnabled) { - if (!interaction.dragging && settings.animation.dragMomentum) { - interaction.targetRotationX += interaction.velocityX; - interaction.targetRotationY += interaction.velocityY; - interaction.velocityX *= 1 - settings.animation.dragFriction; - interaction.velocityY *= 1 - settings.animation.dragFriction; - } - - targetX += interaction.targetRotationX; - targetY += interaction.targetRotationY; - easing = settings.animation.dragFriction; - } - - if (settings.animation.springReturnEnabled) { - const springX = applySpringStep( - interaction.rotationX, - targetX, - interaction.rotationVelocityX, - settings.animation.springStrength, - settings.animation.springDamping, - ); - const springY = applySpringStep( - interaction.rotationY, - targetY, - interaction.rotationVelocityY, - settings.animation.springStrength, - settings.animation.springDamping, - ); - const springZ = applySpringStep( - interaction.rotationZ, - baseRotationZ, - interaction.rotationVelocityZ, - settings.animation.springStrength, - settings.animation.springDamping, - ); - - interaction.rotationX = springX.value; - interaction.rotationY = springY.value; - interaction.rotationZ = springZ.value; - interaction.rotationVelocityX = springX.velocity; - interaction.rotationVelocityY = springY.velocity; - interaction.rotationVelocityZ = springZ.velocity; - } else { - interaction.rotationX += (targetX - interaction.rotationX) * easing; - interaction.rotationY += (targetY - interaction.rotationY) * easing; - interaction.rotationZ += - (baseRotationZ - interaction.rotationZ) * - (settings.animation.rotatePingPong ? 0.18 : 0.12); - } - - pivot.rotation.set( - interaction.rotationX, - interaction.rotationY, - interaction.rotationZ, - ); - - camera.lookAt(lookAtTarget); - camera.updateMatrixWorld(true); - setPrimaryLightPosition(primaryLight, lightAngle, lightHeight); - - if (modelRoot && modelLocalBounds) { - modelRoot.updateMatrixWorld(true); - halftoneMaterial.uniforms.footprintScale.value = getObjectFootprintScale( - { - camera, - localBounds: modelLocalBounds, - lookAtTarget, - meshMatrixWorld: modelRoot.matrixWorld, - viewportHeight: getVirtualHeight(), - viewportWidth: getVirtualWidth(), - }, - ); - } - - renderer.setRenderTarget(sceneTarget); - renderer.render(scene3d, camera); - - blurHorizontalMaterial.uniforms.tInput.value = sceneTarget.texture; - renderer.setRenderTarget(blurTargetA); - renderer.render(blurHorizontalScene, orthographicCamera); - - blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; - renderer.setRenderTarget(blurTargetB); - renderer.render(blurVerticalScene, orthographicCamera); - - blurHorizontalMaterial.uniforms.tInput.value = blurTargetB.texture; - renderer.setRenderTarget(blurTargetA); - renderer.render(blurHorizontalScene, orthographicCamera); - - blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; - renderer.setRenderTarget(blurTargetB); - renderer.render(blurVerticalScene, orthographicCamera); - - renderer.setRenderTarget(null); - renderer.clear(); - renderer.render(postScene, orthographicCamera); - }; - - renderFrame(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - modelUrl, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const nextModelRoot = gltf.scene; - normalizeModelRoot(nextModelRoot); - applyPhysicalMaterial( - nextModelRoot, - environmentTexture, - settings.material, - ); - nextModelRoot.updateMatrixWorld(true); - const worldBounds = new THREE.Box3().setFromObject(nextModelRoot); - modelLocalBounds = worldBounds.applyMatrix4( - nextModelRoot.matrixWorld.clone().invert(), - ); - modelRoot = nextModelRoot; - pivot.add(nextModelRoot); - }, - undefined, - (error) => { - if (!cancelled) { - console.error(error); - } - }, - ); - - return () => { - cancelled = true; - resizeObserver.disconnect(); - canvas.removeEventListener('pointerdown', handlePointerDown); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.removeEventListener('pointermove', handleWindowPointerMove); - window.removeEventListener('pointerup', handlePointerUp); - window.removeEventListener('blur', handleWindowBlur); - window.cancelAnimationFrame(animationFrameId); - - if (modelRoot) { - disposeObjectSubtree(modelRoot); - } - - blurHorizontalMaterial.dispose(); - blurVerticalMaterial.dispose(); - halftoneMaterial.dispose(); - fullScreenGeometry.dispose(); - sceneTarget.dispose(); - blurTargetA.dispose(); - blurTargetB.dispose(); - environmentTexture.dispose(); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, [modelUrl, settings]); - - return <StyledVisualMount aria-hidden ref={mountReference} />; -} - -export function Diamond() { - return ( - <ModelHalftoneIllustration - modelUrl={DIAMOND_MODEL_URL} - settings={DIAMOND_EFFECT_SETTINGS} - /> - ); -} diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/Flash.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/Flash.tsx deleted file mode 100644 index 980fa350d3..0000000000 --- a/packages/twenty-website-new/src/illustrations/ThreeCards/Flash.tsx +++ /dev/null @@ -1,1222 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const VIRTUAL_RENDER_HEIGHT = 768; -const REFERENCE_PREVIEW_DISTANCE = 4; -const MIN_FOOTPRINT_SCALE = 0.001; -const MODEL_SCALE_TARGET = 2.75; -const FLASH_MODEL_URL = '/illustrations/home/three-cards/flash.glb'; - -export type ModelHalftoneRotateAxis = - | 'x' - | 'y' - | 'z' - | 'xy' - | '-x' - | '-y' - | '-z' - | '-xy'; - -export type ModelHalftoneLightingSettings = { - ambientIntensity: number; - angleDegrees: number; - fillIntensity: number; - height: number; - intensity: number; -}; - -export type ModelHalftoneMaterialSettings = { - metalness: number; - roughness: number; -}; - -export type ModelHalftoneSettings = { - dashColor: string; - power: number; - scale: number; - width: number; -}; - -export type ModelHalftoneAnimationSettings = { - autoRotateEnabled: boolean; - autoSpeed: number; - autoWobble: number; - dragFriction: number; - dragMomentum: boolean; - dragSens: number; - followDragEnabled: boolean; - followHoverEnabled: boolean; - hoverEase: number; - hoverRange: number; - hoverReturn: boolean; - lightSweepEnabled: boolean; - lightSweepHeightRange: number; - lightSweepRange: number; - lightSweepSpeed: number; - rotateAxis: ModelHalftoneRotateAxis; - rotateEnabled: boolean; - rotatePingPong: boolean; - rotateSpeed: number; - springDamping: number; - springReturnEnabled: boolean; - springStrength: number; -}; - -export type ModelHalftoneIllustrationSettings = { - animation: ModelHalftoneAnimationSettings; - cameraDistance: number; - halftone: ModelHalftoneSettings; - lighting: ModelHalftoneLightingSettings; - material: ModelHalftoneMaterialSettings; - rotationOffsetX: number; - rotationOffsetY: number; - rotationOffsetZ: number; -}; - -const FLASH_EFFECT_SETTINGS: ModelHalftoneIllustrationSettings = { - animation: { - autoRotateEnabled: false, - autoSpeed: 0.1, - autoWobble: 0, - dragFriction: 0.08, - dragMomentum: true, - dragSens: 0.008, - followDragEnabled: true, - followHoverEnabled: true, - hoverEase: 0.08, - hoverRange: 25, - hoverReturn: true, - lightSweepEnabled: true, - lightSweepHeightRange: 0.5, - lightSweepRange: 28, - lightSweepSpeed: 0.2, - rotateAxis: 'y', - rotateEnabled: true, - rotatePingPong: false, - rotateSpeed: 0.1, - springDamping: 0.4, - springReturnEnabled: true, - springStrength: 0.06, - }, - cameraDistance: 4.27, - halftone: { - dashColor: '#4A38F5', - power: 1.11, - scale: 11.06, - width: 1.03, - }, - lighting: { - ambientIntensity: 0, - angleDegrees: 46, - fillIntensity: 0, - height: 2, - intensity: 2, - }, - material: { - metalness: 1, - roughness: 0, - }, - rotationOffsetX: 0, - rotationOffsetY: 0, - rotationOffsetZ: 0, -} as const; - -const INITIAL_POSE = { - autoElapsed: 42.43333333333221, - rotateElapsed: 89.98333333332951, - rotationX: -8.99639917695435, - rotationY: -8.99639917695435, - rotationZ: FLASH_EFFECT_SETTINGS.rotationOffsetZ, - targetRotationX: 0, - targetRotationY: 0, - timeElapsed: 851.4676000003166, -} as const; - -const passThroughVertexShader = /* glsl */ ` - varying vec2 vUv; - - void main() { - vUv = uv; - gl_Position = vec4(position, 1.0); - } -`; - -const blurFragmentShader = /* glsl */ ` - precision highp float; - - uniform sampler2D tInput; - uniform vec2 dir; - uniform vec2 res; - - varying vec2 vUv; - - void main() { - vec4 sum = vec4(0.0); - vec2 px = dir / res; - - float w[5]; - w[0] = 0.227027; - w[1] = 0.1945946; - w[2] = 0.1216216; - w[3] = 0.054054; - w[4] = 0.016216; - - sum += texture2D(tInput, vUv) * w[0]; - - for (int i = 1; i < 5; i++) { - float fi = float(i) * 3.0; - sum += texture2D(tInput, vUv + px * fi) * w[i]; - sum += texture2D(tInput, vUv - px * fi) * w[i]; - } - - gl_FragColor = sum; - } -`; - -const halftoneFragmentShader = /* glsl */ ` - precision highp float; - - uniform sampler2D tScene; - uniform sampler2D tGlow; - uniform vec2 effectResolution; - uniform vec2 logicalResolution; - uniform float tile; - uniform float s_3; - uniform float s_4; - uniform vec3 dashColor; - uniform float time; - uniform float waveAmount; - uniform float waveSpeed; - uniform float footprintScale; - uniform vec2 interactionUv; - uniform vec2 interactionVelocity; - uniform vec2 dragOffset; - uniform float hoverLightStrength; - uniform float hoverLightRadius; - uniform float hoverFlowStrength; - uniform float hoverFlowRadius; - uniform float dragFlowStrength; - uniform float cropToBounds; - - varying vec2 vUv; - - float distSegment(in vec2 p, in vec2 a, in vec2 b) { - vec2 pa = p - a; - vec2 ba = b - a; - float denom = max(dot(ba, ba), 0.000001); - float h = clamp(dot(pa, ba) / denom, 0.0, 1.0); - return length(pa - ba * h); - } - - float lineSimpleEt(in vec2 p, in float r, in float thickness) { - vec2 a = vec2(0.5) + vec2(-r, 0.0); - vec2 b = vec2(0.5) + vec2(r, 0.0); - float distToSegment = distSegment(p, a, b); - float halfThickness = thickness * r; - return distToSegment - halfThickness; - } - - void main() { - if (cropToBounds > 0.5) { - vec4 boundsCheck = texture2D(tScene, vUv); - if (boundsCheck.a < 0.01) { - gl_FragColor = vec4(0.0); - return; - } - } - - vec2 fragCoord = - (gl_FragCoord.xy / max(effectResolution, vec2(1.0))) * logicalResolution; - float halftoneSize = max(tile * max(footprintScale, 0.001), 1.0); - vec2 pointerPx = interactionUv * logicalResolution; - vec2 fragDelta = fragCoord - pointerPx; - float fragDist = length(fragDelta); - vec2 radialDir = fragDist > 0.001 ? fragDelta / fragDist : vec2(0.0, 1.0); - float velocityMagnitude = length(interactionVelocity); - vec2 motionDir = velocityMagnitude > 0.001 - ? interactionVelocity / velocityMagnitude - : vec2(0.0, 0.0); - float motionBias = velocityMagnitude > 0.001 - ? dot(-radialDir, motionDir) * 0.5 + 0.5 - : 0.5; - - float hoverLightMask = 0.0; - if (hoverLightStrength > 0.0) { - float lightRadiusPx = hoverLightRadius * logicalResolution.y; - hoverLightMask = smoothstep(lightRadiusPx, 0.0, fragDist); - } - - float hoverFlowMask = 0.0; - if (hoverFlowStrength > 0.0) { - float hoverRadiusPx = hoverFlowRadius * logicalResolution.y; - hoverFlowMask = smoothstep(hoverRadiusPx, 0.0, fragDist); - } - - vec2 hoverDisplacement = - radialDir * hoverFlowStrength * hoverFlowMask * halftoneSize * 0.55 + - motionDir * hoverFlowStrength * hoverFlowMask * (0.4 + motionBias) * halftoneSize * 1.15; - vec2 travelDisplacement = dragOffset * dragFlowStrength * 0.45; - vec2 effectCoord = fragCoord + hoverDisplacement + travelDisplacement; - - float bandRow = floor(effectCoord.y / halftoneSize); - float waveOffset = - waveAmount * sin(time * waveSpeed + bandRow * 0.5) * halftoneSize; - effectCoord.x += waveOffset; - - vec2 cellIndex = floor(effectCoord / halftoneSize); - vec2 sampleUv = clamp( - (cellIndex + 0.5) * halftoneSize / logicalResolution, - vec2(0.0), - vec2(1.0) - ); - vec2 cellUv = fract(effectCoord / halftoneSize); - - vec4 sceneSample = texture2D(tScene, sampleUv); - float mask = smoothstep(0.02, 0.08, sceneSample.a); - float lightLift = - hoverLightStrength * hoverLightMask * mix(0.78, 1.18, motionBias) * 0.22; - float bandRadius = clamp( - ( - ( - sceneSample.r + - sceneSample.g + - sceneSample.b + - s_3 * length(vec2(0.5)) - ) * - (1.0 / 3.0) - ) + lightLift, - 0.0, - 1.0 - ) * 1.86 * 0.5; - - float alpha = 0.0; - if (bandRadius > 0.0001) { - float signedDistance = lineSimpleEt(cellUv, bandRadius, s_4); - float edge = 0.02; - alpha = (1.0 - smoothstep(0.0, edge, signedDistance)) * mask; - } - - vec3 color = dashColor * alpha; - gl_FragColor = vec4(color, alpha); - - #include <tonemapping_fragment> - #include <colorspace_fragment> - } -`; - -type ViewportRect = { - height: number; - width: number; - x: number; - y: number; -}; - -type DiamondInteractionState = { - autoElapsed: number; - dragging: boolean; - mouseX: number; - mouseY: number; - pointerInside: boolean; - pointerX: number; - pointerY: number; - rotateElapsed: number; - rotationVelocityX: number; - rotationVelocityY: number; - rotationVelocityZ: number; - rotationX: number; - rotationY: number; - rotationZ: number; - targetRotationX: number; - targetRotationY: number; - velocityX: number; - velocityY: number; -}; - -function clampRectToViewport( - rect: ViewportRect, - viewportWidth: number, - viewportHeight: number, -) { - const minX = Math.max(rect.x, 0); - const minY = Math.max(rect.y, 0); - const maxX = Math.min(rect.x + rect.width, viewportWidth); - const maxY = Math.min(rect.y + rect.height, viewportHeight); - - if (maxX <= minX || maxY <= minY) { - return null; - } - - return { - height: maxY - minY, - width: maxX - minX, - x: minX, - y: minY, - }; -} - -function getRectArea(rect: ViewportRect | null) { - if (!rect) { - return 0; - } - - return Math.max(rect.width, 0) * Math.max(rect.height, 0); -} - -function createBox3Corners(bounds: THREE.Box3) { - const { min, max } = bounds; - - return [ - new THREE.Vector3(min.x, min.y, min.z), - new THREE.Vector3(min.x, min.y, max.z), - new THREE.Vector3(min.x, max.y, min.z), - new THREE.Vector3(min.x, max.y, max.z), - new THREE.Vector3(max.x, min.y, min.z), - new THREE.Vector3(max.x, min.y, max.z), - new THREE.Vector3(max.x, max.y, min.z), - new THREE.Vector3(max.x, max.y, max.z), - ]; -} - -function projectBox3ToViewport({ - camera, - localBounds, - meshMatrixWorld, - viewportHeight, - viewportWidth, -}: { - camera: THREE.PerspectiveCamera; - localBounds: THREE.Box3; - meshMatrixWorld: THREE.Matrix4; - viewportHeight: number; - viewportWidth: number; -}) { - if ( - localBounds.isEmpty() || - viewportWidth <= 0 || - viewportHeight <= 0 - ) { - return null; - } - - let minX = Number.POSITIVE_INFINITY; - let minY = Number.POSITIVE_INFINITY; - let maxX = Number.NEGATIVE_INFINITY; - let maxY = Number.NEGATIVE_INFINITY; - let hasProjectedCorner = false; - - for (const corner of createBox3Corners(localBounds)) { - corner.applyMatrix4(meshMatrixWorld).project(camera); - - if ( - !Number.isFinite(corner.x) || - !Number.isFinite(corner.y) || - !Number.isFinite(corner.z) - ) { - continue; - } - - hasProjectedCorner = true; - - const x = (corner.x * 0.5 + 0.5) * viewportWidth; - const y = (1 - (corner.y * 0.5 + 0.5)) * viewportHeight; - - minX = Math.min(minX, x); - minY = Math.min(minY, y); - maxX = Math.max(maxX, x); - maxY = Math.max(maxY, y); - } - - if (!hasProjectedCorner) { - return null; - } - - return clampRectToViewport( - { - height: maxY - minY, - width: maxX - minX, - x: minX, - y: minY, - }, - viewportWidth, - viewportHeight, - ); -} - -function getFootprintScaleFromRects( - currentRect: ViewportRect | null, - referenceRect: ViewportRect | null, -) { - const currentArea = getRectArea(currentRect); - const referenceArea = getRectArea(referenceRect); - - if (currentArea <= 0 || referenceArea <= 0) { - return 1; - } - - return Math.max( - Math.sqrt(currentArea / referenceArea), - MIN_FOOTPRINT_SCALE, - ); -} - -function getObjectFootprintScale({ - camera, - localBounds, - lookAtTarget, - meshMatrixWorld, - viewportHeight, - viewportWidth, -}: { - camera: THREE.PerspectiveCamera; - localBounds: THREE.Box3; - lookAtTarget: THREE.Vector3; - meshMatrixWorld: THREE.Matrix4; - viewportHeight: number; - viewportWidth: number; -}) { - const currentRect = projectBox3ToViewport({ - camera, - localBounds, - meshMatrixWorld, - viewportHeight, - viewportWidth, - }); - - const referenceCamera = camera.clone(); - const currentOffset = referenceCamera.position.clone().sub(lookAtTarget); - const referenceOffset = - currentOffset.lengthSq() > 0 - ? currentOffset.setLength(REFERENCE_PREVIEW_DISTANCE) - : new THREE.Vector3(0, 0, REFERENCE_PREVIEW_DISTANCE); - - referenceCamera.position.copy(lookAtTarget).add(referenceOffset); - referenceCamera.lookAt(lookAtTarget); - referenceCamera.updateProjectionMatrix(); - referenceCamera.updateMatrixWorld(true); - - const referenceRect = projectBox3ToViewport({ - camera: referenceCamera, - localBounds, - meshMatrixWorld, - viewportHeight, - viewportWidth, - }); - - return getFootprintScaleFromRects(currentRect, referenceRect); -} - -function createEnvironmentTexture(renderer: THREE.WebGLRenderer) { - const pmremGenerator = new THREE.PMREMGenerator(renderer); - const environmentTexture = pmremGenerator.fromScene( - new RoomEnvironment(), - 0.04, - ).texture; - - pmremGenerator.dispose(); - - return environmentTexture; -} - -function createRenderTarget(width: number, height: number) { - return new THREE.WebGLRenderTarget(width, height, { - format: THREE.RGBAFormat, - magFilter: THREE.LinearFilter, - minFilter: THREE.LinearFilter, - }); -} - -function disposeMaterial(material: THREE.Material | THREE.Material[]) { - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - return; - } - - material.dispose(); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - disposeMaterial(sceneObject.material); - }); -} - -function setPrimaryLightPosition( - light: THREE.DirectionalLight, - angleDegrees: number, - height: number, -) { - const lightAngle = THREE.MathUtils.degToRad(angleDegrees); - light.position.set( - Math.cos(lightAngle) * 5, - height, - Math.sin(lightAngle) * 5, - ); -} - -function normalizeModelRoot(modelRoot: THREE.Object3D) { - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(MODEL_SCALE_TARGET / maxAxis); -} - -function applyPhysicalMaterial( - modelRoot: THREE.Object3D, - environmentTexture: THREE.Texture, - materialSettings: ModelHalftoneMaterialSettings, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - disposeMaterial(sceneObject.material); - sceneObject.material = new THREE.MeshPhysicalMaterial({ - clearcoat: 0, - clearcoatRoughness: 0.08, - color: 0xd4d0c8, - envMap: environmentTexture, - envMapIntensity: 0.25, - metalness: materialSettings.metalness, - reflectivity: 0.5, - roughness: materialSettings.roughness, - transmission: 0, - }); - }); -} - -function createInteractionState( - settings: ModelHalftoneIllustrationSettings, -): DiamondInteractionState { - return { - autoElapsed: INITIAL_POSE.autoElapsed, - dragging: false, - mouseX: 0.5, - mouseY: 0.5, - pointerInside: false, - pointerX: 0, - pointerY: 0, - rotateElapsed: INITIAL_POSE.rotateElapsed, - rotationVelocityX: 0, - rotationVelocityY: 0, - rotationVelocityZ: 0, - rotationX: INITIAL_POSE.rotationX, - rotationY: INITIAL_POSE.rotationY, - rotationZ: settings.rotationOffsetZ, - targetRotationX: INITIAL_POSE.targetRotationX, - targetRotationY: INITIAL_POSE.targetRotationY, - velocityX: 0, - velocityY: 0, - }; -} - -function applySpringStep( - current: number, - target: number, - velocity: number, - strength: number, - damping: number, -) { - const nextVelocity = (velocity + (target - current) * strength) * damping; - - return { - value: current + nextVelocity, - velocity: nextVelocity, - }; -} - -const StyledVisualMount = styled.div` - display: block; - height: 100%; - min-width: 0; - width: 100%; -`; - -type ModelHalftoneIllustrationProps = { - modelUrl: string; - settings: ModelHalftoneIllustrationSettings; -}; - -export function ModelHalftoneIllustration({ - modelUrl, - settings, -}: ModelHalftoneIllustrationProps) { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - - if (!container) { - return; - } - - const getWidth = () => Math.max(container.clientWidth, 1); - const getHeight = () => Math.max(container.clientHeight, 1); - const getVirtualHeight = () => Math.max(VIRTUAL_RENDER_HEIGHT, getHeight()); - const getVirtualWidth = () => - Math.max( - Math.round(getVirtualHeight() * (getWidth() / Math.max(getHeight(), 1))), - 1, - ); - - let animationFrameId = 0; - let cancelled = false; - let modelRoot: THREE.Object3D | null = null; - let modelLocalBounds: THREE.Box3 | null = null; - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: false }); - renderer.outputColorSpace = THREE.SRGBColorSpace; - renderer.setPixelRatio(1); - renderer.setClearColor(0x000000, 0); - renderer.setSize(getVirtualWidth(), getVirtualHeight(), false); - - const canvas = renderer.domElement; - canvas.style.cursor = settings.animation.followDragEnabled - ? 'grab' - : 'default'; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - container.appendChild(canvas); - - const environmentTexture = createEnvironmentTexture(renderer); - - const scene3d = new THREE.Scene(); - scene3d.background = null; - - const camera = new THREE.PerspectiveCamera( - 45, - getWidth() / getHeight(), - 0.1, - 100, - ); - camera.position.z = settings.cameraDistance; - - const primaryLight = new THREE.DirectionalLight( - 0xffffff, - settings.lighting.intensity, - ); - setPrimaryLightPosition( - primaryLight, - settings.lighting.angleDegrees, - settings.lighting.height, - ); - scene3d.add(primaryLight); - - const fillLight = new THREE.DirectionalLight( - 0xffffff, - settings.lighting.fillIntensity, - ); - fillLight.position.set(-3, -1, 1); - scene3d.add(fillLight); - - const ambientLight = new THREE.AmbientLight( - 0xffffff, - settings.lighting.ambientIntensity, - ); - scene3d.add(ambientLight); - - const pivot = new THREE.Group(); - scene3d.add(pivot); - - const sceneTarget = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const blurTargetA = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const blurTargetB = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const fullScreenGeometry = new THREE.PlaneGeometry(2, 2); - const orthographicCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); - - const blurHorizontalMaterial = new THREE.ShaderMaterial({ - uniforms: { - dir: { value: new THREE.Vector2(1, 0) }, - res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, - tInput: { value: null }, - }, - fragmentShader: blurFragmentShader, - vertexShader: passThroughVertexShader, - }); - - const blurVerticalMaterial = new THREE.ShaderMaterial({ - uniforms: { - dir: { value: new THREE.Vector2(0, 1) }, - res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, - tInput: { value: null }, - }, - fragmentShader: blurFragmentShader, - vertexShader: passThroughVertexShader, - }); - - const halftoneMaterial = new THREE.ShaderMaterial({ - fragmentShader: halftoneFragmentShader, - transparent: true, - uniforms: { - cropToBounds: { value: 0 }, - dashColor: { value: new THREE.Color(settings.halftone.dashColor) }, - dragFlowStrength: { value: 0 }, - dragOffset: { value: new THREE.Vector2(0, 0) }, - effectResolution: { - value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), - }, - footprintScale: { value: 1 }, - hoverFlowRadius: { value: 0.18 }, - hoverFlowStrength: { value: 0 }, - hoverLightRadius: { value: 0.2 }, - hoverLightStrength: { value: 0 }, - interactionUv: { value: new THREE.Vector2(0.5, 0.5) }, - interactionVelocity: { value: new THREE.Vector2(0, 0) }, - logicalResolution: { - value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), - }, - s_3: { value: settings.halftone.power }, - s_4: { value: settings.halftone.width }, - tGlow: { value: blurTargetB.texture }, - tScene: { value: sceneTarget.texture }, - tile: { value: settings.halftone.scale }, - time: { value: 0 }, - waveAmount: { value: 0 }, - waveSpeed: { value: 1 }, - }, - vertexShader: passThroughVertexShader, - }); - - const blurHorizontalScene = new THREE.Scene(); - blurHorizontalScene.add( - new THREE.Mesh(fullScreenGeometry, blurHorizontalMaterial), - ); - - const blurVerticalScene = new THREE.Scene(); - blurVerticalScene.add(new THREE.Mesh(fullScreenGeometry, blurVerticalMaterial)); - - const postScene = new THREE.Scene(); - postScene.add(new THREE.Mesh(fullScreenGeometry, halftoneMaterial)); - - const updateViewportUniforms = ( - logicalWidth: number, - logicalHeight: number, - effectWidth: number, - effectHeight: number, - ) => { - blurHorizontalMaterial.uniforms.res.value.set(effectWidth, effectHeight); - blurVerticalMaterial.uniforms.res.value.set(effectWidth, effectHeight); - halftoneMaterial.uniforms.effectResolution.value.set( - effectWidth, - effectHeight, - ); - halftoneMaterial.uniforms.logicalResolution.value.set( - logicalWidth, - logicalHeight, - ); - }; - - const interaction = createInteractionState(settings); - const lookAtTarget = new THREE.Vector3(0, 0, 0); - - const syncSize = () => { - const width = getWidth(); - const height = getHeight(); - const virtualWidth = getVirtualWidth(); - const virtualHeight = getVirtualHeight(); - - renderer.setSize(virtualWidth, virtualHeight, false); - camera.aspect = width / height; - camera.updateProjectionMatrix(); - sceneTarget.setSize(virtualWidth, virtualHeight); - blurTargetA.setSize(virtualWidth, virtualHeight); - blurTargetB.setSize(virtualWidth, virtualHeight); - updateViewportUniforms( - virtualWidth, - virtualHeight, - virtualWidth, - virtualHeight, - ); - }; - - const resizeObserver = new ResizeObserver(syncSize); - resizeObserver.observe(container); - - const updatePointerPosition = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const width = Math.max(rect.width, 1); - const height = Math.max(rect.height, 1); - const localX = (event.clientX - rect.left) / width; - const localY = (event.clientY - rect.top) / height; - - interaction.pointerInside = - localX >= 0 && - localX <= 1 && - localY >= 0 && - localY <= 1; - interaction.mouseX = THREE.MathUtils.clamp(localX, 0, 1); - interaction.mouseY = THREE.MathUtils.clamp(localY, 0, 1); - }; - - const handlePointerEnter = (event: PointerEvent) => { - updatePointerPosition(event); - interaction.pointerInside = true; - }; - - const handlePointerDown = (event: PointerEvent) => { - updatePointerPosition(event); - interaction.dragging = true; - interaction.pointerX = event.clientX; - interaction.pointerY = event.clientY; - interaction.velocityX = 0; - interaction.velocityY = 0; - canvas.style.cursor = 'grabbing'; - }; - - const handlePointerMove = (event: PointerEvent) => { - updatePointerPosition(event); - }; - - const handleWindowPointerMove = (event: PointerEvent) => { - if (!interaction.dragging || !settings.animation.followDragEnabled) { - return; - } - - updatePointerPosition(event); - - const deltaX = - (event.clientX - interaction.pointerX) * settings.animation.dragSens; - const deltaY = - (event.clientY - interaction.pointerY) * settings.animation.dragSens; - interaction.velocityX = deltaY; - interaction.velocityY = deltaX; - interaction.targetRotationY += deltaX; - interaction.targetRotationX += deltaY; - interaction.pointerX = event.clientX; - interaction.pointerY = event.clientY; - }; - - const handlePointerLeave = () => { - interaction.pointerInside = false; - - if (interaction.dragging) { - return; - } - - interaction.mouseX = 0.5; - interaction.mouseY = 0.5; - }; - - const handlePointerUp = () => { - interaction.dragging = false; - canvas.style.cursor = settings.animation.followDragEnabled - ? 'grab' - : 'default'; - - if (!settings.animation.springReturnEnabled) { - return; - } - - const springImpulse = Math.max( - settings.animation.springStrength * 10, - 1.2, - ); - interaction.rotationVelocityX += interaction.velocityX * springImpulse; - interaction.rotationVelocityY += interaction.velocityY * springImpulse; - interaction.rotationVelocityZ += interaction.velocityY * springImpulse * 0.12; - interaction.targetRotationX = 0; - interaction.targetRotationY = 0; - interaction.velocityX = 0; - interaction.velocityY = 0; - }; - - const handleWindowBlur = () => { - handlePointerUp(); - handlePointerLeave(); - }; - - canvas.addEventListener('pointerdown', handlePointerDown); - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - window.addEventListener('pointermove', handleWindowPointerMove); - window.addEventListener('pointerup', handlePointerUp); - window.addEventListener('blur', handleWindowBlur); - - const clock = new THREE.Clock(); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - - const delta = clock.getDelta(); - const elapsedTime = INITIAL_POSE.timeElapsed + clock.elapsedTime; - halftoneMaterial.uniforms.time.value = elapsedTime; - halftoneMaterial.uniforms.interactionUv.value.set( - interaction.mouseX, - 1 - interaction.mouseY, - ); - halftoneMaterial.uniforms.interactionVelocity.value.set( - interaction.velocityY, - -interaction.velocityX, - ); - - let baseRotationX = settings.rotationOffsetX; - let baseRotationY = settings.rotationOffsetY; - let baseRotationZ = settings.rotationOffsetZ; - let lightAngle = settings.lighting.angleDegrees; - let lightHeight = settings.lighting.height; - - if (settings.animation.autoRotateEnabled) { - interaction.autoElapsed += delta; - baseRotationY += interaction.autoElapsed * settings.animation.autoSpeed; - baseRotationX += - Math.sin(interaction.autoElapsed * 0.2) * - settings.animation.autoWobble; - } - - if (settings.animation.rotateEnabled) { - interaction.rotateElapsed += delta; - const rotateProgress = settings.animation.rotatePingPong - ? Math.sin(interaction.rotateElapsed * settings.animation.rotateSpeed) * - Math.PI - : interaction.rotateElapsed * settings.animation.rotateSpeed; - const axisDirection = settings.animation.rotateAxis.startsWith('-') - ? -1 - : 1; - const axisProgress = rotateProgress * axisDirection; - - if (settings.animation.rotateAxis.includes('x')) { - baseRotationX += axisProgress; - } - - if (settings.animation.rotateAxis.includes('y')) { - baseRotationY += axisProgress; - } - - if (settings.animation.rotateAxis.includes('z')) { - baseRotationZ += axisProgress; - } - } - - if (settings.animation.lightSweepEnabled) { - const lightPhase = elapsedTime * settings.animation.lightSweepSpeed; - lightAngle += Math.sin(lightPhase) * settings.animation.lightSweepRange; - lightHeight += - Math.cos(lightPhase * 0.85) * - settings.animation.lightSweepHeightRange; - } - - let targetX = baseRotationX; - let targetY = baseRotationY; - let easing = 0.12; - - if (settings.animation.followHoverEnabled) { - const rangeRadians = THREE.MathUtils.degToRad( - settings.animation.hoverRange, - ); - - if ( - settings.animation.hoverReturn || - interaction.mouseX !== 0.5 || - interaction.mouseY !== 0.5 - ) { - targetX += (interaction.mouseY - 0.5) * rangeRadians; - targetY += (interaction.mouseX - 0.5) * rangeRadians; - } - - easing = settings.animation.hoverEase; - } - - if (settings.animation.followDragEnabled) { - if (!interaction.dragging && settings.animation.dragMomentum) { - interaction.targetRotationX += interaction.velocityX; - interaction.targetRotationY += interaction.velocityY; - interaction.velocityX *= 1 - settings.animation.dragFriction; - interaction.velocityY *= 1 - settings.animation.dragFriction; - } - - targetX += interaction.targetRotationX; - targetY += interaction.targetRotationY; - easing = settings.animation.dragFriction; - } - - if (settings.animation.springReturnEnabled) { - const springX = applySpringStep( - interaction.rotationX, - targetX, - interaction.rotationVelocityX, - settings.animation.springStrength, - settings.animation.springDamping, - ); - const springY = applySpringStep( - interaction.rotationY, - targetY, - interaction.rotationVelocityY, - settings.animation.springStrength, - settings.animation.springDamping, - ); - const springZ = applySpringStep( - interaction.rotationZ, - baseRotationZ, - interaction.rotationVelocityZ, - settings.animation.springStrength, - settings.animation.springDamping, - ); - - interaction.rotationX = springX.value; - interaction.rotationY = springY.value; - interaction.rotationZ = springZ.value; - interaction.rotationVelocityX = springX.velocity; - interaction.rotationVelocityY = springY.velocity; - interaction.rotationVelocityZ = springZ.velocity; - } else { - interaction.rotationX += (targetX - interaction.rotationX) * easing; - interaction.rotationY += (targetY - interaction.rotationY) * easing; - interaction.rotationZ += - (baseRotationZ - interaction.rotationZ) * - (settings.animation.rotatePingPong ? 0.18 : 0.12); - } - - pivot.rotation.set( - interaction.rotationX, - interaction.rotationY, - interaction.rotationZ, - ); - - camera.lookAt(lookAtTarget); - camera.updateMatrixWorld(true); - setPrimaryLightPosition(primaryLight, lightAngle, lightHeight); - - if (modelRoot && modelLocalBounds) { - modelRoot.updateMatrixWorld(true); - halftoneMaterial.uniforms.footprintScale.value = getObjectFootprintScale( - { - camera, - localBounds: modelLocalBounds, - lookAtTarget, - meshMatrixWorld: modelRoot.matrixWorld, - viewportHeight: getVirtualHeight(), - viewportWidth: getVirtualWidth(), - }, - ); - } - - renderer.setRenderTarget(sceneTarget); - renderer.render(scene3d, camera); - - blurHorizontalMaterial.uniforms.tInput.value = sceneTarget.texture; - renderer.setRenderTarget(blurTargetA); - renderer.render(blurHorizontalScene, orthographicCamera); - - blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; - renderer.setRenderTarget(blurTargetB); - renderer.render(blurVerticalScene, orthographicCamera); - - blurHorizontalMaterial.uniforms.tInput.value = blurTargetB.texture; - renderer.setRenderTarget(blurTargetA); - renderer.render(blurHorizontalScene, orthographicCamera); - - blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; - renderer.setRenderTarget(blurTargetB); - renderer.render(blurVerticalScene, orthographicCamera); - - renderer.setRenderTarget(null); - renderer.clear(); - renderer.render(postScene, orthographicCamera); - }; - - renderFrame(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - modelUrl, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const nextModelRoot = gltf.scene; - normalizeModelRoot(nextModelRoot); - applyPhysicalMaterial( - nextModelRoot, - environmentTexture, - settings.material, - ); - nextModelRoot.updateMatrixWorld(true); - const worldBounds = new THREE.Box3().setFromObject(nextModelRoot); - modelLocalBounds = worldBounds.applyMatrix4( - nextModelRoot.matrixWorld.clone().invert(), - ); - modelRoot = nextModelRoot; - pivot.add(nextModelRoot); - }, - undefined, - (error) => { - if (!cancelled) { - console.error(error); - } - }, - ); - - return () => { - cancelled = true; - resizeObserver.disconnect(); - canvas.removeEventListener('pointerdown', handlePointerDown); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.removeEventListener('pointermove', handleWindowPointerMove); - window.removeEventListener('pointerup', handlePointerUp); - window.removeEventListener('blur', handleWindowBlur); - window.cancelAnimationFrame(animationFrameId); - - if (modelRoot) { - disposeObjectSubtree(modelRoot); - } - - blurHorizontalMaterial.dispose(); - blurVerticalMaterial.dispose(); - halftoneMaterial.dispose(); - fullScreenGeometry.dispose(); - sceneTarget.dispose(); - blurTargetA.dispose(); - blurTargetB.dispose(); - environmentTexture.dispose(); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, [modelUrl, settings]); - - return <StyledVisualMount aria-hidden ref={mountReference} />; -} - -export function Flash() { - return ( - <ModelHalftoneIllustration - modelUrl={FLASH_MODEL_URL} - settings={FLASH_EFFECT_SETTINGS} - /> - ); -} diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/Grow.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/Grow.tsx deleted file mode 100644 index b200e3c1a1..0000000000 --- a/packages/twenty-website-new/src/illustrations/ThreeCards/Grow.tsx +++ /dev/null @@ -1,366 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const GLB_URL = '/illustrations/partner/three-cards/grow.glb'; - -const halftoneVertexShader = /* glsl */ ` - varying vec3 vWorldNormal; - - void main() { - vec4 worldPosition = modelMatrix * vec4(position, 1.0); - vWorldNormal = normalize(mat3(modelMatrix) * normal); - gl_Position = projectionMatrix * viewMatrix * worldPosition; - } -`; - -const halftoneFragmentShader = /* glsl */ ` - uniform vec3 uColor; - uniform vec3 uLightDir; - uniform vec2 uResolution; - uniform float uNumRows; - - varying vec3 vWorldNormal; - - void main() { - vec3 normal = normalize(vWorldNormal); - vec3 lightDir = normalize(uLightDir); - float ndotl = max(dot(normal, lightDir), 0.0); - float lum = mix(0.35, 1.0, ndotl); - - float rowH = uResolution.y / uNumRows; - float rowFrac = gl_FragCoord.y / rowH - floor(gl_FragCoord.y / rowH); - float dy = abs(rowFrac - 0.5); - - float cellW = rowH * 2.2; - float cellFrac = (gl_FragCoord.x - floor(gl_FragCoord.x / cellW) * cellW) / cellW; - - float fill = pow(lum, 0.45) * 0.95; - - float dynamicBarHalf = mix(0.15, 0.34, smoothstep(0.05, 0.8, lum)); - - float dx2 = abs(cellFrac - 0.5); - float halfFill = fill * 0.5; - float bodyHalfW = max(halfFill - dynamicBarHalf * (rowH / cellW), 0.0); - float capR = dynamicBarHalf * rowH; - - float inDash = 0.0; - if (dx2 <= bodyHalfW) { - float edgeDist = dynamicBarHalf - dy; - inDash = smoothstep(-0.03, 0.03, edgeDist); - } else { - float cdx = (dx2 - bodyHalfW) * cellW; - float cdy = dy * rowH; - float d = sqrt(cdx * cdx + cdy * cdy); - inDash = 1.0 - smoothstep(capR - 1.5, capR + 1.5, d); - } - - if (inDash < 0.01) { - discard; - } - - gl_FragColor = vec4(uColor, inDash); - } -`; - -function createHalftoneDashMaterial( - lightDirection: THREE.Vector3, - resolution: THREE.Vector2, -) { - return new THREE.ShaderMaterial({ - uniforms: { - uColor: { value: new THREE.Color('#1e5bff') }, - uLightDir: { value: lightDirection.clone() }, - uResolution: { value: resolution.clone() }, - uNumRows: { value: 65 }, - }, - vertexShader: halftoneVertexShader, - fragmentShader: halftoneFragmentShader, - transparent: true, - depthWrite: true, - depthTest: true, - side: THREE.DoubleSide, - }); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - - const material = sceneObject.material; - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - } else { - material?.dispose(); - } - }); -} - -type MeshRestPose = { - position: THREE.Vector3; - quaternion: THREE.Quaternion; - wobblePhase: number; -}; - -function applyHalftoneDashMaterials( - modelRoot: THREE.Object3D, - lightDirection: THREE.Vector3, - resolution: THREE.Vector2, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.material = createHalftoneDashMaterial( - lightDirection, - resolution, - ); - - const mesh = sceneObject; - const rest: MeshRestPose = { - position: mesh.position.clone(), - quaternion: mesh.quaternion.clone(), - wobblePhase: mesh.position.y * 4.2 + mesh.position.x * 1.7, - }; - mesh.userData.partnerSolutionsMeshRest = rest; - }); -} - -const StyledVisualMount = styled.div` - display: block; - height: 100%; - min-width: 0; - width: 100%; -`; - -export function Grow() { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - if (!container) { - return; - } - - let cancelled = false; - let animationFrameId = 0; - - const pointer = { x: 0, y: 0, inside: false }; - const targetRotation = { x: 0, y: 0 }; - const lightDirectionWorld = new THREE.Vector3(4, 8, 6).normalize(); - - const scene = new THREE.Scene(); - const width = container.clientWidth; - const height = container.clientHeight; - - const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 100); - camera.position.set(0, 0, 5.05); - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: false }); - renderer.setPixelRatio(1); - renderer.setSize(width, height); - renderer.setClearColor(0x000000, 0); - renderer.outputColorSpace = THREE.SRGBColorSpace; - const canvas = renderer.domElement; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - canvas.style.cursor = 'pointer'; - container.appendChild(canvas); - - const pivot = new THREE.Group(); - scene.add(pivot); - - const clock = new THREE.Clock(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - GLB_URL, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const modelRoot = gltf.scene; - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - const scale = 2.75 / maxAxis; - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(scale); - - const canvasResolution = new THREE.Vector2( - renderer.domElement.width, - renderer.domElement.height, - ); - applyHalftoneDashMaterials( - modelRoot, - lightDirectionWorld, - canvasResolution, - ); - pivot.add(modelRoot); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - const delta = Math.min(clock.getDelta(), 0.1); - - const rotationDamp = 6.8; - const influence = pointer.inside ? 1 : 0.38; - targetRotation.y = pointer.x * 0.78 * influence; - targetRotation.x = pointer.y * 0.62 * influence; - - pivot.rotation.y = THREE.MathUtils.damp( - pivot.rotation.y, - targetRotation.y, - rotationDamp, - delta, - ); - pivot.rotation.x = THREE.MathUtils.damp( - pivot.rotation.x, - targetRotation.x, - rotationDamp, - delta, - ); - - const hoverLift = pointer.inside ? 1 : 0; - pivot.scale.setScalar( - THREE.MathUtils.damp(pivot.scale.x, 1 + hoverLift * 0.12, 7, delta), - ); - - const mx = pointer.x * (pointer.inside ? 1 : 0.32); - const my = pointer.y * (pointer.inside ? 1 : 0.32); - - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - const rest = sceneObject.userData.partnerSolutionsMeshRest as - | MeshRestPose - | undefined; - if (!rest) { - return; - } - - const phase = rest.wobblePhase; - const wobble = pointer.inside ? 1 : 0.36; - sceneObject.position.x = - rest.position.x + mx * 0.22 * Math.sin(phase * 1.8); - sceneObject.position.z = - rest.position.z + my * 0.19 * Math.cos(phase * 1.4); - sceneObject.position.y = - rest.position.y + (mx + my) * 0.055 * Math.sin(phase * 2.5); - - const twist = (mx * 0.34 + my * 0.24) * wobble * Math.sin(phase); - sceneObject.quaternion.copy(rest.quaternion); - sceneObject.rotateY(twist); - }); - - renderer.render(scene, camera); - }; - - renderFrame(); - }, - undefined, - undefined, - ); - - const setPointerFromEvent = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const normalizedX = ((event.clientX - rect.left) / rect.width) * 2 - 1; - const normalizedY = -(((event.clientY - rect.top) / rect.height) * 2 - 1); - pointer.x = THREE.MathUtils.clamp(normalizedX, -1, 1); - pointer.y = THREE.MathUtils.clamp(normalizedY, -1, 1); - }; - - const handlePointerEnter = () => { - pointer.inside = true; - }; - - const handlePointerLeave = () => { - pointer.inside = false; - pointer.x = 0; - pointer.y = 0; - }; - - const handlePointerMove = (event: PointerEvent) => { - setPointerFromEvent(event); - }; - - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - - const handleResize = () => { - if (!mountReference.current || cancelled) { - return; - } - - const nextWidth = mountReference.current.clientWidth; - const nextHeight = mountReference.current.clientHeight; - if (nextWidth < 1 || nextHeight < 1) { - return; - } - - camera.aspect = nextWidth / nextHeight; - camera.updateProjectionMatrix(); - renderer.setSize(nextWidth, nextHeight); - - const rw = renderer.domElement.width; - const rh = renderer.domElement.height; - pivot.traverse((sceneObject) => { - if ( - sceneObject instanceof THREE.Mesh && - sceneObject.material instanceof THREE.ShaderMaterial && - sceneObject.material.uniforms.uResolution - ) { - sceneObject.material.uniforms.uResolution.value.set(rw, rh); - } - }); - }; - - window.addEventListener('resize', handleResize); - - return () => { - cancelled = true; - window.removeEventListener('resize', handleResize); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.cancelAnimationFrame(animationFrameId); - disposeObjectSubtree(scene); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, []); - - return <StyledVisualMount aria-hidden ref={mountReference} />; -} diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/Lock.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/Lock.tsx deleted file mode 100644 index afe978bdb9..0000000000 --- a/packages/twenty-website-new/src/illustrations/ThreeCards/Lock.tsx +++ /dev/null @@ -1,1250 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const VIRTUAL_RENDER_HEIGHT = 768; -const REFERENCE_PREVIEW_DISTANCE = 4; -const MIN_FOOTPRINT_SCALE = 0.001; -const MODEL_SCALE_TARGET = 2.75; -const LOCK_MODEL_URL = '/illustrations/home/three-cards/lock.glb'; - -export type ModelHalftoneRotateAxis = - | 'x' - | 'y' - | 'z' - | 'xy' - | '-x' - | '-y' - | '-z' - | '-xy'; - -export type ModelHalftoneLightingSettings = { - ambientIntensity: number; - angleDegrees: number; - fillIntensity: number; - height: number; - intensity: number; -}; - -export type ModelHalftoneMaterialSettings = { - metalness: number; - roughness: number; -}; - -export type ModelHalftoneSettings = { - dashColor: string; - power: number; - scale: number; - width: number; -}; - -export type ModelHalftoneAnimationSettings = { - autoRotateEnabled: boolean; - autoSpeed: number; - autoWobble: number; - dragFriction: number; - dragMomentum: boolean; - dragSens: number; - followDragEnabled: boolean; - followHoverEnabled: boolean; - hoverEase: number; - hoverRange: number; - hoverReturn: boolean; - lightSweepEnabled: boolean; - lightSweepHeightRange: number; - lightSweepRange: number; - lightSweepSpeed: number; - rotateAxis: ModelHalftoneRotateAxis; - rotateEnabled: boolean; - rotatePingPong: boolean; - rotateSpeed: number; - springDamping: number; - springReturnEnabled: boolean; - springStrength: number; -}; - -export type ModelHalftoneIllustrationSettings = { - animation: ModelHalftoneAnimationSettings; - cameraDistance: number; - halftone: ModelHalftoneSettings; - lighting: ModelHalftoneLightingSettings; - material: ModelHalftoneMaterialSettings; - rotationOffsetX: number; - rotationOffsetY: number; - rotationOffsetZ: number; -}; - -const LOCK_EFFECT_SETTINGS: ModelHalftoneIllustrationSettings = { - animation: { - autoRotateEnabled: false, - autoSpeed: 0.1, - autoWobble: 0, - dragFriction: 0.08, - dragMomentum: true, - dragSens: 0.008, - followDragEnabled: true, - followHoverEnabled: true, - hoverEase: 0.08, - hoverRange: 25, - hoverReturn: true, - lightSweepEnabled: true, - lightSweepHeightRange: 0.5, - lightSweepRange: 28, - lightSweepSpeed: 0.2, - rotateAxis: 'y', - rotateEnabled: true, - rotatePingPong: false, - rotateSpeed: 0.1, - springDamping: 0.4, - springReturnEnabled: true, - springStrength: 0.06, - }, - cameraDistance: 4.27, - halftone: { - dashColor: '#4A38F5', - power: 1.11, - scale: 11.06, - width: 1.03, - }, - lighting: { - ambientIntensity: 0, - angleDegrees: 46, - fillIntensity: 0, - height: 2, - intensity: 2, - }, - material: { - metalness: 1, - roughness: 0, - }, - rotationOffsetX: 0, - rotationOffsetY: 0, - rotationOffsetZ: 0, -} as const; - -const INITIAL_POSE = { - autoElapsed: 42.43333333333221, - rotateElapsed: 89.98333333332951, - rotationX: -8.99639917695435, - rotationY: -8.99639917695435, - rotationZ: LOCK_EFFECT_SETTINGS.rotationOffsetZ, - targetRotationX: 0, - targetRotationY: 0, - timeElapsed: 851.4676000003166, -} as const; - -const passThroughVertexShader = /* glsl */ ` - varying vec2 vUv; - - void main() { - vUv = uv; - gl_Position = vec4(position, 1.0); - } -`; - -const blurFragmentShader = /* glsl */ ` - precision highp float; - - uniform sampler2D tInput; - uniform vec2 dir; - uniform vec2 res; - - varying vec2 vUv; - - void main() { - vec4 sum = vec4(0.0); - vec2 px = dir / res; - - float w[5]; - w[0] = 0.227027; - w[1] = 0.1945946; - w[2] = 0.1216216; - w[3] = 0.054054; - w[4] = 0.016216; - - sum += texture2D(tInput, vUv) * w[0]; - - for (int i = 1; i < 5; i++) { - float fi = float(i) * 3.0; - sum += texture2D(tInput, vUv + px * fi) * w[i]; - sum += texture2D(tInput, vUv - px * fi) * w[i]; - } - - gl_FragColor = sum; - } -`; - -const halftoneFragmentShader = /* glsl */ ` - precision highp float; - - uniform sampler2D tScene; - uniform sampler2D tGlow; - uniform vec2 effectResolution; - uniform vec2 logicalResolution; - uniform float tile; - uniform float s_3; - uniform float s_4; - uniform vec3 dashColor; - uniform float time; - uniform float waveAmount; - uniform float waveSpeed; - uniform float footprintScale; - uniform vec2 interactionUv; - uniform vec2 interactionVelocity; - uniform vec2 dragOffset; - uniform float hoverLightStrength; - uniform float hoverLightRadius; - uniform float hoverFlowStrength; - uniform float hoverFlowRadius; - uniform float dragFlowStrength; - uniform float cropToBounds; - - varying vec2 vUv; - - float distSegment(in vec2 p, in vec2 a, in vec2 b) { - vec2 pa = p - a; - vec2 ba = b - a; - float denom = max(dot(ba, ba), 0.000001); - float h = clamp(dot(pa, ba) / denom, 0.0, 1.0); - return length(pa - ba * h); - } - - float lineSimpleEt(in vec2 p, in float r, in float thickness) { - vec2 a = vec2(0.5) + vec2(-r, 0.0); - vec2 b = vec2(0.5) + vec2(r, 0.0); - float distToSegment = distSegment(p, a, b); - float halfThickness = thickness * r; - return distToSegment - halfThickness; - } - - void main() { - if (cropToBounds > 0.5) { - vec4 boundsCheck = texture2D(tScene, vUv); - if (boundsCheck.a < 0.01) { - gl_FragColor = vec4(0.0); - return; - } - } - - vec2 fragCoord = - (gl_FragCoord.xy / max(effectResolution, vec2(1.0))) * logicalResolution; - float halftoneSize = max(tile * max(footprintScale, 0.001), 1.0); - vec2 pointerPx = interactionUv * logicalResolution; - vec2 fragDelta = fragCoord - pointerPx; - float fragDist = length(fragDelta); - vec2 radialDir = fragDist > 0.001 ? fragDelta / fragDist : vec2(0.0, 1.0); - float velocityMagnitude = length(interactionVelocity); - vec2 motionDir = velocityMagnitude > 0.001 - ? interactionVelocity / velocityMagnitude - : vec2(0.0, 0.0); - float motionBias = velocityMagnitude > 0.001 - ? dot(-radialDir, motionDir) * 0.5 + 0.5 - : 0.5; - - float hoverLightMask = 0.0; - if (hoverLightStrength > 0.0) { - float lightRadiusPx = hoverLightRadius * logicalResolution.y; - hoverLightMask = smoothstep(lightRadiusPx, 0.0, fragDist); - } - - float hoverFlowMask = 0.0; - if (hoverFlowStrength > 0.0) { - float hoverRadiusPx = hoverFlowRadius * logicalResolution.y; - hoverFlowMask = smoothstep(hoverRadiusPx, 0.0, fragDist); - } - - vec2 hoverDisplacement = - radialDir * hoverFlowStrength * hoverFlowMask * halftoneSize * 0.55 + - motionDir * hoverFlowStrength * hoverFlowMask * (0.4 + motionBias) * halftoneSize * 1.15; - vec2 travelDisplacement = dragOffset * dragFlowStrength * 0.45; - vec2 effectCoord = fragCoord + hoverDisplacement + travelDisplacement; - - float bandRow = floor(effectCoord.y / halftoneSize); - float waveOffset = - waveAmount * sin(time * waveSpeed + bandRow * 0.5) * halftoneSize; - effectCoord.x += waveOffset; - - vec2 cellIndex = floor(effectCoord / halftoneSize); - vec2 sampleUv = clamp( - (cellIndex + 0.5) * halftoneSize / logicalResolution, - vec2(0.0), - vec2(1.0) - ); - vec2 cellUv = fract(effectCoord / halftoneSize); - - vec4 sceneSample = texture2D(tScene, sampleUv); - float mask = smoothstep(0.02, 0.08, sceneSample.a); - float lightLift = - hoverLightStrength * hoverLightMask * mix(0.78, 1.18, motionBias) * 0.22; - float bandRadius = clamp( - ( - ( - sceneSample.r + - sceneSample.g + - sceneSample.b + - s_3 * length(vec2(0.5)) - ) * - (1.0 / 3.0) - ) + lightLift, - 0.0, - 1.0 - ) * 1.86 * 0.5; - - float alpha = 0.0; - if (bandRadius > 0.0001) { - float signedDistance = lineSimpleEt(cellUv, bandRadius, s_4); - float edge = 0.02; - alpha = (1.0 - smoothstep(0.0, edge, signedDistance)) * mask; - } - - vec3 color = dashColor * alpha; - gl_FragColor = vec4(color, alpha); - - #include <tonemapping_fragment> - #include <colorspace_fragment> - } -`; - -type ViewportRect = { - height: number; - width: number; - x: number; - y: number; -}; - -type FootprintScaleScratch = { - corners: THREE.Vector3[]; - currentOffset: THREE.Vector3; - referenceCamera: THREE.PerspectiveCamera; - referenceOffset: THREE.Vector3; -}; - -type DiamondInteractionState = { - autoElapsed: number; - dragging: boolean; - mouseX: number; - mouseY: number; - pointerInside: boolean; - pointerX: number; - pointerY: number; - rotateElapsed: number; - rotationVelocityX: number; - rotationVelocityY: number; - rotationVelocityZ: number; - rotationX: number; - rotationY: number; - rotationZ: number; - targetRotationX: number; - targetRotationY: number; - velocityX: number; - velocityY: number; -}; - -function clampRectToViewport( - rect: ViewportRect, - viewportWidth: number, - viewportHeight: number, -) { - const minX = Math.max(rect.x, 0); - const minY = Math.max(rect.y, 0); - const maxX = Math.min(rect.x + rect.width, viewportWidth); - const maxY = Math.min(rect.y + rect.height, viewportHeight); - - if (maxX <= minX || maxY <= minY) { - return null; - } - - return { - height: maxY - minY, - width: maxX - minX, - x: minX, - y: minY, - }; -} - -function getRectArea(rect: ViewportRect | null) { - if (!rect) { - return 0; - } - - return Math.max(rect.width, 0) * Math.max(rect.height, 0); -} - -function createFootprintScaleScratch(): FootprintScaleScratch { - return { - corners: Array.from({ length: 8 }, () => new THREE.Vector3()), - currentOffset: new THREE.Vector3(), - referenceCamera: new THREE.PerspectiveCamera(), - referenceOffset: new THREE.Vector3(), - }; -} - -function writeBox3Corners(bounds: THREE.Box3, corners: THREE.Vector3[]) { - const { min, max } = bounds; - - corners[0].set(min.x, min.y, min.z); - corners[1].set(min.x, min.y, max.z); - corners[2].set(min.x, max.y, min.z); - corners[3].set(min.x, max.y, max.z); - corners[4].set(max.x, min.y, min.z); - corners[5].set(max.x, min.y, max.z); - corners[6].set(max.x, max.y, min.z); - corners[7].set(max.x, max.y, max.z); - - return corners; -} - -function projectBox3ToViewport({ - camera, - localBounds, - meshMatrixWorld, - scratch, - viewportHeight, - viewportWidth, -}: { - camera: THREE.PerspectiveCamera; - localBounds: THREE.Box3; - meshMatrixWorld: THREE.Matrix4; - scratch: FootprintScaleScratch; - viewportHeight: number; - viewportWidth: number; -}) { - if ( - localBounds.isEmpty() || - viewportWidth <= 0 || - viewportHeight <= 0 - ) { - return null; - } - - let minX = Number.POSITIVE_INFINITY; - let minY = Number.POSITIVE_INFINITY; - let maxX = Number.NEGATIVE_INFINITY; - let maxY = Number.NEGATIVE_INFINITY; - let hasProjectedCorner = false; - - for (const corner of writeBox3Corners(localBounds, scratch.corners)) { - corner.applyMatrix4(meshMatrixWorld).project(camera); - - if ( - !Number.isFinite(corner.x) || - !Number.isFinite(corner.y) || - !Number.isFinite(corner.z) - ) { - continue; - } - - hasProjectedCorner = true; - - const x = (corner.x * 0.5 + 0.5) * viewportWidth; - const y = (1 - (corner.y * 0.5 + 0.5)) * viewportHeight; - - minX = Math.min(minX, x); - minY = Math.min(minY, y); - maxX = Math.max(maxX, x); - maxY = Math.max(maxY, y); - } - - if (!hasProjectedCorner) { - return null; - } - - return clampRectToViewport( - { - height: maxY - minY, - width: maxX - minX, - x: minX, - y: minY, - }, - viewportWidth, - viewportHeight, - ); -} - -function getFootprintScaleFromRects( - currentRect: ViewportRect | null, - referenceRect: ViewportRect | null, -) { - const currentArea = getRectArea(currentRect); - const referenceArea = getRectArea(referenceRect); - - if (currentArea <= 0 || referenceArea <= 0) { - return 1; - } - - return Math.max( - Math.sqrt(currentArea / referenceArea), - MIN_FOOTPRINT_SCALE, - ); -} - -function getObjectFootprintScale({ - camera, - localBounds, - lookAtTarget, - meshMatrixWorld, - scratch, - viewportHeight, - viewportWidth, -}: { - camera: THREE.PerspectiveCamera; - localBounds: THREE.Box3; - lookAtTarget: THREE.Vector3; - meshMatrixWorld: THREE.Matrix4; - scratch: FootprintScaleScratch; - viewportHeight: number; - viewportWidth: number; -}) { - const currentRect = projectBox3ToViewport({ - camera, - localBounds, - meshMatrixWorld, - scratch, - viewportHeight, - viewportWidth, - }); - - const { currentOffset, referenceCamera, referenceOffset } = scratch; - - referenceCamera.copy(camera); - currentOffset.copy(referenceCamera.position).sub(lookAtTarget); - - if (currentOffset.lengthSq() > 0) { - referenceOffset.copy(currentOffset).setLength(REFERENCE_PREVIEW_DISTANCE); - } else { - referenceOffset.set(0, 0, REFERENCE_PREVIEW_DISTANCE); - } - - referenceCamera.position.copy(lookAtTarget).add(referenceOffset); - referenceCamera.lookAt(lookAtTarget); - referenceCamera.updateProjectionMatrix(); - referenceCamera.updateMatrixWorld(true); - - const referenceRect = projectBox3ToViewport({ - camera: referenceCamera, - localBounds, - meshMatrixWorld, - scratch, - viewportHeight, - viewportWidth, - }); - - return getFootprintScaleFromRects(currentRect, referenceRect); -} - -function createEnvironmentTexture(renderer: THREE.WebGLRenderer) { - const pmremGenerator = new THREE.PMREMGenerator(renderer); - const environmentTexture = pmremGenerator.fromScene( - new RoomEnvironment(), - 0.04, - ).texture; - - pmremGenerator.dispose(); - - return environmentTexture; -} - -function createRenderTarget(width: number, height: number) { - return new THREE.WebGLRenderTarget(width, height, { - format: THREE.RGBAFormat, - magFilter: THREE.LinearFilter, - minFilter: THREE.LinearFilter, - }); -} - -function disposeMaterial(material: THREE.Material | THREE.Material[]) { - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - return; - } - - material.dispose(); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - disposeMaterial(sceneObject.material); - }); -} - -function setPrimaryLightPosition( - light: THREE.DirectionalLight, - angleDegrees: number, - height: number, -) { - const lightAngle = THREE.MathUtils.degToRad(angleDegrees); - light.position.set( - Math.cos(lightAngle) * 5, - height, - Math.sin(lightAngle) * 5, - ); -} - -function normalizeModelRoot(modelRoot: THREE.Object3D) { - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(MODEL_SCALE_TARGET / maxAxis); -} - -function applyPhysicalMaterial( - modelRoot: THREE.Object3D, - environmentTexture: THREE.Texture, - materialSettings: ModelHalftoneMaterialSettings, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - disposeMaterial(sceneObject.material); - sceneObject.material = new THREE.MeshPhysicalMaterial({ - clearcoat: 0, - clearcoatRoughness: 0.08, - color: 0xd4d0c8, - envMap: environmentTexture, - envMapIntensity: 0.25, - metalness: materialSettings.metalness, - reflectivity: 0.5, - roughness: materialSettings.roughness, - transmission: 0, - }); - }); -} - -function createInteractionState( - settings: ModelHalftoneIllustrationSettings, -): DiamondInteractionState { - return { - autoElapsed: INITIAL_POSE.autoElapsed, - dragging: false, - mouseX: 0.5, - mouseY: 0.5, - pointerInside: false, - pointerX: 0, - pointerY: 0, - rotateElapsed: INITIAL_POSE.rotateElapsed, - rotationVelocityX: 0, - rotationVelocityY: 0, - rotationVelocityZ: 0, - rotationX: INITIAL_POSE.rotationX, - rotationY: INITIAL_POSE.rotationY, - rotationZ: settings.rotationOffsetZ, - targetRotationX: INITIAL_POSE.targetRotationX, - targetRotationY: INITIAL_POSE.targetRotationY, - velocityX: 0, - velocityY: 0, - }; -} - -function applySpringStep( - current: number, - target: number, - velocity: number, - strength: number, - damping: number, -) { - const nextVelocity = (velocity + (target - current) * strength) * damping; - - return { - value: current + nextVelocity, - velocity: nextVelocity, - }; -} - -const StyledVisualMount = styled.div` - display: block; - height: 100%; - min-width: 0; - width: 100%; -`; - -type ModelHalftoneIllustrationProps = { - modelUrl: string; - settings: ModelHalftoneIllustrationSettings; -}; - -export function ModelHalftoneIllustration({ - modelUrl, - settings, -}: ModelHalftoneIllustrationProps) { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - - if (!container) { - return; - } - - const getWidth = () => Math.max(container.clientWidth, 1); - const getHeight = () => Math.max(container.clientHeight, 1); - const getVirtualHeight = () => Math.max(VIRTUAL_RENDER_HEIGHT, getHeight()); - const getVirtualWidth = () => - Math.max( - Math.round(getVirtualHeight() * (getWidth() / Math.max(getHeight(), 1))), - 1, - ); - - let animationFrameId = 0; - let cancelled = false; - let modelRoot: THREE.Object3D | null = null; - let modelLocalBounds: THREE.Box3 | null = null; - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: false }); - renderer.outputColorSpace = THREE.SRGBColorSpace; - renderer.setPixelRatio(1); - renderer.setClearColor(0x000000, 0); - renderer.setSize(getVirtualWidth(), getVirtualHeight(), false); - - const canvas = renderer.domElement; - canvas.style.cursor = settings.animation.followDragEnabled - ? 'grab' - : 'default'; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - container.appendChild(canvas); - - const environmentTexture = createEnvironmentTexture(renderer); - - const scene3d = new THREE.Scene(); - scene3d.background = null; - - const camera = new THREE.PerspectiveCamera( - 45, - getWidth() / getHeight(), - 0.1, - 100, - ); - camera.position.z = settings.cameraDistance; - - const primaryLight = new THREE.DirectionalLight( - 0xffffff, - settings.lighting.intensity, - ); - setPrimaryLightPosition( - primaryLight, - settings.lighting.angleDegrees, - settings.lighting.height, - ); - scene3d.add(primaryLight); - - const fillLight = new THREE.DirectionalLight( - 0xffffff, - settings.lighting.fillIntensity, - ); - fillLight.position.set(-3, -1, 1); - scene3d.add(fillLight); - - const ambientLight = new THREE.AmbientLight( - 0xffffff, - settings.lighting.ambientIntensity, - ); - scene3d.add(ambientLight); - - const pivot = new THREE.Group(); - scene3d.add(pivot); - - const sceneTarget = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const blurTargetA = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const blurTargetB = createRenderTarget(getVirtualWidth(), getVirtualHeight()); - const fullScreenGeometry = new THREE.PlaneGeometry(2, 2); - const orthographicCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); - - const blurHorizontalMaterial = new THREE.ShaderMaterial({ - uniforms: { - dir: { value: new THREE.Vector2(1, 0) }, - res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, - tInput: { value: null }, - }, - fragmentShader: blurFragmentShader, - vertexShader: passThroughVertexShader, - }); - - const blurVerticalMaterial = new THREE.ShaderMaterial({ - uniforms: { - dir: { value: new THREE.Vector2(0, 1) }, - res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, - tInput: { value: null }, - }, - fragmentShader: blurFragmentShader, - vertexShader: passThroughVertexShader, - }); - - const halftoneMaterial = new THREE.ShaderMaterial({ - fragmentShader: halftoneFragmentShader, - transparent: true, - uniforms: { - cropToBounds: { value: 0 }, - dashColor: { value: new THREE.Color(settings.halftone.dashColor) }, - dragFlowStrength: { value: 0 }, - dragOffset: { value: new THREE.Vector2(0, 0) }, - effectResolution: { - value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), - }, - footprintScale: { value: 1 }, - hoverFlowRadius: { value: 0.18 }, - hoverFlowStrength: { value: 0 }, - hoverLightRadius: { value: 0.2 }, - hoverLightStrength: { value: 0 }, - interactionUv: { value: new THREE.Vector2(0.5, 0.5) }, - interactionVelocity: { value: new THREE.Vector2(0, 0) }, - logicalResolution: { - value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), - }, - s_3: { value: settings.halftone.power }, - s_4: { value: settings.halftone.width }, - tGlow: { value: blurTargetB.texture }, - tScene: { value: sceneTarget.texture }, - tile: { value: settings.halftone.scale }, - time: { value: 0 }, - waveAmount: { value: 0 }, - waveSpeed: { value: 1 }, - }, - vertexShader: passThroughVertexShader, - }); - - const blurHorizontalScene = new THREE.Scene(); - blurHorizontalScene.add( - new THREE.Mesh(fullScreenGeometry, blurHorizontalMaterial), - ); - - const blurVerticalScene = new THREE.Scene(); - blurVerticalScene.add(new THREE.Mesh(fullScreenGeometry, blurVerticalMaterial)); - - const postScene = new THREE.Scene(); - postScene.add(new THREE.Mesh(fullScreenGeometry, halftoneMaterial)); - - const updateViewportUniforms = ( - logicalWidth: number, - logicalHeight: number, - effectWidth: number, - effectHeight: number, - ) => { - blurHorizontalMaterial.uniforms.res.value.set(effectWidth, effectHeight); - blurVerticalMaterial.uniforms.res.value.set(effectWidth, effectHeight); - halftoneMaterial.uniforms.effectResolution.value.set( - effectWidth, - effectHeight, - ); - halftoneMaterial.uniforms.logicalResolution.value.set( - logicalWidth, - logicalHeight, - ); - }; - - const interaction = createInteractionState(settings); - const footprintScratch = createFootprintScaleScratch(); - const lookAtTarget = new THREE.Vector3(0, 0, 0); - - const syncSize = () => { - const width = getWidth(); - const height = getHeight(); - const virtualWidth = getVirtualWidth(); - const virtualHeight = getVirtualHeight(); - - renderer.setSize(virtualWidth, virtualHeight, false); - camera.aspect = width / height; - camera.updateProjectionMatrix(); - sceneTarget.setSize(virtualWidth, virtualHeight); - blurTargetA.setSize(virtualWidth, virtualHeight); - blurTargetB.setSize(virtualWidth, virtualHeight); - updateViewportUniforms( - virtualWidth, - virtualHeight, - virtualWidth, - virtualHeight, - ); - }; - - const resizeObserver = new ResizeObserver(syncSize); - resizeObserver.observe(container); - - const updatePointerPosition = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const width = Math.max(rect.width, 1); - const height = Math.max(rect.height, 1); - const localX = (event.clientX - rect.left) / width; - const localY = (event.clientY - rect.top) / height; - - interaction.pointerInside = - localX >= 0 && - localX <= 1 && - localY >= 0 && - localY <= 1; - interaction.mouseX = THREE.MathUtils.clamp(localX, 0, 1); - interaction.mouseY = THREE.MathUtils.clamp(localY, 0, 1); - }; - - const handlePointerEnter = (event: PointerEvent) => { - updatePointerPosition(event); - interaction.pointerInside = true; - }; - - const handlePointerDown = (event: PointerEvent) => { - updatePointerPosition(event); - interaction.dragging = true; - interaction.pointerX = event.clientX; - interaction.pointerY = event.clientY; - interaction.velocityX = 0; - interaction.velocityY = 0; - canvas.style.cursor = 'grabbing'; - }; - - const handlePointerMove = (event: PointerEvent) => { - updatePointerPosition(event); - }; - - const handleWindowPointerMove = (event: PointerEvent) => { - if (!interaction.dragging || !settings.animation.followDragEnabled) { - return; - } - - updatePointerPosition(event); - - const deltaX = - (event.clientX - interaction.pointerX) * settings.animation.dragSens; - const deltaY = - (event.clientY - interaction.pointerY) * settings.animation.dragSens; - interaction.velocityX = deltaY; - interaction.velocityY = deltaX; - interaction.targetRotationY += deltaX; - interaction.targetRotationX += deltaY; - interaction.pointerX = event.clientX; - interaction.pointerY = event.clientY; - }; - - const handlePointerLeave = () => { - interaction.pointerInside = false; - - if (interaction.dragging) { - return; - } - - interaction.mouseX = 0.5; - interaction.mouseY = 0.5; - }; - - const handlePointerUp = () => { - interaction.dragging = false; - canvas.style.cursor = settings.animation.followDragEnabled - ? 'grab' - : 'default'; - - if (!settings.animation.springReturnEnabled) { - return; - } - - const springImpulse = Math.max( - settings.animation.springStrength * 10, - 1.2, - ); - interaction.rotationVelocityX += interaction.velocityX * springImpulse; - interaction.rotationVelocityY += interaction.velocityY * springImpulse; - interaction.rotationVelocityZ += interaction.velocityY * springImpulse * 0.12; - interaction.targetRotationX = 0; - interaction.targetRotationY = 0; - interaction.velocityX = 0; - interaction.velocityY = 0; - }; - - const handleWindowBlur = () => { - handlePointerUp(); - handlePointerLeave(); - }; - - canvas.addEventListener('pointerdown', handlePointerDown); - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - window.addEventListener('pointermove', handleWindowPointerMove); - window.addEventListener('pointerup', handlePointerUp); - window.addEventListener('blur', handleWindowBlur); - - const clock = new THREE.Clock(); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - - const delta = clock.getDelta(); - const elapsedTime = INITIAL_POSE.timeElapsed + clock.elapsedTime; - halftoneMaterial.uniforms.time.value = elapsedTime; - halftoneMaterial.uniforms.interactionUv.value.set( - interaction.mouseX, - 1 - interaction.mouseY, - ); - halftoneMaterial.uniforms.interactionVelocity.value.set( - interaction.velocityY, - -interaction.velocityX, - ); - - let baseRotationX = settings.rotationOffsetX; - let baseRotationY = settings.rotationOffsetY; - let baseRotationZ = settings.rotationOffsetZ; - let lightAngle = settings.lighting.angleDegrees; - let lightHeight = settings.lighting.height; - - if (settings.animation.autoRotateEnabled) { - interaction.autoElapsed += delta; - baseRotationY += interaction.autoElapsed * settings.animation.autoSpeed; - baseRotationX += - Math.sin(interaction.autoElapsed * 0.2) * - settings.animation.autoWobble; - } - - if (settings.animation.rotateEnabled) { - interaction.rotateElapsed += delta; - const rotateProgress = settings.animation.rotatePingPong - ? Math.sin(interaction.rotateElapsed * settings.animation.rotateSpeed) * - Math.PI - : interaction.rotateElapsed * settings.animation.rotateSpeed; - const axisDirection = settings.animation.rotateAxis.startsWith('-') - ? -1 - : 1; - const axisProgress = rotateProgress * axisDirection; - - if (settings.animation.rotateAxis.includes('x')) { - baseRotationX += axisProgress; - } - - if (settings.animation.rotateAxis.includes('y')) { - baseRotationY += axisProgress; - } - - if (settings.animation.rotateAxis.includes('z')) { - baseRotationZ += axisProgress; - } - } - - if (settings.animation.lightSweepEnabled) { - const lightPhase = elapsedTime * settings.animation.lightSweepSpeed; - lightAngle += Math.sin(lightPhase) * settings.animation.lightSweepRange; - lightHeight += - Math.cos(lightPhase * 0.85) * - settings.animation.lightSweepHeightRange; - } - - let targetX = baseRotationX; - let targetY = baseRotationY; - let easing = 0.12; - - if (settings.animation.followHoverEnabled) { - const rangeRadians = THREE.MathUtils.degToRad( - settings.animation.hoverRange, - ); - - if ( - settings.animation.hoverReturn || - interaction.mouseX !== 0.5 || - interaction.mouseY !== 0.5 - ) { - targetX += (interaction.mouseY - 0.5) * rangeRadians; - targetY += (interaction.mouseX - 0.5) * rangeRadians; - } - - easing = settings.animation.hoverEase; - } - - if (settings.animation.followDragEnabled) { - if (!interaction.dragging && settings.animation.dragMomentum) { - interaction.targetRotationX += interaction.velocityX; - interaction.targetRotationY += interaction.velocityY; - interaction.velocityX *= 1 - settings.animation.dragFriction; - interaction.velocityY *= 1 - settings.animation.dragFriction; - } - - targetX += interaction.targetRotationX; - targetY += interaction.targetRotationY; - easing = settings.animation.dragFriction; - } - - if (settings.animation.springReturnEnabled) { - const springX = applySpringStep( - interaction.rotationX, - targetX, - interaction.rotationVelocityX, - settings.animation.springStrength, - settings.animation.springDamping, - ); - const springY = applySpringStep( - interaction.rotationY, - targetY, - interaction.rotationVelocityY, - settings.animation.springStrength, - settings.animation.springDamping, - ); - const springZ = applySpringStep( - interaction.rotationZ, - baseRotationZ, - interaction.rotationVelocityZ, - settings.animation.springStrength, - settings.animation.springDamping, - ); - - interaction.rotationX = springX.value; - interaction.rotationY = springY.value; - interaction.rotationZ = springZ.value; - interaction.rotationVelocityX = springX.velocity; - interaction.rotationVelocityY = springY.velocity; - interaction.rotationVelocityZ = springZ.velocity; - } else { - interaction.rotationX += (targetX - interaction.rotationX) * easing; - interaction.rotationY += (targetY - interaction.rotationY) * easing; - interaction.rotationZ += - (baseRotationZ - interaction.rotationZ) * - (settings.animation.rotatePingPong ? 0.18 : 0.12); - } - - pivot.rotation.set( - interaction.rotationX, - interaction.rotationY, - interaction.rotationZ, - ); - - camera.lookAt(lookAtTarget); - camera.updateMatrixWorld(true); - setPrimaryLightPosition(primaryLight, lightAngle, lightHeight); - - if (modelRoot && modelLocalBounds) { - modelRoot.updateMatrixWorld(true); - halftoneMaterial.uniforms.footprintScale.value = getObjectFootprintScale( - { - camera, - localBounds: modelLocalBounds, - lookAtTarget, - meshMatrixWorld: modelRoot.matrixWorld, - scratch: footprintScratch, - viewportHeight: getVirtualHeight(), - viewportWidth: getVirtualWidth(), - }, - ); - } - - renderer.setRenderTarget(sceneTarget); - renderer.render(scene3d, camera); - - blurHorizontalMaterial.uniforms.tInput.value = sceneTarget.texture; - renderer.setRenderTarget(blurTargetA); - renderer.render(blurHorizontalScene, orthographicCamera); - - blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; - renderer.setRenderTarget(blurTargetB); - renderer.render(blurVerticalScene, orthographicCamera); - - blurHorizontalMaterial.uniforms.tInput.value = blurTargetB.texture; - renderer.setRenderTarget(blurTargetA); - renderer.render(blurHorizontalScene, orthographicCamera); - - blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; - renderer.setRenderTarget(blurTargetB); - renderer.render(blurVerticalScene, orthographicCamera); - - renderer.setRenderTarget(null); - renderer.clear(); - renderer.render(postScene, orthographicCamera); - }; - - renderFrame(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - modelUrl, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const nextModelRoot = gltf.scene; - normalizeModelRoot(nextModelRoot); - applyPhysicalMaterial( - nextModelRoot, - environmentTexture, - settings.material, - ); - nextModelRoot.updateMatrixWorld(true); - const worldBounds = new THREE.Box3().setFromObject(nextModelRoot); - modelLocalBounds = worldBounds.applyMatrix4( - nextModelRoot.matrixWorld.clone().invert(), - ); - modelRoot = nextModelRoot; - pivot.add(nextModelRoot); - }, - undefined, - (error) => { - if (!cancelled) { - console.error(error); - } - }, - ); - - return () => { - cancelled = true; - resizeObserver.disconnect(); - canvas.removeEventListener('pointerdown', handlePointerDown); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.removeEventListener('pointermove', handleWindowPointerMove); - window.removeEventListener('pointerup', handlePointerUp); - window.removeEventListener('blur', handleWindowBlur); - window.cancelAnimationFrame(animationFrameId); - - if (modelRoot) { - disposeObjectSubtree(modelRoot); - } - - blurHorizontalMaterial.dispose(); - blurVerticalMaterial.dispose(); - halftoneMaterial.dispose(); - fullScreenGeometry.dispose(); - sceneTarget.dispose(); - blurTargetA.dispose(); - blurTargetB.dispose(); - environmentTexture.dispose(); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, [modelUrl, settings]); - - return <StyledVisualMount aria-hidden ref={mountReference} />; -} - -export function Lock() { - return ( - <ModelHalftoneIllustration - modelUrl={LOCK_MODEL_URL} - settings={LOCK_EFFECT_SETTINGS} - /> - ); -} diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/PartnerThreeCard.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/PartnerThreeCard.tsx new file mode 100644 index 0000000000..a94b426708 --- /dev/null +++ b/packages/twenty-website-new/src/illustrations/ThreeCards/PartnerThreeCard.tsx @@ -0,0 +1,2103 @@ +// @ts-nocheck +'use client'; + +import { useEffect, useRef, type CSSProperties } from 'react'; +import * as THREE from 'three'; +import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js'; +import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; +import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'; +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; + + +const DRACO_DECODER_PATH = + 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/'; + +const settings = { + "sourceMode": "shape", + "shapeKey": "userUpload_1776089370856", + "lighting": { + "intensity": 1.5, + "fillIntensity": 0.48, + "ambientIntensity": 0.3, + "angleDegrees": 53, + "height": 2 + }, + "material": { + "surface": "solid", + "color": "#d4d0c8", + "roughness": 0.42, + "metalness": 0.15, + "thickness": 150, + "refraction": 2, + "environmentPower": 5 + }, + "halftone": { + "enabled": true, + "scale": 14, + "power": 0.4, + "width": 0.5, + "imageContrast": 1, + "dashColor": "#4A38F5", + "hoverDashColor": "#4A38F5" + }, + "background": { + "transparent": true, + "color": "#000000" + }, + "animation": { + "autoRotateEnabled": true, + "breatheEnabled": false, + "cameraParallaxEnabled": false, + "followHoverEnabled": false, + "followDragEnabled": true, + "floatEnabled": false, + "hoverHalftoneEnabled": false, + "hoverLightEnabled": false, + "dragFlowEnabled": false, + "lightSweepEnabled": false, + "rotateEnabled": false, + "autoSpeed": 0.1, + "autoWobble": 0, + "breatheAmount": 0.04, + "breatheSpeed": 0.8, + "cameraParallaxAmount": 0.3, + "cameraParallaxEase": 0.08, + "driftAmount": 8, + "hoverRange": 25, + "hoverEase": 0.19, + "hoverReturn": true, + "dragSens": 0.008, + "dragFriction": 0.08, + "dragMomentum": true, + "rotateAxis": "y", + "rotatePreset": "axis", + "rotateSpeed": 0.1, + "rotatePingPong": false, + "floatAmplitude": 0.16, + "floatSpeed": 0.8, + "lightSweepHeightRange": 0.5, + "lightSweepRange": 28, + "lightSweepSpeed": 0.7, + "springDamping": 0.6, + "springReturnEnabled": true, + "springStrength": 0.06, + "hoverHalftonePowerShift": 0.42, + "hoverHalftoneRadius": 0.2, + "hoverHalftoneWidthShift": -0.18, + "hoverLightIntensity": 0.8, + "hoverLightRadius": 0.2, + "dragFlowDecay": 0.08, + "dragFlowRadius": 0.24, + "dragFlowStrength": 1.8, + "hoverWarpStrength": 3, + "hoverWarpRadius": 0.15, + "dragWarpStrength": 5, + "waveEnabled": false, + "waveSpeed": 1, + "waveAmount": 2 + } +}; +const shape = { + "filename": "partner-three-card.glb", + "key": "userUpload_1776089370856", + "kind": "imported", + "label": "partner three-card illustration", + "loader": "glb" +}; +const initialPose = { + "autoElapsed": 11.523399999928483, + "rotateElapsed": 0, + "rotationX": -4.020043134225878e-15, + "rotationY": 1.1339840023154435, + "rotationZ": 0, + "targetRotationX": 0, + "targetRotationY": 0, + "timeElapsed": 11.523399999928476 +}; +const DIAMOND_MODEL_URL = '/illustrations/home/three-cards/diamond.glb'; +const LEGACY_IMPORTED_GEOMETRY_SCALE_TARGET = 2.75; +const previewDistance = 4.5; +const VIRTUAL_RENDER_HEIGHT = 768; +const passThroughVertexShader = "\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = vec4(position, 1.0);\n }\n"; +const blurFragmentShader = "\n precision highp float;\n\n uniform sampler2D tInput;\n uniform vec2 dir;\n uniform vec2 res;\n\n varying vec2 vUv;\n\n void main() {\n vec4 sum = vec4(0.0);\n vec2 px = dir / res;\n\n float w[5];\n w[0] = 0.227027;\n w[1] = 0.1945946;\n w[2] = 0.1216216;\n w[3] = 0.054054;\n w[4] = 0.016216;\n\n sum += texture2D(tInput, vUv) * w[0];\n\n for (int i = 1; i < 5; i++) {\n float fi = float(i) * 3.0;\n sum += texture2D(tInput, vUv + px * fi) * w[i];\n sum += texture2D(tInput, vUv - px * fi) * w[i];\n }\n\n gl_FragColor = sum;\n }\n"; +const halftoneFragmentShader = "\n precision highp float;\n\n uniform sampler2D tScene;\n uniform sampler2D tGlow;\n uniform vec2 effectResolution;\n uniform vec2 logicalResolution;\n uniform float tile;\n uniform float s_3;\n uniform float s_4;\n uniform vec3 dashColor;\n uniform vec3 hoverDashColor;\n uniform float time;\n uniform float waveAmount;\n uniform float waveSpeed;\n uniform float footprintScale;\n uniform vec2 interactionUv;\n uniform vec2 interactionVelocity;\n uniform vec2 dragOffset;\n uniform float hoverHalftoneActive;\n uniform float hoverHalftonePowerShift;\n uniform float hoverHalftoneRadius;\n uniform float hoverHalftoneWidthShift;\n uniform float hoverLightStrength;\n uniform float hoverLightRadius;\n uniform float hoverFlowStrength;\n uniform float hoverFlowRadius;\n uniform float dragFlowStrength;\n uniform float cropToBounds;\n\n varying vec2 vUv;\n\n float distSegment(in vec2 p, in vec2 a, in vec2 b) {\n vec2 pa = p - a;\n vec2 ba = b - a;\n float denom = max(dot(ba, ba), 0.000001);\n float h = clamp(dot(pa, ba) / denom, 0.0, 1.0);\n return length(pa - ba * h);\n }\n\n float lineSimpleEt(in vec2 p, in float r, in float thickness) {\n vec2 a = vec2(0.5) + vec2(-r, 0.0);\n vec2 b = vec2(0.5) + vec2(r, 0.0);\n float distToSegment = distSegment(p, a, b);\n float halfThickness = thickness * r;\n return distToSegment - halfThickness;\n }\n\n void main() {\n if (cropToBounds > 0.5) {\n vec4 boundsCheck = texture2D(tScene, vUv);\n if (boundsCheck.a < 0.01) {\n gl_FragColor = vec4(0.0);\n return;\n }\n }\n\n vec2 fragCoord =\n (gl_FragCoord.xy / max(effectResolution, vec2(1.0))) * logicalResolution;\n float halftoneSize = max(tile * max(footprintScale, 0.001), 1.0);\n vec2 pointerPx = interactionUv * logicalResolution;\n vec2 fragDelta = fragCoord - pointerPx;\n float fragDist = length(fragDelta);\n vec2 radialDir = fragDist > 0.001 ? fragDelta / fragDist : vec2(0.0, 1.0);\n float velocityMagnitude = length(interactionVelocity);\n vec2 motionDir = velocityMagnitude > 0.001\n ? interactionVelocity / velocityMagnitude\n : vec2(0.0, 0.0);\n float motionBias = velocityMagnitude > 0.001\n ? dot(-radialDir, motionDir) * 0.5 + 0.5\n : 0.5;\n\n float hoverLightMask = 0.0;\n if (hoverLightStrength > 0.0) {\n float lightRadiusPx = hoverLightRadius * logicalResolution.y;\n hoverLightMask = smoothstep(lightRadiusPx, 0.0, fragDist);\n }\n\n float hoverHalftoneMask = 0.0;\n if (hoverHalftoneActive > 0.0) {\n float hoverHalftoneRadiusPx = hoverHalftoneRadius * logicalResolution.y;\n hoverHalftoneMask = smoothstep(hoverHalftoneRadiusPx, 0.0, fragDist);\n }\n\n float hoverFlowMask = 0.0;\n if (hoverFlowStrength > 0.0) {\n float hoverRadiusPx = hoverFlowRadius * logicalResolution.y;\n hoverFlowMask = smoothstep(hoverRadiusPx, 0.0, fragDist);\n }\n\n vec2 hoverDisplacement =\n radialDir * hoverFlowStrength * hoverFlowMask * halftoneSize * 0.55 +\n motionDir * hoverFlowStrength * hoverFlowMask * (0.4 + motionBias) * halftoneSize * 1.15;\n vec2 travelDisplacement = dragOffset * dragFlowStrength * 0.45;\n vec2 effectCoord = fragCoord + hoverDisplacement + travelDisplacement;\n\n float bandRow = floor(effectCoord.y / halftoneSize);\n float waveOffset =\n waveAmount * sin(time * waveSpeed + bandRow * 0.5) * halftoneSize;\n effectCoord.x += waveOffset;\n\n vec2 cellIndex = floor(effectCoord / halftoneSize);\n vec2 sampleUv = clamp(\n (cellIndex + 0.5) * halftoneSize / logicalResolution,\n vec2(0.0),\n vec2(1.0)\n );\n vec2 cellUv = fract(effectCoord / halftoneSize);\n\n vec4 sceneSample = texture2D(tScene, sampleUv);\n float mask = smoothstep(0.02, 0.08, sceneSample.a);\n float localPower = clamp(\n s_3 + hoverHalftonePowerShift * hoverHalftoneMask,\n -1.5,\n 1.5\n );\n float localWidth = clamp(\n s_4 + hoverHalftoneWidthShift * hoverHalftoneMask,\n 0.05,\n 1.4\n );\n float lightLift =\n hoverLightStrength * hoverLightMask * mix(0.78, 1.18, motionBias) * 0.22;\n float bandRadius = clamp(\n (\n (\n sceneSample.r +\n sceneSample.g +\n sceneSample.b +\n localPower * length(vec2(0.5))\n ) *\n (1.0 / 3.0)\n ) + lightLift,\n 0.0,\n 1.0\n ) * 1.86 * 0.5;\n\n float alpha = 0.0;\n if (bandRadius > 0.0001) {\n float signedDistance = lineSimpleEt(cellUv, bandRadius, localWidth);\n float edge = 0.02;\n alpha = (1.0 - smoothstep(0.0, edge, signedDistance)) * mask;\n }\n\n vec3 activeDashColor = mix(dashColor, hoverDashColor, hoverHalftoneMask);\n vec3 color = activeDashColor * alpha;\n gl_FragColor = vec4(color, alpha);\n\n #include <tonemapping_fragment>\n #include <colorspace_fragment>\n }\n"; + + + +const REFERENCE_PREVIEW_DISTANCE = 4; +const MIN_FOOTPRINT_SCALE = 0.001; + +function getModelOverrides(modelUrl) { + if (modelUrl !== DIAMOND_MODEL_URL) { + return null; + } + + return { + animation: { + autoRotateEnabled: false, + }, + importedGeometry: { + useLegacyNormalization: true, + }, + initialPose: { + ...initialPose, + autoElapsed: 42.43333333333221, + rotateElapsed: 89.98333333332951, + rotationX: -8.99639917695435, + rotationY: -8.99639917695435, + timeElapsed: 851.4676000003166, + }, + }; +} + +function clampRectToViewport(rect, viewportWidth, viewportHeight) { + const minX = Math.max(rect.x, 0); + const minY = Math.max(rect.y, 0); + const maxX = Math.min(rect.x + rect.width, viewportWidth); + const maxY = Math.min(rect.y + rect.height, viewportHeight); + + if (maxX <= minX || maxY <= minY) { + return null; + } + + return { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }; +} + +function getRectArea(rect) { + if (!rect) { + return 0; + } + + return Math.max(rect.width, 0) * Math.max(rect.height, 0); +} + +function createBox3Corners(bounds) { + const { min, max } = bounds; + + return [ + new THREE.Vector3(min.x, min.y, min.z), + new THREE.Vector3(min.x, min.y, max.z), + new THREE.Vector3(min.x, max.y, min.z), + new THREE.Vector3(min.x, max.y, max.z), + new THREE.Vector3(max.x, min.y, min.z), + new THREE.Vector3(max.x, min.y, max.z), + new THREE.Vector3(max.x, max.y, min.z), + new THREE.Vector3(max.x, max.y, max.z), + ]; +} + +function getImagePreviewZoom(previewDistance) { + return REFERENCE_PREVIEW_DISTANCE / Math.max(previewDistance, 0.001); +} + +function getContainedImageRect({ + imageHeight, + imageWidth, + viewportHeight, + viewportWidth, + zoom, +}) { + if ( + imageWidth <= 0 || + imageHeight <= 0 || + viewportWidth <= 0 || + viewportHeight <= 0 + ) { + return null; + } + + const imageAspect = imageWidth / imageHeight; + const viewAspect = viewportWidth / viewportHeight; + + let fittedWidth = viewportWidth; + let fittedHeight = viewportHeight; + + if (imageAspect > viewAspect) { + fittedHeight = viewportWidth / imageAspect; + } else { + fittedWidth = viewportHeight * imageAspect; + } + + const scaledWidth = fittedWidth * zoom; + const scaledHeight = fittedHeight * zoom; + + return clampRectToViewport( + { + x: (viewportWidth - scaledWidth) * 0.5, + y: (viewportHeight - scaledHeight) * 0.5, + width: scaledWidth, + height: scaledHeight, + }, + viewportWidth, + viewportHeight, + ); +} + +function getFootprintScaleFromRects(currentRect, referenceRect) { + const currentArea = getRectArea(currentRect); + const referenceArea = getRectArea(referenceRect); + + if (currentArea <= 0 || referenceArea <= 0) { + return 1; + } + + return Math.max( + Math.sqrt(currentArea / referenceArea), + MIN_FOOTPRINT_SCALE, + ); +} + +function getImageFootprintScale({ + imageHeight, + imageWidth, + previewDistance, + viewportHeight, + viewportWidth, +}) { + const currentRect = getContainedImageRect({ + imageHeight, + imageWidth, + viewportHeight, + viewportWidth, + zoom: getImagePreviewZoom(previewDistance), + }); + const referenceRect = getContainedImageRect({ + imageHeight, + imageWidth, + viewportHeight, + viewportWidth, + zoom: 1, + }); + + return getFootprintScaleFromRects(currentRect, referenceRect); +} + +function projectBox3ToViewport({ + camera, + localBounds, + meshMatrixWorld, + viewportHeight, + viewportWidth, +}) { + if ( + localBounds.isEmpty() || + viewportWidth <= 0 || + viewportHeight <= 0 + ) { + return null; + } + + let minX = Number.POSITIVE_INFINITY; + let minY = Number.POSITIVE_INFINITY; + let maxX = Number.NEGATIVE_INFINITY; + let maxY = Number.NEGATIVE_INFINITY; + let hasProjectedCorner = false; + + for (const corner of createBox3Corners(localBounds)) { + corner.applyMatrix4(meshMatrixWorld).project(camera); + + if ( + !Number.isFinite(corner.x) || + !Number.isFinite(corner.y) || + !Number.isFinite(corner.z) + ) { + continue; + } + + hasProjectedCorner = true; + + const x = (corner.x * 0.5 + 0.5) * viewportWidth; + const y = (1 - (corner.y * 0.5 + 0.5)) * viewportHeight; + + minX = Math.min(minX, x); + minY = Math.min(minY, y); + maxX = Math.max(maxX, x); + maxY = Math.max(maxY, y); + } + + if (!hasProjectedCorner) { + return null; + } + + return clampRectToViewport( + { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }, + viewportWidth, + viewportHeight, + ); +} + +function getMeshFootprintScale({ + camera, + localBounds, + lookAtTarget, + meshMatrixWorld, + viewportHeight, + viewportWidth, +}) { + const currentRect = projectBox3ToViewport({ + camera, + localBounds, + meshMatrixWorld, + viewportHeight, + viewportWidth, + }); + const referenceCamera = camera.clone(); + const currentOffset = referenceCamera.position.clone().sub(lookAtTarget); + const referenceOffset = + currentOffset.lengthSq() > 0 + ? currentOffset.setLength(REFERENCE_PREVIEW_DISTANCE) + : new THREE.Vector3(0, 0, REFERENCE_PREVIEW_DISTANCE); + + referenceCamera.position.copy(lookAtTarget).add(referenceOffset); + referenceCamera.lookAt(lookAtTarget); + referenceCamera.updateProjectionMatrix(); + referenceCamera.updateMatrixWorld(true); + + const referenceRect = projectBox3ToViewport({ + camera: referenceCamera, + localBounds, + meshMatrixWorld, + viewportHeight, + viewportWidth, + }); + + return getFootprintScaleFromRects(currentRect, referenceRect); +} + + + +function makePolarShape(radiusFunction, segments = 320) { + const shape = new THREE.Shape(); + + for (let segmentIndex = 0; segmentIndex <= segments; segmentIndex += 1) { + const angle = (segmentIndex / segments) * Math.PI * 2; + const radius = radiusFunction(angle); + const x = Math.cos(angle) * radius; + const y = Math.sin(angle) * radius; + + if (segmentIndex === 0) { + shape.moveTo(x, y); + } else { + shape.lineTo(x, y); + } + } + + return shape; +} + +function makeReliefGeometry(shape, options = {}) { + const { + bevelSegments = 8, + bevelSize = 0.08, + bevelThickness = 0.1, + depth = 0.58, + waveDepth = 0.016, + waves = 8, + } = options; + + const geometry = new THREE.ExtrudeGeometry(shape, { + depth, + steps: 2, + bevelEnabled: true, + bevelThickness, + bevelSize, + bevelSegments, + curveSegments: 96, + }); + + geometry.center(); + + const position = geometry.attributes.position; + let maxRadius = 0; + + for (let vertexIndex = 0; vertexIndex < position.count; vertexIndex += 1) { + maxRadius = Math.max( + maxRadius, + Math.hypot(position.getX(vertexIndex), position.getY(vertexIndex)), + ); + } + + const fullDepth = depth + bevelThickness * 2; + + for (let vertexIndex = 0; vertexIndex < position.count; vertexIndex += 1) { + const x = position.getX(vertexIndex); + const y = position.getY(vertexIndex); + const z = position.getZ(vertexIndex); + const radius = Math.hypot(x, y) / maxRadius; + const angle = Math.atan2(y, x); + const faceAmount = Math.min(1, Math.abs(z) / (fullDepth * 0.5)); + const rimLift = Math.exp(-Math.pow((radius - 0.84) / 0.12, 2)); + const innerDish = Math.exp(-Math.pow((radius - 0.42) / 0.2, 2)); + const wave = + Math.cos(angle * waves) * + Math.exp(-Math.pow((radius - 0.72) / 0.16, 2)) * + waveDepth; + const relief = faceAmount * (0.14 * rimLift - 0.055 * innerDish + wave); + + position.setZ(vertexIndex, z + (z >= 0 ? 1 : -1) * relief); + } + + position.needsUpdate = true; + geometry.computeVertexNormals(); + geometry.computeBoundingBox(); + geometry.computeBoundingSphere(); + + return geometry; +} + +function mergeGeometries(geometries) { + if (geometries.length === 1) { + return geometries[0]; + } + + let totalVertices = 0; + let totalIndices = 0; + let hasUv = false; + + const geometryInfos = geometries.map((geometry) => { + const position = geometry.attributes.position; + const normal = geometry.attributes.normal; + const uv = geometry.attributes.uv ?? null; + const index = geometry.index; + const indexCount = index ? index.count : position.count; + + totalVertices += position.count; + totalIndices += indexCount; + hasUv = hasUv || uv !== null; + + return { + index, + indexCount, + normal, + position, + uv, + vertexCount: position.count, + }; + }); + + const positions = new Float32Array(totalVertices * 3); + const normals = new Float32Array(totalVertices * 3); + const uvs = hasUv ? new Float32Array(totalVertices * 2) : null; + const indices = new Uint32Array(totalIndices); + + let vertexOffset = 0; + let indexOffset = 0; + + for (const geometryInfo of geometryInfos) { + for (let vertexIndex = 0; vertexIndex < geometryInfo.vertexCount; vertexIndex += 1) { + const positionOffset = (vertexOffset + vertexIndex) * 3; + positions[positionOffset] = geometryInfo.position.getX(vertexIndex); + positions[positionOffset + 1] = geometryInfo.position.getY(vertexIndex); + positions[positionOffset + 2] = geometryInfo.position.getZ(vertexIndex); + normals[positionOffset] = geometryInfo.normal.getX(vertexIndex); + normals[positionOffset + 1] = geometryInfo.normal.getY(vertexIndex); + normals[positionOffset + 2] = geometryInfo.normal.getZ(vertexIndex); + + if (uvs !== null) { + const uvOffset = (vertexOffset + vertexIndex) * 2; + uvs[uvOffset] = geometryInfo.uv?.getX(vertexIndex) ?? 0; + uvs[uvOffset + 1] = geometryInfo.uv?.getY(vertexIndex) ?? 0; + } + } + + if (geometryInfo.index) { + for (let localIndex = 0; localIndex < geometryInfo.indexCount; localIndex += 1) { + indices[indexOffset + localIndex] = + geometryInfo.index.getX(localIndex) + vertexOffset; + } + } else { + for (let localIndex = 0; localIndex < geometryInfo.indexCount; localIndex += 1) { + indices[indexOffset + localIndex] = localIndex + vertexOffset; + } + } + + vertexOffset += geometryInfo.vertexCount; + indexOffset += geometryInfo.indexCount; + } + + const merged = new THREE.BufferGeometry(); + merged.setAttribute('position', new THREE.BufferAttribute(positions, 3)); + merged.setAttribute('normal', new THREE.BufferAttribute(normals, 3)); + + if (uvs !== null) { + merged.setAttribute('uv', new THREE.BufferAttribute(uvs, 2)); + } + + merged.setIndex(new THREE.BufferAttribute(indices, 1)); + + return merged; +} + +function makeArrowTarget() { + const targetParts = []; + const arrowParts = []; + const baseRadius = 1.35; + const baseDepth = 0.32; + const bevel = 0.12; + const points = []; + const segments = 16; + + points.push(new THREE.Vector2(0, -baseDepth / 2)); + points.push(new THREE.Vector2(baseRadius - bevel, -baseDepth / 2)); + + for (let segmentIndex = 0; segmentIndex <= segments; segmentIndex += 1) { + const angle = Math.PI / 2 + (segmentIndex / segments) * (Math.PI / 2); + points.push( + new THREE.Vector2( + baseRadius - bevel + Math.cos(angle) * bevel, + -baseDepth / 2 + bevel + Math.sin(angle) * bevel, + ), + ); + } + + points.push(new THREE.Vector2(baseRadius, baseDepth / 2 - bevel)); + + for (let segmentIndex = 0; segmentIndex <= segments; segmentIndex += 1) { + const angle = (segmentIndex / segments) * (Math.PI / 2); + points.push( + new THREE.Vector2( + baseRadius - bevel + Math.cos(angle) * bevel, + baseDepth / 2 - bevel + Math.sin(angle) * bevel, + ), + ); + } + + points.push(new THREE.Vector2(0, baseDepth / 2)); + + const disc = new THREE.LatheGeometry(points, 64); + disc.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2)); + targetParts.push(disc); + + for (const radius of [0.45, 0.85, 1.22]) { + const ring = new THREE.TorusGeometry(radius, 0.14, 16, 64); + ring.applyMatrix4( + new THREE.Matrix4().makeTranslation(0, 0, baseDepth / 2 + 0.04), + ); + targetParts.push(ring); + } + + const bump = new THREE.SphereGeometry(0.32, 32, 24, 0, Math.PI * 2, 0, Math.PI / 2); + bump.applyMatrix4(new THREE.Matrix4().makeRotationX(-Math.PI / 2)); + bump.applyMatrix4(new THREE.Matrix4().makeTranslation(0, 0, baseDepth / 2)); + targetParts.push(bump); + + const shaftLength = 1.5; + const shaftRadius = 0.05; + const shaft = new THREE.CylinderGeometry(shaftRadius, shaftRadius, shaftLength, 10, 1); + shaft.applyMatrix4(new THREE.Matrix4().makeTranslation(0, shaftLength / 2, 0)); + arrowParts.push(shaft); + + const head = new THREE.ConeGeometry(0.12, 0.35, 10); + head.applyMatrix4(new THREE.Matrix4().makeTranslation(0, -0.15, 0)); + arrowParts.push(head); + + for (let finIndex = 0; finIndex < 3; finIndex += 1) { + const finShape = new THREE.Shape(); + finShape.moveTo(0, 0); + finShape.lineTo(0.22, 0.25); + finShape.lineTo(0, 0.5); + finShape.lineTo(0, 0); + + const finGeometry = new THREE.ExtrudeGeometry(finShape, { + depth: 0.012, + bevelEnabled: false, + }); + + finGeometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0.05, 0, -0.006)); + finGeometry.applyMatrix4( + new THREE.Matrix4().makeRotationY((finIndex * Math.PI * 2) / 3), + ); + finGeometry.applyMatrix4( + new THREE.Matrix4().makeTranslation(0, shaftLength - 0.45, 0), + ); + arrowParts.push(finGeometry); + } + + const nock = new THREE.SphereGeometry(0.065, 8, 8); + nock.applyMatrix4(new THREE.Matrix4().makeTranslation(0, shaftLength + 0.03, 0)); + arrowParts.push(nock); + + const aim = new THREE.Matrix4().makeRotationX(Math.PI / 2.15); + const tilt = new THREE.Matrix4().makeRotationZ(Math.PI / 5); + const shift = new THREE.Matrix4().makeTranslation(0.15, 0.15, 0.12); + + for (const geometry of arrowParts) { + geometry.applyMatrix4(aim); + geometry.applyMatrix4(tilt); + geometry.applyMatrix4(shift); + } + + const merged = mergeGeometries([...targetParts, ...arrowParts]); + merged.computeVertexNormals(); + merged.computeBoundingSphere(); + + return merged; +} + +function makeDollarCoin() { + const parts = []; + const baseRadius = 1.3; + const baseDepth = 0.45; + const bevel = 0.18; + const points = []; + const segments = 20; + + points.push(new THREE.Vector2(0, -baseDepth / 2)); + points.push(new THREE.Vector2(baseRadius - bevel, -baseDepth / 2)); + + for (let segmentIndex = 0; segmentIndex <= segments; segmentIndex += 1) { + const angle = -Math.PI / 2 + (segmentIndex / segments) * Math.PI; + points.push( + new THREE.Vector2( + baseRadius - bevel + Math.cos(angle) * bevel, + Math.sin(angle) * (baseDepth / 2), + ), + ); + } + + points.push(new THREE.Vector2(baseRadius - bevel, baseDepth / 2)); + points.push(new THREE.Vector2(0, baseDepth / 2)); + + const disc = new THREE.LatheGeometry(points, 64); + disc.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2)); + parts.push(disc); + + const frontRim = new THREE.TorusGeometry(baseRadius - 0.22, 0.05, 12, 64); + frontRim.applyMatrix4( + new THREE.Matrix4().makeTranslation(0, 0, baseDepth / 2 - 0.01), + ); + parts.push(frontRim); + + const backRim = new THREE.TorusGeometry(baseRadius - 0.22, 0.05, 12, 64); + backRim.applyMatrix4( + new THREE.Matrix4().makeTranslation(0, 0, -(baseDepth / 2 - 0.01)), + ); + parts.push(backRim); + + const createDollarSign = () => { + const geometries = []; + const tubeRadius = 0.1; + const curveRadius = 0.28; + const verticalOffset = 0.22; + + const bar = new THREE.CylinderGeometry(0.05, 0.05, 1.3, 12); + geometries.push(bar); + + const topArc = new THREE.TorusGeometry(curveRadius, tubeRadius, 16, 32, Math.PI); + topArc.applyMatrix4(new THREE.Matrix4().makeRotationZ(Math.PI / 2)); + topArc.applyMatrix4( + new THREE.Matrix4().makeTranslation(0.05, verticalOffset, 0), + ); + geometries.push(topArc); + + const bottomArc = new THREE.TorusGeometry(curveRadius, tubeRadius, 16, 32, Math.PI); + bottomArc.applyMatrix4(new THREE.Matrix4().makeRotationZ(-Math.PI / 2)); + bottomArc.applyMatrix4( + new THREE.Matrix4().makeTranslation(-0.05, -verticalOffset, 0), + ); + geometries.push(bottomArc); + + const topSerif = new THREE.CylinderGeometry(tubeRadius, tubeRadius, 0.22, 12); + topSerif.applyMatrix4(new THREE.Matrix4().makeRotationZ(Math.PI / 2)); + topSerif.applyMatrix4( + new THREE.Matrix4().makeTranslation(0.16, verticalOffset + curveRadius, 0), + ); + geometries.push(topSerif); + + const bottomSerif = new THREE.CylinderGeometry(tubeRadius, tubeRadius, 0.22, 12); + bottomSerif.applyMatrix4(new THREE.Matrix4().makeRotationZ(Math.PI / 2)); + bottomSerif.applyMatrix4( + new THREE.Matrix4().makeTranslation(-0.16, -verticalOffset - curveRadius, 0), + ); + geometries.push(bottomSerif); + + const diagonalLength = Math.sqrt(0.1 * 0.1 + (verticalOffset * 2) ** 2); + const diagonalAngle = Math.atan2(verticalOffset * 2, 0.1); + const diagonal = new THREE.CylinderGeometry(tubeRadius, tubeRadius, diagonalLength + 0.12, 12); + diagonal.applyMatrix4( + new THREE.Matrix4().makeRotationZ(diagonalAngle - Math.PI / 2), + ); + geometries.push(diagonal); + + return geometries; + }; + + for (const geometry of createDollarSign()) { + geometry.applyMatrix4( + new THREE.Matrix4().makeTranslation(0, 0, baseDepth / 2 + 0.01), + ); + parts.push(geometry); + } + + for (const geometry of createDollarSign()) { + geometry.applyMatrix4(new THREE.Matrix4().makeRotationY(Math.PI)); + geometry.applyMatrix4( + new THREE.Matrix4().makeTranslation(0, 0, -(baseDepth / 2 + 0.01)), + ); + parts.push(geometry); + } + + const merged = mergeGeometries(parts); + merged.computeVertexNormals(); + merged.computeBoundingSphere(); + + return merged; +} + +function createBuiltinGeometry(shapeKey) { + switch (shapeKey) { + case 'torusKnot': + return new THREE.TorusKnotGeometry(1, 0.35, 200, 32); + case 'sphere': + return new THREE.SphereGeometry(1.4, 64, 64); + case 'torus': + return new THREE.TorusGeometry(1, 0.45, 64, 100); + case 'icosahedron': + return new THREE.IcosahedronGeometry(1.4, 4); + case 'box': + return new THREE.BoxGeometry(2.1, 2.1, 2.1, 6, 6, 6); + case 'cone': + return new THREE.ConeGeometry(1.2, 2.4, 64, 10); + case 'cylinder': + return new THREE.CylinderGeometry(1, 1, 2.3, 64, 10); + case 'octahedron': + return new THREE.OctahedronGeometry(1.5, 2); + case 'dodecahedron': + return new THREE.DodecahedronGeometry(1.35, 1); + case 'tetrahedron': + return new THREE.TetrahedronGeometry(1.7, 1); + case 'sunCoin': + return makeReliefGeometry( + makePolarShape( + (angle) => 1 + 0.17 * Math.pow(0.5 + 0.5 * Math.cos(angle * 12), 1.5), + ), + { depth: 0.62, waves: 12, waveDepth: 0.018 }, + ); + case 'lotusCoin': + return makeReliefGeometry( + makePolarShape((angle) => 0.88 + 0.3 * Math.pow(Math.sin(angle * 4), 2)), + { depth: 0.64, waves: 8, waveDepth: 0.014 }, + ); + case 'arrowTarget': + return makeArrowTarget(); + case 'dollarCoin': + return makeDollarCoin(); + default: + return new THREE.TorusKnotGeometry(1, 0.35, 200, 32); + } +} + + + +const EMPTY_TEXTURE_DATA_URL = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO8B7Q8AAAAASUVORK5CYII='; + +function createLoadingManager() { + const loadingManager = new THREE.LoadingManager(); + loadingManager.setURLModifier((url) => + /\.(png|jpe?g|webp|gif|bmp)$/i.test(url) ? EMPTY_TEXTURE_DATA_URL : url, + ); + return loadingManager; +} + +function normalizeImportedGeometry( + geometry, + options = {}, +) { + const { useLegacyNormalization = false } = options; + geometry.computeBoundingBox(); + + let boundingBox = geometry.boundingBox; + let center = new THREE.Vector3(); + let size = new THREE.Vector3(); + + boundingBox?.getCenter(center); + boundingBox?.getSize(size); + geometry.translate(-center.x, -center.y, -center.z); + + if (!useLegacyNormalization) { + const dimensions = [size.x, size.y, size.z]; + const thinnestAxis = dimensions.indexOf(Math.min(...dimensions)); + + if (thinnestAxis === 0) { + geometry.applyMatrix4(new THREE.Matrix4().makeRotationY(Math.PI / 2)); + } else if (thinnestAxis === 1) { + geometry.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2)); + } + } + + geometry.computeBoundingBox(); + geometry.computeBoundingSphere(); + + const scale = useLegacyNormalization + ? LEGACY_IMPORTED_GEOMETRY_SCALE_TARGET / + Math.max(size.x, size.y, size.z, 0.001) + : 1.6 / (geometry.boundingSphere?.radius || 1); + geometry.scale(scale, scale, scale); + + geometry.computeBoundingBox(); + boundingBox = geometry.boundingBox; + center = new THREE.Vector3(); + boundingBox?.getCenter(center); + geometry.translate(-center.x, -center.y, -center.z); + + geometry.computeVertexNormals(); + geometry.computeBoundingBox(); + geometry.computeBoundingSphere(); + + return geometry; +} + +function extractMergedGeometry(root, emptyMessage, geometryOptions) { + root.updateMatrixWorld(true); + const geometries = []; + + root.traverse((object) => { + if (!(object instanceof THREE.Mesh) || !object.geometry) { + return; + } + + const geometry = object.geometry.clone(); + + if (!geometry.attributes.normal) { + geometry.computeVertexNormals(); + } + + geometry.applyMatrix4(object.matrixWorld); + geometries.push(geometry); + }); + + if (geometries.length === 0) { + throw new Error(emptyMessage); + } + + return normalizeImportedGeometry( + mergeGeometries(geometries), + geometryOptions, + ); +} + +function parseFbxGeometry(buffer, label, geometryOptions) { + const originalWarn = console.warn; + + console.warn = (...args) => { + if (typeof args[0] === 'string' && args[0].startsWith('THREE.FBXLoader:')) { + return; + } + + originalWarn(...args); + }; + + try { + const root = new FBXLoader(createLoadingManager()).parse(buffer, ''); + return extractMergedGeometry( + root, + label + ' did not contain any mesh geometry.', + geometryOptions, + ); + } finally { + console.warn = originalWarn; + } +} + +function parseGlbGeometry(buffer, label, geometryOptions) { + return new Promise((resolve, reject) => { + const loadingManager = createLoadingManager(); + const dracoLoader = new DRACOLoader(loadingManager); + dracoLoader.setDecoderPath(DRACO_DECODER_PATH); + + const loader = new GLTFLoader(loadingManager); + loader.setDRACOLoader(dracoLoader); + + const cleanup = () => { + dracoLoader.dispose(); + }; + + loader.parse( + buffer, + '', + (gltf) => { + try { + resolve( + extractMergedGeometry( + gltf.scene, + label + ' did not contain any mesh geometry.', + geometryOptions, + ), + ); + } catch (error) { + reject(error); + } finally { + cleanup(); + } + }, + (error) => { + cleanup(); + reject(error); + }, + ); + }); +} + +async function loadImportedGeometryFromUrl( + loader, + modelUrl, + label, + geometryOptions, +) { + const response = await fetch(modelUrl); + + if (!response.ok) { + throw new Error('Unable to load ' + label + ' from ' + modelUrl + '.'); + } + + const buffer = await response.arrayBuffer(); + + if (loader === 'fbx') { + return parseFbxGeometry(buffer, label, geometryOptions); + } + + return parseGlbGeometry(buffer, label, geometryOptions); +} + + + +const GLASS_ENVIRONMENT_DATA_URL = "data:image/jpeg;base64,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"; +const GLASS_THICKNESS_TO_WORLD_UNITS = 1 / 320; +const GLASS_ATTENUATION_DISTANCE_MIN = 0.12; +const GLASS_ENVIRONMENT_INTENSITY_BASE = 0.18; +const GLASS_ENVIRONMENT_INTENSITY_MULTIPLIER = 0.12; +const GLASS_ENVIRONMENT_ZOOM = 1.55; +const GLASS_TRANSMISSION_BACKGROUND = new THREE.Color(0x030303); +const MAX_TEXTURE_ANISOTROPY = 8; +const HALFTONE_TRANSMISSION_SHADER_PREFIX = "\nuniform float chromaticAberration;\nuniform float anisotropicBlur;\nuniform float time;\nuniform float distortion;\nuniform float distortionScale;\nuniform float temporalDistortion;\nuniform sampler2D buffer;\n\nvec3 random3(vec3 c) {\n float j = 4096.0 * sin(dot(c, vec3(17.0, 59.4, 15.0)));\n vec3 r;\n r.z = fract(512.0 * j);\n j *= 0.125;\n r.x = fract(512.0 * j);\n j *= 0.125;\n r.y = fract(512.0 * j);\n return r - 0.5;\n}\n\nuint hash(uint x) {\n x += (x << 10u);\n x ^= (x >> 6u);\n x += (x << 3u);\n x ^= (x >> 11u);\n x += (x << 15u);\n return x;\n}\n\nuint hash(uvec2 v) { return hash(v.x ^ hash(v.y)); }\nuint hash(uvec3 v) { return hash(v.x ^ hash(v.y) ^ hash(v.z)); }\nuint hash(uvec4 v) {\n return hash(v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w));\n}\n\nfloat floatConstruct(uint m) {\n const uint ieeeMantissa = 0x007FFFFFu;\n const uint ieeeOne = 0x3F800000u;\n m &= ieeeMantissa;\n m |= ieeeOne;\n float f = uintBitsToFloat(m);\n return f - 1.0;\n}\n\nfloat randomBase(float x) {\n return floatConstruct(hash(floatBitsToUint(x)));\n}\nfloat randomBase(vec2 v) {\n return floatConstruct(hash(floatBitsToUint(v)));\n}\nfloat randomBase(vec3 v) {\n return floatConstruct(hash(floatBitsToUint(v)));\n}\nfloat randomBase(vec4 v) {\n return floatConstruct(hash(floatBitsToUint(v)));\n}\n\nfloat rand(float seed) {\n return randomBase(vec3(gl_FragCoord.xy, seed));\n}\n\nconst float F3 = 0.3333333;\nconst float G3 = 0.1666667;\n\nfloat snoise(vec3 p) {\n vec3 s = floor(p + dot(p, vec3(F3)));\n vec3 x = p - s + dot(s, vec3(G3));\n vec3 e = step(vec3(0.0), x - x.yzx);\n vec3 i1 = e * (1.0 - e.zxy);\n vec3 i2 = 1.0 - e.zxy * (1.0 - e);\n vec3 x1 = x - i1 + G3;\n vec3 x2 = x - i2 + 2.0 * G3;\n vec3 x3 = x - 1.0 + 3.0 * G3;\n vec4 w;\n vec4 d;\n w.x = dot(x, x);\n w.y = dot(x1, x1);\n w.z = dot(x2, x2);\n w.w = dot(x3, x3);\n w = max(0.6 - w, 0.0);\n d.x = dot(random3(s), x);\n d.y = dot(random3(s + i1), x1);\n d.z = dot(random3(s + i2), x2);\n d.w = dot(random3(s + 1.0), x3);\n w *= w;\n w *= w;\n d *= w;\n return dot(d, vec4(52.0));\n}\n\nfloat snoiseFractal(vec3 m) {\n return 0.5333333 * snoise(m)\n + 0.2666667 * snoise(2.0 * m)\n + 0.1333333 * snoise(4.0 * m)\n + 0.0666667 * snoise(8.0 * m);\n}\n"; +const HALFTONE_TRANSMISSION_PARS_FRAGMENT = "\n#ifdef USE_TRANSMISSION\n uniform float _transmission;\n uniform float thickness;\n uniform float attenuationDistance;\n uniform vec3 attenuationColor;\n uniform sampler2D refractionEnvMap;\n uniform float useEnvMapRefraction;\n #ifdef USE_TRANSMISSIONMAP\n uniform sampler2D transmissionMap;\n #endif\n #ifdef USE_THICKNESSMAP\n uniform sampler2D thicknessMap;\n #endif\n uniform vec2 transmissionSamplerSize;\n uniform sampler2D transmissionSamplerMap;\n uniform mat4 modelMatrix;\n uniform mat4 projectionMatrix;\n varying vec3 vWorldPosition;\n\n vec3 getVolumeTransmissionRay(\n const in vec3 n,\n const in vec3 v,\n const in float thicknessValue,\n const in float ior,\n const in mat4 modelMatrix\n ) {\n vec3 refractionVector = refract(-v, normalize(n), 1.0 / ior);\n vec3 modelScale;\n modelScale.x = length(vec3(modelMatrix[0].xyz));\n modelScale.y = length(vec3(modelMatrix[1].xyz));\n modelScale.z = length(vec3(modelMatrix[2].xyz));\n return normalize(refractionVector) * thicknessValue * modelScale;\n }\n\n float applyIorToRoughness(\n const in float roughnessValue,\n const in float ior\n ) {\n return roughnessValue * clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n }\n\n vec2 directionToEquirectUv(const in vec3 direction) {\n vec3 dir = normalize(direction);\n vec2 uv = vec2(\n atan(dir.z, dir.x) * 0.15915494309189535 + 0.5,\n asin(clamp(dir.y, -1.0, 1.0)) * 0.3183098861837907 + 0.5\n );\n\n return vec2(fract(uv.x), 1.0 - clamp(uv.y, 0.0, 1.0));\n }\n\n vec4 getTransmissionSample(\n const in vec2 fragCoord,\n const in vec3 transmissionDirection,\n const in float roughnessValue,\n const in float ior\n ) {\n if (useEnvMapRefraction > 0.5) {\n return texture2D(\n refractionEnvMap,\n directionToEquirectUv(transmissionDirection)\n );\n }\n\n float framebufferLod =\n log2(transmissionSamplerSize.x) *\n applyIorToRoughness(roughnessValue, ior);\n return texture2D(buffer, fragCoord.xy);\n }\n\n vec3 applyVolumeAttenuation(\n const in vec3 radiance,\n const in float transmissionDistance,\n const in vec3 attenuationColorValue,\n const in float attenuationDistanceValue\n ) {\n if (isinf(attenuationDistanceValue)) {\n return radiance;\n }\n\n vec3 attenuationCoefficient =\n -log(attenuationColorValue) / attenuationDistanceValue;\n vec3 transmittance =\n exp(-attenuationCoefficient * transmissionDistance);\n\n return transmittance * radiance;\n }\n\n vec4 getIBLVolumeRefraction(\n const in vec3 n,\n const in vec3 v,\n const in float roughnessValue,\n const in vec3 diffuseColor,\n const in vec3 specularColor,\n const in float specularF90,\n const in vec3 position,\n const in mat4 modelMatrix,\n const in mat4 viewMatrix,\n const in mat4 projMatrix,\n const in float ior,\n const in float thicknessValue,\n const in vec3 attenuationColorValue,\n const in float attenuationDistanceValue\n ) {\n vec3 transmissionRay = getVolumeTransmissionRay(\n n,\n v,\n thicknessValue,\n ior,\n modelMatrix\n );\n vec3 refractedRayExit = position + transmissionRay;\n vec4 ndcPos =\n projMatrix * viewMatrix * vec4(refractedRayExit, 1.0);\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n vec3 transmissionDirection = normalize(transmissionRay);\n vec4 transmittedLight = getTransmissionSample(\n refractionCoords,\n transmissionDirection,\n roughnessValue,\n ior\n );\n vec3 attenuatedColor = applyVolumeAttenuation(\n transmittedLight.rgb,\n length(transmissionRay),\n attenuationColorValue,\n attenuationDistanceValue\n );\n vec3 F = EnvironmentBRDF(\n n,\n v,\n specularColor,\n specularF90,\n roughnessValue\n );\n return vec4(\n (1.0 - F) * attenuatedColor * diffuseColor,\n transmittedLight.a\n );\n }\n#endif\n"; +const HALFTONE_TRANSMISSION_FRAGMENT_TEMPLATE = "\nmaterial.transmission = _transmission;\nmaterial.transmissionAlpha = 1.0;\nmaterial.thickness = thickness;\nmaterial.attenuationDistance = attenuationDistance;\nmaterial.attenuationColor = attenuationColor;\n#ifdef USE_TRANSMISSIONMAP\n material.transmission *= texture2D(transmissionMap, vUv).r;\n#endif\n#ifdef USE_THICKNESSMAP\n material.thickness *= texture2D(thicknessMap, vUv).g;\n#endif\n\nvec3 pos = vWorldPosition;\nfloat runningSeed = 0.0;\nvec3 v = normalize(cameraPosition - pos);\nvec3 n = inverseTransformDirection(normal, viewMatrix);\nvec3 transmission = vec3(0.0);\nfloat transmissionR;\nfloat transmissionG;\nfloat transmissionB;\nfloat randomCoords = rand(runningSeed++);\nfloat thicknessSmear =\n thickness * max(pow(roughnessFactor, 0.33), anisotropicBlur);\nvec3 distortionNormal = vec3(0.0);\nvec3 temporalOffset = vec3(time, -time, -time) * temporalDistortion;\n\nif (distortion > 0.0) {\n distortionNormal = distortion * vec3(\n snoiseFractal(vec3(pos * distortionScale + temporalOffset)),\n snoiseFractal(vec3(pos.zxy * distortionScale - temporalOffset)),\n snoiseFractal(vec3(pos.yxz * distortionScale + temporalOffset))\n );\n}\n\nfor (float i = 0.0; i < __SAMPLES__.0; i++) {\n vec3 sampleNorm = normalize(\n n +\n roughnessFactor * roughnessFactor * 2.0 *\n normalize(\n vec3(\n rand(runningSeed++) - 0.5,\n rand(runningSeed++) - 0.5,\n rand(runningSeed++) - 0.5\n )\n ) *\n pow(rand(runningSeed++), 0.33) +\n distortionNormal\n );\n\n transmissionR = getIBLVolumeRefraction(\n sampleNorm,\n v,\n material.roughness,\n material.diffuseColor,\n material.specularColor,\n material.specularF90,\n pos,\n modelMatrix,\n viewMatrix,\n projectionMatrix,\n material.ior,\n material.thickness + thicknessSmear * (i + randomCoords) / float(__SAMPLES__),\n material.attenuationColor,\n material.attenuationDistance\n ).r;\n\n transmissionG = getIBLVolumeRefraction(\n sampleNorm,\n v,\n material.roughness,\n material.diffuseColor,\n material.specularColor,\n material.specularF90,\n pos,\n modelMatrix,\n viewMatrix,\n projectionMatrix,\n material.ior * (1.0 + chromaticAberration * (i + randomCoords) / float(__SAMPLES__)),\n material.thickness + thicknessSmear * (i + randomCoords) / float(__SAMPLES__),\n material.attenuationColor,\n material.attenuationDistance\n ).g;\n\n transmissionB = getIBLVolumeRefraction(\n sampleNorm,\n v,\n material.roughness,\n material.diffuseColor,\n material.specularColor,\n material.specularF90,\n pos,\n modelMatrix,\n viewMatrix,\n projectionMatrix,\n material.ior * (1.0 + 2.0 * chromaticAberration * (i + randomCoords) / float(__SAMPLES__)),\n material.thickness + thicknessSmear * (i + randomCoords) / float(__SAMPLES__),\n material.attenuationColor,\n material.attenuationDistance\n ).b;\n\n transmission.r += transmissionR;\n transmission.g += transmissionG;\n transmission.b += transmissionB;\n}\n\ntransmission /= __SAMPLES__.0;\ntotalDiffuse = mix(totalDiffuse, transmission.rgb, material.transmission);\n"; + +class HalftoneTransmissionMaterial extends THREE.MeshPhysicalMaterial { + constructor(samples = 10) { + super(); + + this.halftoneUniforms = { + chromaticAberration: { value: 0.05 }, + transmission: { value: 0 }, + _transmission: { value: 1 }, + transmissionMap: { value: null }, + refractionEnvMap: { value: null }, + useEnvMapRefraction: { value: 0 }, + roughness: { value: 0 }, + thickness: { value: 0 }, + thicknessMap: { value: null }, + attenuationDistance: { value: Infinity }, + attenuationColor: { value: new THREE.Color('white') }, + anisotropicBlur: { value: 0.1 }, + time: { value: 0 }, + distortion: { value: 0 }, + distortionScale: { value: 0.5 }, + temporalDistortion: { value: 0 }, + buffer: { value: null }, + }; + + this.customProgramCacheKey = () => 'halftone-transmission-' + samples; + + this.onBeforeCompile = (shader) => { + shader.uniforms = { + ...shader.uniforms, + ...this.halftoneUniforms, + }; + shader.defines ??= {}; + + if (this.anisotropy > 0) { + shader.defines.USE_ANISOTROPY = ''; + } + + shader.defines.USE_TRANSMISSION = ''; + shader.fragmentShader = + HALFTONE_TRANSMISSION_SHADER_PREFIX + shader.fragmentShader; + shader.fragmentShader = shader.fragmentShader.replace( + '#include <transmission_pars_fragment>', + HALFTONE_TRANSMISSION_PARS_FRAGMENT, + ); + shader.fragmentShader = shader.fragmentShader.replace( + '#include <transmission_fragment>', + HALFTONE_TRANSMISSION_FRAGMENT_TEMPLATE.replaceAll( + '__SAMPLES__', + String(samples), + ), + ); + }; + + Object.keys(this.halftoneUniforms).forEach((key) => { + Object.defineProperty(this, key, { + configurable: true, + enumerable: true, + get: () => this.halftoneUniforms[key]?.value, + set: (value) => { + this.halftoneUniforms[key].value = value; + }, + }); + }); + } +} + +function setTextureSampling(texture, renderer) { + texture.generateMipmaps = true; + texture.magFilter = THREE.LinearFilter; + texture.minFilter = THREE.LinearMipmapLinearFilter; + texture.anisotropy = Math.min( + renderer.capabilities.getMaxAnisotropy(), + MAX_TEXTURE_ANISOTROPY, + ); +} + +function disposeEnvironmentScene(scene) { + scene.traverse((object) => { + if (object.geometry) { + object.geometry.dispose(); + } + + if (Array.isArray(object.material)) { + object.material.forEach((material) => material.dispose()); + return; + } + + object.material?.dispose?.(); + }); +} + +function createSolidEnvironmentTexture(renderer) { + const pmremGenerator = new THREE.PMREMGenerator(renderer); + const environmentTexture = pmremGenerator.fromScene( + new RoomEnvironment(), + 0.04, + ).texture; + pmremGenerator.dispose(); + + return environmentTexture; +} + +function getTextureImageSize(texture) { + const image = texture.image; + + return { + height: + image?.naturalHeight ?? image?.videoHeight ?? image?.height ?? undefined, + width: + image?.naturalWidth ?? image?.videoWidth ?? image?.width ?? undefined, + }; +} + +function createZoomedGlassTexture(sourceTexture, renderer, zoom) { + if (zoom <= 1) { + return sourceTexture; + } + + const { width, height } = getTextureImageSize(sourceTexture); + + if (!width || !height) { + return sourceTexture; + } + + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext('2d'); + + if (!context) { + return sourceTexture; + } + + const cropWidth = width / zoom; + const cropHeight = height / zoom; + const sourceX = (width - cropWidth) / 2; + const sourceY = (height - cropHeight) / 2; + + context.drawImage( + sourceTexture.image, + sourceX, + sourceY, + cropWidth, + cropHeight, + 0, + 0, + width, + height, + ); + + const zoomedTexture = new THREE.CanvasTexture(canvas); + zoomedTexture.colorSpace = sourceTexture.colorSpace; + zoomedTexture.wrapS = THREE.ClampToEdgeWrapping; + zoomedTexture.wrapT = THREE.ClampToEdgeWrapping; + setTextureSampling(zoomedTexture, renderer); + zoomedTexture.needsUpdate = true; + + return zoomedTexture; +} + +function createStudioGlassEnvironmentTexture(renderer, backdropTexture) { + const pmremGenerator = new THREE.PMREMGenerator(renderer); + const environmentTexture = backdropTexture + ? pmremGenerator.fromEquirectangular(backdropTexture).texture + : pmremGenerator.fromScene(new RoomEnvironment(), 0.04).texture; + pmremGenerator.dispose(); + + return environmentTexture; +} + +function createFallbackGlassBackdropTexture(renderer) { + const texture = new THREE.DataTexture( + new Uint8Array([3, 3, 3, 255]), + 1, + 1, + THREE.RGBAFormat, + ); + texture.colorSpace = THREE.SRGBColorSpace; + texture.wrapS = THREE.ClampToEdgeWrapping; + texture.wrapT = THREE.ClampToEdgeWrapping; + texture.mapping = THREE.EquirectangularReflectionMapping; + setTextureSampling(texture, renderer); + texture.needsUpdate = true; + + return texture; +} + +function loadTexture(url, renderer, colorSpace) { + const loader = new THREE.TextureLoader(); + + return new Promise((resolve, reject) => { + loader.load( + url, + (texture) => { + texture.colorSpace = colorSpace; + setTextureSampling(texture, renderer); + resolve(texture); + }, + undefined, + reject, + ); + }); +} + +async function loadGlassEnvironmentTexture(renderer) { + const sourceBackgroundTexture = await loadTexture( + GLASS_ENVIRONMENT_DATA_URL, + renderer, + THREE.SRGBColorSpace, + ); + const backgroundTexture = createZoomedGlassTexture( + sourceBackgroundTexture, + renderer, + GLASS_ENVIRONMENT_ZOOM, + ); + if (backgroundTexture !== sourceBackgroundTexture) { + sourceBackgroundTexture.dispose(); + } + backgroundTexture.mapping = THREE.EquirectangularReflectionMapping; + backgroundTexture.wrapS = THREE.ClampToEdgeWrapping; + backgroundTexture.wrapT = THREE.ClampToEdgeWrapping; + backgroundTexture.needsUpdate = true; + const environmentTexture = createStudioGlassEnvironmentTexture( + renderer, + backgroundTexture, + ); + + return { + backgroundTexture, + environmentTexture, + }; +} + +async function createHalftoneMaterialAssets(renderer) { + const solidEnvironmentTexture = createSolidEnvironmentTexture(renderer); + + try { + const glassEnvironmentAssets = await loadGlassEnvironmentTexture(renderer); + + return { + glassBackgroundTexture: glassEnvironmentAssets.backgroundTexture, + glassEnvironmentTexture: glassEnvironmentAssets.environmentTexture, + solidEnvironmentTexture, + }; + } catch { + const fallbackGlassBackdropTexture = + createFallbackGlassBackdropTexture(renderer); + const fallbackGlassEnvironmentTexture = + createStudioGlassEnvironmentTexture(renderer); + + return { + glassBackgroundTexture: fallbackGlassBackdropTexture, + glassEnvironmentTexture: fallbackGlassEnvironmentTexture, + solidEnvironmentTexture, + }; + } +} + +function createHalftoneMaterial() { + return new HalftoneTransmissionMaterial(); +} + +function applyHalftoneMaterialSettings(material, materialSettings, materialAssets) { + const isGlass = materialSettings.surface === 'glass'; + const glassThickness = + materialSettings.thickness * GLASS_THICKNESS_TO_WORLD_UNITS; + const glassEnvironmentIntensity = + GLASS_ENVIRONMENT_INTENSITY_BASE + + materialSettings.environmentPower * GLASS_ENVIRONMENT_INTENSITY_MULTIPLIER; + const glassAttenuationDistance = Math.max( + glassThickness * 4, + GLASS_ATTENUATION_DISTANCE_MIN, + ); + + material.color.set(isGlass ? '#ffffff' : materialSettings.color); + material.roughness = materialSettings.roughness; + material.metalness = materialSettings.metalness; + material.envMap = isGlass + ? materialAssets.glassEnvironmentTexture + : materialAssets.solidEnvironmentTexture; + material.envMapIntensity = isGlass + ? GLASS_ENVIRONMENT_INTENSITY_BASE + + materialSettings.environmentPower * GLASS_ENVIRONMENT_INTENSITY_MULTIPLIER + : 0.25; + material.clearcoat = isGlass ? 1 : 0; + material.clearcoatRoughness = isGlass + ? Math.max(materialSettings.roughness * 0.25, 0.01) + : 0.08; + material.reflectivity = isGlass ? 0.98 : 0.5; + material.transmission = 0; + material._transmission = isGlass ? 1 : 0; + material.refractionEnvMap = isGlass ? materialAssets.glassBackgroundTexture : null; + material.useEnvMapRefraction = isGlass ? 1 : 0; + material.thickness = isGlass ? glassThickness : 0; + material.ior = isGlass ? materialSettings.refraction : 1.5; + material.buffer = null; + material.bumpMap = null; + material.bumpScale = 0; + material.roughnessMap = null; + material.side = THREE.FrontSide; + material.transparent = false; + material.opacity = 1; + material.depthWrite = true; + material.attenuationColor.set(isGlass ? materialSettings.color : 'white'); + material.attenuationDistance = isGlass + ? glassAttenuationDistance + : Infinity; + material.anisotropicBlur = isGlass + ? THREE.MathUtils.lerp(0.03, 0.12, materialSettings.roughness) + : 0.1; + material.chromaticAberration = isGlass ? 0 : 0.05; + material.distortion = 0; + material.distortionScale = 0.5; + material.temporalDistortion = 0; + material.userData.halftoneIsGlass = isGlass; + material.userData.halftoneGlassBacksideThickness = isGlass + ? glassThickness * 2 + : 0; + material.userData.halftoneGlassBacksideEnvIntensity = isGlass + ? glassEnvironmentIntensity * 2.8 + : 0; + material.userData.halftoneUseEnvironmentRefraction = isGlass; + material.envMapIntensity = isGlass ? glassEnvironmentIntensity : 0.25; + + material.needsUpdate = true; +} + +function disposeHalftoneMaterialAssets(materialAssets) { + materialAssets.glassBackgroundTexture.dispose(); + + if (materialAssets.glassEnvironmentTexture !== materialAssets.glassBackgroundTexture) { + materialAssets.glassEnvironmentTexture.dispose(); + } + + materialAssets.solidEnvironmentTexture.dispose(); +} + + +function createRenderTarget(width, height) { + return new THREE.WebGLRenderTarget(width, height, { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + }); +} + +function createInteractionState(initialPoseConfig = initialPose) { + return { + autoElapsed: initialPoseConfig.autoElapsed, + activePointerId: null, + dragging: false, + mouseX: 0.5, + mouseY: 0.5, + pointerInside: false, + pointerVelocityX: 0, + pointerVelocityY: 0, + pointerX: 0, + pointerY: 0, + rotateElapsed: initialPoseConfig.rotateElapsed, + rotationX: initialPoseConfig.rotationX, + rotationVelocityX: 0, + rotationY: initialPoseConfig.rotationY, + rotationVelocityY: 0, + rotationZ: initialPoseConfig.rotationZ, + rotationVelocityZ: 0, + smoothedMouseX: 0.5, + smoothedMouseY: 0.5, + targetRotationX: initialPoseConfig.targetRotationX, + targetRotationY: initialPoseConfig.targetRotationY, + velocityX: 0, + velocityY: 0, + }; +} + + +function setPrimaryLightPosition(light, angleDegrees, height) { + const lightAngle = (angleDegrees * Math.PI) / 180; + light.position.set(Math.cos(lightAngle) * 5, height, Math.sin(lightAngle) * 5); +} + +function applySpringStep(current, target, velocity, strength, damping) { + const nextVelocity = (velocity + (target - current) * strength) * damping; + const nextValue = current + nextVelocity; + + return { + value: nextValue, + velocity: nextVelocity, + }; +} + +function resetInteractionState(interactionState) { + interactionState.dragging = false; + interactionState.mouseX = 0.5; + interactionState.mouseY = 0.5; + interactionState.targetRotationX = 0; + interactionState.targetRotationY = 0; + interactionState.velocityX = 0; + interactionState.velocityY = 0; + interactionState.rotationVelocityX = 0; + interactionState.rotationVelocityY = 0; + interactionState.rotationVelocityZ = 0; + interactionState.autoElapsed = 0; +} + +async function createGeometry(modelUrl, geometryOptions) { + if (shape.kind === 'imported' && shape.loader && modelUrl) { + return loadImportedGeometryFromUrl( + shape.loader, + modelUrl, + modelUrl.split('/').pop() ?? shape.label, + geometryOptions, + ); + } + + return createBuiltinGeometry(shape.key); +} + + + + +async function mountHalftoneCanvas(options) { + const { + animationOverrides, + container, + initialRotationX, + initialRotationY, + initialRotationZ, + modelUrl, + onError, + } = options; + const modelOverrides = getModelOverrides(modelUrl); + const resolvedAnimation = { + ...settings.animation, + ...modelOverrides?.animation, + ...animationOverrides, + }; + const resolvedInitialPose = { + ...initialPose, + ...modelOverrides?.initialPose, + rotationX: + initialRotationX ?? + modelOverrides?.initialPose?.rotationX ?? + initialPose.rotationX, + rotationY: + initialRotationY ?? + modelOverrides?.initialPose?.rotationY ?? + initialPose.rotationY, + rotationZ: + initialRotationZ ?? + modelOverrides?.initialPose?.rotationZ ?? + initialPose.rotationZ, + }; + + const getWidth = () => Math.max(container.clientWidth, 1); + const getHeight = () => Math.max(container.clientHeight, 1); + const getVirtualHeight = () => Math.max(VIRTUAL_RENDER_HEIGHT, getHeight()); + const getVirtualWidth = () => + Math.max( + Math.round(getVirtualHeight() * (getWidth() / Math.max(getHeight(), 1))), + 1, + ); + + let geometry; + + try { + geometry = await createGeometry( + modelUrl, + modelOverrides?.importedGeometry, + ); + } catch (error) { + onError?.(error); + geometry = createBuiltinGeometry('torusKnot'); + } + + const renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true }); + renderer.outputColorSpace = THREE.SRGBColorSpace; + renderer.setPixelRatio(1); + renderer.setClearColor(0x000000, 0); + renderer.setSize(getVirtualWidth(), getVirtualHeight(), false); + + const canvas = renderer.domElement; + canvas.style.cursor = resolvedAnimation.followDragEnabled ? 'grab' : 'default'; + canvas.style.display = 'block'; + canvas.style.height = '100%'; + canvas.style.touchAction = 'none'; + canvas.style.width = '100%'; + container.appendChild(canvas); + + const materialAssets = await createHalftoneMaterialAssets(renderer); + + const scene3d = new THREE.Scene(); + scene3d.background = null; + + const baseCameraDistance = previewDistance; + const camera = new THREE.PerspectiveCamera(45, getWidth() / getHeight(), 0.1, 100); + camera.position.z = baseCameraDistance; + + const primaryLight = new THREE.DirectionalLight(0xffffff, settings.lighting.intensity); + setPrimaryLightPosition( + primaryLight, + settings.lighting.angleDegrees, + settings.lighting.height, + ); + scene3d.add(primaryLight); + + const fillLight = new THREE.DirectionalLight( + 0xffffff, + settings.lighting.fillIntensity, + ); + fillLight.position.set(-3, -1, 1); + scene3d.add(fillLight); + + const ambientLight = new THREE.AmbientLight( + 0xffffff, + settings.lighting.ambientIntensity, + ); + scene3d.add(ambientLight); + + const material = createHalftoneMaterial(); + applyHalftoneMaterialSettings(material, settings.material, materialAssets); + + const mesh = new THREE.Mesh(geometry, material); + scene3d.add(mesh); + + const sceneTarget = createRenderTarget(getVirtualWidth(), getVirtualHeight()); + const blurTargetA = createRenderTarget(getVirtualWidth(), getVirtualHeight()); + const blurTargetB = createRenderTarget(getVirtualWidth(), getVirtualHeight()); + const fullScreenGeometry = new THREE.PlaneGeometry(2, 2); + const orthographicCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); + + const blurHorizontalMaterial = new THREE.ShaderMaterial({ + uniforms: { + tInput: { value: null }, + dir: { value: new THREE.Vector2(1, 0) }, + res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, + }, + vertexShader: passThroughVertexShader, + fragmentShader: blurFragmentShader, + }); + + const blurVerticalMaterial = new THREE.ShaderMaterial({ + uniforms: { + tInput: { value: null }, + dir: { value: new THREE.Vector2(0, 1) }, + res: { value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()) }, + }, + vertexShader: passThroughVertexShader, + fragmentShader: blurFragmentShader, + }); + + const halftoneMaterial = new THREE.ShaderMaterial({ + transparent: true, + uniforms: { + tScene: { value: sceneTarget.texture }, + tGlow: { value: blurTargetB.texture }, + effectResolution: { + value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), + }, + logicalResolution: { + value: new THREE.Vector2(getVirtualWidth(), getVirtualHeight()), + }, + tile: { value: settings.halftone.scale }, + s_3: { value: settings.halftone.power }, + s_4: { value: settings.halftone.width }, + dashColor: { value: new THREE.Color(settings.halftone.dashColor) }, + hoverDashColor: { + value: new THREE.Color(settings.halftone.hoverDashColor), + }, + time: { value: 0 }, + waveAmount: { value: 0 }, + waveSpeed: { value: 1 }, + footprintScale: { value: 1.0 }, + interactionUv: { value: new THREE.Vector2(0.5, 0.5) }, + interactionVelocity: { value: new THREE.Vector2(0, 0) }, + dragOffset: { value: new THREE.Vector2(0, 0) }, + hoverHalftoneActive: { value: 0 }, + hoverHalftonePowerShift: { value: 0 }, + hoverHalftoneRadius: { value: 0.2 }, + hoverHalftoneWidthShift: { value: 0 }, + hoverLightStrength: { value: 0 }, + hoverLightRadius: { value: 0.2 }, + hoverFlowStrength: { value: 0 }, + hoverFlowRadius: { value: 0.18 }, + dragFlowStrength: { value: 0 }, + cropToBounds: { value: 0 }, + }, + vertexShader: passThroughVertexShader, + fragmentShader: halftoneFragmentShader, + }); + + const blurHorizontalScene = new THREE.Scene(); + blurHorizontalScene.add( + new THREE.Mesh(fullScreenGeometry, blurHorizontalMaterial), + ); + + const blurVerticalScene = new THREE.Scene(); + blurVerticalScene.add(new THREE.Mesh(fullScreenGeometry, blurVerticalMaterial)); + + const postScene = new THREE.Scene(); + postScene.add(new THREE.Mesh(fullScreenGeometry, halftoneMaterial)); + + const updateViewportUniforms = ( + logicalWidth, + logicalHeight, + effectWidth, + effectHeight, + ) => { + blurHorizontalMaterial.uniforms.res.value.set(effectWidth, effectHeight); + blurVerticalMaterial.uniforms.res.value.set(effectWidth, effectHeight); + halftoneMaterial.uniforms.effectResolution.value.set( + effectWidth, + effectHeight, + ); + halftoneMaterial.uniforms.logicalResolution.value.set( + logicalWidth, + logicalHeight, + ); + }; + + const getHalftoneScale = (viewportWidth, viewportHeight, lookAtTarget) => { + if (!mesh.geometry.boundingBox) { + mesh.geometry.computeBoundingBox(); + } + + if (!mesh.geometry.boundingBox) { + return 1; + } + + mesh.updateMatrixWorld(); + camera.updateMatrixWorld(); + + return getMeshFootprintScale({ + camera, + localBounds: mesh.geometry.boundingBox, + lookAtTarget, + meshMatrixWorld: mesh.matrixWorld, + viewportHeight, + viewportWidth, + }); + }; + + const interaction = createInteractionState(resolvedInitialPose); + const autoRotateEnabled = resolvedAnimation.autoRotateEnabled; + const followHoverEnabled = resolvedAnimation.followHoverEnabled; + const followDragEnabled = resolvedAnimation.followDragEnabled; + const rotateEnabled = resolvedAnimation.rotateEnabled; + + const syncSize = () => { + const width = getWidth(); + const height = getHeight(); + const virtualWidth = getVirtualWidth(); + const virtualHeight = getVirtualHeight(); + + renderer.setSize(virtualWidth, virtualHeight, false); + camera.aspect = width / height; + camera.updateProjectionMatrix(); + sceneTarget.setSize(virtualWidth, virtualHeight); + blurTargetA.setSize(virtualWidth, virtualHeight); + blurTargetB.setSize(virtualWidth, virtualHeight); + updateViewportUniforms( + virtualWidth, + virtualHeight, + virtualWidth, + virtualHeight, + ); + }; + + const resizeObserver = new ResizeObserver(syncSize); + resizeObserver.observe(container); + + const updatePointerPosition = (event) => { + const rect = canvas.getBoundingClientRect(); + const width = Math.max(rect.width, 1); + const height = Math.max(rect.height, 1); + + interaction.mouseX = THREE.MathUtils.clamp( + (event.clientX - rect.left) / width, + 0, + 1, + ); + interaction.mouseY = THREE.MathUtils.clamp( + (event.clientY - rect.top) / height, + 0, + 1, + ); + }; + + const handlePointerDown = (event) => { + updatePointerPosition(event); + if (!followDragEnabled) { + return; + } + + interaction.dragging = true; + interaction.pointerX = event.clientX; + interaction.pointerY = event.clientY; + interaction.velocityX = 0; + interaction.velocityY = 0; + canvas.style.cursor = 'grabbing'; + }; + + const handlePointerMove = (event) => { + updatePointerPosition(event); + }; + + const handleWindowPointerMove = (event) => { + updatePointerPosition(event); + + if (!interaction.dragging || !followDragEnabled) { + return; + } + + const deltaX = (event.clientX - interaction.pointerX) * resolvedAnimation.dragSens; + const deltaY = (event.clientY - interaction.pointerY) * resolvedAnimation.dragSens; + interaction.velocityX = deltaY; + interaction.velocityY = deltaX; + interaction.targetRotationY += deltaX; + interaction.targetRotationX += deltaY; + interaction.pointerX = event.clientX; + interaction.pointerY = event.clientY; + }; + + const handlePointerLeave = () => { + if (interaction.dragging) { + return; + } + + interaction.mouseX = 0.5; + interaction.mouseY = 0.5; + }; + + const handlePointerUp = () => { + interaction.dragging = false; + canvas.style.cursor = followDragEnabled ? 'grab' : 'default'; + + if (!resolvedAnimation.springReturnEnabled) { + return; + } + + const springImpulse = Math.max(resolvedAnimation.springStrength * 10, 1.2); + interaction.rotationVelocityX += interaction.velocityX * springImpulse; + interaction.rotationVelocityY += interaction.velocityY * springImpulse; + interaction.rotationVelocityZ += interaction.velocityY * springImpulse * 0.12; + interaction.targetRotationX = 0; + interaction.targetRotationY = 0; + interaction.velocityX = 0; + interaction.velocityY = 0; + }; + + const handleWindowBlur = () => { + handlePointerUp(); + handlePointerLeave(); + }; + + const handlePointerCancel = () => { + handlePointerUp(); + handlePointerLeave(); + }; + + canvas.addEventListener('pointermove', handlePointerMove); + canvas.addEventListener('pointerleave', handlePointerLeave); + canvas.addEventListener('pointercancel', handlePointerCancel); + window.addEventListener('pointerup', handlePointerUp); + window.addEventListener('pointermove', handleWindowPointerMove); + window.addEventListener('blur', handleWindowBlur); + canvas.addEventListener('pointerdown', handlePointerDown); + + const clock = new THREE.Timer(); + clock.connect(document); + let animationFrameId = 0; + + const renderFrame = (timestamp) => { + animationFrameId = window.requestAnimationFrame(renderFrame); + clock.update(timestamp); + + const delta = 1 / 60; + const elapsedTime = resolvedInitialPose.timeElapsed + clock.getElapsed(); + halftoneMaterial.uniforms.time.value = elapsedTime; + + let baseRotationX = resolvedInitialPose.rotationX; + let baseRotationY = resolvedInitialPose.rotationY; + let baseRotationZ = resolvedInitialPose.rotationZ; + let meshOffsetY = 0; + let meshScale = 1; + let lightAngle = settings.lighting.angleDegrees; + let lightHeight = settings.lighting.height; + + if (autoRotateEnabled) { + interaction.autoElapsed += delta; + baseRotationY += interaction.autoElapsed * resolvedAnimation.autoSpeed; + baseRotationX += + Math.sin(interaction.autoElapsed * 0.2) * + resolvedAnimation.autoWobble; + } + + if (resolvedAnimation.floatEnabled) { + const floatPhase = elapsedTime * resolvedAnimation.floatSpeed; + const driftAmount = (resolvedAnimation.driftAmount * Math.PI) / 180; + + meshOffsetY += Math.sin(floatPhase) * resolvedAnimation.floatAmplitude; + baseRotationX += Math.sin(floatPhase * 0.72) * driftAmount * 0.45; + baseRotationZ += Math.cos(floatPhase * 0.93) * driftAmount * 0.3; + } + + if (resolvedAnimation.breatheEnabled) { + meshScale *= + 1 + + Math.sin(elapsedTime * resolvedAnimation.breatheSpeed) * + resolvedAnimation.breatheAmount; + } + + if (rotateEnabled) { + interaction.rotateElapsed += delta; + const rotateProgress = resolvedAnimation.rotatePingPong + ? Math.sin(interaction.rotateElapsed * resolvedAnimation.rotateSpeed) * + Math.PI + : interaction.rotateElapsed * resolvedAnimation.rotateSpeed; + + if (resolvedAnimation.rotatePreset === 'axis') { + const axisDirection = + resolvedAnimation.rotateAxis.startsWith('-') ? -1 : 1; + const axisProgress = rotateProgress * axisDirection; + + if ( + resolvedAnimation.rotateAxis === 'x' || + resolvedAnimation.rotateAxis === 'xy' || + resolvedAnimation.rotateAxis === '-x' || + resolvedAnimation.rotateAxis === '-xy' + ) { + baseRotationX += axisProgress; + } + + if ( + resolvedAnimation.rotateAxis === 'y' || + resolvedAnimation.rotateAxis === 'xy' || + resolvedAnimation.rotateAxis === '-y' || + resolvedAnimation.rotateAxis === '-xy' + ) { + baseRotationY += axisProgress; + } + + if ( + resolvedAnimation.rotateAxis === 'z' || + resolvedAnimation.rotateAxis === '-z' + ) { + baseRotationZ += axisProgress; + } + } else if (resolvedAnimation.rotatePreset === 'lissajous') { + baseRotationX += Math.sin(rotateProgress * 0.85) * 0.65; + baseRotationY += Math.sin(rotateProgress * 1.35 + 0.8) * 1.05; + baseRotationZ += Math.sin(rotateProgress * 0.55 + 1.6) * 0.32; + } else if (resolvedAnimation.rotatePreset === 'orbit') { + baseRotationX += Math.sin(rotateProgress * 0.75) * 0.42; + baseRotationY += Math.cos(rotateProgress) * 1.2; + baseRotationZ += Math.sin(rotateProgress * 1.25) * 0.24; + } else if (resolvedAnimation.rotatePreset === 'tumble') { + baseRotationX += rotateProgress * 0.55; + baseRotationY += Math.sin(rotateProgress * 0.8) * 0.9; + baseRotationZ += Math.cos(rotateProgress * 1.1) * 0.38; + } + } + + if (resolvedAnimation.lightSweepEnabled) { + const lightPhase = elapsedTime * resolvedAnimation.lightSweepSpeed; + lightAngle += Math.sin(lightPhase) * resolvedAnimation.lightSweepRange; + lightHeight += + Math.cos(lightPhase * 0.85) * + resolvedAnimation.lightSweepHeightRange; + } + + let targetX = baseRotationX; + let targetY = baseRotationY; + let easing = 0.12; + + if (followHoverEnabled) { + const rangeRadians = (resolvedAnimation.hoverRange * Math.PI) / 180; + + if ( + resolvedAnimation.hoverReturn || + interaction.mouseX !== 0.5 || + interaction.mouseY !== 0.5 + ) { + targetX += (interaction.mouseY - 0.5) * rangeRadians; + targetY += (interaction.mouseX - 0.5) * rangeRadians; + } + + easing = resolvedAnimation.hoverEase; + } + + if (followDragEnabled) { + if (!interaction.dragging && resolvedAnimation.dragMomentum) { + interaction.targetRotationX += interaction.velocityX; + interaction.targetRotationY += interaction.velocityY; + interaction.velocityX *= 1 - resolvedAnimation.dragFriction; + interaction.velocityY *= 1 - resolvedAnimation.dragFriction; + } + + targetX += interaction.targetRotationX; + targetY += interaction.targetRotationY; + easing = resolvedAnimation.dragFriction; + } + + if (autoRotateEnabled && !followHoverEnabled && !followDragEnabled) { + targetX = baseRotationX + interaction.targetRotationX; + targetY = baseRotationY + interaction.targetRotationY; + + if (interaction.dragging) { + targetX = interaction.targetRotationX; + targetY = interaction.targetRotationY; + } + + easing = 0.08; + } + + if (resolvedAnimation.springReturnEnabled) { + const springX = applySpringStep( + interaction.rotationX, + targetX, + interaction.rotationVelocityX, + resolvedAnimation.springStrength, + resolvedAnimation.springDamping, + ); + const springY = applySpringStep( + interaction.rotationY, + targetY, + interaction.rotationVelocityY, + resolvedAnimation.springStrength, + resolvedAnimation.springDamping, + ); + const springZ = applySpringStep( + interaction.rotationZ, + baseRotationZ, + interaction.rotationVelocityZ, + resolvedAnimation.springStrength, + resolvedAnimation.springDamping, + ); + + interaction.rotationX = springX.value; + interaction.rotationY = springY.value; + interaction.rotationZ = springZ.value; + interaction.rotationVelocityX = springX.velocity; + interaction.rotationVelocityY = springY.velocity; + interaction.rotationVelocityZ = springZ.velocity; + } else { + interaction.rotationX += (targetX - interaction.rotationX) * easing; + interaction.rotationY += (targetY - interaction.rotationY) * easing; + interaction.rotationZ += + (baseRotationZ - interaction.rotationZ) * + (resolvedAnimation.rotatePingPong ? 0.18 : 0.12); + } + + mesh.rotation.set( + interaction.rotationX, + interaction.rotationY, + interaction.rotationZ, + ); + mesh.position.y = meshOffsetY; + mesh.scale.setScalar(meshScale); + + if (resolvedAnimation.cameraParallaxEnabled) { + const cameraRange = resolvedAnimation.cameraParallaxAmount; + const cameraEase = resolvedAnimation.cameraParallaxEase; + const centeredX = (interaction.mouseX - 0.5) * 2; + const centeredY = (0.5 - interaction.mouseY) * 2; + const orbitYaw = centeredX * cameraRange; + const orbitPitch = centeredY * cameraRange * 0.7; + const horizontalRadius = Math.cos(orbitPitch) * baseCameraDistance; + const targetCameraX = Math.sin(orbitYaw) * horizontalRadius; + const targetCameraY = + Math.sin(orbitPitch) * baseCameraDistance * 0.85; + const targetCameraZ = Math.cos(orbitYaw) * horizontalRadius; + + camera.position.x += (targetCameraX - camera.position.x) * cameraEase; + camera.position.y += (targetCameraY - camera.position.y) * cameraEase; + camera.position.z += (targetCameraZ - camera.position.z) * cameraEase; + } else { + camera.position.x += (0 - camera.position.x) * 0.12; + camera.position.y += (0 - camera.position.y) * 0.12; + camera.position.z += (baseCameraDistance - camera.position.z) * 0.12; + } + + const lookAtTarget = new THREE.Vector3(0, meshOffsetY * 0.2, 0); + + camera.lookAt(lookAtTarget); + setPrimaryLightPosition(primaryLight, lightAngle, lightHeight); + halftoneMaterial.uniforms.footprintScale.value = getHalftoneScale( + getVirtualWidth(), + getVirtualHeight(), + lookAtTarget, + ); + + if (!settings.halftone.enabled) { + renderer.setRenderTarget(null); + renderer.clear(); + renderer.render(scene3d, camera); + return; + } + + renderer.setRenderTarget(sceneTarget); + renderer.render(scene3d, camera); + + blurHorizontalMaterial.uniforms.tInput.value = sceneTarget.texture; + renderer.setRenderTarget(blurTargetA); + renderer.render(blurHorizontalScene, orthographicCamera); + + blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; + renderer.setRenderTarget(blurTargetB); + renderer.render(blurVerticalScene, orthographicCamera); + + blurHorizontalMaterial.uniforms.tInput.value = blurTargetB.texture; + renderer.setRenderTarget(blurTargetA); + renderer.render(blurHorizontalScene, orthographicCamera); + + blurVerticalMaterial.uniforms.tInput.value = blurTargetA.texture; + renderer.setRenderTarget(blurTargetB); + renderer.render(blurVerticalScene, orthographicCamera); + + renderer.setRenderTarget(null); + renderer.clear(); + renderer.render(postScene, orthographicCamera); + }; + + renderFrame(); + + return () => { + window.cancelAnimationFrame(animationFrameId); + clock.dispose(); + resizeObserver.disconnect(); + canvas.removeEventListener('pointermove', handlePointerMove); + canvas.removeEventListener('pointerleave', handlePointerLeave); + canvas.removeEventListener('pointercancel', handlePointerCancel); + window.removeEventListener('pointerup', handlePointerUp); + window.removeEventListener('pointermove', handleWindowPointerMove); + window.removeEventListener('blur', handleWindowBlur); + canvas.removeEventListener('pointerdown', handlePointerDown); + blurHorizontalMaterial.dispose(); + blurVerticalMaterial.dispose(); + halftoneMaterial.dispose(); + fullScreenGeometry.dispose(); + material.dispose(); + sceneTarget.dispose(); + blurTargetA.dispose(); + blurTargetB.dispose(); + disposeHalftoneMaterialAssets(materialAssets); + renderer.dispose(); + + if (canvas.parentNode === container) { + container.removeChild(canvas); + } + }; +} + + +type PartnerThreeCardProps = { + animationOverrides?: Partial<typeof settings.animation>; + initialRotationX?: number; + initialRotationY?: number; + initialRotationZ?: number; + modelUrl: string; + style?: CSSProperties; +}; + +export function PartnerThreeCard({ + animationOverrides, + initialRotationX, + initialRotationY, + initialRotationZ, + modelUrl, + style, +}: PartnerThreeCardProps) { + const mountReference = useRef<HTMLDivElement>(null); + + useEffect(() => { + const container = mountReference.current; + + if (!container) { + return; + } + + const unmount = mountHalftoneCanvas({ + animationOverrides, + container, + initialRotationX, + initialRotationY, + initialRotationZ, + modelUrl, + onError: (error) => { + console.error(error); + }, + }); + + return () => { + void Promise.resolve(unmount).then((dispose) => dispose?.()); + }; + }, [ + animationOverrides, + initialRotationX, + initialRotationY, + initialRotationZ, + modelUrl, + ]); + + return ( + <div + ref={mountReference} + style={{ + background: "transparent", + height: '100%', + width: '100%', + ...style, + }} + /> + ); +} + +export default PartnerThreeCard; diff --git a/packages/twenty-website-new/src/illustrations/ThreeCards/Programming.tsx b/packages/twenty-website-new/src/illustrations/ThreeCards/Programming.tsx deleted file mode 100644 index ec8e5e9e04..0000000000 --- a/packages/twenty-website-new/src/illustrations/ThreeCards/Programming.tsx +++ /dev/null @@ -1,366 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useRef } from 'react'; -import * as THREE from 'three'; -import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; - -const GLB_URL = '/illustrations/partner/three-cards/programming.glb'; - -const halftoneVertexShader = /* glsl */ ` - varying vec3 vWorldNormal; - - void main() { - vec4 worldPosition = modelMatrix * vec4(position, 1.0); - vWorldNormal = normalize(mat3(modelMatrix) * normal); - gl_Position = projectionMatrix * viewMatrix * worldPosition; - } -`; - -const halftoneFragmentShader = /* glsl */ ` - uniform vec3 uColor; - uniform vec3 uLightDir; - uniform vec2 uResolution; - uniform float uNumRows; - - varying vec3 vWorldNormal; - - void main() { - vec3 normal = normalize(vWorldNormal); - vec3 lightDir = normalize(uLightDir); - float ndotl = max(dot(normal, lightDir), 0.0); - float lum = mix(0.35, 1.0, ndotl); - - float rowH = uResolution.y / uNumRows; - float rowFrac = gl_FragCoord.y / rowH - floor(gl_FragCoord.y / rowH); - float dy = abs(rowFrac - 0.5); - - float cellW = rowH * 2.2; - float cellFrac = (gl_FragCoord.x - floor(gl_FragCoord.x / cellW) * cellW) / cellW; - - float fill = pow(lum, 0.45) * 0.95; - - float dynamicBarHalf = mix(0.15, 0.34, smoothstep(0.05, 0.8, lum)); - - float dx2 = abs(cellFrac - 0.5); - float halfFill = fill * 0.5; - float bodyHalfW = max(halfFill - dynamicBarHalf * (rowH / cellW), 0.0); - float capR = dynamicBarHalf * rowH; - - float inDash = 0.0; - if (dx2 <= bodyHalfW) { - float edgeDist = dynamicBarHalf - dy; - inDash = smoothstep(-0.03, 0.03, edgeDist); - } else { - float cdx = (dx2 - bodyHalfW) * cellW; - float cdy = dy * rowH; - float d = sqrt(cdx * cdx + cdy * cdy); - inDash = 1.0 - smoothstep(capR - 1.5, capR + 1.5, d); - } - - if (inDash < 0.01) { - discard; - } - - gl_FragColor = vec4(uColor, inDash); - } -`; - -function createHalftoneDashMaterial( - lightDirection: THREE.Vector3, - resolution: THREE.Vector2, -) { - return new THREE.ShaderMaterial({ - uniforms: { - uColor: { value: new THREE.Color('#1e5bff') }, - uLightDir: { value: lightDirection.clone() }, - uResolution: { value: resolution.clone() }, - uNumRows: { value: 65 }, - }, - vertexShader: halftoneVertexShader, - fragmentShader: halftoneFragmentShader, - transparent: true, - depthWrite: true, - depthTest: true, - side: THREE.DoubleSide, - }); -} - -function disposeObjectSubtree(root: THREE.Object3D) { - root.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.geometry?.dispose(); - - const material = sceneObject.material; - if (Array.isArray(material)) { - material.forEach((item) => item.dispose()); - } else { - material?.dispose(); - } - }); -} - -type MeshRestPose = { - position: THREE.Vector3; - quaternion: THREE.Quaternion; - wobblePhase: number; -}; - -function applyHalftoneDashMaterials( - modelRoot: THREE.Object3D, - lightDirection: THREE.Vector3, - resolution: THREE.Vector2, -) { - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - sceneObject.material = createHalftoneDashMaterial( - lightDirection, - resolution, - ); - - const mesh = sceneObject; - const rest: MeshRestPose = { - position: mesh.position.clone(), - quaternion: mesh.quaternion.clone(), - wobblePhase: mesh.position.y * 4.2 + mesh.position.x * 1.7, - }; - mesh.userData.partnerTechnologyMeshRest = rest; - }); -} - -const StyledVisualMount = styled.div` - display: block; - height: 100%; - min-width: 0; - width: 100%; -`; - -export function Programming() { - const mountReference = useRef<HTMLDivElement>(null); - - useEffect(() => { - const container = mountReference.current; - if (!container) { - return; - } - - let cancelled = false; - let animationFrameId = 0; - - const pointer = { x: 0, y: 0, inside: false }; - const targetRotation = { x: 0, y: 0 }; - const lightDirectionWorld = new THREE.Vector3(4, 8, 6).normalize(); - - const scene = new THREE.Scene(); - const width = container.clientWidth; - const height = container.clientHeight; - - const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 100); - camera.position.set(0, 0, 5.05); - - const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: false }); - renderer.setPixelRatio(1); - renderer.setSize(width, height); - renderer.setClearColor(0x000000, 0); - renderer.outputColorSpace = THREE.SRGBColorSpace; - const canvas = renderer.domElement; - canvas.style.display = 'block'; - canvas.style.height = '100%'; - canvas.style.touchAction = 'none'; - canvas.style.width = '100%'; - canvas.style.cursor = 'pointer'; - container.appendChild(canvas); - - const pivot = new THREE.Group(); - scene.add(pivot); - - const clock = new THREE.Clock(); - - const dracoLoader = new DRACOLoader(); - dracoLoader.setDecoderPath( - 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/', - ); - - const loader = new GLTFLoader(); - loader.setDRACOLoader(dracoLoader); - - loader.load( - GLB_URL, - (gltf) => { - if (cancelled) { - disposeObjectSubtree(gltf.scene); - return; - } - - const modelRoot = gltf.scene; - const bounds = new THREE.Box3().setFromObject(modelRoot); - const center = bounds.getCenter(new THREE.Vector3()); - const size = bounds.getSize(new THREE.Vector3()); - const maxAxis = Math.max(size.x, size.y, size.z, 0.001); - const scale = 2.75 / maxAxis; - - modelRoot.position.sub(center); - modelRoot.scale.setScalar(scale); - - const canvasResolution = new THREE.Vector2( - renderer.domElement.width, - renderer.domElement.height, - ); - applyHalftoneDashMaterials( - modelRoot, - lightDirectionWorld, - canvasResolution, - ); - pivot.add(modelRoot); - - const renderFrame = () => { - if (cancelled) { - return; - } - - animationFrameId = window.requestAnimationFrame(renderFrame); - const delta = Math.min(clock.getDelta(), 0.1); - - const rotationDamp = 6.8; - const influence = pointer.inside ? 1 : 0.38; - targetRotation.y = pointer.x * 0.78 * influence; - targetRotation.x = pointer.y * 0.62 * influence; - - pivot.rotation.y = THREE.MathUtils.damp( - pivot.rotation.y, - targetRotation.y, - rotationDamp, - delta, - ); - pivot.rotation.x = THREE.MathUtils.damp( - pivot.rotation.x, - targetRotation.x, - rotationDamp, - delta, - ); - - const hoverLift = pointer.inside ? 1 : 0; - pivot.scale.setScalar( - THREE.MathUtils.damp(pivot.scale.x, 1 + hoverLift * 0.12, 7, delta), - ); - - const mx = pointer.x * (pointer.inside ? 1 : 0.32); - const my = pointer.y * (pointer.inside ? 1 : 0.32); - - modelRoot.traverse((sceneObject) => { - if (!(sceneObject instanceof THREE.Mesh)) { - return; - } - - const rest = sceneObject.userData.partnerTechnologyMeshRest as - | MeshRestPose - | undefined; - if (!rest) { - return; - } - - const phase = rest.wobblePhase; - const wobble = pointer.inside ? 1 : 0.36; - sceneObject.position.x = - rest.position.x + mx * 0.22 * Math.sin(phase * 1.8); - sceneObject.position.z = - rest.position.z + my * 0.19 * Math.cos(phase * 1.4); - sceneObject.position.y = - rest.position.y + (mx + my) * 0.055 * Math.sin(phase * 2.5); - - const twist = (mx * 0.34 + my * 0.24) * wobble * Math.sin(phase); - sceneObject.quaternion.copy(rest.quaternion); - sceneObject.rotateY(twist); - }); - - renderer.render(scene, camera); - }; - - renderFrame(); - }, - undefined, - undefined, - ); - - const setPointerFromEvent = (event: PointerEvent) => { - const rect = canvas.getBoundingClientRect(); - const normalizedX = ((event.clientX - rect.left) / rect.width) * 2 - 1; - const normalizedY = -(((event.clientY - rect.top) / rect.height) * 2 - 1); - pointer.x = THREE.MathUtils.clamp(normalizedX, -1, 1); - pointer.y = THREE.MathUtils.clamp(normalizedY, -1, 1); - }; - - const handlePointerEnter = () => { - pointer.inside = true; - }; - - const handlePointerLeave = () => { - pointer.inside = false; - pointer.x = 0; - pointer.y = 0; - }; - - const handlePointerMove = (event: PointerEvent) => { - setPointerFromEvent(event); - }; - - canvas.addEventListener('pointerenter', handlePointerEnter); - canvas.addEventListener('pointerleave', handlePointerLeave); - canvas.addEventListener('pointermove', handlePointerMove); - - const handleResize = () => { - if (!mountReference.current || cancelled) { - return; - } - - const nextWidth = mountReference.current.clientWidth; - const nextHeight = mountReference.current.clientHeight; - if (nextWidth < 1 || nextHeight < 1) { - return; - } - - camera.aspect = nextWidth / nextHeight; - camera.updateProjectionMatrix(); - renderer.setSize(nextWidth, nextHeight); - - const rw = renderer.domElement.width; - const rh = renderer.domElement.height; - pivot.traverse((sceneObject) => { - if ( - sceneObject instanceof THREE.Mesh && - sceneObject.material instanceof THREE.ShaderMaterial && - sceneObject.material.uniforms.uResolution - ) { - sceneObject.material.uniforms.uResolution.value.set(rw, rh); - } - }); - }; - - window.addEventListener('resize', handleResize); - - return () => { - cancelled = true; - window.removeEventListener('resize', handleResize); - canvas.removeEventListener('pointerenter', handlePointerEnter); - canvas.removeEventListener('pointerleave', handlePointerLeave); - canvas.removeEventListener('pointermove', handlePointerMove); - window.cancelAnimationFrame(animationFrameId); - disposeObjectSubtree(scene); - renderer.dispose(); - dracoLoader.dispose(); - - if (canvas.parentNode === container) { - container.removeChild(canvas); - } - }; - }, []); - - return <StyledVisualMount aria-hidden ref={mountReference} />; -} diff --git a/packages/twenty-website-new/src/illustrations/illustration-mount.tsx b/packages/twenty-website-new/src/illustrations/illustration-mount.tsx index 02f7c2e512..c5b4582bee 100644 --- a/packages/twenty-website-new/src/illustrations/illustration-mount.tsx +++ b/packages/twenty-website-new/src/illustrations/illustration-mount.tsx @@ -1,5 +1,6 @@ 'use client'; +import { VisibleWhenTabActive } from '@/components/VisibleWhenTabActive'; import { ILLUSTRATIONS, type IllustrationId, @@ -12,5 +13,9 @@ type IllustrationMountProps = { export function IllustrationMount({ illustration }: IllustrationMountProps) { const IllustrationComponent = ILLUSTRATIONS[illustration]; - return <IllustrationComponent />; + return ( + <VisibleWhenTabActive> + <IllustrationComponent /> + </VisibleWhenTabActive> + ); } diff --git a/packages/twenty-website-new/src/illustrations/illustrations-registry.tsx b/packages/twenty-website-new/src/illustrations/illustrations-registry.tsx index 6eb4d03183..ccefed8d70 100644 --- a/packages/twenty-website-new/src/illustrations/illustrations-registry.tsx +++ b/packages/twenty-website-new/src/illustrations/illustrations-registry.tsx @@ -8,30 +8,49 @@ import { Spaceship } from './Helped/Spaceship'; import { Target } from './Helped/Target'; import { Product } from './Hero/Product'; import { WhyTwenty } from './Hero/WhyTwenty'; -import { Organization } from './Plans/Organization'; -import { Pro } from './Plans/Pro'; import { Quotes } from './Quote/Quotes'; import { Hourglass } from './Testimonials/Hourglass'; import { Partner } from './Testimonials/Partner'; -import { Connect } from './ThreeCards/Connect'; -import { Diamond } from './ThreeCards/Diamond'; import { Eye } from './ThreeCards/Eye'; -import { Flash } from './ThreeCards/Flash'; -import { Grow } from './ThreeCards/Grow'; -import { Lock } from './ThreeCards/Lock'; -import { Programming } from './ThreeCards/Programming'; +import { PartnerThreeCard } from './ThreeCards/PartnerThreeCard'; import { SingleScreen } from './ThreeCards/SingleScreen'; import { Speed } from './ThreeCards/Speed'; import { Logo as WhyTwentyStepperLogo } from './WhyTwentyStepper/Logo'; +const DiamondIllustration = () => ( + <PartnerThreeCard modelUrl="/illustrations/home/three-cards/diamond.glb" /> +); + +const FlashIllustration = () => ( + <PartnerThreeCard modelUrl="/illustrations/home/three-cards/flash.glb" /> +); + +const LockIllustration = () => ( + <PartnerThreeCard modelUrl="/illustrations/home/three-cards/lock.glb" /> +); + +const ConnectIllustration = () => ( + <PartnerThreeCard modelUrl="/illustrations/partner/three-cards/connect.glb" /> +); + +const GrowIllustration = () => ( + <PartnerThreeCard modelUrl="/illustrations/partner/three-cards/grow.glb" /> +); + +const ProgrammingIllustration = () => ( + <PartnerThreeCard + modelUrl="/illustrations/partner/three-cards/programming.glb" + /> +); + export const THREE_CARDS_ILLUSTRATIONS = { - diamond: Diamond, + diamond: DiamondIllustration, eye: Eye, - flash: Flash, - lock: Lock, - connect: Connect, - grow: Grow, - programming: Programming, + flash: FlashIllustration, + lock: LockIllustration, + connect: ConnectIllustration, + grow: GrowIllustration, + programming: ProgrammingIllustration, singleScreen: SingleScreen, speed: Speed, } as const satisfies Record<string, ComponentType>; @@ -48,8 +67,6 @@ export const ILLUSTRATIONS = { heroWhyTwenty: WhyTwenty, testimonialsPartner: Partner, testimonialsHourglass: Hourglass, - planPro: Pro, - planOrganization: Organization, money: Money, spaceship: Spaceship, target: Target, diff --git a/packages/twenty-website-new/src/sections/EngagementBand/components/Strip/Strip.tsx b/packages/twenty-website-new/src/sections/EngagementBand/components/Strip/Strip.tsx index db5c37cfd6..fb41e6127d 100644 --- a/packages/twenty-website-new/src/sections/EngagementBand/components/Strip/Strip.tsx +++ b/packages/twenty-website-new/src/sections/EngagementBand/components/Strip/Strip.tsx @@ -3,7 +3,7 @@ import { theme } from '@/theme'; import { css } from '@linaria/core'; import { styled } from '@linaria/react'; import NextImage from 'next/image'; -import type { ReactNode } from 'react'; +import type { CSSProperties, ReactNode } from 'react'; const ENGAGEMENT_BAND_OVERLAY_SRC = '/images/pricing/engagement-band/overlay.webp'; @@ -46,6 +46,14 @@ const StyledStrip = styled.div` row-gap: 0; } + &[data-has-custom-copy-max-width='true'] { + @media (min-width: ${theme.breakpoints.md}px) { + grid-template-columns: + fit-content(var(--engagement-band-copy-max-width)) + minmax(0, 1fr); + } + } + &[data-variant='primary'] { color: ${theme.colors.primary.text[100]}; } @@ -57,13 +65,29 @@ const StyledStrip = styled.div` type StripProps = { children: ReactNode; + desktopCopyMaxWidth?: string; fillColor: string; variant: 'primary' | 'secondary'; }; -export function Strip({ children, fillColor, variant }: StripProps) { +export function Strip({ + children, + desktopCopyMaxWidth, + fillColor, + variant, +}: StripProps) { + const style = desktopCopyMaxWidth + ? ({ + '--engagement-band-copy-max-width': desktopCopyMaxWidth, + } as CSSProperties) + : undefined; + return ( - <StyledStrip data-variant={variant}> + <StyledStrip + data-has-custom-copy-max-width={Boolean(desktopCopyMaxWidth)} + data-variant={variant} + style={style} + > <EngagementBandShape fillColor={fillColor} /> <OverlayLayer aria-hidden> <NextImage diff --git a/packages/twenty-website-new/src/sections/Hero/components/Body/Body.tsx b/packages/twenty-website-new/src/sections/Hero/components/Body/Body.tsx index d8ffe8c3ae..1d76cef9e9 100644 --- a/packages/twenty-website-new/src/sections/Hero/components/Body/Body.tsx +++ b/packages/twenty-website-new/src/sections/Hero/components/Body/Body.tsx @@ -2,7 +2,7 @@ import { Body as BaseBody, type BodyProps, } from '@/design-system/components/Body/Body'; -import { Pages } from '@/enums/pages'; +import type { Pages } from '@/enums/pages'; import { theme } from '@/theme'; import { styled } from '@linaria/react'; @@ -12,36 +12,36 @@ const BodyContainer = styled.div` max-width: 360px; width: 100%; - &[data-page=${Pages.WhyTwenty}] { + &[data-page='whyTwenty'] { color: ${theme.colors.secondary.text[60]}; } @media (min-width: ${theme.breakpoints.md}px) { - &[data-page=${Pages.Home}] { + &[data-page='home'] { max-width: 591px; } - &[data-page=${Pages.Partner}] { + &[data-page='partner'] { max-width: 500px; } - &[data-page=${Pages.Pricing}] { + &[data-page='pricing'] { max-width: 500px; } - &[data-page=${Pages.Product}] { + &[data-page='product'] { max-width: 591px; } - &[data-page=${Pages.WhyTwenty}] { + &[data-page='whyTwenty'] { max-width: 443px; } - &[data-page=${Pages.ReleaseNotes}] { + &[data-page='releaseNotes'] { max-width: 591px; } - &[data-page=${Pages.CaseStudies}] { + &[data-page='caseStudies'] { max-width: 550px; } } diff --git a/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerHalftoneOverlay.tsx b/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerHalftoneOverlay.tsx index e379cde88f..3f3e3f7202 100644 --- a/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerHalftoneOverlay.tsx +++ b/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerHalftoneOverlay.tsx @@ -16,8 +16,8 @@ const HALFTONE_CONTRAST = 1; const HALFTONE_DASH_COLOR = '#959595'; const HALFTONE_HOVER_COLOR = '#4A38F5'; const HALFTONE_HOVER_RADIUS = 0.6; -const HALFTONE_HOVER_POWER_SHIFT = 0.2; -const HALFTONE_HOVER_WIDTH_SHIFT = -0.18; +const HALFTONE_HOVER_POWER_SHIFT = 0.9; +const HALFTONE_HOVER_WIDTH_SHIFT = -0.2; const HALFTONE_HOVER_LIGHT_INTENSITY = 0; const HALFTONE_HOVER_LIGHT_RADIUS = 0.2; diff --git a/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerVisual.tsx b/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerVisual.tsx index 164664bc98..d011647821 100644 --- a/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerVisual.tsx +++ b/packages/twenty-website-new/src/sections/Hero/components/PartnerVisual/PartnerVisual.tsx @@ -1,3 +1,4 @@ +import { VisibleWhenTabActive } from '@/components/VisibleWhenTabActive'; import { theme } from '@/theme'; import { styled } from '@linaria/react'; @@ -22,7 +23,9 @@ const StyledContainer = styled.div` export function PartnerVisual() { return ( <StyledContainer> - <PartnerHalftoneOverlay imageUrl={HERO_IMAGE_URL} /> + <VisibleWhenTabActive> + <PartnerHalftoneOverlay imageUrl={HERO_IMAGE_URL} /> + </VisibleWhenTabActive> </StyledContainer> ); } diff --git a/packages/twenty-website-new/src/sections/Hero/components/WhyTwentyVisual/WhyTwentyVisual.tsx b/packages/twenty-website-new/src/sections/Hero/components/WhyTwentyVisual/WhyTwentyVisual.tsx index 9a69257e3f..243f91b766 100644 --- a/packages/twenty-website-new/src/sections/Hero/components/WhyTwentyVisual/WhyTwentyVisual.tsx +++ b/packages/twenty-website-new/src/sections/Hero/components/WhyTwentyVisual/WhyTwentyVisual.tsx @@ -1,6 +1,6 @@ 'use client'; -import { WhyTwenty as WhyTwentyGlb } from '@/illustrations/Hero/WhyTwenty'; +import { IllustrationMount } from '@/illustrations'; import { theme } from '@/theme'; import { css } from '@linaria/core'; import { styled } from '@linaria/react'; @@ -38,7 +38,7 @@ export function WhyTwentyVisual() { src="/images/why-twenty/hero/background.webp" /> </BackgroundLayer> - <WhyTwentyGlb /> + <IllustrationMount illustration="heroWhyTwenty" /> </VisualContainer> ); } diff --git a/packages/twenty-website-new/src/sections/Hero/components/index.ts b/packages/twenty-website-new/src/sections/Hero/components/index.ts index 19601e27b6..5ca5ab80f7 100644 --- a/packages/twenty-website-new/src/sections/Hero/components/index.ts +++ b/packages/twenty-website-new/src/sections/Hero/components/index.ts @@ -1,12 +1,17 @@ -import { Product as ProductVisual } from '@/illustrations/Hero/Product'; +import { IllustrationMount } from '@/illustrations'; import { PartnerVisual } from '@/sections/Hero/components/PartnerVisual/PartnerVisual'; import { WhyTwentyVisual } from '@/sections/Hero/components/WhyTwentyVisual/WhyTwentyVisual'; +import { createElement } from 'react'; import { Body } from './Body/Body'; import { Cta } from './Cta/Cta'; import { Heading } from './Heading/Heading'; import { HomeVisual } from './HomeVisual/HomeVisual'; import { Root } from './Root/Root'; +function ProductVisual() { + return createElement(IllustrationMount, { illustration: 'heroProduct' }); +} + export const Hero = { Root, Heading, diff --git a/packages/twenty-website-new/src/sections/Plans/components/BillingToggle/BillingToggle.tsx b/packages/twenty-website-new/src/sections/Plans/components/BillingToggle/BillingToggle.tsx index 20d3ec529b..a5165eb280 100644 --- a/packages/twenty-website-new/src/sections/Plans/components/BillingToggle/BillingToggle.tsx +++ b/packages/twenty-website-new/src/sections/Plans/components/BillingToggle/BillingToggle.tsx @@ -3,13 +3,31 @@ import type { PlansBillingPeriod } from '@/sections/Plans/types'; import { theme } from '@/theme'; import { styled } from '@linaria/react'; +import { useLayoutEffect, useRef, useState } from 'react'; const ToggleTrack = styled.div` align-items: center; background-color: ${theme.colors.primary.border[10]}; border-radius: ${theme.radius(20)}; - display: flex; - padding: ${theme.spacing(1)}; + display: inline-flex; + overflow: hidden; + padding: 2px; + position: relative; +`; + +const ToggleHighlight = styled.div` + background-color: ${theme.colors.primary.background[100]}; + border-radius: ${theme.radius(8)}; + bottom: 2px; + left: 0; + pointer-events: none; + position: absolute; + top: 2px; + transition: + transform 0.24s cubic-bezier(0.2, 0.8, 0.2, 1), + width 0.24s cubic-bezier(0.2, 0.8, 0.2, 1), + opacity 0.18s ease; + will-change: transform, width; `; const ToggleOption = styled.button` @@ -23,12 +41,14 @@ const ToggleOption = styled.button` font-size: ${theme.font.size(3)}; font-weight: ${theme.font.weight.medium}; column-gap: ${theme.spacing(2)}; - height: ${theme.spacing(6)}; + height: 28px; justify-content: center; line-height: ${theme.lineHeight(4)}; padding-left: ${theme.spacing(3)}; - text-transform: uppercase; + position: relative; + transition: color 0.18s ease; white-space: nowrap; + z-index: 1; &[data-period='monthly'] { padding-right: ${theme.spacing(3)}; @@ -39,7 +59,6 @@ const ToggleOption = styled.button` } &[data-active='true'] { - background-color: ${theme.colors.primary.background[100]}; color: ${theme.colors.primary.text[100]}; } @@ -59,14 +78,14 @@ const DiscountBadge = styled.span` color: ${theme.colors.secondary.text[100]}; display: inline-flex; font-family: ${theme.font.family.sans}; - font-size: ${theme.font.size(3)}; - font-weight: ${theme.font.weight.regular}; - height: ${theme.spacing(5)}; + font-size: ${theme.font.size(2.5)}; + font-weight: ${theme.font.weight.medium}; + height: 24px; align-items: center; justify-content: center; line-height: ${theme.lineHeight(3.5)}; - padding-left: ${theme.spacing(1)}; - padding-right: ${theme.spacing(1)}; + padding-left: ${theme.spacing(1.5)}; + padding-right: ${theme.spacing(1.5)}; `; type BillingToggleProps = { @@ -74,17 +93,86 @@ type BillingToggleProps = { onBillingChange: (billing: PlansBillingPeriod) => void; }; +type ToggleHighlightState = { + ready: boolean; + width: number; + x: number; +}; + export function BillingToggle({ billing, onBillingChange, }: BillingToggleProps) { + const trackRef = useRef<HTMLDivElement>(null); + const monthlyButtonRef = useRef<HTMLButtonElement>(null); + const yearlyButtonRef = useRef<HTMLButtonElement>(null); + const [highlight, setHighlight] = useState<ToggleHighlightState>({ + ready: false, + width: 0, + x: 0, + }); + + useLayoutEffect(() => { + const track = trackRef.current; + const monthlyButton = monthlyButtonRef.current; + const yearlyButton = yearlyButtonRef.current; + + if (!track || !monthlyButton || !yearlyButton) { + return; + } + + const syncHighlight = () => { + const activeButton = + billing === 'monthly' ? monthlyButton : yearlyButton; + const trackRect = track.getBoundingClientRect(); + const buttonRect = activeButton.getBoundingClientRect(); + const nextHighlight = { + ready: true, + width: buttonRect.width, + x: buttonRect.left - trackRect.left, + }; + + setHighlight((currentHighlight) => { + if ( + currentHighlight.ready === nextHighlight.ready && + currentHighlight.width === nextHighlight.width && + currentHighlight.x === nextHighlight.x + ) { + return currentHighlight; + } + + return nextHighlight; + }); + }; + + syncHighlight(); + + const resizeObserver = new ResizeObserver(syncHighlight); + resizeObserver.observe(track); + resizeObserver.observe(monthlyButton); + resizeObserver.observe(yearlyButton); + + return () => { + resizeObserver.disconnect(); + }; + }, [billing]); + return ( - <ToggleTrack role="radiogroup" aria-label="Billing period"> + <ToggleTrack ref={trackRef} role="radiogroup" aria-label="Billing period"> + <ToggleHighlight + aria-hidden="true" + style={{ + opacity: highlight.ready ? 1 : 0, + transform: `translateX(${highlight.x}px)`, + width: `${highlight.width}px`, + }} + /> <ToggleOption aria-checked={billing === 'monthly'} data-active={billing === 'monthly'} data-period="monthly" onClick={() => onBillingChange('monthly')} + ref={monthlyButtonRef} role="radio" type="button" > @@ -95,6 +183,7 @@ export function BillingToggle({ data-active={billing === 'yearly'} data-period="yearly" onClick={() => onBillingChange('yearly')} + ref={yearlyButtonRef} role="radio" type="button" > diff --git a/packages/twenty-website-new/src/sections/Plans/components/Card/Card.tsx b/packages/twenty-website-new/src/sections/Plans/components/Card/Card.tsx index 495c0d6928..56b45db631 100644 --- a/packages/twenty-website-new/src/sections/Plans/components/Card/Card.tsx +++ b/packages/twenty-website-new/src/sections/Plans/components/Card/Card.tsx @@ -1,13 +1,14 @@ +'use client'; + import { styled } from '@linaria/react'; +import NextImage from 'next/image'; import { Body, Heading, LinkButton } from '@/design-system/components'; import { CheckIcon } from '@/icons/informative/Check'; -import { IllustrationMount } from '@/illustrations'; import type { PlanCardType } from '@/sections/Plans/types'; import { theme } from '@/theme'; import { css } from '@linaria/core'; - -const FIXED_ROWS = 4; +import { useEffect, useRef, useState, type CSSProperties } from 'react'; const StyledCard = styled.div` background-color: ${theme.colors.primary.background[100]}; @@ -15,7 +16,6 @@ const StyledCard = styled.div` border-radius: ${theme.radius(2)}; display: grid; grid-template-columns: 1fr; - grid-template-rows: subgrid; overflow: hidden; padding-bottom: ${theme.spacing(4)}; padding-left: ${theme.spacing(4)}; @@ -27,14 +27,15 @@ const StyledCard = styled.div` `; const CardHeader = styled.div` + align-items: flex-start; display: flex; - flex-direction: column; + flex-direction: row; + gap: ${theme.spacing(3)}; + justify-content: space-between; overflow: visible; @media (min-width: ${theme.breakpoints.md}px) { - align-items: flex-start; - flex-direction: row; - justify-content: space-between; + gap: ${theme.spacing(4)}; } `; @@ -48,6 +49,10 @@ const CardHeaderInfo = styled.div` `; const cardPlanTitleClassName = css` + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &[data-size='xs'] { line-height: ${theme.lineHeight(5)}; } @@ -61,29 +66,27 @@ const cardPlanTitleClassName = css` const priceBodyClassName = css` color: ${theme.colors.primary.text[60]}; + display: block; + min-width: 0; + + @media (min-width: ${theme.breakpoints.md}px) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } `; const PriceLine = styled.div` align-items: baseline; display: flex; + flex-wrap: wrap; gap: ${theme.spacing(1)}; - white-space: nowrap; -`; - -const CardIllustrationEmbed = styled.div` - background-color: ${theme.colors.primary.background[100]}; - border: none; - border-radius: ${theme.radius(2)}; - display: block; - flex-shrink: 0; - height: 80px; - overflow: hidden; - width: 197px; + min-width: 0; @media (min-width: ${theme.breakpoints.md}px) { - display: block; - margin-left: auto; - transform: translateX(${theme.spacing(4)}); + flex-wrap: nowrap; + overflow: hidden; + white-space: nowrap; } `; @@ -93,6 +96,32 @@ const CardRule = styled.div` width: 100%; `; +const CardIcon = styled.div` + --card-icon-width: 80px; + background-color: ${theme.colors.primary.background[100]}; + border: none; + border-radius: ${theme.radius(2)}; + display: block; + flex-shrink: 0; + height: 80px; + margin-left: auto; + overflow: hidden; + position: relative; + width: var(--card-icon-width); + + img { + object-fit: contain; + object-position: center right; + } + + @media (min-width: ${theme.breakpoints.md}px) { + display: block; + margin-left: auto; + height: 80px; + width: var(--card-icon-width); + } +`; + const CtaWrapper = styled.div` width: 100%; @@ -102,23 +131,95 @@ const CtaWrapper = styled.div` } `; +const FEATURES_SWITCH_ANIMATION_MS = 110; +const FEATURE_ITEM_STAGGER_MS = 8; +const FEATURE_ITEM_EXPANDED_HEIGHT = theme.spacing(8); +const FEATURE_ITEM_SPACING = theme.spacing(4); + +const FeaturesViewport = styled.div` + height: var(--features-height, auto); + min-width: 0; + overflow: hidden; + position: relative; + transition: height ${FEATURES_SWITCH_ANIMATION_MS}ms + cubic-bezier(0.2, 0.8, 0.2, 1); + + @media (prefers-reduced-motion: reduce) { + transition: none; + } +`; + const FeaturesList = styled.ul` - display: grid; - grid-template-columns: 1fr; - grid-template-rows: subgrid; + display: flex; + flex-direction: column; list-style: none; margin: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; + min-width: 0; + padding: 0; + width: 100%; +`; + +const FeatureCheck = styled.span` + align-items: center; + display: inline-flex; + height: 16px; + justify-content: center; + width: 16px; `; const FeatureItem = styled.li` + @keyframes pricingFeatureItemEnter { + from { + margin-top: 0; + max-height: 0; + opacity: 0; + } + + to { + margin-top: var(--feature-spacing, 0px); + max-height: var(--feature-item-height, ${FEATURE_ITEM_EXPANDED_HEIGHT}); + opacity: 1; + } + } + + @keyframes pricingFeatureItemExit { + from { + margin-top: var(--feature-spacing, 0px); + max-height: var(--feature-item-height, ${FEATURE_ITEM_EXPANDED_HEIGHT}); + opacity: 1; + } + + to { + margin-top: 0; + max-height: 0; + opacity: 0; + } + } + align-items: center; column-gap: ${theme.spacing(2)}; display: grid; grid-template-columns: auto 1fr; + margin-top: var(--feature-spacing, 0px); + max-height: var(--feature-item-height, ${FEATURE_ITEM_EXPANDED_HEIGHT}); + min-width: 0; + overflow: hidden; + + &[data-state='entering'] { + animation: pricingFeatureItemEnter ${FEATURES_SWITCH_ANIMATION_MS}ms + cubic-bezier(0.2, 0.8, 0.2, 1) both; + animation-delay: calc(var(--feature-index) * ${FEATURE_ITEM_STAGGER_MS}ms); + } + + &[data-state='exiting'] { + animation: pricingFeatureItemExit ${FEATURES_SWITCH_ANIMATION_MS}ms + cubic-bezier(0.2, 0.8, 0.2, 1) both; + animation-delay: calc(var(--feature-index) * ${FEATURE_ITEM_STAGGER_MS}ms); + } + + @media (prefers-reduced-motion: reduce) { + animation: none; + } `; type CardProps = { @@ -127,11 +228,191 @@ type CardProps = { maxBullets: number; }; +const PRICE_ROLL_DURATION_MS = 500; +const PRICE_NUMBER_FORMATTER = new Intl.NumberFormat('en-US'); +const PRICE_HEADING_NUMBER_REGEX = /^(.*?)(\d[\d,]*)(.*)$/; +const FEATURE_LIST_ROW_MIN_HEIGHT = theme.spacing(5.5); + +const useAnimatedNumber = (target: number) => { + const [display, setDisplay] = useState(target); + const previousValueRef = useRef(target); + + useEffect(() => { + const from = previousValueRef.current; + previousValueRef.current = target; + + if (from === target) { + return; + } + + const start = performance.now(); + let animationFrameId = 0; + + const tick = (now: number) => { + const progress = Math.min((now - start) / PRICE_ROLL_DURATION_MS, 1); + const eased = 1 - (1 - progress) ** 3; + setDisplay(Math.round(from + (target - from) * eased)); + + if (progress < 1) { + animationFrameId = requestAnimationFrame(tick); + } + }; + + animationFrameId = requestAnimationFrame(tick); + + return () => { + cancelAnimationFrame(animationFrameId); + }; + }, [target]); + + return display; +}; + +function getHeadingSegments(heading: PlanCardType['price']['heading']) { + return Array.isArray(heading) ? heading : [heading]; +} + +function getPriceHeadingNumericValue(heading: PlanCardType['price']['heading']) { + const segments = getHeadingSegments(heading); + + for (const segment of segments) { + const match = segment.text.match(PRICE_HEADING_NUMBER_REGEX); + + if (!match) { + continue; + } + + return Number(match[2].replaceAll(',', '')); + } + + return null; +} + +function getAnimatedPriceHeading( + heading: PlanCardType['price']['heading'], + animatedValue: number, +) { + const originalIsArray = Array.isArray(heading); + let replaced = false; + + const nextSegments = getHeadingSegments(heading).map((segment) => { + if (replaced) { + return segment; + } + + const match = segment.text.match(PRICE_HEADING_NUMBER_REGEX); + + if (!match) { + return segment; + } + + replaced = true; + + return { + ...segment, + text: `${match[1]}${PRICE_NUMBER_FORMATTER.format(animatedValue)}${match[3]}`, + }; + }); + + return originalIsArray ? nextSegments : nextSegments[0]; +} + +function getBulletsKey(bullets: PlanCardType['features']['bullets']) { + return bullets.map((bullet) => bullet.text).join('||'); +} + +function getFeaturesMinHeight(maxBullets: number) { + if (maxBullets <= 0) { + return '0px'; + } + + return `calc((${FEATURE_LIST_ROW_MIN_HEIGHT} * ${maxBullets}) + (${theme.spacing( + 4, + )} * ${maxBullets - 1}))`; +} + export function Card({ card, highlighted = false, maxBullets }: CardProps) { - const totalRows = FIXED_ROWS + maxBullets; + const iconWidth = card.icon.width ?? 80; + const iconStyle = { + '--card-icon-width': `${iconWidth}px`, + } as CSSProperties; + const targetPriceValue = getPriceHeadingNumericValue(card.price.heading); + const animatedPriceValue = useAnimatedNumber(targetPriceValue ?? 0); + const animatedPriceHeading = + targetPriceValue === null + ? card.price.heading + : getAnimatedPriceHeading(card.price.heading, animatedPriceValue); + const [visibleBullets, setVisibleBullets] = useState(card.features.bullets); + const [queuedBullets, setQueuedBullets] = useState< + PlanCardType['features']['bullets'] | null + >(null); + const [comparisonBullets, setComparisonBullets] = useState< + PlanCardType['features']['bullets'] | null + >(null); + const [featuresPhase, setFeaturesPhase] = useState< + 'stable' | 'exiting' | 'entering' + >('stable'); + + useEffect(() => { + const nextBullets = card.features.bullets; + const nextBulletsKey = getBulletsKey(nextBullets); + + if ( + nextBulletsKey === getBulletsKey(visibleBullets) || + nextBulletsKey === getBulletsKey(queuedBullets ?? []) + ) { + return; + } + + setQueuedBullets(nextBullets); + + if (featuresPhase === 'stable') { + setFeaturesPhase('exiting'); + } + }, [card.features.bullets, featuresPhase, queuedBullets, visibleBullets]); + + useEffect(() => { + if (featuresPhase !== 'exiting' || !queuedBullets) { + return; + } + + const timeoutId = window.setTimeout(() => { + setComparisonBullets(visibleBullets); + setVisibleBullets(queuedBullets); + setQueuedBullets(null); + setFeaturesPhase('entering'); + }, FEATURES_SWITCH_ANIMATION_MS + + FEATURE_ITEM_STAGGER_MS * visibleBullets.length); + + return () => { + window.clearTimeout(timeoutId); + }; + }, [featuresPhase, queuedBullets, visibleBullets]); + + useEffect(() => { + if (featuresPhase !== 'entering') { + return; + } + + const timeoutId = window.setTimeout(() => { + setComparisonBullets(null); + setFeaturesPhase('stable'); + }, FEATURES_SWITCH_ANIMATION_MS + + FEATURE_ITEM_STAGGER_MS * visibleBullets.length); + + return () => { + window.clearTimeout(timeoutId); + }; + }, [featuresPhase, visibleBullets]); + + const comparisonBulletTexts = new Set( + (featuresPhase === 'exiting' ? queuedBullets : comparisonBullets)?.map( + (bullet) => bullet.text, + ) ?? [], + ); return ( - <StyledCard style={{ gridRow: `span ${totalRows}` }}> + <StyledCard> <CardHeader> <CardHeaderInfo> <Heading @@ -144,7 +425,7 @@ export function Card({ card, highlighted = false, maxBullets }: CardProps) { <PriceLine> <Heading as="h4" - segments={card.price.heading} + segments={animatedPriceHeading} size="sm" weight="regular" /> @@ -156,11 +437,56 @@ export function Card({ card, highlighted = false, maxBullets }: CardProps) { /> </PriceLine> </CardHeaderInfo> - <CardIllustrationEmbed> - <IllustrationMount illustration={card.illustration} /> - </CardIllustrationEmbed> + <CardIcon style={iconStyle}> + <NextImage + alt={card.icon.alt} + fill + sizes={`${iconWidth}px`} + src={card.icon.src} + /> + </CardIcon> </CardHeader> + <CardRule /> + + <FeaturesViewport + style={{ + '--features-height': getFeaturesMinHeight(maxBullets), + } as CSSProperties} + > + <FeaturesList data-state={featuresPhase}> + {visibleBullets.map((bullet, index) => ( + <FeatureItem + data-state={ + featuresPhase === 'stable' + ? 'stable' + : comparisonBulletTexts.has(bullet.text) + ? 'stable' + : featuresPhase + } + key={bullet.text} + style={ + { + '--feature-index': index, + '--feature-item-height': FEATURE_ITEM_EXPANDED_HEIGHT, + '--feature-spacing': + index > 0 ? FEATURE_ITEM_SPACING : '0px', + } as CSSProperties + } + > + <FeatureCheck> + <CheckIcon + color={theme.colors.highlight[100]} + size={16} + strokeWidth={1.5} + /> + </FeatureCheck> + <Body as="span" body={bullet} size="sm" /> + </FeatureItem> + ))} + </FeaturesList> + </FeaturesViewport> + <CtaWrapper> <LinkButton color="secondary" @@ -170,19 +496,6 @@ export function Card({ card, highlighted = false, maxBullets }: CardProps) { variant={highlighted ? 'contained' : 'outlined'} /> </CtaWrapper> - - <CardRule /> - - <Body body={card.features.title} size="md" /> - - <FeaturesList style={{ gridRow: `span ${maxBullets}` }}> - {card.features.bullets.map((bullet, index) => ( - <FeatureItem key={index}> - <CheckIcon color={theme.colors.highlight[100]} size={16} /> - <Body as="span" body={bullet} size="sm" /> - </FeatureItem> - ))} - </FeaturesList> </StyledCard> ); } diff --git a/packages/twenty-website-new/src/sections/Plans/components/Cards/Cards.tsx b/packages/twenty-website-new/src/sections/Plans/components/Cards/Cards.tsx index 8d202c1c10..acfd466d52 100644 --- a/packages/twenty-website-new/src/sections/Plans/components/Cards/Cards.tsx +++ b/packages/twenty-website-new/src/sections/Plans/components/Cards/Cards.tsx @@ -1,16 +1,18 @@ +'use client'; + import type { PlanCardType } from '@/sections/Plans/types'; import { theme } from '@/theme'; import { styled } from '@linaria/react'; import { Card } from '../Card/Card'; const CardsGrid = styled.div` - column-gap: ${theme.spacing(4)}; display: grid; grid-template-columns: 1fr; row-gap: ${theme.spacing(4)}; width: 100%; @media (min-width: ${theme.breakpoints.md}px) { + column-gap: ${theme.spacing(6)}; grid-template-columns: 1fr 1fr; } `; diff --git a/packages/twenty-website-new/src/sections/Plans/components/SelfHostToggle/SelfHostToggle.tsx b/packages/twenty-website-new/src/sections/Plans/components/SelfHostToggle/SelfHostToggle.tsx index dee01f7bb9..e647f72879 100644 --- a/packages/twenty-website-new/src/sections/Plans/components/SelfHostToggle/SelfHostToggle.tsx +++ b/packages/twenty-website-new/src/sections/Plans/components/SelfHostToggle/SelfHostToggle.tsx @@ -20,9 +20,9 @@ const Checkbox = styled.span` border: 1px solid ${theme.colors.highlight[100]}; border-radius: ${theme.radius(1)}; display: grid; - height: 20px; + height: 16px; justify-items: center; - width: 20px; + width: 16px; &[data-checked='true'] { background-color: ${theme.colors.highlight[100]}; @@ -38,9 +38,9 @@ function CheckmarkIcon() { <svg aria-hidden fill="none" - height="12" + height="10" viewBox="0 0 12 12" - width="12" + width="10" xmlns="http://www.w3.org/2000/svg" > <path @@ -84,9 +84,7 @@ export function SelfHostToggle({ <ToggleRow> <HiddenInput checked={isSelfHost} - onChange={() => - onHostingChange(isSelfHost ? 'cloud' : 'selfHost') - } + onChange={() => onHostingChange(isSelfHost ? 'cloud' : 'selfHost')} type="checkbox" /> <LabelText>Selfhosting</LabelText> diff --git a/packages/twenty-website-new/src/sections/Plans/types/PlanCard.ts b/packages/twenty-website-new/src/sections/Plans/types/PlanCard.ts index ede0d20ba3..4a5aba3d16 100644 --- a/packages/twenty-website-new/src/sections/Plans/types/PlanCard.ts +++ b/packages/twenty-website-new/src/sections/Plans/types/PlanCard.ts @@ -1,11 +1,15 @@ import { type HeadingType } from '@/design-system/components/Heading/types/Heading'; -import type { IllustrationId } from '@/illustrations'; +import type { ImageType } from '@/design-system/components/Image/types/Image'; import { type PlanFeaturesType } from '@/sections/Plans/types/PlanFeatures'; import { type PlanPriceType } from '@/sections/Plans/types/PlanPrice'; +export type PlanIconType = ImageType & { + width?: number; +}; + export type PlanCardType = { heading: HeadingType; price: PlanPriceType; - illustration: IllustrationId; + icon: PlanIconType; features: PlanFeaturesType; }; diff --git a/packages/twenty-website-new/src/sections/Plans/types/PlanFeatures.ts b/packages/twenty-website-new/src/sections/Plans/types/PlanFeatures.ts index 369b1f9b01..d53f56a585 100644 --- a/packages/twenty-website-new/src/sections/Plans/types/PlanFeatures.ts +++ b/packages/twenty-website-new/src/sections/Plans/types/PlanFeatures.ts @@ -1,6 +1,5 @@ import { BodyType } from '@/design-system/components/Body/types/Body'; export type PlanFeaturesType = { - title: BodyType; bullets: BodyType[]; }; diff --git a/packages/twenty-website-new/src/sections/Plans/types/PlansData.ts b/packages/twenty-website-new/src/sections/Plans/types/PlansData.ts index ec0b5af737..93ffdfbc31 100644 --- a/packages/twenty-website-new/src/sections/Plans/types/PlansData.ts +++ b/packages/twenty-website-new/src/sections/Plans/types/PlansData.ts @@ -1,6 +1,6 @@ import type { BodyType } from '@/design-system/components/Body/types/Body'; import type { HeadingType } from '@/design-system/components/Heading/types/Heading'; -import type { IllustrationId } from '@/illustrations'; +import type { PlanIconType } from './PlanCard'; import type { PlanPriceType } from './PlanPrice'; // Same literals as UI toggles when reading cells. @@ -27,9 +27,8 @@ export type PlansTierCellsType = { // Shared across all eight combinations for this tier. export type PlansTierType = { cells: PlansTierCellsType; - featuresTitle: BodyType; heading: HeadingType; - illustration: IllustrationId; + icon: PlanIconType; }; export type PlansDataType = { diff --git a/packages/twenty-website-new/src/sections/Plans/utils/get-plan-card.ts b/packages/twenty-website-new/src/sections/Plans/utils/get-plan-card.ts index 492281c3a6..380827c5b1 100644 --- a/packages/twenty-website-new/src/sections/Plans/utils/get-plan-card.ts +++ b/packages/twenty-website-new/src/sections/Plans/utils/get-plan-card.ts @@ -17,11 +17,10 @@ export function getPlanCard( return { heading: tier.heading, - illustration: tier.illustration, + icon: tier.icon, price: cell.price, features: { bullets: cell.featureBullets, - title: tier.featuresTitle, }, }; } diff --git a/packages/twenty-website-new/src/sections/Problem/components/Visual/Visual.tsx b/packages/twenty-website-new/src/sections/Problem/components/Visual/Visual.tsx index e9d55a13fd..1cd7002df1 100644 --- a/packages/twenty-website-new/src/sections/Problem/components/Visual/Visual.tsx +++ b/packages/twenty-website-new/src/sections/Problem/components/Visual/Visual.tsx @@ -1,3 +1,4 @@ +import { VisibleWhenTabActive } from '@/components/VisibleWhenTabActive'; import { theme } from '@/theme'; import { styled } from '@linaria/react'; import Monolith from './monolith'; @@ -53,7 +54,9 @@ export function Visual() { <StyledVisual> <StyledMasked> <StyledHalftoneLayer> - <Monolith /> + <VisibleWhenTabActive> + <Monolith /> + </VisibleWhenTabActive> </StyledHalftoneLayer> </StyledMasked> </StyledVisual> diff --git a/packages/twenty-website-new/src/sections/Salesforce/components/PricingWindow/PricingWindow.tsx b/packages/twenty-website-new/src/sections/Salesforce/components/PricingWindow/PricingWindow.tsx index 786f83abac..881ee04eac 100644 --- a/packages/twenty-website-new/src/sections/Salesforce/components/PricingWindow/PricingWindow.tsx +++ b/packages/twenty-website-new/src/sections/Salesforce/components/PricingWindow/PricingWindow.tsx @@ -114,13 +114,20 @@ const PromoTagBorder = styled.div` clip-path: ${STARBURST_CLIP}; background: #005fb2; filter: drop-shadow(2px 3px 6px rgba(0, 40, 80, 0.45)); - height: 130px; + display: inline-flex; + min-width: 200px; + padding: 4px; position: absolute; right: ${theme.spacing(25)}; top: -16px; transform: rotate(-8deg); - width: 200px; z-index: 30; + + @media (max-width: ${theme.breakpoints.md - 1}px) { + min-width: 168px; + right: ${theme.spacing(8)}; + top: -8px; + } `; const PromoTagInner = styled.div` @@ -132,17 +139,20 @@ const PromoTagInner = styled.div` font-family: ${theme.font.family.retro}; font-size: ${theme.font.size(4.5)}; font-weight: bold; - height: calc(100% - 8px); justify-content: center; - left: 4px; letter-spacing: 1px; - line-height: 1.3; - position: absolute; + line-height: 1.15; + min-height: 104px; + padding: ${theme.spacing(7)} ${theme.spacing(10)}; text-align: center; text-transform: uppercase; - top: 4px; white-space: pre-line; - width: calc(100% - 8px); + + @media (max-width: ${theme.breakpoints.md - 1}px) { + font-size: ${theme.font.size(4)}; + min-height: 88px; + padding: ${theme.spacing(6)} ${theme.spacing(7)}; + } `; const Panel = styled.div` @@ -654,131 +664,128 @@ export function PricingWindow({ <Panel> <WindowChrome aria-hidden="true" /> <PricingHeader> - <TitleBar> - <TitleBarText>{pricing.windowTitle}</TitleBarText> - <TitleBarActions> - <TitleBarActionButton - aria-label="Help" - onClick={() => undefined} - type="button" - > - ? - </TitleBarActionButton> - <TitleBarActionButton - aria-label="Close pricing window" - onClick={onClose} - type="button" - > - × - </TitleBarActionButton> - </TitleBarActions> - </TitleBar> - <SummaryPad> - <SummaryInner> - <ProductBlock> - <ProductHeader> - <ProductCopy> - <ProductTitle>{pricing.productTitle}</ProductTitle> - <PriceRow> - {perSeatPriceAmount > pricing.basePriceAmount ? ( - <BasePriceAmount> - {formatPriceAmount(pricing.basePriceAmount)} - </BasePriceAmount> + <TitleBar> + <TitleBarText>{pricing.windowTitle}</TitleBarText> + <TitleBarActions> + <TitleBarActionButton + aria-label="Help" + onClick={() => undefined} + type="button" + > + ? + </TitleBarActionButton> + <TitleBarActionButton + aria-label="Close pricing window" + onClick={onClose} + type="button" + > + × + </TitleBarActionButton> + </TitleBarActions> + </TitleBar> + <SummaryPad> + <SummaryInner> + <ProductBlock> + <ProductHeader> + <ProductCopy> + <ProductTitle>{pricing.productTitle}</ProductTitle> + <PriceRow> + {perSeatPriceAmount > pricing.basePriceAmount ? ( + <BasePriceAmount> + {formatPriceAmount(pricing.basePriceAmount)} + </BasePriceAmount> + ) : null} + <PriceAmount> + {formatPriceAmount(animatedPerSeat)} + </PriceAmount> + <PriceSuffix>{pricing.priceSuffix}</PriceSuffix> + </PriceRow> + {fixedPriceAmount > 0 ? ( + <TotalPriceRow> + <TotalPriceAmount> + {formatPriceAmount(animatedTotal)} + </TotalPriceAmount> + <TotalPriceLabel> + {pricing.totalPriceLabel} + </TotalPriceLabel> + </TotalPriceRow> ) : null} - <PriceAmount> - {formatPriceAmount(animatedPerSeat)} - </PriceAmount> - <PriceSuffix>{pricing.priceSuffix}</PriceSuffix> - </PriceRow> - {fixedPriceAmount > 0 ? ( - <TotalPriceRow> - <TotalPriceAmount> - {formatPriceAmount(animatedTotal)} - </TotalPriceAmount> - <TotalPriceLabel> - {pricing.totalPriceLabel} - </TotalPriceLabel> - </TotalPriceRow> - ) : null} - </ProductCopy> - <ProductIcon - alt={pricing.productIconAlt} - src={pricing.productIconSrc} - /> - </ProductHeader> - </ProductBlock> - <Separator aria-hidden="true" /> - </SummaryInner> - </SummaryPad> - </PricingHeader> - <ContentPad> - <Inner> - <SectionHeader> - <SectionLabel>{pricing.featureSectionHeading}</SectionLabel> - <SelectAllButton - onClick={onSelectAll} - type="button" - > - Select all - </SelectAllButton> - </SectionHeader> - {pricing.addons.map((addon) => { - const checked = checkedIds.has(addon.id); - return ( - <AddonRow key={addon.id}> - <CheckboxLabel - disabled={addon.disabled} - ref={(node) => { - addonAnchorRefs.current[addon.id] = node; - }} - > - <HiddenCheckbox - checked={checked} - disabled={addon.disabled} - onChange={() => - onAddonToggle( - addon, - addonAnchorRefs.current[ - addon.id - ]?.getBoundingClientRect() ?? null, - ) - } - type="checkbox" + </ProductCopy> + <ProductIcon + alt={pricing.productIconAlt} + src={pricing.productIconSrc} /> - <CheckboxFace checked={checked} aria-hidden="true"> - {checked ? <CheckGlyph>✓</CheckGlyph> : null} - </CheckboxFace> - <AddonLabelText>{addon.label}</AddonLabelText> - </CheckboxLabel> - <AddonRightText> - {addon.rightLabelParts - ? renderRightLabelParts(addon.rightLabelParts) - : renderRightLabel(addon.rightLabel)} - </AddonRightText> - {addon.tooltip ? ( - <Tooltip> - <TooltipTitleBar>{addon.tooltip.title}</TooltipTitleBar> - <TooltipBody>{addon.tooltip.body}</TooltipBody> - </Tooltip> - ) : null} - </AddonRow> - ); - })} - <FooterCtaSection> - <Separator aria-hidden="true" /> - {pricing.secondaryCtaNote ? ( - <FooterNote>{pricing.secondaryCtaNote}</FooterNote> - ) : null} - <FakeButton - href={pricing.secondaryCtaHref} - rel="noreferrer" - target="_blank" - > - {pricing.secondaryCtaLabel} - </FakeButton> - </FooterCtaSection> - </Inner> - </ContentPad> + </ProductHeader> + </ProductBlock> + <Separator aria-hidden="true" /> + </SummaryInner> + </SummaryPad> + </PricingHeader> + <ContentPad> + <Inner> + <SectionHeader> + <SectionLabel>{pricing.featureSectionHeading}</SectionLabel> + <SelectAllButton onClick={onSelectAll} type="button"> + Select all + </SelectAllButton> + </SectionHeader> + {pricing.addons.map((addon) => { + const checked = checkedIds.has(addon.id); + return ( + <AddonRow key={addon.id}> + <CheckboxLabel + disabled={addon.disabled} + ref={(node) => { + addonAnchorRefs.current[addon.id] = node; + }} + > + <HiddenCheckbox + checked={checked} + disabled={addon.disabled} + onChange={() => + onAddonToggle( + addon, + addonAnchorRefs.current[ + addon.id + ]?.getBoundingClientRect() ?? null, + ) + } + type="checkbox" + /> + <CheckboxFace checked={checked} aria-hidden="true"> + {checked ? <CheckGlyph>✓</CheckGlyph> : null} + </CheckboxFace> + <AddonLabelText>{addon.label}</AddonLabelText> + </CheckboxLabel> + <AddonRightText> + {addon.rightLabelParts + ? renderRightLabelParts(addon.rightLabelParts) + : renderRightLabel(addon.rightLabel)} + </AddonRightText> + {addon.tooltip ? ( + <Tooltip> + <TooltipTitleBar>{addon.tooltip.title}</TooltipTitleBar> + <TooltipBody>{addon.tooltip.body}</TooltipBody> + </Tooltip> + ) : null} + </AddonRow> + ); + })} + <FooterCtaSection> + <Separator aria-hidden="true" /> + {pricing.secondaryCtaNote ? ( + <FooterNote>{pricing.secondaryCtaNote}</FooterNote> + ) : null} + <FakeButton + href={pricing.secondaryCtaHref} + rel="noreferrer" + target="_blank" + > + {pricing.secondaryCtaLabel} + </FakeButton> + </FooterCtaSection> + </Inner> + </ContentPad> </Panel> </PanelWrapper> ); diff --git a/packages/twenty-website-new/src/sections/Testimonials/components/Carousel/Carousel.tsx b/packages/twenty-website-new/src/sections/Testimonials/components/Carousel/Carousel.tsx index c8d3ed6e96..906fe43f81 100644 --- a/packages/twenty-website-new/src/sections/Testimonials/components/Carousel/Carousel.tsx +++ b/packages/twenty-website-new/src/sections/Testimonials/components/Carousel/Carousel.tsx @@ -162,6 +162,8 @@ export function Carousel({ children, eyebrow, testimonials }: CarouselProps) { const hasPrevious = index > 0; const hasNext = index < total - 1; const current = testimonials[index]; + const authorSecondaryLine = + current.author.designation ?? current.author.handle ?? null; const goToPrevious = () => { if (hasPrevious) setIndex(index - 1); @@ -246,12 +248,14 @@ export function Carousel({ children, eyebrow, testimonials }: CarouselProps) { size="sm" weight="medium" /> - <Body - as="span" - body={current.author.designation} - size="xs" - weight="light" - /> + {authorSecondaryLine ? ( + <Body + as="span" + body={authorSecondaryLine} + size="xs" + weight="light" + /> + ) : null} </AuthorBlock> </FooterRow> </RightColumn> diff --git a/packages/twenty-website-new/src/sections/ThreeCards/components/IllustrationCard/IllustrationCard.tsx b/packages/twenty-website-new/src/sections/ThreeCards/components/IllustrationCard/IllustrationCard.tsx index 534358fbc5..0505e18006 100644 --- a/packages/twenty-website-new/src/sections/ThreeCards/components/IllustrationCard/IllustrationCard.tsx +++ b/packages/twenty-website-new/src/sections/ThreeCards/components/IllustrationCard/IllustrationCard.tsx @@ -2,7 +2,7 @@ import { Body, Heading, IconButton } from '@/design-system/components'; import { ArrowRightIcon } from '@/icons'; -import { THREE_CARDS_ILLUSTRATIONS } from '@/illustrations'; +import { IllustrationMount } from '@/illustrations'; import type { ThreeCardsIllustrationCardType } from '@/sections/ThreeCards/types'; import { theme } from '@/theme'; import { styled } from '@linaria/react'; @@ -79,9 +79,6 @@ export function IllustrationCard({ illustrationCard, variant = 'shaped', }: IllustrationCardProps) { - const ThreeCardsIllustration = - THREE_CARDS_ILLUSTRATIONS[illustrationCard.illustration]; - return ( <IllustrationCardContainer> {variant === 'shaped' && ( @@ -98,7 +95,7 @@ export function IllustrationCard({ /> <CardRule /> <CardEmbed> - <ThreeCardsIllustration /> + <IllustrationMount illustration={illustrationCard.illustration} /> </CardEmbed> <CardRule /> <CardBodyCell> diff --git a/packages/twenty-website-new/src/theme/colors.ts b/packages/twenty-website-new/src/theme/colors.ts index 93353ee935..d75221cb03 100644 --- a/packages/twenty-website-new/src/theme/colors.ts +++ b/packages/twenty-website-new/src/theme/colors.ts @@ -1,6 +1,9 @@ export const colors = { primary: { - background: { 100: 'var(--color-white-100)' }, + background: { + 100: 'var(--color-white-100)', + hover: 'var(--color-black-100)', + }, text: { 100: 'var(--color-black-100)', 80: 'var(--color-black-80)', @@ -23,6 +26,7 @@ export const colors = { secondary: { background: { 100: 'var(--color-black-100)', + hover: 'var(--color-black-hover)', 80: 'var(--color-black-80)', 5: 'var(--color-black-5)', }, diff --git a/packages/twenty-website-new/src/theme/css-variables.ts b/packages/twenty-website-new/src/theme/css-variables.ts index bd8e67b1d8..691673f6cc 100644 --- a/packages/twenty-website-new/src/theme/css-variables.ts +++ b/packages/twenty-website-new/src/theme/css-variables.ts @@ -10,6 +10,7 @@ export const cssVariables = css` --color-white-10: #FFFFFF1A; --color-black-100: #1C1C1C; + --color-black-hover: #333333; --color-black-80: #1C1C1CCC; --color-black-60: #1C1C1C99; --color-black-40: #1C1C1C66;