From 08968cc9b01cee2c278cad296b183c214dd66713 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 17 Oct 2024 13:13:33 +0300 Subject: [PATCH 001/248] add webview component --- _src/blocks/webview/webview.css | 70 ++++++++++++++++++++++++++++++++ _src/blocks/webview/webview.js | 3 ++ _src/icons/pattern.png | Bin 0 -> 37276 bytes 3 files changed, 73 insertions(+) create mode 100644 _src/blocks/webview/webview.css create mode 100644 _src/blocks/webview/webview.js create mode 100644 _src/icons/pattern.png diff --git a/_src/blocks/webview/webview.css b/_src/blocks/webview/webview.css new file mode 100644 index 000000000..c7cef21c8 --- /dev/null +++ b/_src/blocks/webview/webview.css @@ -0,0 +1,70 @@ +.webview-wrapper { + max-width: 768px; + max-height: 512px; + padding: 0 var(--section-desktop-padding); + margin: 0 auto; + background: url(../../icons/pattern.png) repeat-x; + background-size: 188px 104px; + text-align: center; + font-family: "Segoe UI", Arial, sans-serif; + + .webview { + max-width: 438px; + margin: auto; + + img { + width: 92px; + height: auto; + } + + h2 { + margin-top: 16px; + font-size: 32px; + line-height: 32px; + font-weight: 700; + color: #006EFF; + } + + h3 { + margin-top: 30px; + margin-bottom: 16px; + font-size: 18px; + line-height: 24px; + font-weight: 700; + color: black; + } + + .button-container { + margin-top: 14px; + margin-bottom: 0; + } + + .button { + background-color: #006EFF; + border-color: #006EFF; + color: white; + font-size: 14px; + width: 264px; + justify-content: center; + + &::after { + content: none; + } + + &:hover { + background-color: #0056CC; + border-color: #0056CC; + + span { + transform: translateX(0); + } + } + } + + .button.secondary { + background-color: white; + border-color: white; + color: #006EFF; + } + } +} \ No newline at end of file diff --git a/_src/blocks/webview/webview.js b/_src/blocks/webview/webview.js new file mode 100644 index 000000000..012cce22b --- /dev/null +++ b/_src/blocks/webview/webview.js @@ -0,0 +1,3 @@ +export default async function decorate(block) { + +} \ No newline at end of file diff --git a/_src/icons/pattern.png b/_src/icons/pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4221d6afed79866c4ea2d071e5a3323cc011dc GIT binary patch literal 37276 zcmX6^2{@GR*M0{f`;zS2*g_#ol&zR7gJ>dTuMn~o*=JOik&vuIQ5b7Xn|&Fg6eB-b zrm~DBdkopv`5ynzb*aHS?>x^r_qosgoO9j;t1HIrEJ7?01hJc%AW#qlivq6)nHj;q zjh7@mASm^gDdLiK=!?J2VUg0tVS0y6gSzn#WR{YvFBoY*ui1K^R=jWf$?TPp;X31sfZ9H~7Uvg+=&qPb4Wk}`ee6V6DuZ21c`m9$*;36c*LXZJg z82SravG>p`JJe?wzwXg;yp;(WfyPz7v$4s+L~hPF*r;lrV2NFXLW#NHQ-h7JHTNS1 zCEzCV{<>Qu_x&?bV@QNtFL<4sz`PKSLWU`-iF?en8(e_d0>LRv@I7Db6{)vqae#EG+b(?J<)- z`hG_JIgyzLdJR!sX$IIdlFkQIZYAH5r4*PYbuzxmbS8`5 z@@QdbO$NJjYA0EdMIj}a$}8*BpS7S?lD3e{d~R|52dh(&aafNaC*qqIf^!dn-Exb= zyk1*rnIl4U_E*}ojwOt=zq{4xcY7umSN{j1gB0>}Q^a(`wWHgCfi9oPl}LK zb1_DcVL#_J?{98sf{mR(1lb|Oe6&OkcfBq0zM0i|l~52eI=gd)nyiw3H)je)qjYT{ zajk&y)*klLz3ymJ6Lyt&NTe_L;0odKspALIY83R!c$@H}d3n=rhLtL?wvkCQDp#~m zc3275eU`s+WC{9c?eQu;M@9Vp@A2_*&!)Y- zEh_OPc9~(NFRs~+*YgY`6H{|_L2kkwIf$zdET2!ii_8Q+@VA?28-RV2!AvvW&mu?bf(NeF9sNlj1{_Ces_(>LYLyi&Stq+fU z&}_{dsLdV4*jf#7vBYxlvmA>tcx}jhmrJUEpQq3Bz|8=gf|S=^>|sk5)qYTz{trM> z>>yk7Cs*GY(tdTkI6BnweDzgc;l#GKw#D@FcOG*MhwqI3O6UX3d1mi0ZUBqu86e_= zob+!Cd|3yf<}XpO$04E>(6RNi2l7*Ao4Npz**Q4IB=Ak9OPKnHSid8P2RBp^OEXo^ z$sEXf8yqtbf24>TIX>P}efn{2TQ>nES+EEjnT(Z3wQ#pe=6}SX*v%vM=gaoAaXSx` z|NeY;D?U5yTkAcrO9w17BIqk?zxt921Xw`2NA?_(dH+Z|$wjJwOka21$%S+LvZ5p5 z*h=_tjlYxop>_(`DHHc7N!H+bpn5XCMcxPBh?H%28B%0&W0Irxmn5*XIz+MdoLTb-@*fRk{ht*(zL1 zTh9gHnRHJ0YWCU1e?a@c7e}OWWEv1Yg&=4f8CpL+ABxkN7dxfIr7Xx?9vi;N0cB+> zQg0l{!hhC8J%&G-ztO$i_JMT6XRZP5(mXwKYHQW|U>4=kq6`*?qWdIDicF+zUp&rh zh##|L4is2+4Qk{sUfc~%o_e8fv39*(#ZN#)gn`@1e|VD&Io6=+bBZX4LA!4kN`7xI zCV2n5#v_qFKjNnB7+mFmoiob#PS&t!?4z6)?L1$!DK1i0eHZztQT@)tk78CnV#IqQ zvlj;DA^(7Ym6IOmS?@RX<;}lqqKd{~-cr9uLHw~pey%fuPGo`_+pQZtB5cHW5X3C0 zbQxz~kp2&Q?}1$ma`9wmpdVvE`{BW!|Iyl_7lGgWe-SaXq>QfX(oq^c`)tvR-eL7g zjB1o4{Dt@ioflI)<@xfOf74)QJFW3Y>$S^G1o}|PkzfeAoVzbP;Bvl+_o9>Vo$MVH z+`x6UYC^^0K4-L7wQJ}+;QSO3ozN95%52I0@(;4@`yua@4b*Ur@?}wlkAtuB9#qt= z7cT4wv$bo50o?mw=VUz&f3Hq;QjWWpr2qKvM4Q32cYNHn{_~7avba7vjo-yLV4p8K z7sT_Xh7*~}5KzbiA3J*Qup*9&-;@&g!eN}}kS$uuNB5rQTsS-TsFs#iDCKCwl{<^- z?_?$@btuL3m-ow7fX$B*#Hc`eN0%G0>IEnsJ4e5f?yf<-$|}-XpN{hv5)sj%lZg9r z{DHP``uB!UQs0rboEwqi^3zFL*EI9bqxZLao|J}ssvg0)&Fon_GD|v3<4@POrC>Lo z`4IJ`V}4EvpQ@56kn})jrT?QRMINtrzIzFw`TEoNoGrD93sScj{$O)5#JXfp$kFug zP}1q{UmPi~vcrBE6}7cpQo39Og0Tk019d z9_L1K?g_#h{3$I_n&fMlgH6U~egdB^fxiL^Judc&qmAAA%&NfcgxTL-^~v55y8M*> zuV1u6m@e3X#RlmSAciTe?-q~;p!Wd>JDY_(Gc#Xv5wLwnQ&n*hk$rRAX6P*m>Pu8t zJIV1Xfhu?K5)o5rupRC5@U7U(;)DVO>Uu1y((&I6vqZQxj&b59-h!?xp}payT=kowY%c9moiee}MOyt_H`suJaC zOEL92%cAZF7x(l2rSC@K2ZC|cwlXI2gloN{Vt2I3XV=cSi!}zt-gdFJ7<O$nvnd*Q(h}Wu610K4{%RyOib zdHOBzu7i1hlMOOVN{xa*6nSKjRo0FepZSGb|7Fx3_UB-*NO z@w0{<@G-E%?dpRlMJ_bobknut>e>l&&ju9xP1er9 z_u?U?jU`E3pvdgZRA-9ihsOS`w}3;c7W?DePE)cb3E4f&7X2Ki@|-?7=PIQu(hm13 zUKX6YDqJpUHC#i!Eg=T9$tC8%<{!;BL1c0GuO?wHBE)qACp$ip#Y}cIQ&A_|6Xtjz zdH_)}S08z6X*k5JtSQ}o#7(lp0@WqV2~fVhy*f2w^2yen0q~e#pa@e=aa*7W*VS)} z-c(k}2N#mn*lk0-?RLmh4L2s0gGT}6C0k`&Bs)ag_NqZbF&l*LNefhY{r(o-6$OCr zP?Sz(JFP^KkEy$c+<}1&2*(AYOb_B?xZ;b_$t;q7nW#zdnPYo8yscXg@fV`T-gHl#=el zKtwRQS6bct5*{J3|CWV#qLqRx7940kInf-i`JYWFEqsEYIR+M7on+p0;z*sC^nc7n z{&C^V)M?~7OV~tLs+|+B>)JQd=q+C~W)5T@LH|?4)Oj0w#2S|kdcphxq)fjPV7~K(&0`Q<(aVp`?7Rz)2s{J{?9t zjTlNhJaE}Uo5}n08Z_MjKNw$mp|vX5ub#49e1$FAjN6u%z^V#~{XlFPGcjpN75l9e(pqdF!wOM!y{Wb3Dk*fE@fl zq(tk#H>&kAy@U?&ie_;VL1?bQ`A<9_WBPL)RA-3&NkH17(+u8DCa%!BSKuv4_{A3axg%#$hqm3b-ZRVr) zHkUR&E4z2!_~H0AA?|TP>1`$}o*z%1w`5&uKE^!rK?sC|MSr=ePeKs|+jQVnK@7IJ z8h+qjy)ke4#o=O!OU(r=L zGGG&on+S_^m+athxnOH+PqpRkb5dwVWA^?nu1|-X?IuCorjP~xP{@!u5YcdE*5C4l z)>+ZIGd6}qmgw43vf#&6{fD9a0C;7!Y^2lg!skz140L_27<_lI<;jkwoytw+D9MiS z8n@$bTJ#P!xTU+Qx0_i^;6jW6KeEQeJeIfM+rQfh6T9~1=XpJ9PNW<*b4}{GZ2MPe zl=Pla%udfLJ@#iZWTmG=BBm}4M;q7@LuC+icHa-&KR^VPZ&$TE;**J*E?%3=p@c`R z`qX_^Qha!>PfH+f70`x@0=@}x=DHL6xVOh4t7M0h%!6}i!_RxZbr-t5JPx;-Beu|m zW2)(W^(WnOW@JeFwNMpffH?QTYd3+AjD+RtT%@n3>0UV;ZDF-BaLR_&ynp{hqqbW9 z)wcAH+Z>96vq(GBM^(}ZLt(_cPpTu-?O(uqQU9^(06xy=?#thu;^yY<6W<;-Ki-Bv z9mCb{owQm+@&2OTQ-M$a*%(4qH52Mr7i>)hE6MaJ>4$!*_rRbKq&%Vg^$@%dKL z=@`2!yAN5KvvEY1rEWh4?401jZ|VKuM{WWXXoVe8u~@Uj?I>W36=Heit~gpC#NS+O zseW~OKBu@I7)*HidPtmid$E_^HEDsxBV4+&rcBZ~^zq$QUWgM zcYVmc-xc0MiN9hgWuMP!rDe$UhEc=Jb%#W|nDeGh@|SQ?GE`*=z3A*6flU z1l$f8It-2dTx$<$q`DnT&&UQkYNG7aLC@<)F`w<~Uq&qbh4-sBKllOx6QiOmbsi?scDE~o@T7_67up9|Z)#`v>C!>BnfRkRRnRoJ=Xj z&cQtntGsetZqATPx3+`%VmMtB6kKgSy_5^sS&TS?Ar!xm$#W^bp*Se!ogs(YxdLCX zrGrDQDoXMHTH%mC^i%NF)8MJ325GjoZv)0%ig|SM{EJIC>wi4DDG_G zg^5|1POo|o8or>$Hbqug=!EIm;?=;V5ecVCpKR+wRGUCF`>RuD0mn(gcSB#96Ru9j zxCs~{f__jS;bR)tc5A|^L{*Em;X{20bL?VH@y=(}q-L>n8{^V&bS7DBV59la-VwL1 zFj0?K4}*GT3q0vVmAMb%ymCIYQLR0-PnQdn&-<50MT#x&IhA(FO)P}x+q6Hea$9(L zF^aHJy?ie-)Y9m9#)Fl%8*4HJ{^dbqLd--~nHai_o;)Eo&JICTFY(6epcOv+=2rH9 z{&b=2^-7YNcVv+_sIQEU-+sycB5qLXn0eN5&MR$?c)Wi_(rpZKj2~V^^TX!iwcpbR z=!f#fd{wj{(-T8n=l9qv{;3NcC{Ss(lHY45I1Kn<+gIuTInHa>Mg*om@xq5YTy3Ve z#cvwEy5rRr=l0i%7y@m>qf5&7TbxFHPInhByiARAYr0&P<6ODBNDt**qn}{f`|drS zAE<1Pa4e(*mxWjz>e`p-L*oW~RD+F|2fgG+{%uRVy=N`fw#NUpzGcBwH88F&^0-~v z=Z#hds)0M2^X!^_MujpwT-;GCln=SyEAwFYP}t$}596pG$Y&$Es23bDOu_e0W!b*E z6kb?Mqql57*ltrdGnFtygXxy+2aj)t3WZPv3UmwLy_$yeUaSo_O3Q~#s3g}LSP z<@7^z+q!p8FO75=%A>RWfreVeE1x-YUH1B5G`dQazuCaty0&2VVfCN)R|6%hu?3Gx zv@L793i@`=3<1_eR`1zj^fN29e@ESlrwi0`yoFXP_G;l=K7D8iwa{;AZ@{w8TJ(2Q z(RDg7$P(;Sv#ThiwgGL{+!@c-9@^rSW*p zn*CDmNwj`p+n#Yk5l_1e`9Ew_3gAZeqO`bZh7h_)x=*iNWm$QZ#Sj*&!_aQrB{W`Qg!!H|FmBaN<89<8Gqa4s2`l<3Lc*LdXY65YF2th0$z}Dk92EIo<*DJreQ1zk8_on$Fl<~I0zCtLcmZa8 zuvffIRO=9?M97FVCSJjOJ9%I4mi|aUcJU4p!Vpf1UPNFB3NsJA^S1KVy6k%)khJ8w zVlYh0>8Ayp?^&V5y?=G0V&1;_VG~;4WQHzc3Cm(7ikp#746&8J91*|!w%F?t_74yl zLf1JqMirwL^^ddZ3>Mj5Lz7O&$Hk3ZyUBD09`S2gs^iKYan%UBGxaZP=KsU2Ji(=lZ)!ZFpO(jJu=p*P9b2Tvaxxe zNcpi5LgZoWoN~tah7(k)*f#4s-F5v+iHrA?fgy0bV#3@lyYh&rw>Lg@3hLf@H*wQ_ z^e(Rtebq$~{2Qt3iBCEjo)?{Heg42&^-)AXSGQ%J&dzPV0gj8RYvP#_PrN*;Y%aX{ z7G82`1(RiDM}?KVNIB$K_g#C%3~iqdokI?^^dWB^eb8( zXipivGqvX{2B_s=@trYTYV`EBnB@Ih)vo8dGgNeD%42%mjZqo-LB>ms9btd&ho z-|o^6%=JQ5VF7{APOvRDHDUtR&uvCdZH)qLzw*k_3_Y+%p6C6$SM0TUc1<VC zCfOgW4DnW|@XFz5mK>AD?{|S)oI!P^2*jPend8yOHE97UrK8X+t-1>IA8BUs7h<0(?r(sLg)&Mq}c5lxl7dvMi-Iir_xqvhDe;H|>z~&5s@N;vB~e{*^b|jdLS`yKzf)h^wrnfxl-=k{?DuE8o)OXc<_sm~!P__f{e2 zkP01pgK}ZwZ4ZGjkCD?KulE0CN+=y+yM;jR#2I-2qX+Ot=L+FwkU+mm z*%jKSy9sb|u(OYX`~r;&I@4C(ej(1LtE@^aFsM9|?G})%E z0SEgc)|EUC110hwz#Cja05%QIT$80T!I}otd*r~$SY<5(G0;WIzYzBC&*^A;`0kTk zVv5tO?-m1NiyK6nw>8_^+9In5WPKQOt7;GT1h?Qk;nh4~``_Ax5;}|s`p#K|M=Ob} z0S#5{fiH3fwGjh1;63k&33s$q-l{}%!;#xl<%PXQ<3lbH5_;_#CEgV>R32hTRvl5Y zh|n@YsT6pZ@LoVbU|T)f(m&|@!bA8w%CEV511$2>x`=gY%jxM$%xBw4-5$e9aqz!c zxMG|{fhSL2clJ)C2DHxTA@&?=1lzY`UOfPQr#br`PVdhv?>U`eWMmxERaa+#hbJIA z&3dKwZQndv(N!523oH%_s@9|N_N$8ny<~{Ay&ky6#eHDcuTEUgS7DR#%9(j=fTh4z zc%f&g7Pcym(35_i+qMvwfulTr-?Clhd3$^N@qYE;!4u0!dG`Rx^V_OwHtE5NN~Ico z9dY24k`IM`mOW+6qh!2a!4CpG<4`bJ!N>5DGb4DX90dH}O8xrvYX+)InS+h(Z{>E- zF*bJg1NLb6s+l~nsBLBD3dr}U{*TJwaPA%4@ryrUuH@k0fKV=(1mK)smd|M>Ph80G z0UX{7>6j*c)E5O7e5EV`{l=%~pJkhpgpTlD_C((d!3jKwv6)_FlkD(sd-;B+UA)BW zw>Iwlan~T=O-j=}c1})ADvlSC&Jf^$!O(1N>=R`j00r-KcabdN1rI!~EdTm2I~Z)^ z4MrIPhuWvY_2)V1TEW+0YHF&SsXP(T&|8cK?r0Ml(fqu9?a5P3#V{VdruWAsoeQN8 zl)3tPclY*kW5@__i>r)cWI`GBC7`)24o*&5%9NHq5RCMmS1OsF#0&aoUuisfD&b%r zdcfP4w!f9VQ{wHqZ(q1jmT)wAabhUa*bjrj3^K9W(mRoxFVCELClzx0_MZe&q;6!* z7D>k#!P!1K5hfNb2Spcq0XrPJbO!2y1Kiw~^g3`4t=xB#Eg?eDgALb}5&;SDbNBgq z=yA4^!4fgAKII!BEUmAf*I%SkX*pC}Nt?`yoL2IhE#NF%@vma9-!5m@`muM+kzs&f zT+F0-QW)0ME$-KHO?n~LgCJs=*KdEYElf|=ke@~W_iH;el46=yjxWHJY{A;z-X3MF z^up0J$#>^BjntQn5_4*Jx933YH{$9miA0(>%r!K0TO4R2K}cn78K9bony3YIsn)Jy z1ZEnRQdaE^Qfpjd39yJZW&kuMB(Y9T+p7#AO(Uo3rawT|adBs%}>8mCBS zSZ>wg?7PL&^RWilPPw#iAu9JBTwExe(Ei2g1FV}sp#hfvxFq@u$?{Ieo@O6{*HeGr z^ABT+^zfS^agkRG|K8iPfJUq)KApDMJ?m!CpZ98UH_QMV-yGm^_>gNdb^%u~3Mz-5 zP@Xb=UlTIz3`8elj{=3pJ{}CA870czg!#=;sYIyt0i-WcAP3syHuBT;VBMNreX}uK zf%4PDv-fkAsrmB_hX&9QAvl5+_6lztT7dbGUn%zv*B5L0T{u+;J$=cf5f8 zRDNNb7TKH?*BlQ*)nc=-Q?gM3ic((pKkS|HajLuV`oWtsSE=gW(eMHqXt%FI%PaqQ z4E9}KTV-FHaBh0+EJ6?glh21v|(#)Vn3CDlY)%xU(Yo(pp4)5bs14_C-%B|G?s8kK4l07&$a2(sTJ z>d=3SAk|~%c%!1Cy1y^m%|9J^u9v6D^8}H(J$C7__09v*qYBC{bzMn;ERt!ulxyGmOn{y84X+#4$Q z-x>1s^+JxYR{}#63M~oT@^M2IrlV#_(M3g}7u z<-oLHuX4bYn%y2l5>KB#)yc!@k5kT~GaZ$)P|h6VVZqkjw^+a(39%L|>FXgO09jj=H4DT* zH)&1lzRLGnme@~3Fs!1Oy`u^b$G}sySjPFmMU~Ll-Qmq@5UoHA3SNAHn;nb}y{3wb zOqcf1M%$Y?hRYUu zR^v;1NU(g#2h8SHXRtR7bv-{k9X$kmt_VPZu1}t>5C#^)$*5@#6gNAzKk1yBE}B!s z-ce6Ai3|j6&I?d?24ISxw6FQ?_C0;IlJV<@^@xuMcK{wtC}2n-Co(MzTN61r96G=cx!kwpKvw) zb{+jjp##3z_A%Ixk^TE>Q+Z`7;5K{w-f<{C<08-2aUm%BwrZFa@)r{E*&n~Sn|pWo zkiT7J=J~fj72x}lMgPp*;g$wK_qq%9wy^EzUO8jG?N%MKiv{HhLgA?^T`QUa~ zUcUzsCzw{`hig(Yyj=muiXXvOWVy8!v5p5@_dQYvhx|@t%CYf&#QNR3k`atT_LuNW zJ&!=$HV`6y^xf+Xb|R+Y2wVnDLsHuyntY(3h>eL$+^w3wbWhKimFtbE0N zQOx6Jh;>gykPWcBBfy%Al#EU+(pcBe{q!&YYsz5w33_$P{OsBt5ILnS?X`d(#^zE8 zpHj*nut5?96`*pXy|G^iRXq^#6w|YjRdY#FTN=+goHcy?p9buq(wt~WwOyi=t|n_& z4HZ7WwXqQue*1Pz!km!Dn9CDaTlhG89nBEF8wA2&=<9DJ9u+uTGX)53E8MNvt7f6$ zkOh29W0OwWw?8nCG0yRmk{$PX5;|N$drRZ?m%RU3hm8ue0Uy#HsN(itBH)2RfJZa2 z4cE%7b;MFitZ{jUh_zUQ2_@jegK01T_YcHL<3be{8fZL}8u`9e2G{^2Dk!)k3ITW0 z_B&3;)UmW?6FGEEanW-#WmY5qPd zAs%BR!d#1Vl>t8^l1|AMSsPW0T@!la;xV)I&{Hw$@vFp)YOMrcvufDjEKQs{>U64! z$TcF(n!J$`7G>JzLjj$*^^J`)fonT<9e}@tMLHAcP1=k^Ia~=L1pnVL0I4i@l9<8!g2>2t5yYH$;i#5BdJcutq&O}gg(8HOxh_u>55;$|c zcpL#<5C*YJ9sqztt@_YUBLoH{nwCPwhh+NgpoF$*9w;Oe*&X;IBEjTB@_oUPa7O57 z&B1jiGLdCGWomVM5!Q4DXMT8`TQ?U+lLW8O^a->#>Fej;erRz9I~dJ1m(6FdL(sdP zv)Yv(GLI=~hP67jO?7#pb!uN9XoPMaUA6Vo2qu)TGVIZKGpgTF61n5u; zSWB0?dUIprKmoY_){Kix+BXc4Gz9FNc1sZLA$DvWUm;D7un`;s60K8c)wyNs)^F*V z@71rYPBp#6q7ds_2#_{b9?(ux;-6ECvsfZex7&tg6u;k6U2|`V_)unDZj7v#Wi>Eh z&O~jN(%&lLdL-KUOI+Y~Q`!Ah(d%Jz!Q9DH`!dnKkX}0QJ1caA8oD}gZY`0SbYZ** z&MX!8yvkvJf4BlB+x7#?KdI&diqIi!?b(*nJmNxvg1@dHEN$GqI=n30`5S7qgkH%WQBI9jZb3odNI7PP&>v}z2zj^0-M0au2Z35?=Sf+j zR}tojcTv4?|nd*JO;72=BxT^JG}KWF`v)PFB^KXycxrdIkFLTT+O{`sJgY-{;R04aD;*y zl{HQcB&pO>c@HbLCki3E{*Sic5W)}X=Lwlg;#$01nyGRg!%71{`3dMTLcNz10t-E^ zMm&{)jOwL)^@&Y?9?Qkk>Y(|XrLv9O5VQ*tzMuiNyC|KAl;)vqeFF5G;yXNgMC4&^ zw{G212BRPr{U6)L#>N_(Ls4Cxs%sA{`u!3+r=}(Xwwp=&!ibmvEl`o#qQ3}I(S2wy z;ZB4qZY1ACTCZxiTWzAIGG(u;IvO?FXTO9AAzM|Ii) z5-|d#>3iY;tZT(yV*(uU6bHEONrSJbM=ojW^guWCLM!GQG-HrL8et%?BF~**(S3}) zv9=SL`Vkk#6|HXZAp=(%Hj!%bXR9cE7;3`T)^2G*pc3x_7An>D<-!qoxF&T;k>b(f zk}5K{W)g#)Xn9jwjNGR3)7;gs*4#P+oxx1%E3e;`Eg?Ud#w$rr`}+DgnI#Y9#ZoK> zu8R6!O}qr|oQ&g#M3~<4FB`q3F{&ux*MH=Jb$5bHXN;X|0qt5$mE$K6)Wd-3&g>9~6<}sGcwQo`U!CSa-YEF! zljEVt-R!ruJgNx@E(%<+)#R^t?%bx>gDAVoxOL4WO*f4x`_=#MYs^Jytwi9sex_l2Q*zvJcL{Ui{AtQ%|s1Fp+7wG9DO^% z(0r17Ln0=$Z+W!QpD`LR@j-yremt~%{l`Jn!*e?hASLTU5_la0gr%u$+8SiHkqUzN zEO-jz8rEcataRcAYA7pOKby-1STA)w$))#ECItos<^-Z zmNzyx4=vsj24LSDNZ}=nq4YP>)`i(GJ3mGQ;khQ$Nc+D*j-g2w_>v-}1@yDJNBKG8 zX|3WXC7NW!`@$oc;Om=&C|& zfdj{@pO#~I#$uP0g3AUAiwB;(G}}@g&ESk3By1>gpsXUG4b8&S)A#-rg&eZ1pFRCpoyg@kw8QeLwngDE=2x6`EU{XQ?FQRF2 zztK&AHK*7&3pEC&%vZtmC|=uTT4SAmCEQ5?18`t- zv~H3ds_ca4hhMy;NY2R4r{x*~`qwx9c^fTQt_?oi8XKV0k`DG@`<&&!QupjY!*^IJ z^=m&Y8hfQ1)li+K*osrnaV|ic>j@?x4ufO8 zrjU(XFbEKl5qvii5TH=>6=({m+s7bACu%sx2a%HY${36(;i zg{3Q$Bt&YmP3^cG5LFnBJ((RAp(XMKME-G)mVE58=gc>toePSeevh`z`AtBS<{qG{ zzs|1J#*8GZN35(#rKNG?08c1eiDhM9C&T zqLKgVMn5Ysv>s?D1-)F7xYH~JyU4uS>D-D`E9trCvXQH~>v7Y0&+oY&1X66s%)R;) z!MJzNka#6?Jc|Fz)GCvav9Zf%lKwA%9M0$8iq3*{mLIM2I0S@;EjVO=5t~8-SmEV2;8pvCCPg!&I(GL(<(=(Xd1lJj#jGbeD0Qp1u{BN*j71 zQNRnH)*2`v@e4~&SH-YSe78ojt2BaACtuzYJfzmwo-ZAqMv)BWVox8KJ>b47)S7}% z=LDzj{8Om2*f}J;;TaZmCwln}T!VrJ67#QnMSTDnM$V?`*0mDCtKS1IMX0hWK-QD? zoXEF31^QJidxf`Ey`*^(ZjOKxAia#aV8Af8)+Fzw!G3)Dy*yk#0ud28EzA(m$W>qi z>R|ANn=?*`bz~{Je|UJW44@#Rdm26NzlW4iWN{C^nXr*e7TY%%zuxxsE3;3|3?@G* zZ5>1zM!YrcYxO6)9}>2E!WVO}Eg~tMG{WzHr+$piXh>Y%BrvQ%+`hxj5w*vm1jHv1 zkW?%nEA|nFCkwcIAWY?8+xn0bIPzH@l7TTk7tp5#;Q2N-=1fc+XT{a?$e)d# zG<)W!XK>rH|FJUgTGEfwE4Q!=pBFnvBQqSJ0}M#{O0drSGa&QIT4!8XaR zpnsOJ{_RiZIWX^wr(G;dN?pHJHgF8pWoUpUgdTnn4wEU6L(2O{o3#uU@WM7&xP!|v zOmu-v(8d0bGOP~X@pnB{aq30sDWKiSd66}G54S@n*}(*!DlqN;7;<)Pxbw@GJQIWq zBjkY&)5~}9uuntc8=xjfjeSgy#|QmH1YF#81_r+X8}GIwjusvO1UB5wnR%cwRjQs* z<w`GJs zN30*B+<%q}fW${I;;{t_1Y>hE1SyTh@JC#eZ6F3fdw95gVucC&bp;EWU@1Ap!S5Gy z=Ut9?^#jnNa&$lO43(@gTyh}K*1}W2R+IMiAetn8KSHu&7$yRa?wnf5^pYKmu+z}C zxxYWPx9MJ}4{Jqev&@Ak?>8SBHsUm+eVd91(qEJbmwyA^G)HKhKi}=~K@PB?615ht zYWaxc`ZJ8w*F3;QJkSYlOS(E!ZXRgg1>CLk$ZV|RjFKHL^xL7}7kj`hk{&IvRxv0I zFyi^L^ubS^Q+0~ zxq@t~mD+kkr}5u%Bsg<`0uvLg2rSK+0)h<(g6$hgxf>`@&iM9T3p~noMmOMC(fL7f zKR$!Iw`L3h@JID-wnRHN>&0+!s;u!2Hv0pe#1zBj4=T^Yr2RAS@Z|J=;gSsFEIMhB zAGD%|H@d(uo&fpX_^imdv|jtBh+vieSM$dej79Bva(^J`FazS>n+JTmfmpxqfu?&I zxVv5n7!CB>N96HMj0+-;oq;E@b6Y^ndE&x2xt(4!doeEu1?Q%t$}f*rMDes!L6ka4 z;rBOzwxJYWAo0d<4L1w2I`R#Qu7>WvwpQ4v1BQ%;#F!w3{d`ad6Y~%|DwNfav+Mc5 zz_=y5m1+i3_dCWiyJYLsjpKJ$k{vHY%JzvLaXU@n z(z$?%dy|urbj4byz(E~o8&oV!2WMUk(*e&oc9 zSu13CKUA!H!4%R8maQyV;14wZ8t`zYwL*20lV>#T&xQtQqM~(#k`8NlB(OM6`p{=M zOfL2?4M#CBYj%Ajit#2yFbeQr6xpH-SVb4xlLCCug%HK=X_#eAhu)v|pY2)Tl7UbE~Md z0z6vglbBDxeHjEg4`qEdw5iBtw>lbpYEH4K2Ra*j$ZB`<kLwsqF<0CIqOOymDb=0hwQ9P-=k#otfwn7N8e>5@!y#O&>8dAiSeLN(awJ5zMzoC zv$BUkpV{^NXP#mQo`ouANO#gQ%;toJ`ku=@z%Gc3%V)(eNYVass#)B3P#20i8{Jz5 zd(#`DU707J>7_vxNMG+|eAz;cI_GCxrTILZJ+QLMCkcSe1G0=Y+s2d$sYg#nubhYc zugCnMOw=)NNu)JeKNf=mS_mVC(8-912=WWA@`vI4rU(&f`DzYH;JvC)9dx-l&tUob z6`rfaU795P0)OdZW4<+cZNlMk8C^zKm|ish;Ir%1c5D74CNK5W@+dsiW=KjFDg?m56y z1$YcXXSzVUk2d^3^W96u zm~9$zgQoBnQIf*46rp?0(-actNPd;H-9tJ+te1b`;{zL32IYof4GRYbl@~}nnyJ;F zSu#!)N1`cS-bMkFUp-OPvFfEf68OTi)whY(o2Y;GY~XpdeAX?A%x>W4YXFBSKjwpo zzQdMFfT3<)c)1J?QL~??R*jofx%&X(+o8DTkKmTV4mWP->FVkxt*)+muCK30Qo0S1 z^P(yTCY8Y#m+69CR6xO7zo2;E-PDEoY|)6mZ47^JL~pdh>&(rSx4SQ0XK42FF5(L8 zSM;R|WKcWa!-~=2(tY9osr-2I`DWs&iJhz5nANDCqyB+Pjm~z9kANqv(a~@P4>5Sb zWBepIx=o-aGz$JCk8B_SNED(qx7FcSLBm+QHDbZ!yX8M&qg}R(;eQ72l*)S;>RW^G z5eFI@?2;9H3qv}w*dx=pWWghcYba7N*iY3`N@AzpzkM6frSjCW1Xaern-88llLy$K zm7?`jLDc~CoZtKI9Yd^(L;np9YUqGpIcORF4A}zvAI%>EwCRpe{}Y@J1j;u6ISRN& zgd<)&;q%Qc#}F>*rY}Q{O~4DeDuc>0B_1_itxG5JVX`fa`dS86mbd z*Vp&sX>EWsSzB3wEK-6nm5&4inC{hSxAWUt$yb$+jHPT0&4ZhQM^3_(T?kHv9GBSL zgLd)1w;JZxVGH&P$V$docC@c!NKf`gNC34445|NI> zFu0amUtoUv(R;V?uO@f(ws5t6p7M*Rt-bNzN)beU(M~Ve6Q1Ain|xZ^L6rdhM`E6H z;^~cI>1_Mr{`r=ws;bm`fgl%)h>H`m9GU!FBiQn>nH9)8>g zY~U%B<!W{8l2I8@ibp?v%Kp{>l&ZR6#Rjt+Oos!X>SRaOGky=Is=GLrr^%a*2r+cI{VunXCfwk%Wxo|x#ujBm>8|I1Naz)(Em=NXNo8ZS>lM;@$0=*SeyMKhb`>aAY z`mrBD4+9LD)HAi%TY_+5;nw9z=_Iz1XlXqj`CuA_VBN9@1a~3gqeJyHJqT>tqONd~ z5s~fHT$0)mUcvFps7F?2oI@Sr&`SQm?5e3oVIN;yi8^vX$#KcU5@2Wj?42pl$|J9# zt$&Am+605DFBrV_Perv{=8pKL1yw2cMw%vNuFL%&N7n&Qb^FDCD5D}Il^JEv?5%VqSJt(+lxvsFLa2CMi6VQi zYj4@RNO6&!tz@qXixG6*MF$={j4V+xaeTlCIT z50+gAwZ&J>o1EIZ&n>E=HxhG8bw}^{g|`c7xQMvpVTWoxQ%!eIPgd>O@2iYRp0d$k zYGi~1x61F@Gzq^KVNJY{9LcrZ=SmL=UWoKe!BM%nyN6QuW+33L8Uo^u4aoo0r-mug zhX_R55A&Ll`UB`E5DuE8W?qlXkoYyQyu%23SzFGzE#qxBQUZD=CJG zra=$_)*9VJ%Q_-wP0;+p?YTm&sO|3BwJ#j$^S?25ZcPo_RR#%1_BU?a_#@--e2O2a zBT5bVXPS!1kMAHf%KwgwlD&&Yi9ErIpUAN&k|HxRGm;|Zo`iY2g}9j6 za?T0D=yrq}vX64$05srpZFJll6uUB)6POwrF^H(^UHuF$NsXVr6N1#@UoJIMEUc_S z)IY~Ke!{WUM2_94L0xTaM8&{qQC7BeNLxuSx_R|_E3mv}O^S_$2z#CuneB^2s1R~0 zCH%%N6qj&8x}Fb0xT`Up%rBSQZSnJs6iC>NX+Ehx=20pi=Zg(}@wXzbe}wlKinnvF zFa%c^zB%{k9j`B|rU-WKF>P-sYHJ1T$N)^=45izV$0^k>kR=K;pb)iS3Pvf!cg`w6 zK?RIk45s-z=2jQ^p>^JJlG?d<`FXPJUKn9YcCW&p0VyygDE6-4_<3-mZBqvCC3U_3 zE^n2#49Oz?$;rvDgRlh>hl7?@RzG21iBkUO$9f$A9h{aYf}`$z>+R*Gus*T8wk9ZT zxxKYDj^PDo7qdldB*=WxZ$#AISz6!e!1zSIA_@vej>tar`!ce!l9@*I?nSBbQM8m^d7@*ZJ3-bnK`6QK@on}2@x_+dz!7sB@<-&I4Q+~ z?MOt|<%f2Wc@;UsoxN!5iihPR6KJzfuoZYW(LYUvNJWFmq1K4__XDXlG22(*eLax% z0(zFL;Nakpy1KfB0@uXEgoU9~vI!At3to7QCMgaeSw_2@6TQL&&;yB(##wQYnp!H!iAn_OmfluJ|BoIJ3pTF&ll!N5czXJkK4iCH ztF5bBXJutoB((&5)-f|PQ?9B6*{<8n<${X71uyQ3B+j^BX0QDZcT(HV)J$t3ja&`* z0zhRY51G99RCdSM65aw||cj&`9&IgsBH}n)z3@#)w*Rw$7jde|U2bQDS#c zo^W8fzqxzhjwB<~*#IqdjUtIu(P?#c`@W~BxbsLTt0othmKfBt`;U?7Rs3l2`c4mH z7spEZ(4XCCV~f6F_ax@_C!Cy|N0o`K!~Xd?nj^5dP#-`q&hGajZtBeRB8--ob!&ZC%=CE`W(RIdw>6?yU;y(?=BLPT2 z@p^QPeXgyo^=08V(A4ZXe|R63>Jpkq6c`H1%U!?bnt)RMK~5g|O#Ce6Hc9|aie5~Q zq6Ba#_G6%qIu3|SNzurDZ>~T%Fk@@wgFQhb$cw2l3|9C7reo9HY~J$Oq4g<$(99bZ z3V%+s?=^t#T>5NPTAUxYsb4$;O_`Pe?8Cau=I5t}^EQV`R8id{oQtC6{oJZev@m;f zqUke2ir7jVH>oArxOg};epKP0G_A>U&Tl|WU`a|NgxV@4azhGH>!M>#fl*xss;s7k z?WT(Vs6PUc!S3yfAieD6Ye$y*+eJ+aYimbuFJ8!_Ea+Hoczd0lj6;mg0lio00mM_Nk@*xkzxdi}x@_Q>gc! z!|(qk`1wIux33sOmvQvq&r7D!dandBp{{UQ%uY4&df9v1g-Y#E77Mqwj&WGpE6AGYK ze7M8i1U13Mx72w2*aE7Fn`78M#@5%I3pol2u#%4m_;#T&Ftpre8#9$hqxwvfPCM6{)ZnRZ_-Dcys&3Wa; zg}14DX{#tsh6FCU^g^>*|Ke8cl2i)f95}3SqV8FJhpqNl;T*??@~B?wpX@u%=?zd3 zq6XmlBaRf#)#quoTXjNddi`LchqMTP=N?KS#jiO27Hq5rw?jY+rD&eBHeW=2h>4?| zV)#aZSWpEjoo}-$y(g2@$ez-(eo^UwwwWUJ`;>;Ts|QGG@nkp-M*3=kF?C8c9LF(U zQ`!`n4s-vt4Es(IiiGkl_G&W2fjpxB$K(3#u*cV}E2@FJ$aH!2X-jzR(tPxRr2-{_ z>9_#i;$@r=m*=NgUCNS`au#$!gb@Je-zNsVNheLH{JK94MVQ)Yq-JUy-B5anCg^X%9#`l0~cnaQ6j@bPl~`}gl3 z5FBZH$K1@$N2t}X%vw-)Q1|X?O_JgxY1qsB@pblGTwI~FTw|yF)Q-g}PrV=`D|r*y zH+AJFA(2;SE*^H^?(40sDAHy%q+TXTW9kA_y;f;)ufT2t{&}3g*KIjBgL1P@(|XF} zKmBN=6Op^jbWY9<9IQL&0taeq2~_CuSvHNi&D~2Eve9be^R7rBNzEuUE!)VP_D6A%C<0oABU4SiO(R8t;2kszEM>J~F;$haNSLU(v?p#+OtTlQf!q z1^V=54&x{C&ae^OWDXy)qc5Hbgys}7gqkX-3qEnIPG$sl#VVD1i*B_li;|uI0LcJv zPfm8WvhHS6UkTyh0_DLDxgapdEV>zoy?vXKZD$-E*R#XV61y89bYRRg>ttSY0!_l3 zVJA;lI%&cl*ACmL(*NN$tVom9oRp6!4ssWt2=YtE_aJ_I3fn1=YQ2|>i^zM|{E(=*cs&d=*UN7qZO+lxGW0uO0*)u*-U^0lweQCyz%I>0$Kd%{mKA$fxj1)OX^~}c@{Wz6& zeTW4)&-cSF+w(1sz1MbND%xN_J>heT@2iqO5xzDy+0xR|P-xjJ;~}B%Dvpm7e-D72 z9f!vAn+*eXoU4i)OA4u}>Zh^-S;w(8w)7xbSy|0JmSv(69V4DC#4tiAN!sSpNh)Z2 z;zXJ!+<&ikAZ}v?)saWi!)C_kW(!MH@J%Yi+wYMqFizIw#6-efo*m@!`r6uG@9E|H zb2v=6a)T$VVig6O;Gmd5{_>uat*~y~u^r$l8mn+>T6I#M-K*`_uV44ghW)I@{x%SN zxWN`j!2nJHaaSExGsReCA&kI4qrl#N=FQZoqUT!O5GahsPw5 zr5t>vq_p%`IN-;y?B|k5Y60jHmi9|Ff&e<+aBPgPA1Ai(8*k z^uNByD=*)44s^2@(E0j-As8Ss#W33adP+|?l&d2u~v&)j;6?hjbi!==&fvK zaY_vnjPO8O7eyH zCJ?hu0I?H}9C{CgsCT~bT9l{Bx=0d58?8IGhK+M}yX4&3&_FzsW!#rcp+f~F27I4D zS;0Z{AJDv5SFi==O!QNVZl0o;+{-{bD?t{#cbPNdd5gFnT+eNe_+HG3-C_~zReqAqF`>zs>{ zy}~P_70cS(#c2>a1BsWcYSOFaavf699_rqEHa0d5HZO`8qI}*X3zwAS2Ak427wpqN zuHQ!((R=wEMKFkb#I)5WG50x0CVxSZ3xxF+CrJE`==ZKmK+{MXy>!gVmx<<|1q>@= zFY3Y@J>#FgVP|>UgT%h@Ug*H0jQnP_^zWnGSE;9Le;QU~YN9S+(CddbQ25YmVh?63 zNMrVeFoSSH;q19-!GY1r!>8EE-oe4yoqx5r`#)sU_8tP3eL|d<26A6vI(*sV@6R~` z9vvdWV72yGjrZPHJDngvy1+XTa`1;Cu>ED`Tgr{H5!8hQ8mI<^x_FD>?faIC=kW1- zk%C?sHz~h|*EtLqWq^8{AW(?yRO!^zS5_bdNSjU5dzv7}awf1*mz&O`Ir}!$?ax;_ zDNd$DXW4}V%s$rC(D>_ppWt%~hA@mw59I1-mhn$cKg9nLl=%kDgK5@P-a zXy7AWED9v=HZ-=FJbv!*ZrCeze4qao&`&-s_*vlo>03^K$Li>IGd!tKJt^#$YD&RW z=2XWFecDwqPYdGr_?7Q5g|x}(X}3N}TpWySK=b!5g54i=$^5D@=N@YuKB#WxjQ^gQ zli5GjVf*Du4a6tlNG>=p&##%)dC2E1?~x#!$aVhC*VMfteO&1!UXLhZpT$@kt->1F zu}8r3@H6Cl{<7C-ZG;~(g>Dj?+pR@rbxYE& zdpCl>Sh&Kyf6Zb4JqoR#3toU9c*w6bID{`JWKOj{xCmJqRh}JErU55A>fT)VVUnRV z_QG3nG2l6M2Uvf&-cgFaJ-qG1PcJ+8W#fcxnNq#af(T%A^frnanU?DQ3M!aupHjh} zU#P_$;P4EaVQHin6VBEUahEkk z#9brEokoC~O-fu`oGYMOls+Wtx=Ux-M@+|Ae55y1``5Eieqv^a=T; zOl0EfYD8Zkmadm1cXx9;phaN0XKIUj#wsU9M@Hf>J0@|@e20t7xcV2}f~eD9;XW$i zG7!r#4>BN#Rk#?^wxOe=1J%a;MAQ3A%rXd}WgBa#^Q^O_a`lxGt{`&58lhtkp3&$;f(fylvsQ~GDXQdgbskHjdqth=k>EX1f^L;G^X1m+TFXb zwHSA(O7H<0*Zl`79)+Re-e4wmULP2sgCbO7=elDftZ!}P1}H~S|Nnu~7okz_|Ie!Q z`;E@BEa=w^vo^{#TJb|Is+do<1bf`|*fxf2C3>joO=Rq1CE%7o@m5Lvpiw zN0G$eY0L>3QtJA2D_gVi+8JqQfh$?dGED8#V=IdZwpO=G!V}5`TjD~mQ`QlG=fsa& zINTo)EeH8A#3v@61l~xq0(<0L|oEUR^VDc59U7DL&%ontuO z1y>6ZHb!Q%ALRzj<96cKG)hbtlvZTjmvo!5>|Fi%g3q#9MO$y@*rtJfu^^N8c-+Ag z__jasg6Y{|lTV&J2JHL`#E;kU_te$Z&1A&Ix1~Ux(3?!im_VmYc6qrdN5Dcke|}J$ zYp0r?cVnZ==J9lDg!{(ySg5)cZV=eIZFeD zplS#Kl-~!+gJu}DT62D?tMY_2O5<|g#swiaX*fN>Fmm8$DyY`58MplT|8O~Z%z==W z7YdL9GEJ~(zCFrIN{N+DWBbRzT1lzw253t`u34kpSe^KKR7fQ~ud&XluxXr9fk~_88 zIQ8t5MkJiIW~<5REc*W5DHCJ#=QvV#GZRw%-T2#ux=Y!qAR!_GgN>f|6EPfX`0nLBzRk%*;~qgDU{b_Wo2YoO8EICz#RyRLQ8^d zAoW?u^LLi{o*Fh9lCTiD{||c}(=h>)+R+5X%9-T49$>hdd-t5>@M3?q#aF^)s$-JE z^IF7mAO0;%RM<^IXe1Bn$GT(mAHsq1}F~t|qBqLihMFGMdo(Ew0oFxaJAfv>A zAHR)Kw0AR#L_Ny!QNnbP*sogZl9yh^pS#feGIHY?D)PVebA2FLFoadA#u!h?n4gWd zc6xmChV<_wkG)5ZIzPsIb{byTCHP%^{OGD&ou$zb3swVK!)Xu4dd?>SHa&ZXbKcup z6r+hl?m+J0eqpBQ4$3$EW-nizVS{ z`_7p|R$)#L|HBBNCZL3SaCFDkXov{gNY@+;aAd4fgH|HH0ccKM z^ebGSG1ga&{Kl#2Y}5xG^c7+Rn+yp^*k@kQ9xvkuU#0H7KBMNL;Cx!2$IRQtU1DJ$ z=*-KJ*DI{;gyfqLNH-JOBX5?x$2AtOF%y@Vkw1A8cb+=jCbKjo&XcHmpse5;Y%qTr zM?+yaa&^(kEfTXvqm(EII>HH(etx2Szk&Afv=Yt@e4iX3RGKT8REf3GB~Ws*LGPg0 zT^XKP7BO4aduHop+E+3H2GuDxJ8Rcsq*rR=HxOq%&7&8ue2%{2BRf~RAC!Io64Vb`ZcVk zqDjR>#mnpLd?04XRjVS(suMFov@d_s66sRB+TPIlRKj!px#nqB!#BzeJK7m2SjUTm zao>|K)AfSBfoOP%=hLR(1$J@qvCo7OezlM`tG3e`+qeAg8x0X7ntEv$de0Br@8vSE z@^{Lx`g>|H1J*$~#}ni>m;+>!o`TRn@IyQB0%6?BXh?ATAXBJ;I6BXdo=EOPyogtX zg4W-Cc?gDIuUQCmdTH0Jhh$|oS>HF(hXag)z4_aDtlRrd$FPD5Y^^7dYuwF~E3J;& z*Zn61{ zTs!}w!N6kihOs-|IJ)BOO){Fp*0X%sF60FqrbQm#NgEVJBI$0T1VY(;I?F1FzRy#N zp(|Wz{B@jrw(42eh`;l6mhBO}dDh-TbQ!a51iYT8enNduSpl)Xl>dxF&LwO1GfP{Y zRNs=<8sF&Y-~N&RsoI!-@|^EC$xq^^r+vj2B-4|3Zfq)}#7K6uqL~Rkf;5LR^dZbU zKjFv@IY*YlmCiOeRSAJv8<>)#5j|o`Wf_6<{X&Sj&`X6?&}^%djP15h9ku3heV{m1 zqUbAJa8G7AjIv@<+n}JOVhC-PGw5C%v7nar@RKd|f%hr7^z~P=U)+$Vy5Tz!VHq-y zOG!+kD`Lho)?}a~$XU>zqrG38`kZz0*~o#3n1}%Vfo(~0O{640-iP(U@FPSU`ZNn` zcwxB%k-xOP)Z-HL#Lh%Cl)Drb6dVlEl~2y|K%Xs=2sG^ntB4@t+;alYLDohwG}^4= zGfdL-A&2%AvpYA5RGSFL7s-e(9>qp)#Vpvq%AdS7@U$r!ZC3W|%lV$!7k&l>=Vzf~ zxWW7ybx0e%0GuJ5UPOnAlI+NO3|uX|G`)0WqsxGoG0te#V*JzL)0DUJ$04ajFW7aO zD%P_w==2x;7uH6aq~A)7i?blOXc4zz32U=b(f!VWY;ch8G9hJ=zwx6BnXg?xUOMu( zHgZA)Nq_qRdKg4o-x!}^@HB~z+M(BG^tbfeIZx~oSb|37S!OSbumT3&hTut=Hz8tCDrI?)B3CP$5DIbfOXe z4u{K+cER|Uik44DXK<=E-Md^uakr`FT2(-1F@xiqZpW+3?Hi}NpriL~&H>dZLKwU) z0x0qyU&9KRsiMx`UAF39LPUgIsW`9-wTkLG*5(G@V;)3c=?e3jZf)wMd*#r^0K%Dm z8f%U%LZkMd*J_@pz4>jYNBTFVW9ZAhM)myES;MHYvxA=nucgb09*>@dBTa%&hoZOE zs%DTw)-#!J2GNnhIOD_5#BdjHD^QF_ zYj-KO>lPlUD7y;`@!5p3vH(2 z(_#WI(ap;#?pCZc%Fv^Cv)I~5#@_=QMicI2G$g9FWum{6qLl_Lp?+RoqpXiEgg-JG z(wT+?lJMZq(r&_hi`lU;Wo%r=QbWB@M&rgaS=`~ygGQI)Tx}(R@4|gH758lf$eZrS zevimsB={)On58Rd@kE&4xr}bARwI9+gr;C$vYC73ENMlcU}ML0RA}X%`{=GG|5|iP zSLl!V4WvBJRAnfY39mI|d`oro*7ASW5mlqq!_H7kcw}=8i^U4Q!)WYzzJ|ROM*wd1 zd+AKC<-y=U6`Ym+@=A_EeUSX7cq#4~oXYc9lis|e=f?;Yg42yjvYyfII>Peu&pAW^ z+%^>wYX6I^i5X9-yTS2exiQY`t+mlBh~0FS_y09FZVkOpVF)Yl^U4lmuEA&hqe;}h zRnZbP5EI#S%3=X^-E-yp6DBy)86|2yB@DOL$?-8sv6uNDR6XbqWeg6}qJ!_zS`V-+9`|FkQntt9VvQ9?&V)P-_&lm3uYPgd; zn#xVsS|ohFweC4FEF(`Ub}r$wS9W-gUZ09xaMs1VH%d7DQ+J!**js+x^N%lc;ioT$ zI;l%UD1$#O;)D0)EsnI=Q2CJv`x{{t4>QV zWew>x=V+DO*5Fc>hgj@q|2jLqYj~#o@_OX;Da=}ub?_cH&th@7;8sD**5LFJBsDZq z^B}qRI4|T^Tuo+t>Exb1$vrX}yyx1u^y1kmiecN#Ogf(=W1pPAYh`8}sJ z|20l=O_%@6y@XcQi7tHKib03~Qj%%K@VkzFlb`fzAICC$^!PW*EFa`8m>WR2p+f?TYB`Bxb#9!DA{^fA0O}+H6TOn|SgJk>j1T5wgdX`y*dZf7 zzCSp^7jH?*SiR9DI5`H=Bw_-XRSirf`M&J zHWB|539QkO2X?ZZa2o4t32sX=tyKpHB&;q&lE>6Lnvgx;3&w ztHvlOh`#MgCAHO1rIYN!`^mC`F9gE9Y-+2t!a}DrYm<>b<;{jOFda^a8+Pr2(uWK$ z-N-HNbY_Ep8Zg5txTy$dZItb9HeCOytl`>bY|TH}r-eU#1t9~NClJJ5yU(y~-jP2m zM3h=sSeR`0P?gZ#?Sba;j@`ZW_IDulJh4=R>%0ad_air+#wJL~#%C?Us$}ai%nQ5L ziAgwfHJ8_na9gL>2nN<^=OA}tG zs}+hGA+mdKb*|&Tt6GXz*-dhHqQOc92n0ebL2mi^%-_F%w^mjPx(L=bl&IE9Cj&Fd z+9H+6*BO!Tnw4;6QyMjV#jy%BrI9WjW0BTI(F&51!-Dv6D$k?>W_$YU_*MepO&6gY z_2DKeBy5I1=dUO*Fo=o<8^7VLugG=Lm&SLP@S4}a1xBH|>z0K$Y=(ArcL_fX{ei+q zPw*^vP-IZdVjE8%my{GL4JE5rfw4}a+V^wAi*Jn7V(ewi?N@rmoWN~y#Yq?llj0hcFjD-w2YW=L=sPGt{9w?LZkRkWGQxF3wBE+2)}^V=_ogN+s=wbOlb zg&fO|Pdik)!^uMx5*gI>04&D_3p6NfIk_w2a3(!`of>Q&t)Wg{UKPqn$pwxA%J}BWObbpF7E;^ zN7qtAf6X=qt}g_O4d2W}^y8NKx|41 zR6ZwbqOLhPIl1DKAr~!w7iIhSu}~e2*5dr9#^b7dAMH+YFk<*ZlfiwxhQC1_sD^ua z#g^BQYrT_*#Bvu&xzQumjv5hcGpKW0J!QA2hrxby3fcU*)J~?nX|E|#e zBZ;$?jN^YtY(tn8(Ibm$$fgo5Ftwt0##UFgJi?4)Mj*0lBq^@rm$5A&c#pQd^PN{#?oW)HF9o?UH4-%t( zsqR$_ePSBFGD<7#8jb5%qp+MyjHf6Fcvda38%=G6Mqd%?ebiCGl?_@3XVH~r4eM?K zLU%6KhehW!MKGS{3oPc6(61S2eL#g0;|qwjo^x8Moi@9g9@y-jP#e8nIGI`&Szi0} zURvZ@BTKmwTPv}sib&kO9Mr$EmgX40#*PClvI035KDsmIlRKLhX$3fRfOqsQ*}?Vr zzxaQBJbFiY%a1d<#9w5=QIt$ZMTNMmq@)dvwyf!eMvRjdZTR5Okbb9n=4v}^|V>%GFSG1KGj!V!FBMO9Ty+4Oz(h|SGSh;xR@yzh*Tjm?AZ zx~6H_syH|-FOG~Dh2T68K9f~)wyXitwpE0lZ&v3F>LH13LPCOUQ>zn2>Vrp*iXH?C zpLgIT6a<_|dd=3s!6Y#yB_+qQw-nBg1m@hf(<67s|4SGs6usOzRZ}E`YqJUj5S3=P zPl5OJyElC6>%-VOId#FfWb8w;=oW>L1;dt)(Dsb#cRs%-4GegkPGd!%{krREB|KV~ zE$t@<9mhO)>COmvSwEa(?ufdpe4E5WGI`bCyF@m&=G)|CJ$s{^-SrMr+{@ScfSyC*o7^0|i}q-!%f$9KP;sewksS|?s7tX%Byf>xP@HF^u}@&W zy=->kwmQ&4o))GFY0G5aONzEms&v|iBka-c4t4L~c}>W)eT1QAuX|oQ5V%3J=<4b^ zulpK>VsjMPnSgsrf8Geegt%JMd-hXkPr_r2P;xnSSTPaDJiLes#Bx()o2TC-p;qs z5{zLa3YvIj(m|!G;E=xU=32%MbG%9D>T>E3IH+`*XShC*sK>4R`|XX7WLjQLAMKaY z@OZqiqN3tyO9O7Yr3!ure)FDENux?l`V<%9G zzdKdNPje0=*hdo=i#7vx0t$)1wCSHw!q6Yx#%cB$ThaAfh7 zi^boc3>?y{_or)h6Y}8vLzg+zmX!YAZ^lE}b35;XITwYLzXpznPTnv&^ZKSY?k-{r z2FUuD`p>1+kp}-eHOJtylE5g3aoh}N0=@V<8Q`)>oir_OkXHALGFu{~LghiwjMSL( z=PZ`SeSxEY2xuy{tEa~S@zQ-x=;`i8w?8Q>HM|GQw*GQ?LbM;Itu_A~Egoy<uI9fL^zkEEE z5|(9mf8g$(ecEdSdxS9%g!l;QtZbJo6)*6l`{7A)wR-j%G667kA)mu{{Zu)vMl%EE ze4r8=z=D-C$I%2q?kmBLeJMF5rKbusiufj2JbdpYPlc=J{rmSBMFG(ahlET_Of+Fe zkbnbEkl+X~1$kAZk=5W*Q_AVX7xmk+0)IO-)a>wc3i^TUfEK+ zmFt`}H$TroQ$e(V!5oVDC&4TVw)T^E2&){rastrtmivnS(xtJ?$Qq?IOO*`m-o8E& zaYe=RY^Y%v$D7xzr0<~0Qas-wzZH7oZ04A`*VCm>8B~0T)*x~C4BU2!y^4aAre3j? z7K&FQEnoh5nX`PILqF*1W2;lo36A7*b93wvo+}vYldwnBm_90vrYaikqMedWuv1w( zIPf8F7EE0z=dfiiv(KmQ+37YecKT3RX?*tVStI-zC+*p)VB7YCgL0dxSvv|~ zAg<5YP+T3$%c^KQu=}F+JD>7O2k)|SueRE%zAALCw9$$;y0L0sGQ#m(d?vTnAG#d9>uE@9=jAGu|v8u;ChS5=HgFY1!>dgu@g=w7N5pDK(n>jg}3IYI;eY`$I ztz2Q_UWBy?{m2%Fj|e<-tkcV*HQWc=iKGYaQIvSzSth3UvKNU6va3Lww; z_{WuSZ?;jb0S5bB6?GcxQTcc(nSOIX^(LzcT*SbaD|vXazpzq4 z4WQ%x{Li0Oj`#1UF(V>zZ#V;-Gb8n-nEoDA4M(cPdD(G~&}f_F?p;g&dyi9R{6(HA z-9HLN!=^wVg(>bRjgmJPPv>%W3pz@xHr@KcT_K@WoOvGau$494j2Udl?lwfPzv5jM zc-nl2((w1jHvYat{2e6I+DKd|@2Mz*qTI*A@;CT*fpxB~Mu)0AV}KLEW_*brLVoLw zn)nCvo6q2wukbWY%-~}2Epv58Vn?1ngIal~Cr_T(Ow)VcUwITc+E`s(O=-_rUR}Kq z9x(UTfHz5If4?lO_KM%|Z$bA4P4PuEk0+=MqffObH$$l4fQ)U-yRDIaHpw$!G%03= zhL-HSss}5AYkQmLC##?>Xp4cy_lCvs`5s=r%ag4mF9ekLFlbGYv(X6+!tNGl$9HzD z{OYY22Xegy6?Bwb#&w(Wn*gSaewqJ zKVWsNsz-pI-yg>=?kgml($iDG@x$9e>S#TC&*=T{9t=!w=lZ+mfvPlpp^BC1ZG1c7 zjni1A_&}3N#=EZ%N8@UYE6}}#j|8?2lpCH*j|xAHcvgtgyA#!~r8@QL@9Nk*n6jvA zX8d0s{0ErF3WM6e$v1XiyWLYDN;AU2Jbu&A`o9j)T|boZ{Pif13Zr-BtIed5+F_yY zV}+iz88t3(y%gW6x;moMGT=Hv#Z_8-mZh3`9O=Z4?^?)@;C%Mf?(4ua#=;~`QTwgd%a zX78u~H0;>4<9ttpro61wT;TiUNqBG$62rPQD$+1`w+VOg`n{39zB0#rZ_f8TwU^98 zA6js@={nn(Dj!Km%sHx46qq(v382Ei0qcBp8cD5MNCwfBB;zgQ}e z&~?Xg%)CIDPap&!m>!{VIsE%ex2}Y!xs&W>Y@7)=t)wpOCHsrCmF$Z`;ahxdxpb4$ zq-MN|6scNkFQPV}>?1s>$$n9fTwBZh9N*{7DFge6sLX_m_&<&kj6|ubJXPQj3Y^BY z*@7yGPqz%dP_0FRDBhuWpVhP)CGW{y`*<^#bX zUiU$9$-fwx=i9vu?wMxSvnp3HO`YL2`l61v*0Zgf8sd5QaYC1ZI5?lq=Gfw%ytF+EB;-ju+5oaJ!U zWqMdj!BT>gc%Q|^CkEx@rsvTDN7f=&C_8t~Mz+~+`}3u8G8by5+uB~q<520Qu*3TfevPFAX_#LVcT6FbHqOq1Adzh`sAe;Lg$`8 z|9H~Et%mv~6*e|7;7aQc4mcbp)idj23|(HiMwWsMp)SBw(w$m9;`lw~u@uvzSaf6@ zPfVvWLI?MB_5INiV=!}JA)+aD`BN{z5PGNNrR<-3oEL~vDcI;C6{8kCg^!(G)+E$J zt4MxF`={v5hH?gn2=Nb-JmQuMzgQ0Gb2n~)sio{gO+z|hvtF78_TIizFOMc^o?LE;|D`m0nz*An5)-Ror!vx-T} zb9isRh!jtcbTN7N4`@uz{9+lx45n7$2V})p=uDrmRWU7%gq!eAfZ7oA^8YFll^CBJ z-I-u8r%E}WZ2YV#^2`Huk6(}UBV{bJlbLJcvqnZ7B?tt%V3dnLACFDB5joo#e>DOI z9o~fnPA9R1p83ETDK>U6zj@>3Pze+)1tye^>rMvn4^_H5;i&`79 zrdxtB{Y2EFHtD@Nl4D=zU25ogtS@)!NuOpz>G?F`@3OwG2dEjz*mbEf#hGP0%qGXo z()R!r*=v2ii+vL--)&W=-v1j)XWGs(vcER;-}!gT!FN`_=;Z}-WHLsYM|rhV$i1g* zH4@pREOI}+9)r%Hab^k{C@8+1<#uo#Zz@p@_TwxVQ_k}(HS(0X{%fsXwZar=@wec( zgG%heIz<}tU58D04;svO2wl|>=Qd}8U{tY`B%-(b#Z=Hn?{ghC>uOS$e7FYBVY8Id zZu*+JJC};T|7wdu_1b>0?FF(59)?h_kR>(We489RKJdAn78sex1B%bNWG#O|-hu3k zW$^*2&AA=As@XzcCVJ~u^qrAE9lE@JJb?SYS^`-+DmG9Frn4l#>c>ZF8+sHgS^ z$p#Jv=akUPxMJyVYH#HKjf)tP4HX=tzxlQNrGdj|NU5Ow#cpHJ-Lo#R%!vS*@mUmD zdfoypZn{%6!KQ*-$geYjFE!Rkxrv4q%>E5>)R=0JT;14}8(_EsftPyty8VDWzMv)V z2?u7$9Pj?d#nhSv_sd0Eo;LVto&eEJowKbRohG5*%4Z{E20wgqkr}DDKG(&6W5_PF zSBqP<`$@>P4|k4R2K|QI7Q9O2!5#eA{$SKh$eCUEiXjjB6eii6e_AVd^u_Ns9;D>? ztI7;=O?bT-`fK>zOzs*0*tMj1~T4Q>9kUsRKh{}Ys z1mB>c4jv!yBOKKVj|1sN zy1Ji2%B7XHzlA2n#pEo$FLy>&@LoJ^LQ!JpFld#2F@cmG2fQgy&V~Wg^Fcw6QjFYr zldvs=jDD3vkAG33I`W@I^~M~5y0o)?Tb$_XHVIKY$H9yEO`o%j{1+XLUk5)l&JtHKubwsV6Z-r@seI?0o7{WP!v#jXK#>S@CJI}i+>*J zn_31ho_*(v-@4+x(4{Rtm0Iz6@v-!&vD;EiSjXgsi;Thljg~Xl9F!@V$3~3EqAzwPjC%bo=QA6=oL|u> zYx1Lt-%g(z;o%6kx!Uwv=02A0%<0!Cc8xTxZ>jviD2dA;AJu-iP93f_&-FBGu}^34 zX%FA~d!(jSGhs8$jB)|g-^9B9{6*l`?3+i;zMfvAy|1i0oqcin1`}1MkHTY;Z;oSB zvo6vq=&vo}6ne!6tof&z(q0p>M3)*CQd6(&=v|Y?ksV357gskp^C6Jp`qsOIDI?Bg?bZuSFuQ7q)Ff(=>u_ z9nM?i^oY^xZ{Do98j$O!$Lr@Lr7Ws{8f~OeW~Nh-KZ5|#bPdZ+bPoYroIH2a)il<`o#wobxZTrh0SXmPVq107N1`8Edy9@ zuwTbj3t_A0sNPZ25A^{zjsAWUgZ&+$k=G`+29z|9a5(IraZ{mCpin3z)c_75L~#&z z9H(e6Z`(Gh9rr|Qu=q}A&e!mMH~LyjgI#7G+KBePUCvuUOPjkjsJ+{20&&=$N{GMb{gD$wK171I@ zcqsiUug!0{$>CeqVZbGEum4IZJ?Wku$64|{Rp0in)p4Ov;7};!XZl8b|Mh4?wdN7r zC$MU4c}d^X4Js^I>?n2h-G5A-g}NEAmW$O*Y)*JOdcghu-a@B00C?t%LI@%vPj%z% z*d@nt;5goCfv)j|GFx2o-F<1Vy1doE8;H~; z(rR5nS1Ul|^LaRqLjXuhNkRznvMT>9y2@s$$EzG_K`{%$2ZGds5|FV%F)Q z8na;~m{wJmQagN`);kKGgdYlps(!{>6l!Aq5tLXO{kw_H15f%^J8%7j4?p1tTwE`) zpeZ$*^M|o(%fD=pSqnIhQ?~t8%O~|p`i(+WQ<5f{XrhTG&JHw{+D$akL=%r8G)cdS zCYosCF@z@RH_^oZ-%cF}000002=ccc Date: Fri, 18 Oct 2024 16:08:56 +0300 Subject: [PATCH 002/248] Add the first webview component --- _src/blocks/webview/webview.css | 41 ++++++++++++++++++++++++++++++++- _src/blocks/webview/webview.js | 39 ++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/_src/blocks/webview/webview.css b/_src/blocks/webview/webview.css index c7cef21c8..1d3fe3fe5 100644 --- a/_src/blocks/webview/webview.css +++ b/_src/blocks/webview/webview.css @@ -1,6 +1,5 @@ .webview-wrapper { max-width: 768px; - max-height: 512px; padding: 0 var(--section-desktop-padding); margin: 0 auto; background: url(../../icons/pattern.png) repeat-x; @@ -66,5 +65,45 @@ border-color: white; color: #006EFF; } + + .prod-oldprice { + font-size: var(--body-font-size-xs); + line-height: var(--body-font-size-xs); + text-decoration: line-through; + margin-right: 10px; + } + + .prod-percent { + font-size: 13px; + line-height: 15px; + color: white; + background-color: #61A851; + border-radius: 11px; + padding: 4px 10px; + font-weight: bold; + } + + .prod-newprice { + font-size: var(--body-font-size-xl); + line-height: var(--body-font-size-xl); + font-weight: 700; + } + + .under-price-text { + font-size: var(--body-font-size-xxs); + line-height: var(--body-font-size-xxs); + color: #666666; + + p { + margin: 0; + font-size: var(--body-font-size-xxxs); + } + } + + .price_box { + display: flex; + flex-direction: column; + gap: 9px; + } } } \ No newline at end of file diff --git a/_src/blocks/webview/webview.js b/_src/blocks/webview/webview.js index 012cce22b..4481f9f1b 100644 --- a/_src/blocks/webview/webview.js +++ b/_src/blocks/webview/webview.js @@ -1,3 +1,40 @@ export default async function decorate(block) { + const { + product, saveText, + } = block.closest('.section').dataset; -} \ No newline at end of file + let prodName; let prodUsers; let prodYears; + if (product) { + [prodName, prodUsers, prodYears] = product.split('/'); + } + block.setAttribute('data-store-context', ''); + block.setAttribute('data-store-id', prodName); + block.setAttribute('data-store-option', `${prodUsers}-${prodYears}`); + block.setAttribute('data-store-department', 'consumer'); + block.setAttribute('data-store-event', 'product-loaded'); + + const buyLink = block.querySelector('a[href*="#buylink"]'); + buyLink?.setAttribute('data-store-buy-link', ''); + + [...block.children].forEach((child) => { + if (child.textContent.includes('{PRICE_BOX}') && product) { + child.innerHTML = child.innerHTML.replace('{PRICE_BOX}', '
Price box
'); + child.innerHTML = ` +
+
+ + ${saveText || ''} +
+
+ +
+
`; + } + if (child.textContent.includes('{under_price_text}')) { + // remove the p tag that is wrapping the text {under_price_text} + child.querySelector('p')?.remove(); + + child.classList.add('under-price-text'); + } + }); +} From b6bde10cb5c5145fa890823d341ceec2347329f2 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Tue, 22 Oct 2024 12:20:15 +0300 Subject: [PATCH 003/248] created webview table --- _src/blocks/webview-table/webview-table.css | 366 ++++++++++++++++++++ _src/blocks/webview-table/webview-table.js | 137 ++++++++ 2 files changed, 503 insertions(+) create mode 100644 _src/blocks/webview-table/webview-table.css create mode 100644 _src/blocks/webview-table/webview-table.js diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css new file mode 100644 index 000000000..8dbf57ddc --- /dev/null +++ b/_src/blocks/webview-table/webview-table.css @@ -0,0 +1,366 @@ +:root { + --first-table-cell-color: #e4f2ff; + --table-cell-color: #eee; + --yes-check-color: #44AA44; + --no-check-color: #FD3434; + --column-header-highlight-color: #de2985; + --product-comparison-text-color: #5d5c5c; + --expandable-row-background-color: #0040F0; + --expandable-row-text-color: #fff; + --product-table-badge-color: #2cb43d; + --current-price-color: #000; + --expandable-row-arrow-color: #c5c5c5; +} +.await-loader{ + min-height: 4rem; +} +.webview-wrapper { + width: 768px; + max-height: 512px; + padding: 0; + margin: 0 auto; + + background-color: #141517; + background-size: 188px 104px; + text-align: center; + font-family: "Segoe UI", Arial, sans-serif; + + .webview { + max-width: 438px; + margin: auto; + img { + width: 92px; + height: auto; + } + + h3 { + margin-top: 30px; + margin-bottom: 16px; + font-size: 18px; + line-height: 24px; + font-weight: 700; + color: black; + } + + .button-container { + margin-top: 8px; + margin-bottom: 0; + } + + .button.secondary { + background-color: white; + border-color: white; + color: #006EFF; + } + + .prod-oldprice { + font-size: var(--body-font-size-xs); + line-height: var(--body-font-size-xs); + text-decoration: line-through; + } + + .prod-percent { + font-size: 13px; + line-height: 15px; + color: white; + background-color: #61A851; + border-radius: 11px; + padding: 4px 10px; + font-weight: bold; + } + + .prod-newprice { + font-size: var(--body-font-size-xl); + line-height: var(--body-font-size-xl); + font-weight: 700; + } + + .under-price-text { + font-size: var(--body-font-size-xxs); + line-height: var(--body-font-size-xxs); + color: #666666; + + p { + margin: 0; + font-size: var(--body-font-size-xxxs); + } + } + + .price_box { + display: flex; + flex-direction: column; + gap: 4px; + } + } +} + + +.webview { + display: table; + padding-top: 0.625rem; + padding-bottom: 0.625rem; + font-size: 14px; +} + +.webview h1{ + text-align: center; + font: normal normal bold 24px Segoe UI; + letter-spacing: 0px; + color: #F7F7F7; + opacity: 1; + margin-bottom: 8px; + margin-top: 2px; +} + +.webview .webview-comparison-header div[role="columnheader"]:first-child{ + min-width: 292px; +} + +.webview .webview-comparison-header strong{ + font-size: 16px; +} + +.webview .webview-comparison-header div[role="columnheader"]:not(:first-child) { + flex: 1; + min-width: 142px; + flex-flow:column; + flex-wrap: wrap; + text-align: center; + justify-content: center; + color: #e4f2ff; +} + +.webview .webview-comparison-header div[role="columnheader"] p{ + text-align: center; + font: normal normal normal 16px Segoe UI; + letter-spacing: 0px; + opacity: 1; + margin: 0; + margin-top: 8px; + line-height: 0.9; +} +.webview .webview-comparison-header div[role="columnheader"] p:last-of-type{ + margin-bottom: 8px; +} + +.webview-comparison-header div[role="columnheader"] { + padding-bottom: 8px; +} + +.webview div[role='row']:not(.webview-comparison-header) { + display: flex; + flex-wrap: nowrap; + white-space: normal; + justify-content: space-around; + font-size: var(--body-font-size-xs); + font: normal normal 600 14px Segoe UI; + color: var(--color-dark-gray); + min-width: 94px; + width: 100%; +} + +.webview div[role='row']:not(.webview-comparison-header):last-of-type{ + border-bottom-left-radius: 8px; + padding-bottom: 6.27px; +} + +.webview-comparison-header{ + display: flex; +} + +.webview div[role='cell']{ + min-width: 142px; + border: 0.1px solid #3c3c3c; + border-left: none; + border-right: none; + display: flex; + flex-flow:column nowrap; + justify-content: center; + align-items: center; + padding: 8px; + font-size: 14px; +} + +.webview div[role='cell']:first-child { + white-space: normal; + display: table-cell; + min-width: 292px; + height: auto; + text-align: left; + letter-spacing: 0px; + color: #FFFFFF; + opacity: 1; + font: normal normal 600 14px Segoe UI; + border: 0.1px solid #141517; + border-right: none; + background: #333333 0% 0% no-repeat padding-box; +} + +.webview div[role='row']:first-of-type div[role='cell']:first-child{ + border-top-left-radius: 8px; +} + +.webview div[role='row']:last-of-type div[role='cell']{ + border:none; + border-radius: 0 0 4px 4px; +} + +.webview div[role="cell"] .yes-check { + position: relative; + top:1px; + width: 18px; + height: 18px; + background-color: #4CAF50; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: black; + font-size: 16px; +} + + +.webview div[role="cell"] .yes-check::after { + content: ''; + position: relative; + width: 3px; + height: 7px; + border: solid black; + border-width: 0 2px 2px 0; + transform: rotate(45deg); + bottom: 1px; + left: 0%; +} + + +.webview div[role="cell"] .no-check { + height: 1rem; + width: 0.625rem; + position: relative; + top:1px; +} + +.webview div[role="cell"] .no-check::after { + position: absolute; + width: 0.17rem; + transform: rotate(45deg); + content: ' '; + background-color: var(--no-check-color); + height: 16px; +} + +.webview div[role="cell"] .no-check::before { + position: absolute; + height: 16px; + width: 0.17rem; + transform: rotate(-45deg); + content: ' '; + background-color: var(--no-check-color); +} + +.webview .button{ + border: 1px solid #006EFF ; + opacity: 1; + background-color: black !important; + width: 122px; + padding: 6px 16px 6px 16px !important; + border-radius: 4px !important; +} +.webview .button .button-text{ + color: #006EFF; +} + +.webview .savings-tag-container{ + background-color: #2cb43d; + color: white; + font-weight: bold; + width: 100%; + border-radius: 4px 4px 0 0; + padding: 2px; +} + +.webview .featured{ + background-color: #202123; +} + + +.webview .price_box{ + padding: 0; + color:#e4f2ff; + text-align: center; +} + +.webview .under-price-text{ + font-size: 12px; +} + + +.webview .featured .button{ + background: #006EFF 0% 0% no-repeat padding-box !important; + opacity: 1; +} + +.webview .featured .button-text{ + color: white !important; +} + +.webview .current .button{ + border-color: #767676 !important; +} + +.webview .current .button-text{ + color: #767676 !important; +} +.light-mode{ + color: black; + background-color: #FFFFFF !important; +} + +.light-mode h1{ + color: black !important; +} + + +.light-mode div[role="columnheader"]{ + background-color: #FFFFFF !important; + color: #000000 !important; +} + +.light-mode div[role='cell']:first-child:not(:last-of-type){ + color: #000000 !important; + background-color: #F9F9FE !important; + border-color: #FFFF; +} +.light-mode div[role='cell']:first-child:last-of-type{ + background-color: #fff; +} + +.light-mode .yes-check::after{ + border-color: #FFFFFF !important; +} + +.light-mode .price_box{ + color: black !important; +} + +.light-mode div[role="cell"]{ + color: #515B6D !important; + background-color: #FFFFFF !important; + border-color: #F5F5F5; +} + +.light-mode div[role="cell"] .featured { + background-color: #F9F9FE !important; +} + +.light-mode .prod-oldprice{ + color:#515B6D !important; +} + +.light-mode .under-price-text{ + color:#515B6D !important; +} + +.light-mode .button{ + background-color: #FFFFFF !important; +} \ No newline at end of file diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js new file mode 100644 index 000000000..a2b641f92 --- /dev/null +++ b/_src/blocks/webview-table/webview-table.js @@ -0,0 +1,137 @@ +import { matchHeights } from '../../scripts/utils/utils.js'; + +function replaceTableTextToProperCheckmars(block) { + block.querySelectorAll('div') + .forEach(async (div) => { + if (div.textContent.match(/^yes/i)) { + div.textContent = ''; + const icon = document.createElement('div'); + icon.classList.add('yes-check'); + div.appendChild(icon); + } else if (div.textContent.match(/^no/i)) { + div.textContent = ''; + const icon = document.createElement('div'); + icon.classList.add('no-check'); + div.appendChild(icon); + } + }); +} + +function buildTableHeader(block) { + const header = block.querySelector('div:nth-of-type(2)'); + + // Ensure the header exists before trying to modify it + if (header) { + header.classList.add('webview-comparison-header'); + } +} + +function addAccesibilityRoles(block) { + block.setAttribute('role', 'table'); + const firstDiv = block.querySelector('div:first-of-type'); + [...block.querySelectorAll('div')].filter((div) => !firstDiv.contains(div)) + .forEach((div) => { + if (div.childElementCount > 1 && div.parentElement.getAttribute('role') === 'table') { + div.setAttribute('role', 'row'); + } else if (!div.hasAttribute('role')) { + div.setAttribute('role', 'cell'); + } + }); + + const header = block.querySelector('div:not(:first-child)'); + [...header.children].forEach((headerColumns) => { + headerColumns.setAttribute('role', 'columnheader'); + }); +} + +function renderPrices(block, metadata) { + const { + products, firstYearText, featuredProduct, currentProduct, saveText, + } = metadata; + + const productsAsList = Array.from(products?.split(',')); + const cells = block.querySelectorAll('div[role="cell"]'); + let index = 0; // Manual index increment + + cells.forEach((cell) => { + // Only process cells that contain the {PRICEBOX} variable + if (cell.textContent.includes('{PRICEBOX}')) { + cell.querySelector('p')?.remove(); + const [prodName, prodUsers, prodYears] = productsAsList[index]?.split('/') || []; + + const buyBox = document.createElement('div'); + buyBox.classList.add('buy-box', 'await-loader'); + + const savingsTag = document.createElement('div'); + savingsTag.style.visibility = 'hidden'; + savingsTag.classList.add('savings-tag-container'); + + // Determine if current product or featured product + const isFeatured = index + 1 === Number(featuredProduct); + const isCurrent = Number(currentProduct) === index + 1; + if (prodName) { + cell.setAttribute('data-store-context', ''); + cell.setAttribute('data-store-id', prodName); + cell.setAttribute('data-store-option', `${prodUsers}-${prodYears}`); + cell.setAttribute('data-store-department', 'consumer'); + cell.setAttribute('data-store-event', 'product-loaded'); + } + // Add featured logic if applicable + if (featuredProduct && isFeatured) { + block.querySelector(`div[role="columnheader"]:nth-of-type(${Number(featuredProduct) + 1})`).classList.add('featured'); + block.querySelectorAll('div[role="row"]').forEach((row) => { + const featuredCell = row.querySelector(`div[role="cell"]:nth-of-type(${Number(featuredProduct) + 1})`); + if (featuredCell) { + featuredCell.classList.add('featured'); + } + }); + block.setAttribute('data-store-context', ''); + block.setAttribute('data-store-id', prodName); + block.setAttribute('data-store-option', `${prodUsers}-${prodYears}`); + block.setAttribute('data-store-department', 'consumer'); + block.setAttribute('data-store-event', 'product-loaded'); + savingsTag.innerHTML = ` + + ${saveText || ''} + + `; + savingsTag.style.visibility = 'visible'; + } + // Populate buy box for non-current products + if (!isCurrent) { + buyBox.innerHTML = ` +
+
+ +
+
+ +
+
+ ${firstYearText} + `; + const buyLink = cell.querySelector('a[href*="#buylink"]'); + buyLink?.setAttribute('data-store-buy-link', ''); + } else { + cell.classList.add('current'); + } + + cell.insertAdjacentElement('afterbegin', buyBox); + const tagCell = block.querySelector(`div[role="columnheader"]:nth-of-type(${index + 2})`); + tagCell.insertAdjacentElement('afterbegin', savingsTag); + + // eslint-disable-next-line no-plusplus + index++; // Increment index manually + } + }); +} + +export default async function decorate(block) { + const metadata = block.closest('.section').dataset; + buildTableHeader(block); + addAccesibilityRoles(block); + replaceTableTextToProperCheckmars(block); + renderPrices(block, metadata); + matchHeights(block, '.savings-tag-container'); + matchHeights(block, '.buy-box'); +} From 2a6e67344606497a9fc13e811b2bcd00d27270d0 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 22 Oct 2024 14:06:39 +0300 Subject: [PATCH 004/248] set up the initial environment for testing vlaicu --- _src/scripts/libs/constants.js | 4 ++++ _src/scripts/libs/page.js | 7 +++++++ _src/scripts/libs/store/store.js | 16 ++++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index e37e29c4e..15ae28856 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -10,5 +10,9 @@ export const Constants = { ZUROA_LOCALES: ['nl-nl'], + VLAICU_LOCALES: ['en-us'], + + VLAICU_PAGES: ['total-security'], + DEV_DOMAINS: ["localhost", "stage", ".hlx."], } \ No newline at end of file diff --git a/_src/scripts/libs/page.js b/_src/scripts/libs/page.js index f058f130e..fc0887e3b 100644 --- a/_src/scripts/libs/page.js +++ b/_src/scripts/libs/page.js @@ -17,6 +17,11 @@ export default class Page { */ static locale; + /** + * @type {string} - 'consumer', 'total-security' + */ + static pageName; + /** * @type {'dev' | 'stage' | 'prod'} */ @@ -31,6 +36,8 @@ export default class Page { this.langauge = this.locale.split('-')[0]; this.environment = this.#getEnvironment(); + + this.pageName = window.location.pathname.split('/').filter(Boolean).pop(); } static #getLocale() { diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 0c8be1a55..6c74c078f 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -955,9 +955,9 @@ class StoreConfig { constructor() { /** * Api used to fetch the prices - * @type {"init"|"zuora"} + * @type {"init"|"zuora"|"vlaicu"} */ - this.provider = Constants.ZUROA_LOCALES.includes(Page.locale) ? "zuora" : "init"; + this.provider = this.#getProvider(); /** * default promotion @@ -984,6 +984,18 @@ class StoreConfig { this.httpMethod = "GET"; } + /** + * + * @returns {string} the prices provider to be used + */ + #getProvider() { + if (Constants.VLAICU_LOCALES.includes(Page.locale) && Constants.VLAICU_PAGES.includes(Page.pageName)) { + return "vlaicu"; + } + + return Constants.ZUROA_LOCALES.includes(Page.locale) ? "zuora" : "init"; + } + async getCampaign() { const jsonFilePath = 'https://www.bitdefender.com/pages/fragment-collection/zuoracampaign.json'; From b0e3cc82e78b0a0a569c6670a538202a3ab1c3a2 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 22 Oct 2024 17:58:09 +0300 Subject: [PATCH 005/248] created the Vlaicu class --- _src/scripts/libs/constants.js | 56 +++++++- _src/scripts/libs/store/store.js | 217 ++++++++++++++++++++++--------- 2 files changed, 212 insertions(+), 61 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 82262a43d..3c55ecbaa 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -1,5 +1,5 @@ export const Constants = { - DEV_BASE_URL: ["localhost", "stage", ".hlx."].some((domain) => + DEV_BASE_URL: ['localhost', 'stage', '.hlx.'].some((domain) => window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : '', FINGERPRINT_LOCAL_STORAGE_NAME: 'rhvID', @@ -10,9 +10,59 @@ export const Constants = { ZUROA_LOCALES: ['nl-nl', 'nl-be'], - VLAICU_LOCALES: ['en-us'], + VLAICU_LOCALES: ['en-gb'], VLAICU_PAGES: ['total-security'], - DEV_DOMAINS: ["localhost", "stage", ".hlx."], + DEV_DOMAINS: ['localhost', 'stage', '.hlx.'], + + PRODUCT_ID_MAPPINGS: { + av: "com.bitdefender.cl.av", + is: "com.bitdefender.cl.is", + tsmd: "com.bitdefender.cl.tsmd", + fp: "com.bitdefender.fp", + ps: "com.bitdefender.premiumsecurity", + psm: "com.bitdefender.premiumsecurity", + psp: "com.bitdefender.premiumsecurityplus", + pspm: "com.bitdefender.premiumsecurityplus", + soho: "com.bitdefender.soho", + mac: "com.bitdefender.avformac", + vpn: "com.bitdefender.vpn", + "vpn-monthly": "com.bitdefender.vpn", + pass: "com.bitdefender.passwordmanager", + passm: "com.bitdefender.passwordmanager", + pass_sp: "com.bitdefender.passwordmanager", + pass_spm: "com.bitdefender.passwordmanager", + bms: "com.bitdefender.bms", + mobile: "com.bitdefender.bms", + ios: "com.bitdefender.iosprotection", + mobileios: "com.bitdefender.iosprotection", + dip: "com.bitdefender.dataprivacy", + dipm: "com.bitdefender.dataprivacy", + avpm: 'com.bitdefender.cl.avplus.v2', + // DLP + ts_i: 'com.bitdefender.tsmd.v2', + ts_f: 'com.bitdefender.tsmd.v2', + ps_i: 'com.bitdefender.premiumsecurity.v2', + ps_f: 'com.bitdefender.premiumsecurity.v2', + us_i: 'com.bitdefender.ultimatesecurityeu.v2', + us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', + us_f: 'com.bitdefender.ultimatesecurityeu.v2', + us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', + us_pf: 'com.bitdefender.ultimatesecurityeu.v2', + us_pf_m: 'com.bitdefender.ultimatesecurityeu.v2', + us_pi: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pi_m: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', + }, + + PRODUCT_ID_NAME_MAPPINGS: { + pass: "Bitdefender Password Manager", + pass_sp: "Bitdefender Password Manager Shared Plan", + passm: "Bitdefender Password Manager", + pass_spm: "Bitdefender Password Manager Shared Plan" + } } \ No newline at end of file diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 6c74c078f..398419335 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -743,56 +743,6 @@ class BitCheckout { // this products come with device_no set differently from the init-selector api where they are set to 1 static wrongDeviceNumber = ["bms", "mobile", "ios", "mobileios", "psm", "passm"] - static productId = { - av: "com.bitdefender.cl.av", - is: "com.bitdefender.cl.is", - tsmd: "com.bitdefender.cl.tsmd", - fp: "com.bitdefender.fp", - ps: "com.bitdefender.premiumsecurity", - psm: "com.bitdefender.premiumsecurity", - psp: "com.bitdefender.premiumsecurityplus", - pspm: "com.bitdefender.premiumsecurityplus", - soho: "com.bitdefender.soho", - mac: "com.bitdefender.avformac", - vpn: "com.bitdefender.vpn", - "vpn-monthly": "com.bitdefender.vpn", - pass: "com.bitdefender.passwordmanager", - passm: "com.bitdefender.passwordmanager", - pass_sp: "com.bitdefender.passwordmanager", - pass_spm: "com.bitdefender.passwordmanager", - bms: "com.bitdefender.bms", - mobile: "com.bitdefender.bms", - ios: "com.bitdefender.iosprotection", - mobileios: "com.bitdefender.iosprotection", - dip: "com.bitdefender.dataprivacy", - dipm: "com.bitdefender.dataprivacy", - avpm: 'com.bitdefender.cl.avplus.v2', - // DLP - ts_i: 'com.bitdefender.tsmd.v2', - ts_f: 'com.bitdefender.tsmd.v2', - ps_i: 'com.bitdefender.premiumsecurity.v2', - ps_f: 'com.bitdefender.premiumsecurity.v2', - us_i: 'com.bitdefender.ultimatesecurityeu.v2', - us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_f: 'com.bitdefender.ultimatesecurityeu.v2', - us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pi: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pi_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', - } - - static names = { - pass: "Bitdefender Password Manager", - pass_sp: "Bitdefender Password Manager Shared Plan", - passm: "Bitdefender Password Manager", - pass_spm: "Bitdefender Password Manager Shared Plan" - } - static getKey() { const hostname = window.location.hostname; if (/^(author-p23952-e68330|www|new)/.test(hostname)) { @@ -855,7 +805,7 @@ class BitCheckout { } static async getProductVariationsPrice(id, campaignId) { - let payload = (await this.getProductVariations(this.productId[id], campaignId))?.payload; + let payload = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId))?.payload; if (!payload || payload.length === 0) { return null @@ -866,13 +816,13 @@ class BitCheckout { * for example com.bitdefender.passwordmanager maps 2 products * Password Manager and Password Manager Shared Plan */ - if (this.names[id]) { - payload = payload.filter(product => product.name === this.names[id]) + if (Constants.PRODUCT_ID_NAME_MAPPINGS[id]) { + payload = payload.filter(product => product.name === Constants.PRODUCT_ID_NAME_MAPPINGS[id]) } window.StoreProducts.product[id] = { product_alias: id, - product_id: this.productId[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id], product_name: payload[0].name, variations: {} } @@ -916,8 +866,8 @@ class BitCheckout { const devicesObj = { currency_iso: devices.currency, currency_label: "€", - product_id: this.productId[id], - platform_product_id: this.productId[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id], + platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], promotion: campaignId, region_id: 22, platform_id: 16, @@ -950,6 +900,127 @@ class BitCheckout { } } +class Vlaicu { + + static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; + static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; + + // TODO: delete this parameter + static campaign = "TSExpired0MRDLP24"; + + static async getProductVariations(productId, campaign) { + + const pathVariablesResolverObject = { + "{locale}": Page.locale, + "{bundleId}": productId, + "{campaignId}": campaign || this.campaign + }; + + // get the correct path to get the prices + let productPath = campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + + // replace all variables from the path + const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); + productPath = productPath.replace(pathVariablesRegex, (matched) => { + return pathVariablesResolverObject[matched] + }); + + const endpoint = new URL(productPath, Store.config.vlaicuEndpoint); + + try { + const response = await fetch( + endpoint.href, + { + method: "GET", + headers: { + "Content-Type": "application/json" + } + } + ); + + if (!response.ok) { + return null; + } + + return await response.json(); + } catch (error) { + console.error(error); + return null; + } + } + + static async getProductVariationsPrice(id, campaignId) { + const productInfo = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId))?.product; + if (!productInfo) { + return null; + } + + let payload = productInfo?.options; + if (!payload || !payload.length) { + return null; + } + + /** + * this rules splits one product into multiple products + * for example com.bitdefender.passwordmanager maps 2 products + * Password Manager and Password Manager Shared Plan + */ + if (Constants.PRODUCT_ID_NAME_MAPPINGS[id]) { + payload = payload.filter(product => product.name === Constants.PRODUCT_ID_NAME_MAPPINGS[id]) + } + + window.StoreProducts.product[id] = { + product_alias: id, + product_id: Constants.PRODUCT_ID_MAPPINGS[id], + product_name: productInfo.productName, + variations: {} + } + + payload.forEach(productVariation => { + const yearsSubscription = productVariation.months / 12; + const devices_no = productVariation.slots; + + const devicesObj = { + currency_iso: productVariation.currency, + currency_label: "€", + product_id: Constants.PRODUCT_ID_MAPPINGS[id], + platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], + promotion: campaignId, + region_id: 22, + platform_id: 16, + price: productVariation.price, + variation: { + variation_name: `${productVariation.slots}u-${yearsSubscription}y`, + years: yearsSubscription, + months: productVariation.months, + // billing_period: period.billing_period, + // payment_period: period.payment_period + } + } + + if (productVariation.discountAmount > 0) { + devicesObj['discount'] = { + discounted_price: productVariation.discountedPrice, + discount_value: productVariation.discountAmount, + } + } + + window.StoreProducts.product[id].variations[devices_no] = window.StoreProducts.product[id].variations[devices_no] + ? window.StoreProducts.product[id].variations[devices_no] + : {}; + window.StoreProducts.product[id].variations[devices_no][yearsSubscription] = devicesObj; + }); + + return window.StoreProducts.product[id]; + } + + static async loadProduct(id, campaign) { + window.StoreProducts = window.StoreProducts || []; + window.StoreProducts.product = window.StoreProducts.product || {}; + return await this.getProductVariationsPrice(id, campaign); + } +} + class StoreConfig { constructor() { @@ -978,6 +1049,14 @@ class StoreConfig { endpoint: "https://checkout-service.bitdefender.com" }; + /** + * @type {string} + */ + this.vlaicuEndpoint = ""; + if (Constants.DEV_DOMAINS.some(domain => window.location.hostname.includes(domain))) { + this.vlaicuEndpoint = "https://service-delivery.nmbapp.net"; + } + /** * @type {"GET"} */ @@ -997,12 +1076,16 @@ class StoreConfig { } async getCampaign() { - const jsonFilePath = 'https://www.bitdefender.com/pages/fragment-collection/zuoracampaign.json'; + if (!Constants.ZUROA_LOCALES.includes(Page.locale)) { + return ""; + } + + const jsonFilePath = "https://www.bitdefender.com/pages/fragment-collection/zuoracampaign.json"; const resp = await fetch(jsonFilePath); if (!resp.ok) { console.error(`Failed to fetch data. Status: ${resp.status}`); - return ''; + return ""; } const data = await resp.json(); @@ -1081,6 +1164,24 @@ export class Store { } } + // TODO: setup vlaicu as an option here + if (this.config.provider === "vlaicu") { + try { + const product = await Vlaicu.loadProduct(productInfo.id, productInfo.promotion); + + if (!product) { + return null + } + + return { + ...product, + ...productInfo + } + } catch (error) { + return null; + } + } + const data = JSON.stringify({ ev: 1, product_id: productInfo.id, From 6b52db50191edf8580550086c5f12707c9bafaea Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 23 Oct 2024 11:18:59 +0300 Subject: [PATCH 006/248] added correct endpoint for Vlaicu --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 398419335..c7e9cc743 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1052,7 +1052,7 @@ class StoreConfig { /** * @type {string} */ - this.vlaicuEndpoint = ""; + this.vlaicuEndpoint = window.location.origin; if (Constants.DEV_DOMAINS.some(domain => window.location.hostname.includes(domain))) { this.vlaicuEndpoint = "https://service-delivery.nmbapp.net"; } From 4dd64c500bfa482587795bb27b8d6cc9595b41d5 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 23 Oct 2024 12:41:25 +0300 Subject: [PATCH 007/248] fixed light mode css --- _src/blocks/webview-table/webview-table.css | 431 ++++++++------------ 1 file changed, 163 insertions(+), 268 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 8dbf57ddc..041396f51 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -1,276 +1,158 @@ :root { --first-table-cell-color: #e4f2ff; - --table-cell-color: #eee; --yes-check-color: #44AA44; --no-check-color: #FD3434; - --column-header-highlight-color: #de2985; - --product-comparison-text-color: #5d5c5c; --expandable-row-background-color: #0040F0; --expandable-row-text-color: #fff; - --product-table-badge-color: #2cb43d; + --product-comparison-text-color: #5d5c5c; --current-price-color: #000; - --expandable-row-arrow-color: #c5c5c5; } -.await-loader{ + +.await-loader { min-height: 4rem; } -.webview-wrapper { - width: 768px; - max-height: 512px; - padding: 0; + +.webview-table-wrapper { + max-width: 768px; + height: 512px; margin: 0 auto; - - background-color: #141517; - background-size: 188px 104px; - text-align: center; font-family: "Segoe UI", Arial, sans-serif; - - .webview { - max-width: 438px; - margin: auto; - img { - width: 92px; - height: auto; - } - - h3 { - margin-top: 30px; - margin-bottom: 16px; - font-size: 18px; - line-height: 24px; - font-weight: 700; - color: black; - } - - .button-container { - margin-top: 8px; - margin-bottom: 0; - } - - .button.secondary { - background-color: white; - border-color: white; - color: #006EFF; - } - - .prod-oldprice { - font-size: var(--body-font-size-xs); - line-height: var(--body-font-size-xs); - text-decoration: line-through; - } - - .prod-percent { - font-size: 13px; - line-height: 15px; - color: white; - background-color: #61A851; - border-radius: 11px; - padding: 4px 10px; - font-weight: bold; - } - - .prod-newprice { - font-size: var(--body-font-size-xl); - line-height: var(--body-font-size-xl); - font-weight: 700; - } - - .under-price-text { - font-size: var(--body-font-size-xxs); - line-height: var(--body-font-size-xxs); - color: #666666; - - p { - margin: 0; - font-size: var(--body-font-size-xxxs); - } - } - - .price_box { - display: flex; - flex-direction: column; - gap: 4px; - } - } } +.webview-table { + width: 100%; + height: 512px; -.webview { + padding: 0 25px; display: table; - padding-top: 0.625rem; - padding-bottom: 0.625rem; font-size: 14px; + background-color: #141517; + color: #999999; } -.webview h1{ +.webview-table h1 { text-align: center; - font: normal normal bold 24px Segoe UI; - letter-spacing: 0px; + font: bold 24px "Segoe UI"; color: #F7F7F7; - opacity: 1; - margin-bottom: 8px; - margin-top: 2px; + margin: 2px 0 8px; } -.webview .webview-comparison-header div[role="columnheader"]:first-child{ - min-width: 292px; +.webview-comparison-header { + display: flex; + background-color: #141517; + border: none; } -.webview .webview-comparison-header strong{ - font-size: 16px; +.webview-table div[role="row"]{ + display: flex; } -.webview .webview-comparison-header div[role="columnheader"]:not(:first-child) { - flex: 1; - min-width: 142px; - flex-flow:column; - flex-wrap: wrap; +.webview-comparison-header div[role="columnheader"] { + width: 142px; text-align: center; justify-content: center; color: #e4f2ff; -} - -.webview .webview-comparison-header div[role="columnheader"] p{ - text-align: center; - font: normal normal normal 16px Segoe UI; - letter-spacing: 0px; - opacity: 1; - margin: 0; - margin-top: 8px; - line-height: 0.9; -} -.webview .webview-comparison-header div[role="columnheader"] p:last-of-type{ - margin-bottom: 8px; -} - -.webview-comparison-header div[role="columnheader"] { padding-bottom: 8px; + border-right: none; + border-left: none; + p{ + margin: 1px; + padding: 0; + } + p:first-of-type{ + margin-top: 2px; + } + p:last-of-type{ + margin-bottom: 2px; + } } - -.webview div[role='row']:not(.webview-comparison-header) { - display: flex; - flex-wrap: nowrap; - white-space: normal; - justify-content: space-around; - font-size: var(--body-font-size-xs); - font: normal normal 600 14px Segoe UI; - color: var(--color-dark-gray); - min-width: 94px; - width: 100%; -} - -.webview div[role='row']:not(.webview-comparison-header):last-of-type{ - border-bottom-left-radius: 8px; - padding-bottom: 6.27px; -} - -.webview-comparison-header{ - display: flex; +.webview-comparison-header div[role="columnheader"]:first-child { + min-width: 292px; } -.webview div[role='cell']{ - min-width: 142px; +.webview-table div[role='cell'] { + width: 142px; + padding: 8px; + background: #141517; border: 0.1px solid #3c3c3c; border-left: none; border-right: none; display: flex; - flex-flow:column nowrap; + flex-direction: column; justify-content: center; align-items: center; - padding: 8px; - font-size: 14px; } -.webview div[role='cell']:first-child { - white-space: normal; - display: table-cell; +.webview-table div[role='cell']:first-child { min-width: 292px; - height: auto; - text-align: left; - letter-spacing: 0px; - color: #FFFFFF; - opacity: 1; - font: normal normal 600 14px Segoe UI; - border: 0.1px solid #141517; - border-right: none; - background: #333333 0% 0% no-repeat padding-box; + max-width: 292px; + background: #333; + color: #fff; + font-weight: 600; + border: 0.1px solid black; } - -.webview div[role='row']:first-of-type div[role='cell']:first-child{ - border-top-left-radius: 8px; +.webview-table div[role="row"]:last-of-type div[role='cell']:first-child{ + visibility: hidden; } -.webview div[role='row']:last-of-type div[role='cell']{ - border:none; - border-radius: 0 0 4px 4px; -} - -.webview div[role="cell"] .yes-check { - position: relative; - top:1px; - width: 18px; - height: 18px; - background-color: #4CAF50; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: black; - font-size: 16px; -} +.webview-table div[role='row']:last-of-type div[role='cell'] { + border: hidden; + .buy-box{ + .prod-oldprice{ + text-align: center; + text-decoration: line-through; + font: normal normal normal 14px/19px Segoe UI; + letter-spacing: 0px; + opacity: 1; + } + .prod-newprice{ + text-align: center; + font: normal normal bold 20px/26px Segoe UI; + letter-spacing: 0px; + color: #FFFFFF; + opacity: 1; + } + } -.webview div[role="cell"] .yes-check::after { - content: ''; - position: relative; - width: 3px; - height: 7px; - border: solid black; - border-width: 0 2px 2px 0; - transform: rotate(45deg); - bottom: 1px; - left: 0%; } - -.webview div[role="cell"] .no-check { - height: 1rem; - width: 0.625rem; - position: relative; - top:1px; +.webview-table-wrapper .webview-table .button-container{ + margin-top: 2px; + margin-bottom: 2px; } +.webview-table-wrapper .webview-table .button{ + justify-content: center; + border: 1px solid #006EFF; + background-color: black; + width: 122px; + padding: 6px 16px; + border-radius: 4px; + text-align: center; + &::after { + display: none; + content: none; + } -.webview div[role="cell"] .no-check::after { - position: absolute; - width: 0.17rem; - transform: rotate(45deg); - content: ' '; - background-color: var(--no-check-color); - height: 16px; } -.webview div[role="cell"] .no-check::before { - position: absolute; - height: 16px; - width: 0.17rem; - transform: rotate(-45deg); - content: ' '; - background-color: var(--no-check-color); + .webview-table .button .button-text { + color: #006EFF; + text-align: center; } -.webview .button{ - border: 1px solid #006EFF ; - opacity: 1; - background-color: black !important; - width: 122px; - padding: 6px 16px 6px 16px !important; - border-radius: 4px !important; -} -.webview .button .button-text{ - color: #006EFF; +.webview-table-wrapper .webview-table .current .button{ + border-color: #767676; + .button-text{ + color: #767676; + } + &::after { + display: none; + content: none; + } } -.webview .savings-tag-container{ +.webview-table .savings-tag-container { background-color: #2cb43d; color: white; font-weight: bold; @@ -279,88 +161,101 @@ padding: 2px; } -.webview .featured{ - background-color: #202123; -} - - -.webview .price_box{ - padding: 0; - color:#e4f2ff; +.webview-table .price_box { + flex-flow: column; + color: #e4f2ff; text-align: center; } -.webview .under-price-text{ - font-size: 12px; +.webview-table .yes-check { + width: 18px; + height: 18px; + background-color: #4CAF50; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + color: black; } - -.webview .featured .button{ - background: #006EFF 0% 0% no-repeat padding-box !important; - opacity: 1; +.webview-table .yes-check::after { + content: ''; + width: 3px; + height: 7px; + border: solid black; + border-width: 0 2px 2px 0; + transform: rotate(45deg); } -.webview .featured .button-text{ - color: white !important; +.webview-table .no-check { + height: 1rem; + width: 0.625rem; + position: relative; } -.webview .current .button{ - border-color: #767676 !important; +.webview-table .no-check::after, .webview-table .no-check::before { + content: ''; + position: absolute; + width: 0.17rem; + height: 16px; + background-color: var(--no-check-color); } -.webview .current .button-text{ - color: #767676 !important; -} -.light-mode{ - color: black; - background-color: #FFFFFF !important; +.webview-table .no-check::after { + transform: rotate(45deg); } -.light-mode h1{ - color: black !important; +.webview-table .no-check::before { + transform: rotate(-45deg); } +.webview-table-wrapper .webview-table .featured{ + background-color: #202123; + .button{ + background-color: #006EFF; + } + .button-text{ + color: #FFFFFF; + } + div[role="cell"]:last-of-type{ + border-radius: 4px 4px 0 0; + } -.light-mode div[role="columnheader"]{ - background-color: #FFFFFF !important; - color: #000000 !important; } -.light-mode div[role='cell']:first-child:not(:last-of-type){ - color: #000000 !important; - background-color: #F9F9FE !important; - border-color: #FFFF; -} -.light-mode div[role='cell']:first-child:last-of-type{ +.webview-table-wrapper .light-mode { background-color: #fff; + color: black; } -.light-mode .yes-check::after{ - border-color: #FFFFFF !important; -} - -.light-mode .price_box{ - color: black !important; +.webview-table-wrapper .light-mode h1 { + color: black; } -.light-mode div[role="cell"]{ - color: #515B6D !important; - background-color: #FFFFFF !important; - border-color: #F5F5F5; +.webview-table-wrapper .light-mode div[role="columnheader"] { + background-color: #fff; + color: #000; } -.light-mode div[role="cell"] .featured { - background-color: #F9F9FE !important; +.webview-table-wrapper .light-mode div[role='cell']:first-child { + color: #000; + background-color: #F9F9FE; + border-color: #FFF; } -.light-mode .prod-oldprice{ - color:#515B6D !important; +.webview-table-wrapper .light-mode div[role="cell"] { + color: #515B6D; + background-color: #fff; + border-color: #F5F5F5; } -.light-mode .under-price-text{ - color:#515B6D !important; +.webview-table-wrapper .light-mode div[role="cell"] .price_box { + color: black; + .prod-newprice{ + color: #000000 !important; + } } -.light-mode .button{ - background-color: #FFFFFF !important; +.webview-table-wrapper .light-mode .button { + background-color: #fff; } \ No newline at end of file From 12a72fe70bdc774fdc5678906fb995d1e5a55ba9 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 23 Oct 2024 12:45:14 +0300 Subject: [PATCH 008/248] fixed light-mode checkmarks --- _src/blocks/webview-table/webview-table.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 041396f51..b7e02e13e 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -256,6 +256,11 @@ } } +.webview-table-wrapper .light-mode .yes-check::after { + border: solid #FFFFFF; + border-width: 0 2px 2px 0; +} + .webview-table-wrapper .light-mode .button { background-color: #fff; } \ No newline at end of file From a67df57e72916817bf19b1883ccac3b3456ae64e Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 23 Oct 2024 12:54:53 +0300 Subject: [PATCH 009/248] centered no-checks --- _src/blocks/webview-table/webview-table.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index b7e02e13e..0949f3232 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -191,6 +191,7 @@ height: 1rem; width: 0.625rem; position: relative; + margin-left: 7px; } .webview-table .no-check::after, .webview-table .no-check::before { From 5f07ac91ad3836e1d8f57b277afc644bbd659e79 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 23 Oct 2024 12:57:58 +0300 Subject: [PATCH 010/248] added featured syle --- _src/blocks/webview-table/webview-table.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 0949f3232..bd79b38d2 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -264,4 +264,8 @@ .webview-table-wrapper .light-mode .button { background-color: #fff; +} + +.webview-table-wrapper .light-mode div .featured{ + background-color: #F9F9FE; } \ No newline at end of file From a4589e371a29459a3dd1ef3834483d7ab9bb87a7 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 23 Oct 2024 13:14:23 +0300 Subject: [PATCH 011/248] fixed text alignment --- _src/blocks/webview-table/webview-table.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index bd79b38d2..d26b122af 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -90,6 +90,7 @@ color: #fff; font-weight: 600; border: 0.1px solid black; + align-items: baseline; } .webview-table div[role="row"]:last-of-type div[role='cell']:first-child{ visibility: hidden; From 40454b0078e0f82976f7b90870cbc6e2119a727c Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 23 Oct 2024 15:34:21 +0300 Subject: [PATCH 012/248] removed unnecessary parameters --- _src/scripts/libs/constants.js | 8 ++--- .../resolver/staticAttributes/buyLink.js | 1 - _src/scripts/libs/store/store.js | 35 +++---------------- 3 files changed, 9 insertions(+), 35 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 3c55ecbaa..bcdcbda74 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -60,9 +60,9 @@ export const Constants = { }, PRODUCT_ID_NAME_MAPPINGS: { - pass: "Bitdefender Password Manager", - pass_sp: "Bitdefender Password Manager Shared Plan", - passm: "Bitdefender Password Manager", - pass_spm: "Bitdefender Password Manager Shared Plan" + pass: "Bitdefender Password Manager", + pass_sp: "Bitdefender Password Manager Shared Plan", + passm: "Bitdefender Password Manager", + pass_spm: "Bitdefender Password Manager Shared Plan" } } \ No newline at end of file diff --git a/_src/scripts/libs/store/resolver/staticAttributes/buyLink.js b/_src/scripts/libs/store/resolver/staticAttributes/buyLink.js index 9c2bf48ea..64e0400e5 100644 --- a/_src/scripts/libs/store/resolver/staticAttributes/buyLink.js +++ b/_src/scripts/libs/store/resolver/staticAttributes/buyLink.js @@ -20,6 +20,5 @@ export const resolve = async (element, { product, option }) => { button.setAttribute("data-buy-price", option.getDiscountedPrice("value") || option.getPrice("value")); button.setAttribute("data-old-price", option.getPrice("value")); button.setAttribute("data-currency", option.getSymbol()); - button.setAttribute("data-region", product.getRegionId()); button.setAttribute("data-variation", `${option.getDevices()}u-${option.getSubscription("years")}y`); } \ No newline at end of file diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index c7e9cc743..447893e59 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -268,8 +268,6 @@ export class Product { this.promotion = product.promotion || (GLOBAL_V2_LOCALES.find(domain => Page.locale === domain) ? 'global_v2' : null); const option = Object.values(Object.values(product.variations)[0])[0]; this.currency = option.currency_iso; - this.symbol = option.currency_label; - this.regionId = option.region_id; this.avangateId = Object.values(Object.values(product.variations)[0])[0]?.platform_product_id; this.yearDevicesMapping = Object.entries(this.options).reduce((acc, [deviceKey, values]) => { Object.keys(values).forEach(yearKey => { @@ -301,13 +299,6 @@ export class Product { return this.productId; } - /** - * @returns {string} - */ - getRegionId() { - return this.regionId; - } - /** * Returns product API ALIAS * @returns {string} - Product Id : tsmd/com.bitdefender.cl.tsmd @@ -340,14 +331,6 @@ export class Product { return this.currency; } - /** - * - * @returns {string} - $ | € ... - */ - getSymbol() { - return this.symbol; - } - /** * * @returns {string} - consumer | business @@ -865,12 +848,9 @@ class BitCheckout { } const devicesObj = { currency_iso: devices.currency, - currency_label: "€", product_id: Constants.PRODUCT_ID_MAPPINGS[id], platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], promotion: campaignId, - region_id: 22, - platform_id: 16, price: devices.price, variation: { variation_name: `${devices_no}u-${billingPeriod}y`, @@ -917,6 +897,7 @@ class Vlaicu { }; // get the correct path to get the prices + // TODO: add a check for campaign to be not null let productPath = campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; // replace all variables from the path @@ -977,24 +958,18 @@ class Vlaicu { } payload.forEach(productVariation => { - const yearsSubscription = productVariation.months / 12; + const yearsSubscription = Math.ceil(productVariation.months / 12); const devices_no = productVariation.slots; const devicesObj = { currency_iso: productVariation.currency, - currency_label: "€", product_id: Constants.PRODUCT_ID_MAPPINGS[id], platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], promotion: campaignId, - region_id: 22, - platform_id: 16, price: productVariation.price, variation: { - variation_name: `${productVariation.slots}u-${yearsSubscription}y`, + variation_name: `${devices_no}u-${yearsSubscription}y`, years: yearsSubscription, - months: productVariation.months, - // billing_period: period.billing_period, - // payment_period: period.payment_period } } @@ -1034,7 +1009,7 @@ class StoreConfig { * default promotion * @type {string} */ - this.campaign = this.getCampaign(); + this.campaign = this.#getCampaign(); /** * @type {{ @@ -1075,7 +1050,7 @@ class StoreConfig { return Constants.ZUROA_LOCALES.includes(Page.locale) ? "zuora" : "init"; } - async getCampaign() { + async #getCampaign() { if (!Constants.ZUROA_LOCALES.includes(Page.locale)) { return ""; } From d243094c7c28eb545a3788be86b68e4b9234502b Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 23 Oct 2024 16:24:27 +0300 Subject: [PATCH 013/248] added function to get correct http method --- _src/scripts/libs/store/store.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 11114d029..e9ac03c08 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1006,7 +1006,7 @@ class StoreConfig { this.provider = this.#getProvider(); /** - * default promotion + * default promotion for zuora * @type {string} */ this.campaign = this.#getCampaign(); @@ -1033,11 +1033,23 @@ class StoreConfig { } /** - * @type {"GET"} + * @type {"GET"|"POST"} */ - this.httpMethod = "POST"; + this.httpMethod = this.#getHTTPMethod(); } + /** + * + * @returns {string} the http method used to get prices + */ + #getHTTPMethod() { + if (Constants.VLAICU_LOCALES.includes(Page.locale) && Constants.VLAICU_PAGES.includes(Page.pageName)) { + return "GET"; + } + + return "POST"; + }; + /** * * @returns {string} the prices provider to be used @@ -1103,7 +1115,7 @@ export class Store { this.products = (await Promise .allSettled( productsInfo.map(async product => { - //url > produs > global_campaign + // target > url > produs > global_campaign > default campaign for zuora product.promotion = await Target.getCampaign() || this.#getUrlPromotion() || product.promotion From 678b3379ac29f6181c78a3f9c70b9bd17879a111 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 24 Oct 2024 10:58:19 +0300 Subject: [PATCH 014/248] fixed double border issue --- _src/blocks/webview-table/webview-table.css | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index d26b122af..432d74a68 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -34,7 +34,7 @@ text-align: center; font: bold 24px "Segoe UI"; color: #F7F7F7; - margin: 2px 0 8px; + margin: 8px 0 2px; } .webview-comparison-header { @@ -74,9 +74,7 @@ width: 142px; padding: 8px; background: #141517; - border: 0.1px solid #3c3c3c; - border-left: none; - border-right: none; + border-top: 0.1px solid #3c3c3c; display: flex; flex-direction: column; justify-content: center; @@ -97,7 +95,6 @@ } .webview-table div[role='row']:last-of-type div[role='cell'] { - border: hidden; .buy-box{ .prod-oldprice{ text-align: center; @@ -124,7 +121,7 @@ } .webview-table-wrapper .webview-table .button{ justify-content: center; - border: 1px solid #006EFF; + border: 2px solid #006EFF; background-color: black; width: 122px; padding: 6px 16px; From 4bb2fbddfb1a18c5d7f856563e3fbb51d06447cd Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 24 Oct 2024 11:43:50 +0300 Subject: [PATCH 015/248] final style adjustments --- _src/blocks/webview-table/webview-table.css | 24 +++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 432d74a68..7eb28ed5b 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -34,7 +34,7 @@ text-align: center; font: bold 24px "Segoe UI"; color: #F7F7F7; - margin: 8px 0 2px; + margin: 10px 0 10px; } .webview-comparison-header { @@ -58,9 +58,10 @@ p{ margin: 1px; padding: 0; + line-height: 1; } p:first-of-type{ - margin-top: 2px; + margin-top: 4px; } p:last-of-type{ margin-bottom: 2px; @@ -87,7 +88,7 @@ background: #333; color: #fff; font-weight: 600; - border: 0.1px solid black; + border-top: 1px solid black; align-items: baseline; } .webview-table div[role="row"]:last-of-type div[role='cell']:first-child{ @@ -95,30 +96,32 @@ } .webview-table div[role='row']:last-of-type div[role='cell'] { + border-radius: 0 0 4px 4px; .buy-box{ .prod-oldprice{ text-align: center; text-decoration: line-through; - font: normal normal normal 14px/19px Segoe UI; + font: normal normal normal 14px Segoe UI; letter-spacing: 0px; opacity: 1; } + .prod-newprice{ text-align: center; - font: normal normal bold 20px/26px Segoe UI; + font: normal normal bold 24px Segoe UI; letter-spacing: 0px; color: #FFFFFF; opacity: 1; + line-height: 0.8; } - } - } .webview-table-wrapper .webview-table .button-container{ margin-top: 2px; margin-bottom: 2px; } + .webview-table-wrapper .webview-table .button{ justify-content: center; border: 2px solid #006EFF; @@ -216,10 +219,6 @@ .button-text{ color: #FFFFFF; } - div[role="cell"]:last-of-type{ - border-radius: 4px 4px 0 0; - } - } .webview-table-wrapper .light-mode { @@ -250,6 +249,9 @@ .webview-table-wrapper .light-mode div[role="cell"] .price_box { color: black; + .prod-oldprice{ + color: #515B6D; + } .prod-newprice{ color: #000000 !important; } From f12cc0b8cc67ff23cb208314b412b200512ef7a0 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 24 Oct 2024 11:47:29 +0300 Subject: [PATCH 016/248] final style --- _src/blocks/webview-table/webview-table.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 7eb28ed5b..80044218a 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -61,10 +61,12 @@ line-height: 1; } p:first-of-type{ - margin-top: 4px; + margin-top: 8px; + font-size: 14px; } p:last-of-type{ - margin-bottom: 2px; + margin-bottom: 4px; + font-size: 16px; } } .webview-comparison-header div[role="columnheader"]:first-child { From a99f38e7bb4e47bffb9c4982e230daa24b39b982 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 24 Oct 2024 11:49:18 +0300 Subject: [PATCH 017/248] final-style --- _src/blocks/webview-table/webview-table.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 80044218a..636c3c7c7 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -110,7 +110,7 @@ .prod-newprice{ text-align: center; - font: normal normal bold 24px Segoe UI; + font: normal normal bold 20px Segoe UI; letter-spacing: 0px; color: #FFFFFF; opacity: 1; From 64dd711034bd36bc163636bbc2de73bc5fb1ee05 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 24 Oct 2024 12:31:23 +0300 Subject: [PATCH 018/248] final version webview-table --- _src/blocks/webview-table/webview-table.css | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 636c3c7c7..38206ec93 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -34,7 +34,7 @@ text-align: center; font: bold 24px "Segoe UI"; color: #F7F7F7; - margin: 10px 0 10px; + margin: 10px 0 14px; } .webview-comparison-header { @@ -100,6 +100,9 @@ .webview-table div[role='row']:last-of-type div[role='cell'] { border-radius: 0 0 4px 4px; .buy-box{ + display: flex; + flex-direction: column; + gap: 0px; .prod-oldprice{ text-align: center; text-decoration: line-through; @@ -107,21 +110,25 @@ letter-spacing: 0px; opacity: 1; } - + .prod-newprice{ text-align: center; font: normal normal bold 20px Segoe UI; letter-spacing: 0px; color: #FFFFFF; opacity: 1; - line-height: 0.8; + line-height: 1; + } + + .under-price-text{ + font-size: 10px; } } } .webview-table-wrapper .webview-table .button-container{ margin-top: 2px; - margin-bottom: 2px; + margin-bottom: 4px; } .webview-table-wrapper .webview-table .button{ From 4d8814bdc437a3128945e824aa15163129a0e576 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 24 Oct 2024 17:11:37 +0300 Subject: [PATCH 019/248] added buy links from Vlaicu --- _src/scripts/libs/data-layer.js | 14 +++++- _src/scripts/libs/store/store.js | 77 +++++++++++++++++++------------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 0a4ac2b07..c93a0645a 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -653,13 +653,22 @@ export class Target { }, { once: true }); }); + /** + * get the flag which marks wether the page should use Vlaicu or not + * @returns {Promise} + */ + static async getVlaicuFlag() { + await this.#staticInit; + return Boolean(this.offers?.["vlaicu-flag-mbox"]?.content?.vlaicuFlag || null); + } + /** * https://bitdefender.atlassian.net/wiki/spaces/WWW/pages/1661993460/Activating+Promotions+Enhancements+Target * @returns {Promise} */ static async getCampaign() { await this.#staticInit; - return this.offers?.["initSelector-mbox"]?.content?.pid || null + return this.offers?.["initSelector-mbox"]?.content?.pid || null; } /** @@ -693,7 +702,7 @@ export class Target { return []; } - return [...mboxes].map((name, index) => { return { index: ++index, name } }); + return [...mboxes].map((name, index) => { return { index: index + 2, name } }); } static async #getOffers() { @@ -709,6 +718,7 @@ export class Target { execute: { mboxes: [ { index: 0, name: "initSelector-mbox" }, + { index: 1, name: "vlaicu-flag-mbox" }, ...mboxes ] } diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index e9ac03c08..38d2ceb0a 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -441,6 +441,12 @@ export class Product { return option; } + if (Store.config.provider === "vlaicu" && yearsOption.buyLink) { + option.buyLink = yearsOption.buyLink; + + return option; + } + //Zuora settings const windowURL = new URL(window.location.href) const zuoraCart = new URL("/index.html:step=cart?theme=light", Store.config.zuora.cartUrl) @@ -967,6 +973,7 @@ class Vlaicu { platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], promotion: campaignId, price: productVariation.price, + buyLink: productVariation.buyLink, variation: { variation_name: `${devices_no}u-${yearsSubscription}y`, years: yearsSubscription, @@ -998,16 +1005,20 @@ class Vlaicu { class StoreConfig { - constructor() { + /** + * + * @param {boolean} vlaicuFlag + */ + constructor(vlaicuFlag) { /** * Api used to fetch the prices * @type {"init"|"zuora"|"vlaicu"} */ - this.provider = this.#getProvider(); + this.provider = this.#getProvider(vlaicuFlag); /** - * default promotion for zuora - * @type {string} + * default promotion + * @type {Promise} */ this.campaign = this.#getCampaign(); @@ -1035,31 +1046,7 @@ class StoreConfig { /** * @type {"GET"|"POST"} */ - this.httpMethod = this.#getHTTPMethod(); - } - - /** - * - * @returns {string} the http method used to get prices - */ - #getHTTPMethod() { - if (Constants.VLAICU_LOCALES.includes(Page.locale) && Constants.VLAICU_PAGES.includes(Page.pageName)) { - return "GET"; - } - - return "POST"; - }; - - /** - * - * @returns {string} the prices provider to be used - */ - #getProvider() { - if (Constants.VLAICU_LOCALES.includes(Page.locale) && Constants.VLAICU_PAGES.includes(Page.pageName)) { - return "vlaicu"; - } - - return Constants.ZUROA_LOCALES.includes(Page.locale) ? "zuora" : "init"; + this.httpMethod = this.#getHTTPMethod(vlaicuFlag); } async #getCampaign() { @@ -1078,6 +1065,30 @@ class StoreConfig { return data.data[0].CAMPAIGN_NAME; } + + /** + * + * @returns {"GET"|"POST"} the http method used to get prices + */ + #getHTTPMethod(vlaicuFlag) { + if (vlaicuFlag) { + return "GET"; + } + + return "POST"; + }; + + /** + * @param {boolean} vlaicuFlag + * @returns {"init"|"zuora"|"vlaicu"} the prices provider to be used + */ + #getProvider(vlaicuFlag) { + if (vlaicuFlag) { + return "vlaicu"; + } + + return Constants.ZUROA_LOCALES.includes(Page.locale) ? "zuora" : "init"; + } } export class Store { @@ -1097,8 +1108,7 @@ export class Store { static mappedCountry = this.getCountry(); /** Private variables */ static baseUrl = Constants.DEV_BASE_URL; - - static config = new StoreConfig(); + static config = null; /** * Get a product from the api.2checkout.com @@ -1108,6 +1118,10 @@ export class Store { */ static async getProducts(productsInfo) { if (!Array.isArray(productsInfo)) { return null; } + + if (!this.config) { + this.config = new StoreConfig(await Target.getVlaicuFlag()); + } // remove duplicates by id productsInfo = [...new Map(productsInfo.map((product) => [`${product.id}`, product])).values()]; @@ -1156,7 +1170,6 @@ export class Store { } } - // TODO: setup vlaicu as an option here if (this.config.provider === "vlaicu") { try { const product = await Vlaicu.loadProduct(productInfo.id, productInfo.promotion); From 438f1a699240ab137c9751cda5d5c4b040eff719 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 24 Oct 2024 17:14:58 +0300 Subject: [PATCH 020/248] removed unnecessary constants --- _src/scripts/libs/constants.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index bcdcbda74..85543763b 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -10,10 +10,6 @@ export const Constants = { ZUROA_LOCALES: ['nl-nl', 'nl-be'], - VLAICU_LOCALES: ['en-gb'], - - VLAICU_PAGES: ['total-security'], - DEV_DOMAINS: ['localhost', 'stage', '.hlx.'], PRODUCT_ID_MAPPINGS: { From 7d818771c102da103e78c9ab50d660bc0c17d9ba Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Fri, 25 Oct 2024 11:35:42 +0300 Subject: [PATCH 021/248] started using production endpoint to simplify testing --- _src/scripts/libs/store/store.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 38d2ceb0a..3e6a77d94 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1038,10 +1038,7 @@ class StoreConfig { /** * @type {string} */ - this.vlaicuEndpoint = window.location.origin; - if (Constants.DEV_DOMAINS.some(domain => window.location.hostname.includes(domain))) { - this.vlaicuEndpoint = "https://service-delivery.nmbapp.net"; - } + this.vlaicuEndpoint = "https://www.bitdefender.com"; /** * @type {"GET"|"POST"} From 898f8d9eaadf31446e625e31a7a056fd9d3fe70d Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Fri, 25 Oct 2024 11:42:04 +0300 Subject: [PATCH 022/248] made the vlaicu endpoint more verbose --- _src/scripts/libs/store/store.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 3e6a77d94..ae63ef1e1 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1038,7 +1038,9 @@ class StoreConfig { /** * @type {string} */ - this.vlaicuEndpoint = "https://www.bitdefender.com"; + this.vlaicuEndpoint = Constants.DEV_DOMAINS.some(domain => window.location.hostname.includes(domain)) + ? "https://www.bitdefender.com" + : window.location.origin; /** * @type {"GET"|"POST"} From 15eaa8aafb3fb23f3826505a72a8d70df979880b Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 28 Oct 2024 16:44:47 +0200 Subject: [PATCH 023/248] implemented special cases for monthly products --- _src/blocks/new-prod-boxes/new-prod-boxes.js | 42 +++++++------ _src/scripts/libs/constants.js | 21 +++++++ _src/scripts/libs/store/resolver/resolver.js | 4 -- _src/scripts/libs/store/store.js | 64 +++++++++++++++----- 4 files changed, 93 insertions(+), 38 deletions(-) diff --git a/_src/blocks/new-prod-boxes/new-prod-boxes.js b/_src/blocks/new-prod-boxes/new-prod-boxes.js index 6ab642245..a897126fb 100644 --- a/_src/blocks/new-prod-boxes/new-prod-boxes.js +++ b/_src/blocks/new-prod-boxes/new-prod-boxes.js @@ -379,26 +379,28 @@ export default async function decorate(block) { let productObject = await Store.getProducts([new ProductInfo(prodName), new ProductInfo(addOnProdName)]); let product = productObject[prodName]; let addOnProduct = productObject[addOnProdName]; - let addOnCost = addOnProduct.getOption(addOnProdUsers, addOnProdYears).getDiscountedPrice('value') - product.getOption(prodUsers, prodYears).getDiscountedPrice('value'); - addOnCost = formatPrice(addOnCost, product.getCurrency()); - - let addOnNewPrice = newLi.querySelector('.add-on-newprice'); - addOnNewPrice.textContent = addOnCost; - let addOnOldPrice = newLi.querySelector('.add-on-oldprice'); - addOnOldPrice.textContent = formatPrice(addOnProduct.getOption(addOnProdUsers, addOnProdYears).getPrice('value'), addOnProduct.getCurrency()); - let addOnPercentSave = newLi.querySelector('.add-on-percent-save'); - addOnPercentSave.textContent = `${addOnPriceBox.querySelector('.prod-save').textContent} ${addOnProduct.getOption(addOnProdUsers, addOnProdYears).getDiscount('percentageWithProcent')}`; - - let checkBoxSelector = newLi.querySelector('.checkmark'); - checkBoxSelector.addEventListener('change', () => { - if (checkBoxSelector.checked) { - checkmarkList.classList.add('checked'); - block.children[key].querySelector('.add-on-product').style.display = 'block'; - } else { - checkmarkList.classList.remove('checked'); - block.children[key].querySelector('.add-on-product').style.display = 'none'; - } - }); + if (addOnProduct) { + let addOnCost = addOnProduct.getOption(addOnProdUsers, addOnProdYears).getDiscountedPrice('value') - product.getOption(prodUsers, prodYears).getDiscountedPrice('value'); + addOnCost = formatPrice(addOnCost, product.getCurrency()); + + let addOnNewPrice = newLi.querySelector('.add-on-newprice'); + addOnNewPrice.textContent = addOnCost; + let addOnOldPrice = newLi.querySelector('.add-on-oldprice'); + addOnOldPrice.textContent = formatPrice(addOnProduct.getOption(addOnProdUsers, addOnProdYears).getPrice('value'), addOnProduct.getCurrency()); + let addOnPercentSave = newLi.querySelector('.add-on-percent-save'); + addOnPercentSave.textContent = `${addOnPriceBox.querySelector('.prod-save').textContent} ${addOnProduct.getOption(addOnProdUsers, addOnProdYears).getDiscount('percentageWithProcent')}`; + + let checkBoxSelector = newLi.querySelector('.checkmark'); + checkBoxSelector.addEventListener('change', () => { + if (checkBoxSelector.checked) { + checkmarkList.classList.add('checked'); + block.children[key].querySelector('.add-on-product').style.display = 'block'; + } else { + checkmarkList.classList.remove('checked'); + block.children[key].querySelector('.add-on-product').style.display = 'none'; + } + }); + } } }); } diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 85543763b..9414f2aea 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -60,5 +60,26 @@ export const Constants = { pass_sp: "Bitdefender Password Manager Shared Plan", passm: "Bitdefender Password Manager", pass_spm: "Bitdefender Password Manager Shared Plan" + }, + + MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m"], + + WRONG_DEVICES_PRODUCT_IDS: { + 'pass_sp': { + contentDevices: 1, + providerDevices: 4, + }, + 'pass_spm': { + contentDevices: 1, + providerDevices: 4, + }, + 'vpn': { + contentDevices: 10, + providerDevices: 1, + }, + 'vpn-monthly': { + contentDevices: 10, + providerDevices: 1, + } } } \ No newline at end of file diff --git a/_src/scripts/libs/store/resolver/resolver.js b/_src/scripts/libs/store/resolver/resolver.js index a9d21030f..bba67ae3b 100644 --- a/_src/scripts/libs/store/resolver/resolver.js +++ b/_src/scripts/libs/store/resolver/resolver.js @@ -226,8 +226,6 @@ export class StoreResolver { storeEvent: "[data-store-event]", storeKey: "[data-store-key]", storeContext: "[data-store-context]", - storeRegion: "[data-store-region]", - storePlatform: "[data-store-platform]", storeDevicePropertiesMapping: "[data-store-device-properties-mapping]" } @@ -251,8 +249,6 @@ export class StoreResolver { element.dataset.storeId, element.dataset.storeDepartment, element.dataset.storePromotion, - element.dataset.storeRegion, - element.dataset.storePlatform ) } catch (error) { console.error(error.message) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index ae63ef1e1..9b7c3fe9d 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -265,7 +265,7 @@ export class Product { this.name = product.product_name; this.options = product.variations; this.department = product.department; - this.promotion = product.promotion || (GLOBAL_V2_LOCALES.find(domain => Page.locale === domain) ? 'global_v2' : null); + this.promotion = product.promotion || (GLOBAL_V2_LOCALES.find(domain => Page.locale === domain) ? 'global_v2' : ''); const option = Object.values(Object.values(product.variations)[0])[0]; this.currency = option.currency_iso; this.avangateId = Object.values(Object.values(product.variations)[0])[0]?.platform_product_id; @@ -281,6 +281,22 @@ export class Product { return acc; }, {}); + + // TODO: remove this if after finishing Vlaicu migration. It is used because in init selector the variation + // is wrongly placed as 1-1 instead of 4-1 as it should be for 'pass_sp' and 'pass_spm' + // for 'vpn' in init selector it was 10-1 which also needs to be changed + if (Store.config.provider === 'vlaicu' + && Object.keys(Constants.WRONG_DEVICES_PRODUCT_IDS).includes(product.product_alias)) { + const contentDevices = Constants.WRONG_DEVICES_PRODUCT_IDS[product.product_alias].contentDevices; + const providerDevices = Constants.WRONG_DEVICES_PRODUCT_IDS[product.product_alias].providerDevices + + this.options[contentDevices] = this.options[providerDevices]; + if (!this.yearDevicesMapping[contentDevices]) { + this.yearDevicesMapping[contentDevices] = [providerDevices] + } else { + this.yearDevicesMapping[contentDevices].push(providerDevices); + } + } } /** @@ -727,8 +743,6 @@ export class Product { class BitCheckout { - static monthlyProducts = ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm"] - // this products come with device_no set differently from the init-selector api where they are set to 1 static wrongDeviceNumber = ["bms", "mobile", "ios", "mobileios", "psm", "passm"] @@ -842,7 +856,7 @@ class BitCheckout { return; } - if (this.monthlyProducts.indexOf(id) !== -1) { + if (Constants.MONTHLY_PRODUCTS.indexOf(id) !== -1) { billingPeriod = 1; } @@ -947,15 +961,6 @@ class Vlaicu { return null; } - /** - * this rules splits one product into multiple products - * for example com.bitdefender.passwordmanager maps 2 products - * Password Manager and Password Manager Shared Plan - */ - if (Constants.PRODUCT_ID_NAME_MAPPINGS[id]) { - payload = payload.filter(product => product.name === Constants.PRODUCT_ID_NAME_MAPPINGS[id]) - } - window.StoreProducts.product[id] = { product_alias: id, product_id: Constants.PRODUCT_ID_MAPPINGS[id], @@ -964,6 +969,24 @@ class Vlaicu { } payload.forEach(productVariation => { + + /** + * for monthly products only add the monthly variations + * e.g for vpn-monthly we do not care about the product variation if it passes 12 months (more than a year) + */ + if (Constants.MONTHLY_PRODUCTS.includes(id) && productVariation.months >= 12) { + return; + } + + /** + * for yearly products only add the yearly variations + * e.g for tsmd we do not care about the product variation if it is below 12 months (less than a year) + */ + + if (!Constants.MONTHLY_PRODUCTS.includes(id) && productVariation.months < 12) { + return; + } + const yearsSubscription = Math.ceil(productVariation.months / 12); const devices_no = productVariation.slots; @@ -993,6 +1016,11 @@ class Vlaicu { window.StoreProducts.product[id].variations[devices_no][yearsSubscription] = devicesObj; }); + // for the cases where there is no variation available in the price call + if (!Object.keys(window.StoreProducts.product[id].variations).length) { + return null; + } + return window.StoreProducts.product[id]; } @@ -1049,6 +1077,10 @@ class StoreConfig { } async #getCampaign() { + if (GLOBAL_V2_LOCALES.find(domain => Page.locale === domain)) { + return "global_v2"; + } + if (!Constants.ZUROA_LOCALES.includes(Page.locale)) { return ""; } @@ -1107,6 +1139,10 @@ export class Store { static mappedCountry = this.getCountry(); /** Private variables */ static baseUrl = Constants.DEV_BASE_URL; + + /** + * @type {StoreConfig | null} + */ static config = null; /** @@ -1174,7 +1210,7 @@ export class Store { const product = await Vlaicu.loadProduct(productInfo.id, productInfo.promotion); if (!product) { - return null + return null; } return { From 15bf2fc7809002e8595a60bad5791870aa99032b Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 28 Oct 2024 17:09:26 +0200 Subject: [PATCH 024/248] tested zuora pages --- _src/blocks/products/products.js | 3 ++- _src/scripts/libs/store/store.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 97650c62a..bf1dda838 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -1,3 +1,4 @@ +import { Constants } from '../../scripts/libs/constants.js'; import { createNanoBlock, renderNanoBlocks, @@ -43,7 +44,7 @@ function renderPlanSelector(plans, defaultSelection) { liStoreParameters['data-store-click-set-product'] = ''; liStoreParameters['data-store-product-id'] = productCode; liStoreParameters['data-store-department'] = 'consumer'; - liStoreParameters['data-product-type'] = productCode.slice(-1) === 'm' ? 'monthly' : 'yearly'; + liStoreParameters['data-product-type'] = Constants.MONTHLY_PRODUCTS.includes(productCode) ? 'monthly' : 'yearly'; } const li = createTag( diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 9b7c3fe9d..df9a6513c 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -905,7 +905,7 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - // TODO: delete this parameter + // TODO: delete this parameter as it is for testing purposes only static campaign = "TSExpired0MRDLP24"; static async getProductVariations(productId, campaign) { @@ -913,7 +913,7 @@ class Vlaicu { const pathVariablesResolverObject = { "{locale}": Page.locale, "{bundleId}": productId, - "{campaignId}": campaign || this.campaign + "{campaignId}": this.campaign // TODO: replace with campaign received as parameter }; // get the correct path to get the prices From ad5ad4f0fd96d0562e364d25dab608c69dccd787 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 29 Oct 2024 13:51:39 +0200 Subject: [PATCH 025/248] moved trackers before loadblocks --- _src/scripts/scripts.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 74890e746..cb43cef43 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -371,6 +371,7 @@ async function loadLazy(doc) { loadHeader(doc.querySelector('header')); } + loadTrackers(); await loadBlocks(main); const { hash } = window.location; @@ -391,8 +392,6 @@ async function loadLazy(doc) { loadCSS(`${window.hlx.codeBasePath}/scripts/template-factories/${templateMetadata}-lazy.css`); } - loadTrackers(); - sampleRUM('lazy'); sampleRUM.observe(main.querySelectorAll('div[data-block-name]')); sampleRUM.observe(main.querySelectorAll('picture > img')); From 17c6a91db0eade195e24fd792e01a0e28d068dcd Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 15:36:06 +0200 Subject: [PATCH 026/248] Refactor lazy loading logic to exclude webview pages --- _src/scripts/scripts.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 232221679..a146a50ca 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -432,8 +432,9 @@ async function loadLazy(doc) { const main = doc.querySelector('main'); const pageIsNotInFragmentsFolder = window.location.pathname.indexOf('/fragments/') === -1; + const pageIsNotInWebviewFolder = window.location.pathname.indexOf('/webview/') === -1; - if (pageIsNotInFragmentsFolder) { + if (pageIsNotInFragmentsFolder || pageIsNotInWebviewFolder) { // eslint-disable-next-line no-unused-vars loadHeader(doc.querySelector('header')); } @@ -444,7 +445,7 @@ async function loadLazy(doc) { const element = hash ? doc.getElementById(hash.substring(1)) : false; if (hash && element) element.scrollIntoView(); - if (pageIsNotInFragmentsFolder) { + if (pageIsNotInFragmentsFolder || pageIsNotInWebviewFolder) { loadFooter(doc.querySelector('footer')); } From 455b745872d51b149d7feea09505b6fe1ec33f3b Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 16:07:34 +0200 Subject: [PATCH 027/248] Refactor lazy loading logic to exclude webview pages --- _src/scripts/scripts.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index a146a50ca..c4954cff2 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -433,8 +433,9 @@ async function loadLazy(doc) { const pageIsNotInFragmentsFolder = window.location.pathname.indexOf('/fragments/') === -1; const pageIsNotInWebviewFolder = window.location.pathname.indexOf('/webview/') === -1; + console.log('pageIsNotInFragmentsFolder', pageIsNotInFragmentsFolder); - if (pageIsNotInFragmentsFolder || pageIsNotInWebviewFolder) { + if (pageIsNotInFragmentsFolder && pageIsNotInWebviewFolder) { // eslint-disable-next-line no-unused-vars loadHeader(doc.querySelector('header')); } @@ -445,7 +446,7 @@ async function loadLazy(doc) { const element = hash ? doc.getElementById(hash.substring(1)) : false; if (hash && element) element.scrollIntoView(); - if (pageIsNotInFragmentsFolder || pageIsNotInWebviewFolder) { + if (pageIsNotInFragmentsFolder && pageIsNotInWebviewFolder) { loadFooter(doc.querySelector('footer')); } From 70a0b9c0f35d66975687491bd54068335d198a4c Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 16:11:34 +0200 Subject: [PATCH 028/248] Refactor lazy loading logic to exclude webview pages and adjust header height --- _src/scripts/scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index c4954cff2..98544f209 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -433,10 +433,11 @@ async function loadLazy(doc) { const pageIsNotInFragmentsFolder = window.location.pathname.indexOf('/fragments/') === -1; const pageIsNotInWebviewFolder = window.location.pathname.indexOf('/webview/') === -1; - console.log('pageIsNotInFragmentsFolder', pageIsNotInFragmentsFolder); + doc.querySelector('header').style.height = '0px'; if (pageIsNotInFragmentsFolder && pageIsNotInWebviewFolder) { // eslint-disable-next-line no-unused-vars + doc.querySelector('header').style.height = 'initial'; loadHeader(doc.querySelector('header')); } From 871cf9b280ee13b0913ca42589524d5993178831 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 16:17:27 +0200 Subject: [PATCH 029/248] Refactor webview.js to add target attribute to anchor tags --- _src/blocks/webview/webview.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_src/blocks/webview/webview.js b/_src/blocks/webview/webview.js index 4481f9f1b..6cb4d1a38 100644 --- a/_src/blocks/webview/webview.js +++ b/_src/blocks/webview/webview.js @@ -37,4 +37,6 @@ export default async function decorate(block) { child.classList.add('under-price-text'); } }); + + block.querySelector('a').setAttribute('target', '_blank'); } From cf3a2a6a18105de26f09237ad38e0e3035f55652 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 29 Oct 2024 16:52:24 +0200 Subject: [PATCH 030/248] removed old target calls --- _src/scripts/libs/constants.js | 10 +++- _src/scripts/libs/data-layer.js | 97 +++++++-------------------------- 2 files changed, 28 insertions(+), 79 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 9414f2aea..d2797bbe1 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -36,6 +36,14 @@ export const Constants = { dip: "com.bitdefender.dataprivacy", dipm: "com.bitdefender.dataprivacy", avpm: 'com.bitdefender.cl.avplus.v2', + ultsec: "", + ultsecplus: "", + ultsecm: "", + ultsecplusm: "", + idthefts: "", + idtheftp: "", + idtheftsm: "", + idtheftpm: "", // DLP ts_i: 'com.bitdefender.tsmd.v2', ts_f: 'com.bitdefender.tsmd.v2', @@ -62,7 +70,7 @@ export const Constants = { pass_spm: "Bitdefender Password Manager Shared Plan" }, - MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m"], + MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm"], WRONG_DEVICES_PRODUCT_IDS: { 'pass_sp': { diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index c93a0645a..359f127f5 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -69,28 +69,28 @@ export class PageLoadStartedEvent { * get experiment details from Target * @returns {object | null} */ - async #getTargetExperimentDetails() { - let targetExperimentDetails = null; - if (this.#getMetadata('target-experiment') !== '') { - const { runTargetExperiment } = await import('../target.js'); - targetExperimentDetails = await runTargetExperiment(TARGET_TENANT); - } + // async #getTargetExperimentDetails() { + // let targetExperimentDetails = null; + // if (this.#getMetadata('target-experiment') !== '') { + // const { runTargetExperiment } = await import('../target.js'); + // targetExperimentDetails = await runTargetExperiment(TARGET_TENANT); + // } - return targetExperimentDetails; - } + // return targetExperimentDetails; + // } /** * * @returns {object} - get experiment information */ - #getExperimentDetails() { - if (!window.hlx || !window.hlx.experiment) { - return null; - } + // #getExperimentDetails() { + // if (!window.hlx || !window.hlx.experiment) { + // return null; + // } - const { id: experimentId, selectedVariant: experimentVariant } = window.hlx.experiment; - return { experimentId, experimentVariant }; - } + // const { id: experimentId, selectedVariant: experimentVariant } = window.hlx.experiment; + // return { experimentId, experimentVariant }; + // } /** * @@ -198,10 +198,6 @@ export class PageLoadStartedEvent { if (!hostname) { return; } - - const experimentDetails = (await this.#getTargetExperimentDetails()) ?? this.#getExperimentDetails(); - // eslint-disable-next-line no-console - console.debug(`Experiment details: ${JSON.stringify(experimentDetails)}`); const { domain, domainPartsCount } = this.#getDomainInfo(hostname); const METADATA_ANALYTICS_TAGS = 'analytics-tags'; @@ -216,7 +212,6 @@ export class PageLoadStartedEvent { subSubSubSection: null, domain: domain, domainPartsCount: domainPartsCount, - experimentDetails: experimentDetails } if (tags.length) { @@ -572,15 +567,7 @@ window._Visitor = Visitor; export class Target { static events = { - LIBRARY_LOADED: "at-library-loaded", - REQUEST_START: "at-request-start", - REQUEST_SUCCEEDED: "at-request-succeeded", - REQUEST_FAILED: "at-request-failed", - CONTENT_RENDERING_START: "at-content-rendering-start", - CONTENT_RENDERING_SUCCEEDED: "at-content-rendering-succeeded", - CONTENT_RENDERING_FAILED: "at-content-rendering-failed", - CONTENT_RENDERING_NO_OFFERS: "at-content-rendering-no-offers", - CONTENT_RENDERING_REDIRECT: "at-content-rendering-redirect" + LIBRARY_LOADED: "at-library-loaded" } /** @@ -600,56 +587,10 @@ export class Target { return; } - /** - * Semaphor to mark that the offer call was made - * This helps avoid doubled call fot the getOffer - * Set before any 'await' as those triggered jumps in the code - */ - let offerCallMade = false; - /** Target wasn't loaded we wait for events from it */ - [this.events.CONTENT_RENDERING_SUCCEEDED, this.events.CONTENT_RENDERING_NO_OFFERS] - .forEach(event => document.addEventListener(event, async () => { - if (!offerCallMade) { - offerCallMade = true; - await this.#getOffers(); - resolve(); - } - }, { once: true })); - - [this.events.CONTENT_RENDERING_FAILED, this.events.REQUEST_FAILED] - .forEach(event => document.addEventListener(event, async () => { - if (!offerCallMade) { - offerCallMade = true; - resolve(); - } - }, { once: true })); - - /** - * Worst case the load event is triggered before the event from Target - * as such we try to make the offer call again checking if at least the library was loaded - */ - window.addEventListener("load", async () => { - if (!offerCallMade) { - - if (window.adobe?.target) { - offerCallMade = true; - await this.#getOffers(); - resolve(); - } else if (window.location.hostname !== 'localhost') { - /** - * Wait for 4 seconds and check if adobe launch was loaded and triggered the offer call - */ - setTimeout(() => { - if (!offerCallMade) { - offerCallMade = true; - resolve(); - } - }, 4000); - } else { - resolve(); - } - } + document.addEventListener(this.events.LIBRARY_LOADED, async () => { + await this.#getOffers(); + resolve(); }, { once: true }); }); From 865aeb93642f5356e58ed1191a383820b0a8be13 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 17:49:06 +0200 Subject: [PATCH 031/248] Refactor webview-table.js to add temporary light theme support --- _src/blocks/webview-table/webview-table.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index a2b641f92..cf0b35302 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -134,4 +134,11 @@ export default async function decorate(block) { renderPrices(block, metadata); matchHeights(block, '.savings-tag-container'); matchHeights(block, '.buy-box'); + + + // THIS IS TEMPORARY, DONT FORGET TO DELETE + const url = new URL(window.location.href); + if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'light') { + block.classList.add('light'); + } } From cfbd197ceaebd8948f79caf28e20d9bb8ca0abf7 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 17:53:03 +0200 Subject: [PATCH 032/248] Refactor webview-table.js to add temporary light theme support --- _src/blocks/webview-table/webview-table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index cf0b35302..84356231c 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -139,6 +139,6 @@ export default async function decorate(block) { // THIS IS TEMPORARY, DONT FORGET TO DELETE const url = new URL(window.location.href); if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'light') { - block.classList.add('light'); + block.parentElement.classList.add('light'); } } From 6f19e00273040cc7c938d14c06b62e985cb5d05e Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 17:53:28 +0200 Subject: [PATCH 033/248] Refactor webview-table.js to update light theme class name --- _src/blocks/webview-table/webview-table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index 84356231c..551dc12ca 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -139,6 +139,6 @@ export default async function decorate(block) { // THIS IS TEMPORARY, DONT FORGET TO DELETE const url = new URL(window.location.href); if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'light') { - block.parentElement.classList.add('light'); + block.parentElement.classList.add('light-mode'); } } From 9e001de64ee857648b5ab9a9bd48f189d407a2fd Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 29 Oct 2024 17:54:15 +0200 Subject: [PATCH 034/248] Refactor webview-table.js to update light theme class name --- _src/blocks/webview-table/webview-table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index 551dc12ca..137c98d77 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -139,6 +139,6 @@ export default async function decorate(block) { // THIS IS TEMPORARY, DONT FORGET TO DELETE const url = new URL(window.location.href); if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'light') { - block.parentElement.classList.add('light-mode'); + block.classList.add('light-mode'); } } From e95a934c9eff333421b0a122a83257440b7e3218 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 31 Oct 2024 14:41:50 +0200 Subject: [PATCH 035/248] brought back the experiment details --- _src/scripts/libs/data-layer.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 5bb84f36c..b346d9ce7 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -198,6 +198,10 @@ export class PageLoadStartedEvent { if (!hostname) { return; } + + const experimentDetails = (await this.#getTargetExperimentDetails()) ?? this.#getExperimentDetails(); + // eslint-disable-next-line no-console + console.debug(`Experiment details: ${JSON.stringify(experimentDetails)}`); const { domain, domainPartsCount } = this.#getDomainInfo(hostname); const METADATA_ANALYTICS_TAGS = 'analytics-tags'; @@ -212,6 +216,7 @@ export class PageLoadStartedEvent { subSubSubSection: null, domain: domain, domainPartsCount: domainPartsCount, + experimentDetails: experimentDetails } if (tags.length) { From 7fc27eb162760b2d648885c6dec5fdafcc05a000 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 31 Oct 2024 15:59:23 +0200 Subject: [PATCH 036/248] product card feature list elements alignments --- _src/blocks/new-prod-boxes/new-prod-boxes.css | 3 +-- _src/blocks/new-prod-boxes/new-prod-boxes.js | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/_src/blocks/new-prod-boxes/new-prod-boxes.css b/_src/blocks/new-prod-boxes/new-prod-boxes.css index 5e8c00979..1ed9cc7cc 100644 --- a/_src/blocks/new-prod-boxes/new-prod-boxes.css +++ b/_src/blocks/new-prod-boxes/new-prod-boxes.css @@ -266,8 +266,7 @@ } .new-prod-boxes-container .new-prod-boxes .prod_box .inner_prod_box .benefitsLists ul { - margin: 0; - margin-bottom: -5px; + margin-top: -5px; padding: 0; color: black; } diff --git a/_src/blocks/new-prod-boxes/new-prod-boxes.js b/_src/blocks/new-prod-boxes/new-prod-boxes.js index 6ab642245..72e16162b 100644 --- a/_src/blocks/new-prod-boxes/new-prod-boxes.js +++ b/_src/blocks/new-prod-boxes/new-prod-boxes.js @@ -419,6 +419,12 @@ export default async function decorate(block) { decorateIcons(block.closest('.section')); } + const prodCard = block.querySelector('.prod_box'); + const featureLists = prodCard?.querySelectorAll('ul'); + featureLists?.forEach((list, idx) => { + matchHeights(block, `ul:nth-of-type(${idx + 1})`); + }); + matchHeights(block, '.subtitle'); matchHeights(block, 'h2'); matchHeights(block, 'h4'); From 12823774363cd79a376ec02a4bd0fccc9da7d050 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 31 Oct 2024 16:06:27 +0200 Subject: [PATCH 037/248] Add conditional height matching for feature lists in new-prod-boxes --- _src/blocks/new-prod-boxes/new-prod-boxes.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/_src/blocks/new-prod-boxes/new-prod-boxes.js b/_src/blocks/new-prod-boxes/new-prod-boxes.js index 72e16162b..1dcd112f8 100644 --- a/_src/blocks/new-prod-boxes/new-prod-boxes.js +++ b/_src/blocks/new-prod-boxes/new-prod-boxes.js @@ -419,11 +419,13 @@ export default async function decorate(block) { decorateIcons(block.closest('.section')); } - const prodCard = block.querySelector('.prod_box'); - const featureLists = prodCard?.querySelectorAll('ul'); - featureLists?.forEach((list, idx) => { - matchHeights(block, `ul:nth-of-type(${idx + 1})`); - }); + if (blockParent.classList.contains('same-height-lists')) { + const prodCard = block.querySelector('.prod_box'); + const featureLists = prodCard?.querySelectorAll('ul'); + featureLists?.forEach((list, idx) => { + matchHeights(block, `ul:nth-of-type(${idx + 1})`); + }); + } matchHeights(block, '.subtitle'); matchHeights(block, 'h2'); From a2e50c1ee41cc9a610e943f7031b874910032dfc Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 31 Oct 2024 18:05:07 +0200 Subject: [PATCH 038/248] Add mbox-canvas block and update data-layer to handle mbox elements --- _src/blocks/mbox-canvas/mbox-canvas.css | 0 _src/blocks/mbox-canvas/mbox-canvas.js | 11 +++++++++++ _src/scripts/libs/data-layer.js | 17 ++++------------- 3 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 _src/blocks/mbox-canvas/mbox-canvas.css create mode 100644 _src/blocks/mbox-canvas/mbox-canvas.js diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css new file mode 100644 index 000000000..e69de29bb diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js new file mode 100644 index 000000000..afe243126 --- /dev/null +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -0,0 +1,11 @@ +import { Target } from '../../scripts/libs/data-layer.js'; + +export default async function decorate(block) { + block.innerHTML += ` +
+ +
+ `; + const offer = await Target.getMbox('something'); + console.log(offer); +} diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 0a4ac2b07..c90151922 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -674,20 +674,11 @@ export class Target { * @returns {[string]} */ static #getAllMboxes() { - const mboxes = [...document.querySelectorAll("[data-mboxes]")] - .map(mboxes => { - try { - return JSON.parse(mboxes.dataset.mboxes) - } catch (error) { - console.warn(error); - return null; - } + const mboxes = new Set([...document.querySelectorAll("[data-mbox]")] + .map(mbox => { + return mbox.dataset.mbox; }) - .filter(Boolean) - .reduce((acc, mboxes) => { - mboxes.forEach(mbox => acc.add(mbox)); - return acc; - }, new Set()); + .filter(Boolean)); if (!mboxes) { return []; From ce1377591d6c6b46eeae199cb8d8d2cd65ba7f0a Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 5 Nov 2024 15:01:29 +0200 Subject: [PATCH 039/248] feat: enhance mbox-canvas functionality with dynamic content loading and modal detection --- _src/blocks/mbox-canvas/mbox-canvas.js | 17 ++++++++++++++++- _src/blocks/webview-table/webview-table.js | 1 - 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index afe243126..fd885c4a4 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -1,4 +1,6 @@ import { Target } from '../../scripts/libs/data-layer.js'; +import { decorateMain , detectModalButtons } from '../../scripts/scripts.js'; +import { loadBlock, loadBlocks } from '../../scripts/lib-franklin.js'; export default async function decorate(block) { block.innerHTML += ` @@ -7,5 +9,18 @@ export default async function decorate(block) { `; const offer = await Target.getMbox('something'); - console.log(offer); + console.log(offer) + console.log(offer.content.offer) + const page = await fetch(`http://localhost:3000/en-us/webview/webview-table.plain.html`); + const aemHeaderHtml = await page.text(); + console.log(offer) + console.log(aemHeaderHtml); + let newHtml = document.createElement('div'); + newHtml.innerHTML = aemHeaderHtml; + decorateMain(newHtml); + detectModalButtons(newHtml); + await loadBlocks(newHtml); + // console.log(aemHeaderHtml); + console.log(newHtml); + block.querySelector('[data-mbox=something]').innerHTML = newHtml.outerHTML; } diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index 137c98d77..f1d07aebe 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -135,7 +135,6 @@ export default async function decorate(block) { matchHeights(block, '.savings-tag-container'); matchHeights(block, '.buy-box'); - // THIS IS TEMPORARY, DONT FORGET TO DELETE const url = new URL(window.location.href); if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'light') { From 0244e93a5a9a7b36333949a02d3849f265a7bf85 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 5 Nov 2024 15:44:24 +0200 Subject: [PATCH 040/248] fix: streamline mbox-canvas rendering by removing unnecessary console logs and updating innerHTML assignment --- _src/blocks/mbox-canvas/mbox-canvas.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index fd885c4a4..c86d89a64 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -9,18 +9,12 @@ export default async function decorate(block) { `; const offer = await Target.getMbox('something'); - console.log(offer) - console.log(offer.content.offer) const page = await fetch(`http://localhost:3000/en-us/webview/webview-table.plain.html`); const aemHeaderHtml = await page.text(); - console.log(offer) - console.log(aemHeaderHtml); let newHtml = document.createElement('div'); newHtml.innerHTML = aemHeaderHtml; decorateMain(newHtml); detectModalButtons(newHtml); - await loadBlocks(newHtml); - // console.log(aemHeaderHtml); - console.log(newHtml); - block.querySelector('[data-mbox=something]').innerHTML = newHtml.outerHTML; + block.querySelector('[data-mbox=something]').innerHTML = newHtml.innerHTML; + await loadBlocks(block.querySelector('[data-mbox=something]')); } From 48fe653512b77f87fdb76dac426953b4e3afeca6 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 5 Nov 2024 17:35:12 +0200 Subject: [PATCH 041/248] feat: refactor mbox-canvas to improve offer loading and HTML decoration --- _src/blocks/mbox-canvas/mbox-canvas.js | 34 +++++++++----- _src/scripts/libs/data-layer.js | 61 ++++++++------------------ 2 files changed, 41 insertions(+), 54 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index c86d89a64..60348f7d4 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -1,20 +1,32 @@ import { Target } from '../../scripts/libs/data-layer.js'; import { decorateMain , detectModalButtons } from '../../scripts/scripts.js'; -import { loadBlock, loadBlocks } from '../../scripts/lib-franklin.js'; +import { loadBlocks } from '../../scripts/lib-franklin.js'; + +function decorateHTMLOffer(aemHeaderHtml) { + let newHtml = document.createElement('div'); + newHtml.innerHTML = aemHeaderHtml; + decorateMain(newHtml); + detectModalButtons(newHtml); + + return newHtml; +} export default async function decorate(block) { + let parametersJSON = { + feature : 'main_ui' + } block.innerHTML += ` -
+
-
+
`; - const offer = await Target.getMbox('something'); - const page = await fetch(`http://localhost:3000/en-us/webview/webview-table.plain.html`); + const offer = await Target.getOffers([{ + name: 'something', + parameters: parametersJSON + }]); + const page = await fetch(`${offer['something'].content.offer}`); const aemHeaderHtml = await page.text(); - let newHtml = document.createElement('div'); - newHtml.innerHTML = aemHeaderHtml; - decorateMain(newHtml); - detectModalButtons(newHtml); - block.querySelector('[data-mbox=something]').innerHTML = newHtml.innerHTML; - await loadBlocks(block.querySelector('[data-mbox=something]')); + let decoratedHTML = decorateHTMLOffer(aemHeaderHtml); + block.querySelector('.canvas-content').innerHTML = decoratedHTML.innerHTML; + await loadBlocks(block.querySelector('.canvas-content')); } diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 7e9602d58..0ab60c40f 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -597,13 +597,12 @@ export class Target { /** Target is loaded and we wait for it to finish so we can get the offer */ if (window.adobe?.target) { - this.#getOffers().then(resolve); + resolve(); return; } /** Target wasn't loaded we wait for events from it */ - document.addEventListener(this.events.LIBRARY_LOADED, async () => { - await this.#getOffers(); + document.addEventListener(this.events.LIBRARY_LOADED, () => { resolve(); }, { once: true }); }); @@ -623,18 +622,20 @@ export class Target { * ) * @returns {Promise} */ - static async getBuyLinksMapping() { - await this.#staticInit; - return this.offers?.["buyLinks-mbox"]?.content || {}; + static getBuyLinksMapping() { + return this.getOffers([{ + name: 'buyLinks-mbox' + }])?.content || {}; } /** * https://bitdefender.atlassian.net/wiki/spaces/WWW/pages/1661993460/Activating+Promotions+Enhancements+Target * @returns {Promise} */ - static async getCampaign() { - await this.#staticInit; - return this.offers?.["initSelector-mbox"]?.content?.pid || null + static getCampaign() { + return this.getOffers([{ + name: 'initSelector-mbox' + }])?.content?.pid || null; } /** @@ -645,28 +646,12 @@ export class Target { await this.#staticInit; } - /** - * @returns {[string]} - */ - static #getAllMboxes() { - const mboxes = new Set([...document.querySelectorAll("[data-mbox]")] - .map(mbox => { - return mbox.dataset.mbox; - }) - .filter(Boolean)); - - if (!mboxes) { - return []; - } - - return [...mboxes].map((name, index) => { return { index: index + 2, name } }); - } - - static async #getOffers() { - const mboxes = this.#getAllMboxes(); - + static async getOffers(mboxes) { + // const mboxes = this.#getAllMboxes(); + await this.#staticInit; + let offers = {}; try { - this.offers = await window.adobe?.target?.getOffers({ + offers = await window.adobe?.target?.getOffers({ consumerId: await Visitor.getConsumerId(), request: { id: { @@ -674,15 +659,13 @@ export class Target { }, execute: { mboxes: [ - { index: 0, name: "initSelector-mbox" }, - { index: 1, name: "buyLinks-mbox"}, - ...mboxes + ...mboxes.map((mbox, index) => {return { index, ...mbox}}) ] } } }); - this.offers = this.offers?.execute?.mboxes?.reduce((acc, mbox) => { + offers = offers?.execute?.mboxes?.reduce((acc, mbox) => { acc[mbox.name] = {}; acc[mbox.name].content = mbox?.options?.[0]?.content; acc[mbox.name].type = mbox?.options?.[0]?.type; @@ -692,16 +675,8 @@ export class Target { } catch (e) { console.warn(e); } - } - /** - * - * @param {string} mbox - * @returns {Promise} - */ - static async getMbox(mbox) { - await this.#staticInit; - return this.offers?.[mbox]; + return offers; } }; From 6442171720e1371d7d21a2460f89814bb4eda593 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 7 Nov 2024 14:05:24 +0200 Subject: [PATCH 042/248] feat: add createOfferParameters function to handle URL parameters for offers --- _src/blocks/mbox-canvas/mbox-canvas.js | 34 +++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index 60348f7d4..ef3cc443b 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -11,20 +11,36 @@ function decorateHTMLOffer(aemHeaderHtml) { return newHtml; } +function createOfferParameters() { + let parameters = {} + const urlParams = new URLSearchParams(window.location.search); + const feature = urlParams.get('feature'); + urlParams.forEach((value, key) => { + if (value === feature) { + parameters['feature'] = feature; + } + }) + + return parameters; +} + export default async function decorate(block) { - let parametersJSON = { - feature : 'main_ui' - } + const { + // eslint-disable-next-line no-unused-vars + mboxName, + } = block.closest('.section').dataset; + + let parameters = createOfferParameters(); block.innerHTML += ` -
+
-
- `; +
+ `; const offer = await Target.getOffers([{ - name: 'something', - parameters: parametersJSON + name: mboxName, + parameters: parameters }]); - const page = await fetch(`${offer['something'].content.offer}`); + const page = await fetch(`${offer[mboxName].content.offer}`); const aemHeaderHtml = await page.text(); let decoratedHTML = decorateHTMLOffer(aemHeaderHtml); block.querySelector('.canvas-content').innerHTML = decoratedHTML.innerHTML; From bee7a6856f35e14750bb1dcecc08d94b0ae248de Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 7 Nov 2024 14:21:10 +0200 Subject: [PATCH 043/248] fix: update parameter assignment and variable naming for clarity in mbox-canvas --- _src/blocks/mbox-canvas/mbox-canvas.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index ef3cc443b..6611b02c7 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -17,7 +17,7 @@ function createOfferParameters() { const feature = urlParams.get('feature'); urlParams.forEach((value, key) => { if (value === feature) { - parameters['feature'] = feature; + parameters.feature = feature; } }) @@ -41,8 +41,8 @@ export default async function decorate(block) { parameters: parameters }]); const page = await fetch(`${offer[mboxName].content.offer}`); - const aemHeaderHtml = await page.text(); - let decoratedHTML = decorateHTMLOffer(aemHeaderHtml); - block.querySelector('.canvas-content').innerHTML = decoratedHTML.innerHTML; + const offerHtml = await page.text(); + let decoratedOfferHtml = decorateHTMLOffer(offerHtml); + block.querySelector('.canvas-content').innerHTML = decoratedOfferHtml.innerHTML; await loadBlocks(block.querySelector('.canvas-content')); } From cd261aa873ec972deb48c77a55a77157757a1971 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 16:00:54 +0200 Subject: [PATCH 044/248] refactor: use const for variable declarations in mbox-canvas for improved readability and consistency --- _src/blocks/mbox-canvas/mbox-canvas.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index 6611b02c7..0533fc830 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -3,7 +3,7 @@ import { decorateMain , detectModalButtons } from '../../scripts/scripts.js'; import { loadBlocks } from '../../scripts/lib-franklin.js'; function decorateHTMLOffer(aemHeaderHtml) { - let newHtml = document.createElement('div'); + const newHtml = document.createElement('div'); newHtml.innerHTML = aemHeaderHtml; decorateMain(newHtml); detectModalButtons(newHtml); @@ -12,14 +12,18 @@ function decorateHTMLOffer(aemHeaderHtml) { } function createOfferParameters() { - let parameters = {} + const parameters = {}; const urlParams = new URLSearchParams(window.location.search); const feature = urlParams.get('feature'); - urlParams.forEach((value, key) => { + const language = urlParams.get('lang'); + urlParams.forEach((value) => { if (value === feature) { parameters.feature = feature; } - }) + if (value === language) { + parameters.language = language; + } + }); return parameters; } @@ -30,7 +34,7 @@ export default async function decorate(block) { mboxName, } = block.closest('.section').dataset; - let parameters = createOfferParameters(); + const parameters = createOfferParameters(); block.innerHTML += `
@@ -38,11 +42,11 @@ export default async function decorate(block) { `; const offer = await Target.getOffers([{ name: mboxName, - parameters: parameters + parameters, }]); const page = await fetch(`${offer[mboxName].content.offer}`); const offerHtml = await page.text(); - let decoratedOfferHtml = decorateHTMLOffer(offerHtml); + const decoratedOfferHtml = decorateHTMLOffer(offerHtml); block.querySelector('.canvas-content').innerHTML = decoratedOfferHtml.innerHTML; await loadBlocks(block.querySelector('.canvas-content')); } From 3ee1717aa5cb19a15273ef3731cbaa81c96bc925 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 17:22:20 +0200 Subject: [PATCH 045/248] feat: integrate user geolocation fetching in product variations logic --- _src/scripts/libs/store/store.js | 9 ++++++--- _src/scripts/libs/user.js | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index c434bcc37..5ceeb1997 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -3,6 +3,7 @@ import { Target, Visitor } from "../data-layer.js"; import { GLOBAL_V2_LOCALES, setUrlParams } from "../../utils/utils.js"; import Page from "../page.js"; import { getMetadata } from "../../utils/utils.js"; +import { User } from "../../libs/user.js" export const monthlyProducts = { "ultsecm": "ultsecm", @@ -923,7 +924,9 @@ class Vlaicu { static campaign = "TSExpired0MRDLP24"; static async getProductVariations(productId, campaign) { - + const userCountry = await User.country; + const userGeoIp = await fetch(`${Constants.DEV_BASE_URL}/p-api/v1/countries/${userCountry.toUpperCase()}/locales`); + console.log(userGeoIp); const pathVariablesResolverObject = { "{locale}": Page.locale, "{bundleId}": productId, @@ -965,7 +968,7 @@ class Vlaicu { } static async getProductVariationsPrice(id, campaignId) { - const productInfo = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId))?.product; + const productInfo = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id.trim()], campaignId))?.product; if (!productInfo) { return null; } @@ -1053,7 +1056,7 @@ class StoreConfig { */ constructor(vlaicuFlag) { /** - * Api used to fetch the prices + * Api §d to fetch the prices * @type {"init"|"zuora"|"vlaicu"} */ this.provider = this.#getProvider(vlaicuFlag); diff --git a/_src/scripts/libs/user.js b/_src/scripts/libs/user.js index 0d8cd0dbf..4ac40b43a 100644 --- a/_src/scripts/libs/user.js +++ b/_src/scripts/libs/user.js @@ -68,7 +68,7 @@ export class User { } try { - const response = await fetch(`${Constants.DEV_BASE_URL}/bin/json/v1/geolocation?timestamp=${Date.now()}`); + const response = await fetch(`${Constants.DEV_BASE_URL}/geoip`); if (!response.ok) { console.error(`FETCH-GEO-COOKIE-ERROR-CODE:${response.status} MESSAGE:${response.statusText}`); From 7250a6a1d27eda54ee197afb799716e6e2b9d9ca Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 17:24:52 +0200 Subject: [PATCH 046/248] fix: update geolocation fetch URL to use relative path --- _src/scripts/libs/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/user.js b/_src/scripts/libs/user.js index 4ac40b43a..8fe0feb16 100644 --- a/_src/scripts/libs/user.js +++ b/_src/scripts/libs/user.js @@ -68,7 +68,7 @@ export class User { } try { - const response = await fetch(`${Constants.DEV_BASE_URL}/geoip`); + const response = await fetch(`/geoip`); if (!response.ok) { console.error(`FETCH-GEO-COOKIE-ERROR-CODE:${response.status} MESSAGE:${response.statusText}`); From 04cf61e1ca7a36224a7eb08cd7e8480db261e1a9 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 17:29:20 +0200 Subject: [PATCH 047/248] fix: simplify geolocation country retrieval in user.js --- _src/scripts/libs/user.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_src/scripts/libs/user.js b/_src/scripts/libs/user.js index 8fe0feb16..a4e3712bf 100644 --- a/_src/scripts/libs/user.js +++ b/_src/scripts/libs/user.js @@ -81,8 +81,7 @@ export class User { return "us"; } - Cookie.set("cf-ipcountry", country["cf-ipcountry"], 0.02); - return country["cf-ipcountry"].toLowerCase(); + return country.country.toLowerCase(); } catch(err) { console.warn('FETCH-GEO-COOKIE-ERROR'); From 0a9faa70e16a26dbdd66d94cb368be30e42afeaf Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 17:33:05 +0200 Subject: [PATCH 048/248] fix: log parsed user geolocation response in getProductVariations method --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 5ceeb1997..b31c03c11 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -926,7 +926,7 @@ class Vlaicu { static async getProductVariations(productId, campaign) { const userCountry = await User.country; const userGeoIp = await fetch(`${Constants.DEV_BASE_URL}/p-api/v1/countries/${userCountry.toUpperCase()}/locales`); - console.log(userGeoIp); + console.log(userGeoIp.json()); const pathVariablesResolverObject = { "{locale}": Page.locale, "{bundleId}": productId, From c8d9905c3eeaec2937aff9cb2bf299c4aae6fb8e Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 17:53:05 +0200 Subject: [PATCH 049/248] feat: add user locale retrieval and integrate geoIpPricing logic in product variations --- _src/scripts/libs/data-layer.js | 8 ++++++++ _src/scripts/libs/store/store.js | 8 +++----- _src/scripts/libs/user.js | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index e68994c97..6c68ba09d 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -676,6 +676,14 @@ export class Target { return Boolean((await this.#vlaicuFlagMbox)?.content?.vlaicuFlag || null); } + /** + * get the flag which marks wether the page should use geoIpPricing or not + * @returns {Promise} + */ + static async getVlaicuGeoIpPrice() { + return Boolean((await this.#vlaicuFlagMbox)?.content?.geoIpPrice || null); + } + /** * get the product-buy link mappings from Target ( * e.g diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index b31c03c11..fadd49b3b 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -924,11 +924,9 @@ class Vlaicu { static campaign = "TSExpired0MRDLP24"; static async getProductVariations(productId, campaign) { - const userCountry = await User.country; - const userGeoIp = await fetch(`${Constants.DEV_BASE_URL}/p-api/v1/countries/${userCountry.toUpperCase()}/locales`); - console.log(userGeoIp.json()); + const locale = await Target.getVlaicuGeoIpPrice() ? await User.locale : Page.locale; const pathVariablesResolverObject = { - "{locale}": Page.locale, + "{locale}": locale, "{bundleId}": productId, "{campaignId}": this.campaign // TODO: replace with campaign received as parameter }; @@ -1176,7 +1174,7 @@ export class Store { // create the store config if it does not exist if (!this.config) { - this.config = new StoreConfig(await Target.getVlaicuFlag()); + this.config = new StoreConfig(await Target.getVlaicuFlag().vlaicuFlag); } // get the target buyLink mappings diff --git a/_src/scripts/libs/user.js b/_src/scripts/libs/user.js index a4e3712bf..e29bb3b2e 100644 --- a/_src/scripts/libs/user.js +++ b/_src/scripts/libs/user.js @@ -8,6 +8,8 @@ export class User { static country = this.#getGeolocation(); + static locale = this.#getUserLocale(); + /** * * @returns {Promise} @@ -88,4 +90,19 @@ export class User { return "us"; } } + + /** + * Handling User Locale + * @return {Promise} + */ + static async #getUserLocale() { + const userCountry = await this.country; + try { + const userGeoIpCall = await fetch(`${Constants.DEV_BASE_URL}/p-api/v1/countries/${userCountry.toUpperCase()}/locales`); + const userGeoIpData = await userGeoIpCall.json(); + return userGeoIpData[0].locale.toLowerCase(); + } catch { + return "en-us" + } + } }; \ No newline at end of file From 4798d9a590a5c8a6545cb5e9d17cd20b623f2909 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 12 Nov 2024 17:57:19 +0200 Subject: [PATCH 050/248] fix: update store config initialization to remove unnecessary property access --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index fadd49b3b..b0ad5a214 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1174,7 +1174,7 @@ export class Store { // create the store config if it does not exist if (!this.config) { - this.config = new StoreConfig(await Target.getVlaicuFlag().vlaicuFlag); + this.config = new StoreConfig(await Target.getVlaicuFlag()); } // get the target buyLink mappings From d8e8f06b6fec7a583d1e985921903acdd96e15f7 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 13 Nov 2024 17:22:00 +0200 Subject: [PATCH 051/248] change parameter name --- _src/blocks/mbox-canvas/mbox-canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index 0533fc830..93fed7b81 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -21,7 +21,7 @@ function createOfferParameters() { parameters.feature = feature; } if (value === language) { - parameters.language = language; + parameters.lang = language; } }); From a27252f30c8d2bfc7f0c652e547e648e65aa1d26 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 14 Nov 2024 14:57:50 +0200 Subject: [PATCH 052/248] feat: add method to retrieve URL parameters and integrate into offer execution --- _src/scripts/libs/data-layer.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 6c68ba09d..f533b442a 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -613,6 +613,8 @@ export class Target { */ static eventTokens = []; + static urlParameters = this.#getUrlParameters(); + /** * @param {string[]} */ @@ -728,6 +730,21 @@ export class Target { return receivedOffers ? receivedOffers[mboxName] : null; } + /** + * Function to get all URL parameters and put them in an object + * @returns {Object} An object containing all URL parameters + */ + static #getUrlParameters() { + const urlParams = new URLSearchParams(window.location.search); + const parameters = {}; + + urlParams.forEach((value, key) => { + parameters[key] = value; + }); + + return parameters; + } + static async getOffers(mboxes) { await this.#staticInit; let offers = {}; @@ -741,7 +758,9 @@ export class Target { }, execute: { mboxes: [ - ...mboxes.map((mbox, index) => {return { index, ...mbox}}) + ...mboxes.map((mbox, index) => { + return { index, name: mbox.name, parameters: Object.assign(urlParameters, mbox.parameters) } + }) ] } } From eed74e2ff8e46ac46d7db6ade536cf9e34ef235d Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 14 Nov 2024 15:01:08 +0200 Subject: [PATCH 053/248] koasfkafs --- _src/scripts/libs/data-layer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index f533b442a..8c2bc049c 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -613,7 +613,10 @@ export class Target { */ static eventTokens = []; - static urlParameters = this.#getUrlParameters(); + /** + * @type {Object{}} + */ + static #urlParameters = this.#getUrlParameters(); /** * @param {string[]} @@ -759,7 +762,7 @@ export class Target { execute: { mboxes: [ ...mboxes.map((mbox, index) => { - return { index, name: mbox.name, parameters: Object.assign(urlParameters, mbox.parameters) } + return { index, name: mbox.name, parameters: Object.assign(this.#urlParameters, mbox.parameters) } }) ] } From 33b9fb0d93b53d55ceb7f9a896490e2195e61dfd Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 14 Nov 2024 16:21:15 +0200 Subject: [PATCH 054/248] feat: add 'hidden' case to footer and header factory setup to prevent logic execution --- _src/blocks/footer/footer.js | 2 ++ _src/blocks/header/header.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/_src/blocks/footer/footer.js b/_src/blocks/footer/footer.js index 2a1898aa2..6f7554873 100644 --- a/_src/blocks/footer/footer.js +++ b/_src/blocks/footer/footer.js @@ -226,6 +226,8 @@ function applyFooterFactorySetup(footerMetadata, block) { case 'franklinFooter': runDefaultFooterLogic(block); break; + case 'hidden': + break; default: runAemFooterLogic(block); break; diff --git a/_src/blocks/header/header.js b/_src/blocks/header/header.js index 043802fe9..45c53b1d3 100644 --- a/_src/blocks/header/header.js +++ b/_src/blocks/header/header.js @@ -625,6 +625,8 @@ function applyHeaderFactorySetup(headerMetadata, header) { case 'quiz': runQuizPageHeaderLogic(header); break; + case 'hidden': + break; default: runDefaultHeaderLogic(header); break; From aecadc3c422379f73f99cd50c8f2f67643f974a6 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 14:05:35 +0200 Subject: [PATCH 055/248] add vcampaign from parameters --- _src/scripts/libs/store/store.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index b0ad5a214..804571c7a 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1,6 +1,6 @@ import { Constants } from "../constants.js"; import { Target, Visitor } from "../data-layer.js"; -import { GLOBAL_V2_LOCALES, setUrlParams } from "../../utils/utils.js"; +import { getParamValue, GLOBAL_V2_LOCALES, setUrlParams } from "../../utils/utils.js"; import Page from "../page.js"; import { getMetadata } from "../../utils/utils.js"; import { User } from "../../libs/user.js" @@ -920,20 +920,19 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - // TODO: delete this parameter as it is for testing purposes only - static campaign = "TSExpired0MRDLP24"; + static campaign = getParamValue('vcampaign'); static async getProductVariations(productId, campaign) { const locale = await Target.getVlaicuGeoIpPrice() ? await User.locale : Page.locale; const pathVariablesResolverObject = { "{locale}": locale, "{bundleId}": productId, - "{campaignId}": this.campaign // TODO: replace with campaign received as parameter + "{campaignId}": this.campaign }; // get the correct path to get the prices // TODO: add a check for campaign to be not null - let productPath = campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + let productPath = ( campaign !== Store.NO_PROMOTION && this.campaign != null ) ? this.promotionPath : this.defaultPromotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); From 57b7b9a8b86264feecfff45e4f2d8568a4c71d43 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 14:32:55 +0200 Subject: [PATCH 056/248] feat: implement dark mode styling and cleanup temporary comments --- _src/blocks/webview-table/webview-table.js | 1 - _src/blocks/webview/webview.css | 24 ++++++++++++++++++---- _src/blocks/webview/webview.js | 5 +++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index f1d07aebe..0c53c8180 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -135,7 +135,6 @@ export default async function decorate(block) { matchHeights(block, '.savings-tag-container'); matchHeights(block, '.buy-box'); - // THIS IS TEMPORARY, DONT FORGET TO DELETE const url = new URL(window.location.href); if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'light') { block.classList.add('light-mode'); diff --git a/_src/blocks/webview/webview.css b/_src/blocks/webview/webview.css index 1d3fe3fe5..51b9f3f25 100644 --- a/_src/blocks/webview/webview.css +++ b/_src/blocks/webview/webview.css @@ -7,9 +7,24 @@ text-align: center; font-family: "Segoe UI", Arial, sans-serif; + &.dark-mode { + background-color: black; + + .webview { + color: white; + + .button.secondary { + background-color: black; + border-color: black; + } + } + } + .webview { max-width: 438px; margin: auto; + padding-top: 48px; + padding-bottom: 35px; img { width: 92px; @@ -30,7 +45,6 @@ font-size: 18px; line-height: 24px; font-weight: 700; - color: black; } .button-container { @@ -64,6 +78,9 @@ background-color: white; border-color: white; color: #006EFF; + padding: 0; + margin: 0; + border: 0; } .prod-oldprice { @@ -84,9 +101,8 @@ } .prod-newprice { - font-size: var(--body-font-size-xl); - line-height: var(--body-font-size-xl); - font-weight: 700; + font: normal normal bold 24px / 30px Segoe UI; + line-height: 0.7; } .under-price-text { diff --git a/_src/blocks/webview/webview.js b/_src/blocks/webview/webview.js index 6cb4d1a38..3720013e8 100644 --- a/_src/blocks/webview/webview.js +++ b/_src/blocks/webview/webview.js @@ -38,5 +38,10 @@ export default async function decorate(block) { } }); + const url = new URL(window.location.href); + if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'dark') { + block.parentElement.classList.add('dark-mode'); + } + block.querySelector('a').setAttribute('target', '_blank'); } From 200e2b3411c33eef23e6c93004ab132ef6340e91 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 14:57:16 +0200 Subject: [PATCH 057/248] feat: add loading state management for offer retrieval in mbox-canvas --- _src/blocks/mbox-canvas/mbox-canvas.css | 9 ++++++++ _src/blocks/mbox-canvas/mbox-canvas.js | 2 ++ _src/styles/styles.css | 28 +++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css index e69de29bb..8635dbb07 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.css +++ b/_src/blocks/mbox-canvas/mbox-canvas.css @@ -0,0 +1,9 @@ +.mbox-canvas-container { + display: flex; + justify-content: center; + + .mbox-canvas-wrapper { + height: 512px; + width: 768px; + } +} \ No newline at end of file diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index 93fed7b81..f820d3640 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -40,6 +40,7 @@ export default async function decorate(block) {
`; + block.classList.add('loader'); const offer = await Target.getOffers([{ name: mboxName, parameters, @@ -49,4 +50,5 @@ export default async function decorate(block) { const decoratedOfferHtml = decorateHTMLOffer(offerHtml); block.querySelector('.canvas-content').innerHTML = decoratedOfferHtml.innerHTML; await loadBlocks(block.querySelector('.canvas-content')); + block.classList.remove('loader'); } diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 6cd52b251..9990c7129 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1595,6 +1595,34 @@ main .section.blue a.button.modal::after { visibility: hidden; } +.loader { + width: 48px; + height: 48px; + border: 5px solid #006EFF;; + border-bottom-color: transparent; + border-radius: 50%; + display: inline-block; + position: relative; + top: 50%; + left: 50%; + box-sizing: border-box; + animation: rotation 1s linear infinite; + } + + @keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +.loader * { + visibility: hidden; + display: none; +} + @media (min-width: 768px) { .buttons-align-right > div { flex-direction: row; From f4b4c56a38959ac7f4fd082734b49ff8f3508285 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 15:30:45 +0200 Subject: [PATCH 058/248] add loader --- _src/blocks/mbox-canvas/mbox-canvas.css | 6 +++++- _src/blocks/mbox-canvas/mbox-canvas.js | 5 ++++- _src/blocks/webview-table/webview-table.css | 2 +- _src/scripts/scripts.js | 5 +++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css index 8635dbb07..70e1955a6 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.css +++ b/_src/blocks/mbox-canvas/mbox-canvas.css @@ -4,6 +4,10 @@ .mbox-canvas-wrapper { height: 512px; - width: 768px; + width: 770px; + + &.dark-mode { + background-color: black; + } } } \ No newline at end of file diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index f820d3640..c15a1fdd3 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -40,6 +40,10 @@ export default async function decorate(block) { `; + const url = new URL(window.location.href); + if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'dark') { + block.parentElement.classList.add('dark-mode'); + } block.classList.add('loader'); const offer = await Target.getOffers([{ name: mboxName, @@ -50,5 +54,4 @@ export default async function decorate(block) { const decoratedOfferHtml = decorateHTMLOffer(offerHtml); block.querySelector('.canvas-content').innerHTML = decoratedOfferHtml.innerHTML; await loadBlocks(block.querySelector('.canvas-content')); - block.classList.remove('loader'); } diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index 38206ec93..ac32a2d82 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -13,7 +13,7 @@ } .webview-table-wrapper { - max-width: 768px; + max-width: 770px; height: 512px; margin: 0 auto; font-family: "Segoe UI", Arial, sans-serif; diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 0c4cdf743..237b4481c 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -507,6 +507,11 @@ async function loadPage() { element.classList.remove('await-loader'); }); + const awaitLoader = document.querySelectorAll('.loader'); + awaitLoader.forEach((element) => { + element.classList.remove('loader'); + }); + adobeMcAppendVisitorId('main'); pushTrialDownloadToDataLayer(); From 6238882a1b6fcab447398a9a6ce53ea4a3cc56e4 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 15:38:56 +0200 Subject: [PATCH 059/248] feat: enhance dark mode support and adjust component dimensions --- _src/blocks/mbox-canvas/mbox-canvas.css | 8 ++++---- _src/blocks/mbox-canvas/mbox-canvas.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css index 70e1955a6..057bb39f8 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.css +++ b/_src/blocks/mbox-canvas/mbox-canvas.css @@ -2,12 +2,12 @@ display: flex; justify-content: center; + &.dark-mode { + background-color: #141517; + } + .mbox-canvas-wrapper { height: 512px; width: 770px; - - &.dark-mode { - background-color: black; - } } } \ No newline at end of file diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index c15a1fdd3..a21e5fa67 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -42,7 +42,7 @@ export default async function decorate(block) { `; const url = new URL(window.location.href); if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'dark') { - block.parentElement.classList.add('dark-mode'); + block.closest('.section').classList.add('dark-mode'); } block.classList.add('loader'); const offer = await Target.getOffers([{ From 21bcdf8add764c8b370b868ec18dfc7b8d11a624 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 15:51:48 +0200 Subject: [PATCH 060/248] add dark mode ezoteric --- _src/blocks/mbox-canvas/mbox-canvas.css | 4 ---- _src/scripts/lib-franklin.js | 4 ++++ _src/styles/styles.css | 4 ++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css index 057bb39f8..6327c47f6 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.css +++ b/_src/blocks/mbox-canvas/mbox-canvas.css @@ -2,10 +2,6 @@ display: flex; justify-content: center; - &.dark-mode { - background-color: #141517; - } - .mbox-canvas-wrapper { height: 512px; width: 770px; diff --git a/_src/scripts/lib-franklin.js b/_src/scripts/lib-franklin.js index 342a73169..50ed9d53b 100644 --- a/_src/scripts/lib-franklin.js +++ b/_src/scripts/lib-franklin.js @@ -11,6 +11,8 @@ * governing permissions and limitations under the License. */ +import { getParamValue } from "./utils/utils.js"; + const STICKY_NAVIGATION_SECTION_METADATA_KEY = 'sticky-navigation-item'; export const ALL_FRANKLIN_DEV_SUBDOMAINS = ['localhost', '.hlx.page', '.hlx.live']; export const STICKY_NAVIGATION_DATASET_KEY = 'stickyNavName'; @@ -659,6 +661,8 @@ export function decorateTemplateAndTheme() { element.classList.add(toClassName(c.trim())); }); }; + const dark = getParamValue('theme'); + if (dark) addClasses(document.body, 'dark-mode'); const template = getMetadata('template'); if (template) addClasses(document.body, template); const theme = getMetadata('theme'); diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 9990c7129..862c49ba5 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -129,6 +129,10 @@ body [data-desktop-detector] { display: none; } +body.dark-mode { + background-color: #141517; +} + @media (min-width: 768px) { body [data-mobile-detector] { display: none; From f958f4cf42f4d986260e4dc32e6a663b31683cb2 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 19 Nov 2024 16:10:18 +0200 Subject: [PATCH 061/248] feat: center align mbox-canvas content and remove dark mode theme check --- _src/blocks/mbox-canvas/mbox-canvas.css | 3 +++ _src/blocks/mbox-canvas/mbox-canvas.js | 4 ---- _src/styles/styles.css | 7 ++----- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css index 6327c47f6..96c21494f 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.css +++ b/_src/blocks/mbox-canvas/mbox-canvas.css @@ -5,5 +5,8 @@ .mbox-canvas-wrapper { height: 512px; width: 770px; + display: flex; + justify-content: center; + align-items: center; } } \ No newline at end of file diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index a21e5fa67..62557f001 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -40,10 +40,6 @@ export default async function decorate(block) { `; - const url = new URL(window.location.href); - if (url.searchParams.has('theme') && url.searchParams.get('theme') === 'dark') { - block.closest('.section').classList.add('dark-mode'); - } block.classList.add('loader'); const offer = await Target.getOffers([{ name: mboxName, diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 862c49ba5..57ef35752 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1606,14 +1606,11 @@ main .section.blue a.button.modal::after { border-bottom-color: transparent; border-radius: 50%; display: inline-block; - position: relative; - top: 50%; - left: 50%; box-sizing: border-box; animation: rotation 1s linear infinite; - } +} - @keyframes rotation { +@keyframes rotation { 0% { transform: rotate(0deg); } From 9fcfd36b21703470b56069b7b90f55eb675e28d0 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 25 Nov 2024 15:51:11 +0200 Subject: [PATCH 062/248] add link checker block with UI and functionality --- _src/blocks/link-checker/link-checker.css | 98 +++++++++++++++++++++++ _src/blocks/link-checker/link-checker.js | 82 +++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 _src/blocks/link-checker/link-checker.css create mode 100644 _src/blocks/link-checker/link-checker.js diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css new file mode 100644 index 000000000..2faaa5c9b --- /dev/null +++ b/_src/blocks/link-checker/link-checker.css @@ -0,0 +1,98 @@ + +main .section.link-checker-container { + + margin: 50px auto; + padding: 20px; + background-color: #fff; + border-radius: 20px; + max-width: 1350px; + background: #007BFF; + padding-top: 50px; + padding-bottom: 0px; + display: flex; + justify-content: center; + overflow: visible; + + .link-checker-wrapper { + max-width: 960px; + width: 100%; + } + + .link-checker { + display: flex; + flex-direction: column; + align-items: center; + background-color: white; + border-radius: 20px; + padding: 48px 160px 68px; + text-align: center; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + position: relative; + + h2 { + font-weight: bold; + font-size: 40px; + color: #006EFF; + margin-bottom: 40px; + } + + p { + font-size: 20px; + margin-bottom: 20px; + padding: 0; + } + + p:first-of-type { + margin: 0; + } + + .input-container { + display: flex; + justify-content: center; + width: 100%; + gap: 15px; + } + + input[type="text"] { + padding: 15px; + font-size: 1em; + border-radius: 8px; + border: 1px solid #006EFF; + width: 100%; + max-width: 444px; + margin: 0; + } + + button { + padding: 15px 40px; + cursor: pointer; + background-color: #007BFF; + color: #fff; + border: none; + border-radius: 10px; + font-weight: bold; + font-size: 1em; + } + button:hover { + background-color: #0056b3; + } + .result { + margin-top: 20px; + font-weight: bold; + } + .safe { + color: green; + } + .warning { + color: orange; + } + .danger { + color: red; + } + } + + @media (min-width: 1200px) { + .link-checker { + bottom: -20%; + } +} diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js new file mode 100644 index 000000000..9552b598e --- /dev/null +++ b/_src/blocks/link-checker/link-checker.js @@ -0,0 +1,82 @@ +class StatusMessageFactory { + static createMessage(status, url) { + const messages = { + safe: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe' }, + so_far_so_good_1: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe' }, + so_far_so_good_2: { text: `This link looks safe, but the domain '${url.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe' }, + phishing: { text: 'This link leads to a phishing site designed to steal personal information like passwords or financial data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, + malware: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger' }, + untrusted: { text: 'This link appears suspicious and may not be trustworthy. It’s best to avoid accessing it. Keep your security software active and steer clear of the site.', className: 'result warning' }, + fraud: { text: 'This link directs to a fraudulent site intended to trick users and steal sensitive data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, + spam: { text: 'This link has been identified in spam emails, which often contain malicious content. Avoid clicking on it, as it may lead to harmful sites or scams. Ensure your security measures are in place.', className: 'result warning' }, + pua: { text: 'This link is associated with apps that could slow down your device or compromise your privacy. It’s best to avoid the site and make sure your security settings are active.', className: 'result danger' }, + miner: { text: 'This URL is linked to cryptocurrency mining activities, which may use your device\'s resources without your consent. Avoid visiting the site and ensure your security protections are in place.', className: 'result danger' }, + 'malware-hd': { text: 'This URL is likely to contain malware, posing a significant threat. It\'s strongly advised to avoid accessing it and ensure your security protections are active and up to date.', className: 'result danger' }, + homograph: { text: 'This link is designed to look like a trusted site using tricky characters. Don’t click the link and make sure your security software is updated to protect your device.', className: 'result danger' }, + 'c&c': { text: 'This URL is linked to a server used to command and control malware on infected devices. Don’t click the link and make sure your security software is up to date to keep your device safe.', className: 'result danger' }, + 'miner-server': { text: 'This URL is linked to crypto mining activity, which could use your device\'s resources if accessed. It’s recommended not to click the link and ensure your security software is up to date.', className: 'result danger' }, + malvertising: { text: 'This link is connected to harmful ads that could affect your device and expose your personal data, such as your passwords, credit card information, email addresses, or browsing history. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, + other: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, + }; + return messages[status] || { text: `Status: ${status}`, className: 'result warning' }; + } +} + +async function checkLink(input, result) { + let url = input.value.trim(); + if (!url) { + result.textContent = 'Please enter a URL.'; + result.className = 'result warning'; + return; + } + + try { + url = new URL(`http://${url}`); + } catch (_) { + result.textContent = 'Please enter a valid URL.'; + result.className = 'result warning'; + return; + } + + const response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ url }), + }); + + if (!response.ok) { + result.textContent = 'Something went wrong on our end'; + return; + } + + const data = await response.json(); + + const status = data.status[0]; + const message = StatusMessageFactory.createMessage(status, url); + result.textContent = message.text; + result.className = message.className; +} + +export default function decorate(block) { + const inputContainer = document.createElement('div'); + inputContainer.classList.add('input-container'); + block.appendChild(inputContainer); + + const input = document.createElement('input'); + input.type = 'text'; + input.placeholder = 'Enter URL to check'; + inputContainer.appendChild(input); + + const button = document.createElement('button'); + button.textContent = 'Check URL'; + inputContainer.appendChild(button); + + const result = document.createElement('div'); + result.textContent = 'Add your link or paste it from the device’s clipboard.'; + result.className = 'result'; + block.appendChild(result); + + button.addEventListener('click', () => checkLink(input, result)); +} From 365dc248bb8edeccfb7a733b9d0b4cab078e4573 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 26 Nov 2024 15:30:31 +0200 Subject: [PATCH 063/248] add new styles --- _src/blocks/link-checker/link-checker.css | 9 ++++- _src/icons/link-checker-example.svg | 20 ++++++++++++ _src/icons/link-checker-pattern.svg | 40 +++++++++++++++++++++++ _src/styles/styles.css | 5 +++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 _src/icons/link-checker-example.svg create mode 100644 _src/icons/link-checker-pattern.svg diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 2faaa5c9b..459273e43 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -6,7 +6,8 @@ main .section.link-checker-container { background-color: #fff; border-radius: 20px; max-width: 1350px; - background: #007BFF; + background: url("../../icons/link-checker-pattern.svg"); + background-color: #006EFF; padding-top: 50px; padding-bottom: 0px; display: flex; @@ -61,8 +62,14 @@ main .section.link-checker-container { width: 100%; max-width: 444px; margin: 0; + position: relative; + background: url("../../icons/link-checker-example.svg") no-repeat; + background-position: right center; + background-position-x: 96%; } + + button { padding: 15px 40px; cursor: pointer; diff --git a/_src/icons/link-checker-example.svg b/_src/icons/link-checker-example.svg new file mode 100644 index 000000000..6cdb9b8b7 --- /dev/null +++ b/_src/icons/link-checker-example.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/_src/icons/link-checker-pattern.svg b/_src/icons/link-checker-pattern.svg new file mode 100644 index 000000000..ef9e1ee76 --- /dev/null +++ b/_src/icons/link-checker-pattern.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 9e1abe256..15cf73581 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -772,6 +772,11 @@ body.creators { margin: 0 auto; } + main .section.width-smallest .block, main .section.width-smallest .default-content-wrapper { + width: 640px; + margin: 0 auto; + } + .creators .default-content-wrapper h2 { font: normal normal 300 60px/69px "IBM Plex Sans", sans-serif; } From f048045f8a4717da73d806123cffc0a0aca32658 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Tue, 26 Nov 2024 15:45:30 +0200 Subject: [PATCH 064/248] added blog-news block --- _src/blocks/blog-news/blog-news.css | 78 +++++++++++++++++++++++++++++ _src/blocks/blog-news/blog-news.js | 48 ++++++++++++++++++ _src/styles/styles.css | 5 -- 3 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 _src/blocks/blog-news/blog-news.css create mode 100644 _src/blocks/blog-news/blog-news.js diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css new file mode 100644 index 000000000..153509e4c --- /dev/null +++ b/_src/blocks/blog-news/blog-news.css @@ -0,0 +1,78 @@ +.blog-news { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +.blog-news h2 { + font-size: 2rem; + margin-bottom: 10px; +} + +.blog-news .blog-grid { + display: grid; + grid-auto-flow: row; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + justify-content: center; + gap: 30px; +} + +.blog-news .blog-card { + text-align: center; + overflow: hidden; + display: flex; + flex-direction: column; + align-items: center; + gap: 30px; +} + +.blog-news .blog-card:hover { + transform: scale(1.02); +} + +.blog-news .blog-card img { + width: 420px; + height: 308px; + object-fit: cover; + background-color: #f8d7da; /* Placeholder color */ + border-radius: 20px; +} + +.blog-news .blog-card h3 { + font-size: 1.2rem; + margin-bottom: 24px; + color: #333; +} + +.blog-news .blog-card a { + text-decoration: none; + color: #007bff; + font-weight: bold; +} + +.blog-news .blog-card a:hover { + text-decoration: underline; +} + +@media (min-width:767px){ + .blog-news .blog-card{ + text-align: left; + } +} + +@media (min-width: 1440px){ + .blog-news{ + padding: 0; + } + .blog-news .blog-grid{ + grid-template-columns: repeat(3, 1fr) + } + +} + +@media(min-width: 1600px){ + .blog-news{ + max-width: 1320px; + } +} + diff --git a/_src/blocks/blog-news/blog-news.js b/_src/blocks/blog-news/blog-news.js new file mode 100644 index 000000000..36e45a546 --- /dev/null +++ b/_src/blocks/blog-news/blog-news.js @@ -0,0 +1,48 @@ +import { matchHeights } from '../../scripts/utils/utils.js'; + +async function renderBlogGrid(block, endpoint, articlesNumber) { + const blogGrid = block.querySelector('.blog-grid'); + try { + const response = await fetch(endpoint); + const rssText = await response.text(); + + const data = new window.DOMParser().parseFromString(rssText, 'text/xml'); + const items = data.querySelectorAll('item'); + let currentCount = 0; + items.forEach((item) => { + // eslint-disable-next-line no-plusplus + currentCount++; + if (currentCount>articlesNumber) return; + const link = item.querySelector('link').textContent; + + const title = item.querySelector('title').textContent; + const media = item.querySelector('content'); + const image = media.getAttribute('url'); + + // Create a blog card + const blogCard = document.createElement('div'); + blogCard.classList.add('blog-card'); + + blogCard.innerHTML = ` + ${title} +
+

${title}

+ Find out more +
+ `; + + blogGrid.appendChild(blogCard); + }); + } catch (error) { + console.error(error); + } +} + +export default function decorate(block) { + const { endpoint, articlesNumber } = block.closest('.section').dataset; + const blogGrid = document.createElement('div'); + block.appendChild(blogGrid); + blogGrid.classList.add('blog-grid'); + renderBlogGrid(block, endpoint, articlesNumber); + matchHeights(block, 'h3'); +} diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 9e1abe256..72c235225 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -448,11 +448,6 @@ main .section.wide h2 { font-weight: var(--font-weight-bold); } -.centered img { - margin-top: 50px; - margin-bottom: 50px; -} - main .section.table-align-top table { vertical-align: top; } From 59d6221a56c107be2d8a718188763ae3329a5e94 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 26 Nov 2024 17:32:31 +0200 Subject: [PATCH 065/248] add icon corners styling for columns layout --- _src/blocks/columns/columns.css | 66 +++++++++++++++++++++++++++++++++ _src/styles/styles.css | 4 ++ 2 files changed, 70 insertions(+) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index fe15e8f24..630398215 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1135,6 +1135,55 @@ main .section.two-columns .right-col .products.plans a.button:any-link { justify-content: center; } +.columns-container.icon-corners { + + .columns-wrapper { + border-radius: 20px; + } + + .columns { + padding: 40px; + } + + > div { + position: relative; + } + + .columns > div { + align-items: center; + } + + > div > div > div:nth-child(1) > div:nth-child(2) { + flex: 2; + + h2 { + font-size: 32px; + text-align: center; + z-index: 1; + position: relative; + } + } + + span.icon-corner-left { + position: absolute; + top: 0; + left: 0; + width: 180px; + height: 180px; + z-index: 0; + } + + span.icon-corner-right { + position: absolute; + top: 0; + right: 0; + width: 180px; + height: 180px; + transform: rotateY(180deg); + z-index: 0; + } +} + @media (max-width: 1399px) { .columns-wrapper { padding: 0 var(--section-large-desktop-padding); @@ -1245,6 +1294,23 @@ main .section.two-columns .right-col .products.plans a.button:any-link { .columns.screenshots > div > .columns-img-col { flex: 0 0 230px; } + + .columns-container.icon-corners { + + .columns { + padding: 100px; + } + + span.icon-corner-left { + width: 400px; + height: 300px; + } + + span.icon-corner-right { + width: 400px; + height: 300px; + } + } } @media (max-width: 767px) { diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 15cf73581..3018a5d3c 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1559,6 +1559,10 @@ main .section.blue a.button.modal::after { text-align: center; } +.align-left { + text-align: left; +} + .icon-apple, .icon-android { width: 18px; transform: translateY(22px); From 5f44735ce34cdd5b98b077f272fa9eb4574ebf64 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 27 Nov 2024 13:13:46 +0200 Subject: [PATCH 066/248] added 2 cards columns section --- _src/blocks/blog-news/blog-news.css | 9 +-- _src/blocks/columns/columns.css | 121 ++++++++++++++++++++++++++++ _src/blocks/columns/columns.js | 5 ++ 3 files changed, 130 insertions(+), 5 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index 153509e4c..e7b935d67 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -11,7 +11,6 @@ .blog-news .blog-grid { display: grid; - grid-auto-flow: row; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); justify-content: center; gap: 30px; @@ -27,26 +26,26 @@ } .blog-news .blog-card:hover { - transform: scale(1.02); + transform: scale(1.05); } .blog-news .blog-card img { width: 420px; height: 308px; object-fit: cover; - background-color: #f8d7da; /* Placeholder color */ + background-color: #FFD6D6; border-radius: 20px; } .blog-news .blog-card h3 { font-size: 1.2rem; margin-bottom: 24px; - color: #333; + color: #000000; } .blog-news .blog-card a { text-decoration: none; - color: #007bff; + color:#006EFF; font-weight: bold; } diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index fe15e8f24..c984178a8 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1277,3 +1277,124 @@ main .section.two-columns .right-col .products.plans a.button:any-link { margin: 0; } } + +.columns-container.multi-blocks{ + .columns-wrapper{ + padding: 20px; + min-width: 99%; + } + + .columns{ + width: 100%; + background: #F6F6F6 0% 0% no-repeat padding-box; + border-radius: 20px; + opacity: 1; + padding:20px; + } + + .columns > div > .columns-img-col img { + display: none; + } + + p{ + margin: 0; + } + + .button-container{ + margin-top: 20px; + } + + .button-container a{ + width: 100%; + justify-content: center; + } + + td{ + display: flex; + gap:15px; + align-items: center; + + span{ + margin: 0; + } + + h3{ + font-size: 24px; + margin: 0; + } + + h6{ + font-size: 14px; + color: #5F5F5F; + line-height: 0; + } + + p{ + margin:0 0 0 10px; + align-content: center; + } + + p:nth-last-of-type(2){ + margin: 0; + } + + hr{ + border: 1px solid #006EFF; + width: 25px; + line-height: 0; + } + } + .columns > div > .columns-img-col { + margin-bottom: 0; + } + + @media (min-width:767px) { + display: grid; + grid-auto-flow: column; + justify-content: center; + + div{ + height: 100%; + gap: 20px; + align-content: flex-start; + } + + .columns{ + max-width: 500px; + } + + .columns > div > div { + flex: unset; + align-content: center; + } + } + + @media (min-width: 1200px){ + .columns{ + min-width: 560px; + } + + .columns > div >div{ + width: 50%; + } + + .columns > div > .columns-img-col img { + position: static; + object-fit: cover; + display: block; + border-radius: 20px; + } + } + + @media(min-width:1400px){ + .columns{ + min-width: 640px; + } + } + + @media(min-width:1600px){ + .columns{ + min-width: 650px; + } + } +} diff --git a/_src/blocks/columns/columns.js b/_src/blocks/columns/columns.js index c8644481e..803412ddc 100644 --- a/_src/blocks/columns/columns.js +++ b/_src/blocks/columns/columns.js @@ -182,4 +182,9 @@ export default function decorate(block, options) { }); matchHeights(block, 'h3'); matchHeights(block, 'h4'); + if (block.closest('.section').classList.contains('multi-blocks')) { + matchHeights(block.closest('.section'), '.columns'); + matchHeights(block.closest('.section'), 'table'); + matchHeights(block.closest('.section'), 'p:nth-last-of-type(2)'); + } } From 9090a717952cea4c00904820f5da0479e4b5bf26 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 27 Nov 2024 13:21:03 +0200 Subject: [PATCH 067/248] added font-size --- _src/blocks/columns/columns.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 6fd14b4f7..a4e2b2c1c 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1361,8 +1361,9 @@ main .section.two-columns .right-col .products.plans a.button:any-link { .columns > div > .columns-img-col img { display: none; } - + p{ + font-size: 16px; margin: 0; } From cad843816b5dcb2bb8eb2e45172f124536e04cf7 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 27 Nov 2024 16:01:52 +0200 Subject: [PATCH 068/248] add new SVG icons and update link-checker styles --- _src/blocks/link-checker/link-checker.css | 50 ++++++++++++++-- _src/blocks/link-checker/link-checker.js | 72 +++++++++++++++++------ _src/icons/bulb.svg | 13 ++++ _src/icons/check.svg | 10 ++++ _src/icons/safe.svg | 13 ++++ _src/icons/share.svg | 10 ++++ 6 files changed, 147 insertions(+), 21 deletions(-) create mode 100644 _src/icons/bulb.svg create mode 100644 _src/icons/check.svg create mode 100644 _src/icons/safe.svg create mode 100644 _src/icons/share.svg diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 459273e43..deeb2affc 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -69,8 +69,13 @@ main .section.link-checker-container { } + .buttons-container { + margin-top: 40px; + display: flex; + gap: 40px; + } - button { + button.check-url { padding: 15px 40px; cursor: pointer; background-color: #007BFF; @@ -80,15 +85,52 @@ main .section.link-checker-container { font-weight: bold; font-size: 1em; } - button:hover { + button.check-url:hover { background-color: #0056b3; } + + button.share-button, button.check-another-button { + cursor: pointer; + color: #007BFF; + border: none; + background-color: transparent; + font-weight: bold; + font-size: 16px; + display: inline-flex; + align-items: center; + } + button.share-button:before { + content: url("../../icons/share.svg"); + margin-right: 10px; + height: 20px; + width: 20px; + display: inline-block; + } + button.check-another-button:before { + content: url("../../icons/check.svg"); + margin-right: 10px; + height: 20px; + width: 20px; + display: inline-block; + } + .result { margin-top: 20px; - font-weight: bold; + font-size: 16px; + border-radius: 8px; } .safe { - color: green; + background-color: #F3FEF8; + padding: 17px 30px 17px 46px; + position: relative; + + &::before { + content: url("../../icons/safe.svg"); + position: absolute; + left: 30px; + top: 50%; + transform: translateY(-50%); + } } .warning { color: orange; diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 9552b598e..8980aa50f 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -1,21 +1,25 @@ class StatusMessageFactory { static createMessage(status, url) { + console.log(status); const messages = { - safe: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe' }, - so_far_so_good_1: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe' }, - so_far_so_good_2: { text: `This link looks safe, but the domain '${url.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe' }, - phishing: { text: 'This link leads to a phishing site designed to steal personal information like passwords or financial data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, - malware: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger' }, - untrusted: { text: 'This link appears suspicious and may not be trustworthy. It’s best to avoid accessing it. Keep your security software active and steer clear of the site.', className: 'result warning' }, - fraud: { text: 'This link directs to a fraudulent site intended to trick users and steal sensitive data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, - spam: { text: 'This link has been identified in spam emails, which often contain malicious content. Avoid clicking on it, as it may lead to harmful sites or scams. Ensure your security measures are in place.', className: 'result warning' }, - pua: { text: 'This link is associated with apps that could slow down your device or compromise your privacy. It’s best to avoid the site and make sure your security settings are active.', className: 'result danger' }, - miner: { text: 'This URL is linked to cryptocurrency mining activities, which may use your device\'s resources without your consent. Avoid visiting the site and ensure your security protections are in place.', className: 'result danger' }, - 'malware-hd': { text: 'This URL is likely to contain malware, posing a significant threat. It\'s strongly advised to avoid accessing it and ensure your security protections are active and up to date.', className: 'result danger' }, - homograph: { text: 'This link is designed to look like a trusted site using tricky characters. Don’t click the link and make sure your security software is updated to protect your device.', className: 'result danger' }, - 'c&c': { text: 'This URL is linked to a server used to command and control malware on infected devices. Don’t click the link and make sure your security software is up to date to keep your device safe.', className: 'result danger' }, - 'miner-server': { text: 'This URL is linked to crypto mining activity, which could use your device\'s resources if accessed. It’s recommended not to click the link and ensure your security software is up to date.', className: 'result danger' }, - malvertising: { text: 'This link is connected to harmful ads that could affect your device and expose your personal data, such as your passwords, credit card information, email addresses, or browsing history. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, + 1: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe' }, + 2: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe' }, + 3: { text: `This link looks safe, but the domain '${url.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe' }, + 5: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger' }, + 17: { text: 'This link appears suspicious and may not be trustworthy. It’s best to avoid accessing it. Keep your security software active and steer clear of the site.', className: 'result danger' }, + 8: { text: 'This link directs to a fraudulent site intended to trick users and steal sensitive data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, + 15: { text: 'This link has been identified in spam emails, which often contain malicious content. Avoid clicking on it, as it may lead to harmful sites or scams. Ensure your security measures are in place.', className: 'result danger' }, + 11: { text: 'This link is associated with apps that could slow down your device or compromise your privacy. It’s best to avoid the site and make sure your security settings are active.', className: 'result danger' }, + 13: { text: 'This URL is linked to cryptocurrency mining activities, which may use your device\'s resources without your consent. Avoid visiting the site and ensure your security protections are in place.', className: 'result danger' }, + 16: { text: 'This URL is likely to contain malware, posing a significant threat. It\'s strongly advised to avoid accessing it and ensure your security protections are active and up to date.', className: 'result danger' }, + 12: { text: 'This link is designed to look like a trusted site using tricky characters. Don’t click the link and make sure your security software is updated to protect your device.', className: 'result danger' }, + 6: { text: 'This URL is linked to a server used to command and control malware on infected devices. Don’t click the link and make sure your security software is up to date to keep your device safe.', className: 'result danger' }, + 14: { text: 'This URL is linked to crypto mining activity, which could use your device\'s resources if accessed. It’s recommended not to click the link and ensure your security software is up to date.', className: 'result danger' }, + 10: { text: 'This link is connected to harmful ads that could affect your device and expose your personal data, such as your passwords, credit card information, email addresses, or browsing history. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, + 18: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, + 4: { text: 'This link is dangerous and can compromise your personal information or harm your device. Do not click it, and ensure your security software is up-to-date to stay protected from threats.', className: 'result danger' }, + 7: { text: 'This link is a threat, exposing you to malicious ads and phishing attempts that can steal your information and damage your device. Do not interact with it, and ensure your security software is updated.', className: 'result danger' }, + 9: { text: 'This link leads to a phishing site designed to steal personal information like passwords or financial data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, other: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, }; return messages[status] || { text: `Status: ${status}`, className: 'result warning' }; @@ -52,13 +56,28 @@ async function checkLink(input, result) { } const data = await response.json(); - - const status = data.status[0]; + console.log(data); + const { status } = data; const message = StatusMessageFactory.createMessage(status, url); result.textContent = message.text; result.className = message.className; } +function copyToClipboard(block) { + // Get the text field + const copyText = document.getElementById('link-checker-input'); + + // Select the text field + copyText.select(); + copyText.setSelectionRange(0, 99999); // For mobile devices + + // Copy the text inside the text field + navigator.clipboard.writeText(copyText.value); + + // Alert the copied text + alert(`Copied the text: ${copyText.value}`); +} + export default function decorate(block) { const inputContainer = document.createElement('div'); inputContainer.classList.add('input-container'); @@ -67,10 +86,12 @@ export default function decorate(block) { const input = document.createElement('input'); input.type = 'text'; input.placeholder = 'Enter URL to check'; + input.id = 'link-checker-input'; inputContainer.appendChild(input); const button = document.createElement('button'); button.textContent = 'Check URL'; + button.classList.add('check-url'); inputContainer.appendChild(button); const result = document.createElement('div'); @@ -78,5 +99,22 @@ export default function decorate(block) { result.className = 'result'; block.appendChild(result); + const buttonsContainer = document.createElement('div'); + buttonsContainer.classList.add('buttons-container'); + + const shareButton = document.createElement('button'); + shareButton.innerHTML = 'Share Result'; + shareButton.classList.add('share-button'); + shareButton.addEventListener('click', copyToClipboard(block)); + + const checkAnother = document.createElement('button'); + checkAnother.innerHTML = 'Check Another Link'; + checkAnother.classList.add('check-another-button'); + + buttonsContainer.appendChild(shareButton); + buttonsContainer.appendChild(checkAnother); + + block.appendChild(buttonsContainer); + button.addEventListener('click', () => checkLink(input, result)); } diff --git a/_src/icons/bulb.svg b/_src/icons/bulb.svg new file mode 100644 index 000000000..eae75151f --- /dev/null +++ b/_src/icons/bulb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_src/icons/check.svg b/_src/icons/check.svg new file mode 100644 index 000000000..7334b94de --- /dev/null +++ b/_src/icons/check.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_src/icons/safe.svg b/_src/icons/safe.svg new file mode 100644 index 000000000..468893b2c --- /dev/null +++ b/_src/icons/safe.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/_src/icons/share.svg b/_src/icons/share.svg new file mode 100644 index 000000000..01091adb3 --- /dev/null +++ b/_src/icons/share.svg @@ -0,0 +1,10 @@ + + + + + + + + + + From 50b7aaaffbd1dc927b446b50ac3aa461742c59f6 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 27 Nov 2024 16:02:48 +0200 Subject: [PATCH 069/248] remove copyToClipboard function and its usage in link-checker --- _src/blocks/link-checker/link-checker.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 8980aa50f..b55bc1664 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -63,21 +63,6 @@ async function checkLink(input, result) { result.className = message.className; } -function copyToClipboard(block) { - // Get the text field - const copyText = document.getElementById('link-checker-input'); - - // Select the text field - copyText.select(); - copyText.setSelectionRange(0, 99999); // For mobile devices - - // Copy the text inside the text field - navigator.clipboard.writeText(copyText.value); - - // Alert the copied text - alert(`Copied the text: ${copyText.value}`); -} - export default function decorate(block) { const inputContainer = document.createElement('div'); inputContainer.classList.add('input-container'); @@ -105,7 +90,6 @@ export default function decorate(block) { const shareButton = document.createElement('button'); shareButton.innerHTML = 'Share Result'; shareButton.classList.add('share-button'); - shareButton.addEventListener('click', copyToClipboard(block)); const checkAnother = document.createElement('button'); checkAnother.innerHTML = 'Check Another Link'; From da69455dcd6e581a7b8dccfa40b235b79c844176 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 27 Nov 2024 16:53:20 +0200 Subject: [PATCH 070/248] made the final changes for login functionality --- _src/blocks/header/header.js | 27 +++++++++++++++------------ _src/scripts/libs/constants.js | 7 +++++-- _src/scripts/libs/user.js | 4 ++-- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/_src/blocks/header/header.js b/_src/blocks/header/header.js index 73fa0b9a6..8237de484 100644 --- a/_src/blocks/header/header.js +++ b/_src/blocks/header/header.js @@ -71,10 +71,18 @@ const loginFunctionality = async (root = document) => { // change login container to display that the user is logged in // if the previous call was successfull const megaMenuLoginContainer = root.querySelector('li.mega-menu__login-container'); + const loginAttempt = sessionStorage.getItem('login-attempt'); const userData = await User.getUserInfo(); - // TODO: add a session storage check after setting up a BE static route - if (userData) { + if (!loginAttempt && !userData) { + const userLoggedInExpirationDate = Cookie.get(Constants.LOGIN_LOGGED_USER_EXPIRY_COOKIE_NAME); + if (userLoggedInExpirationDate > Date.now()) { + sessionStorage.setItem('login-attempt', true); + const loginEndpointUrl = new URL(`${Constants.LOGIN_URL_ORIGIN}${megaMenuLoginContainer.dataset.loginEndpoint}`); + loginEndpointUrl.searchParams.set('origin', `${window.location.pathname}${window.location.search}`); + window.location.href = loginEndpointUrl.href; + } + } else if (userData) { updateMegaMenu(userData.firstname, userData.email, megaMenuLoginContainer); } } catch (error) { @@ -489,12 +497,7 @@ async function runDefaultHeaderLogic(block) { aemFetchDomain = websiteDomain.split('-').join('_'); } - const aemHeaderHostname = window.location.hostname.includes('.hlx.') - || window.location.hostname.includes('localhost') - ? 'https://stage.bitdefender.com' - : ''; - - const aemHeaderFetch = await fetch(`${aemHeaderHostname}/content/experience-fragments/bitdefender/language_master/${aemFetchDomain}/header-navigation/mega-menu/master/jcr:content/root.html`); + const aemHeaderFetch = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/content/experience-fragments/bitdefender/language_master/${aemFetchDomain}/header-navigation/mega-menu/master/jcr:content/root.html`); if (!aemHeaderFetch.ok) { return; } @@ -508,14 +511,14 @@ async function runDefaultHeaderLogic(block) { contentDiv.innerHTML = aemHeaderHtml; // make image paths absolute for non-production environments - if (aemHeaderHostname === 'https://stage.bitdefender.com') { - makeImagePathsAbsolute(contentDiv, aemHeaderHostname); + if (Constants.PUBLIC_URL_ORIGIN === 'https://stage.bitdefender.com') { + makeImagePathsAbsolute(contentDiv, Constants.PUBLIC_URL_ORIGIN); } const loadedLinks = []; contentDiv.querySelectorAll('link').forEach((linkElement) => { // update the links so that they work on all Franklin domains - linkElement.href = `${aemHeaderHostname}${linkElement.getAttribute('href')}`; + linkElement.href = `${Constants.PUBLIC_URL_ORIGIN}${linkElement.getAttribute('href')}`; // add a promise for each link element in the code // so that we can wait on all the CSS before displaying the component @@ -558,7 +561,7 @@ async function runDefaultHeaderLogic(block) { const scripts = contentDiv.querySelectorAll('script'); scripts.forEach((script) => { const newScript = document.createElement('script'); - newScript.src = `${aemHeaderHostname}${script.getAttribute('src')}`; + newScript.src = `${Constants.PUBLIC_URL_ORIGIN}${script.getAttribute('src')}`; newScript.defer = true; contentDiv.appendChild(newScript); }); diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 5eb64d23a..9b3216a53 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -23,6 +23,9 @@ export const Constants = { TARGET_TENANT: "bitdefender", - PUBLIC_URL: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) - ? '' : 'https://www.bitdefender.com' + PUBLIC_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) + ? '' : 'https://www.bitdefender.com', + + LOGIN_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) + ? window.location.origin : 'https://www.bitdefender.com', } \ No newline at end of file diff --git a/_src/scripts/libs/user.js b/_src/scripts/libs/user.js index f3f4e11c6..f755165b4 100644 --- a/_src/scripts/libs/user.js +++ b/_src/scripts/libs/user.js @@ -17,7 +17,7 @@ export class User { } try { - const userDataResponse = await fetch(`${Constants.PUBLIC_URL}/bin/login/userInfo.json`); + const userDataResponse = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/bin/login/userInfo.json`); return userDataResponse.ok ? (await userDataResponse.json()).result : null; } catch { return null; @@ -87,7 +87,7 @@ export class User { */ static async #getGeolocation() { try { - const response = await fetch(`${Constants.PUBLIC_URL}/geoip`); + const response = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/geoip`); if (!response.ok) { return "us"; From 69db005ac47af6330f11f98edaeb6f2ff60f8378 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 27 Nov 2024 17:56:13 +0200 Subject: [PATCH 071/248] implemented link checker clipboard copy function + popup --- _src/blocks/blog-news/blog-news.js | 2 +- _src/blocks/columns/columns.css | 8 ++++- _src/blocks/link-checker/link-checker.css | 38 ++++++++++++++++++++++- _src/blocks/link-checker/link-checker.js | 31 ++++++++++++++++++ 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.js b/_src/blocks/blog-news/blog-news.js index 36e45a546..5b33ab92f 100644 --- a/_src/blocks/blog-news/blog-news.js +++ b/_src/blocks/blog-news/blog-news.js @@ -12,7 +12,7 @@ async function renderBlogGrid(block, endpoint, articlesNumber) { items.forEach((item) => { // eslint-disable-next-line no-plusplus currentCount++; - if (currentCount>articlesNumber) return; + if (currentCount > articlesNumber) return; const link = item.querySelector('link').textContent; const title = item.querySelector('title').textContent; diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index a4e2b2c1c..3bee8e944 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1375,6 +1375,9 @@ main .section.two-columns .right-col .products.plans a.button:any-link { width: 100%; justify-content: center; } + table{ + margin-bottom: 15px; + } td{ display: flex; @@ -1397,7 +1400,6 @@ main .section.two-columns .right-col .products.plans a.button:any-link { } p{ - margin:0 0 0 10px; align-content: center; } @@ -1411,6 +1413,10 @@ main .section.two-columns .right-col .products.plans a.button:any-link { line-height: 0; } } + + tr:last-of-type td{ + height: 25px; + } .columns > div > .columns-img-col { margin-bottom: 0; } diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index deeb2affc..302fc3dbd 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -1,7 +1,7 @@ main .section.link-checker-container { - margin: 50px auto; + margin: 50px auto 100px auto; padding: 20px; background-color: #fff; border-radius: 20px; @@ -98,6 +98,8 @@ main .section.link-checker-container { font-size: 16px; display: inline-flex; align-items: center; + flex-flow: column; + height: 40px; } button.share-button:before { content: url("../../icons/share.svg"); @@ -114,6 +116,40 @@ main .section.link-checker-container { display: inline-block; } + .share-popup { + position:relative; + top: -6em; + background-color: #000; + color: #fff; + padding: 8px 12px; + border-radius: 5px; + font-size: 14px; + font-weight: bold; + white-space: nowrap; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2); + z-index: 10; + transition: opacity 0.3s ease-in-out; + pointer-events: none; + } + + .share-popup::after { + content: ""; + position: absolute; + bottom: -6px; + left: 50%; + transform: translateX(-50%); + width: 0; + height: 0; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid #000; + } + .button-container .share-button:hover + .share-popup, + .button-container .share-button:focus + .share-popup { + opacity: 1; + pointer-events: auto; + } + } .result { margin-top: 20px; font-size: 16px; diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index b55bc1664..b3bbc13e5 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -63,6 +63,33 @@ async function checkLink(input, result) { result.className = message.className; } +function createSharePopup(buttonsContainer) { + const shareButton = buttonsContainer.querySelector('.share-button'); + const sharePopup = document.createElement('div'); + sharePopup.classList.add('share-popup'); + shareButton?.insertAdjacentElement('beforeend', sharePopup); + return sharePopup; +} + +function copyToClipboard(block) { + // Get the text field + const copyText = document.getElementById('link-checker-input'); + + // Select the text field + copyText?.select(); + copyText?.setSelectionRange(0, 99999); // For mobile devices + + // Copy the text inside the text field + navigator.clipboard.writeText(copyText.value); + const buttonsContainer = block.querySelector('.buttons-container'); + if (buttonsContainer) { + const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); + sharePopup.textContent = `Copied the text: ${copyText.value}`; + sharePopup.style = 'opacity: 1'; + setTimeout(() => { sharePopup.style = 'opacity:0;'; }, 2500); + } +} + export default function decorate(block) { const inputContainer = document.createElement('div'); inputContainer.classList.add('input-container'); @@ -101,4 +128,8 @@ export default function decorate(block) { block.appendChild(buttonsContainer); button.addEventListener('click', () => checkLink(input, result)); + shareButton.addEventListener('click', (e) => { + e.preventDefault(); + copyToClipboard(block); + }); } From e6f5e73718cf7c8a54ac9ac9a4d9c42d1299f00c Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 27 Nov 2024 17:57:20 +0200 Subject: [PATCH 072/248] enhance link-checker styles and functionality with new SVG icons and status messages --- _src/blocks/link-checker/link-checker.css | 102 ++++++++++++++++++++-- _src/blocks/link-checker/link-checker.js | 48 +++++++++- _src/icons/bulb-pink.svg | 13 +++ 3 files changed, 155 insertions(+), 8 deletions(-) create mode 100644 _src/icons/bulb-pink.svg diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index deeb2affc..f76cd38b6 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -6,7 +6,6 @@ main .section.link-checker-container { background-color: #fff; border-radius: 20px; max-width: 1350px; - background: url("../../icons/link-checker-pattern.svg"); background-color: #006EFF; padding-top: 50px; padding-bottom: 0px; @@ -14,6 +13,77 @@ main .section.link-checker-container { justify-content: center; overflow: visible; + &::before { + content: url("../../icons/link-checker-pattern.svg"); + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: url("../../icons/link-checker-pattern.svg"); + } + + &.danger { + background-color: #3e030b; + + &::before { + filter: invert(100%) sepia(0%) saturate(1%) hue-rotate(4deg) brightness(105%) contrast(101%); + } + + .check-url { + display: none; + } + + .link-checker input[type="text"] { + max-width: 100%; + border: 2px solid #D82E21; + background: none; + } + + .link-checker .danger-image { + display: block; + } + + .link-checker h2 { + color: #EA0220; + margin-bottom: 16px; + } + + .link-checker p:not(:has(img)) { + display: none; + } + } + + &.safe { + background-color: #3d8648; + + &::before { + filter: invert(50%) sepia(17%) saturate(1255%) hue-rotate(91deg) brightness(96%) contrast(95%); + } + + .check-url { + display: none; + } + + .link-checker h2 { + margin-bottom: 16px; + } + + .link-checker input[type="text"] { + max-width: 100%; + border: 2px solid #3D8648; + background: none; + } + + .link-checker .safe-image { + display: block; + } + + .link-checker p:not(:has(img)) { + display: none; + } + } + .link-checker-wrapper { max-width: 960px; width: 100%; @@ -43,6 +113,20 @@ main .section.link-checker-container { padding: 0; } + .safe-image { + display: none; + img { + max-width: 196px; + } + } + + .danger-image { + display: none; + img { + max-width: 196px; + } + } + p:first-of-type { margin: 0; } @@ -132,11 +216,18 @@ main .section.link-checker-container { transform: translateY(-50%); } } - .warning { - color: orange; - } .danger { - color: red; + background-color: #FDF3F4; + padding: 17px 30px 17px 46px; + position: relative; + + &::before { + content: url("../../icons/bulb-pink.svg"); + position: absolute; + left: 30px; + top: 50%; + transform: translateY(-50%); + } } } @@ -144,4 +235,5 @@ main .section.link-checker-container { .link-checker { bottom: -20%; } + } } diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index b55bc1664..8d3f39869 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -26,7 +26,20 @@ class StatusMessageFactory { } } -async function checkLink(input, result) { +function changeTexts(block, result) { + switch (result) { + case 'safe': + block.querySelector('h2').textContent = "You're safe"; + break; + case 'danger': + block.querySelector('h2').textContent = 'Definitely Don’t Go There'; + break; + default: + break; + } +} + +async function checkLink(block, input, result) { let url = input.value.trim(); if (!url) { result.textContent = 'Please enter a URL.'; @@ -56,11 +69,35 @@ async function checkLink(input, result) { } const data = await response.json(); - console.log(data); const { status } = data; const message = StatusMessageFactory.createMessage(status, url); result.textContent = message.text; result.className = message.className; + block.closest('.section').classList.add(message.className.split(' ')[1]); + input.setAttribute('disabled', ''); + + changeTexts(block, message.className.split(' ')[1]); +} + +function resetChecker(block) { + const classesToRemove = ['danger', 'safe']; + const section = block.closest('.section'); + + // Iterate over the classes and remove them from the section + classesToRemove.forEach((className) => { + if (section.classList.contains(className)) { + section.classList.remove(className); + } + }); + + // Reset the input and result elements + const input = block.querySelector('#link-checker-input'); + const result = block.querySelector('.result'); + const h2 = block.querySelector('h2'); + input.removeAttribute('disabled'); + result.textContent = 'Add your link or paste it from the device’s clipboard.'; + result.className = 'result'; + h2.textContent = 'Is This Link Really Safe?'; } export default function decorate(block) { @@ -100,5 +137,10 @@ export default function decorate(block) { block.appendChild(buttonsContainer); - button.addEventListener('click', () => checkLink(input, result)); + const [safeImage, dangerImage] = block.querySelectorAll('picture'); + safeImage.classList.add('safe-image'); + dangerImage.classList.add('danger-image'); + + button.addEventListener('click', () => checkLink(block, input, result)); + checkAnother.addEventListener('click', () => resetChecker(block)); } diff --git a/_src/icons/bulb-pink.svg b/_src/icons/bulb-pink.svg new file mode 100644 index 000000000..039b32ce8 --- /dev/null +++ b/_src/icons/bulb-pink.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From c5de37ae6765751943358498f790efd72dfec769 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 27 Nov 2024 18:11:17 +0200 Subject: [PATCH 073/248] fixed share button layout --- _src/blocks/link-checker/link-checker.css | 3 +-- _src/blocks/link-checker/link-checker.js | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 302fc3dbd..215614b67 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -97,8 +97,7 @@ main .section.link-checker-container { font-weight: bold; font-size: 16px; display: inline-flex; - align-items: center; - flex-flow: column; + flex-wrap: wrap; height: 40px; } button.share-button:before { diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index b3bbc13e5..961ae6051 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -65,6 +65,7 @@ async function checkLink(input, result) { function createSharePopup(buttonsContainer) { const shareButton = buttonsContainer.querySelector('.share-button'); + shareButton.style.maxWidth = `${shareButton.offsetWidth}px`; const sharePopup = document.createElement('div'); sharePopup.classList.add('share-popup'); shareButton?.insertAdjacentElement('beforeend', sharePopup); @@ -86,7 +87,10 @@ function copyToClipboard(block) { const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); sharePopup.textContent = `Copied the text: ${copyText.value}`; sharePopup.style = 'opacity: 1'; - setTimeout(() => { sharePopup.style = 'opacity:0;'; }, 2500); + setTimeout(() => { + const popupWidth = sharePopup.offsetWidth; + sharePopup.style = `transform: translateX(-${popupWidth}) opacity:0;`; + }, 2500); } } From 3ed9f2a3d2f9b2987bc945f343610cbb958b8092 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 27 Nov 2024 18:14:22 +0200 Subject: [PATCH 074/248] removed unnecessary logic --- _src/blocks/link-checker/link-checker.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 5d73c6435..947b8bbc7 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -125,8 +125,7 @@ function copyToClipboard(block) { sharePopup.textContent = `Copied the text: ${copyText.value}`; sharePopup.style = 'opacity: 1'; setTimeout(() => { - const popupWidth = sharePopup.offsetWidth; - sharePopup.style = `transform: translateX(-${popupWidth}) opacity:0;`; + sharePopup.style = `opacity:0;`; }, 2500); } } From 343bd77c6cbff15ebaf30e19ef3746c0a8c5488b Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 27 Nov 2024 18:15:01 +0200 Subject: [PATCH 075/248] lint fix --- _src/blocks/link-checker/link-checker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 947b8bbc7..2c1c83ddb 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -125,7 +125,7 @@ function copyToClipboard(block) { sharePopup.textContent = `Copied the text: ${copyText.value}`; sharePopup.style = 'opacity: 1'; setTimeout(() => { - sharePopup.style = `opacity:0;`; + sharePopup.style = 'opacity:0;'; }, 2500); } } From efb1a96e5f2f713337815061fb22608bd62bb651 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 11:17:33 +0200 Subject: [PATCH 076/248] style fix for icon-corners + popup fix --- _src/blocks/columns/columns.css | 6 ++++++ _src/blocks/link-checker/link-checker.js | 11 ++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 3bee8e944..1e6ed991c 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1182,6 +1182,12 @@ main .section.two-columns .right-col .products.plans a.button:any-link { transform: rotateY(180deg); z-index: 0; } + + @media (min-width:768px){ + .columns > div { + align-items: baseline; + } + } } @media (max-width: 1399px) { diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 2c1c83ddb..9019e928c 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -109,7 +109,7 @@ function createSharePopup(buttonsContainer) { return sharePopup; } -function copyToClipboard(block) { +function copyToClipboard(block, caller) { // Get the text field const copyText = document.getElementById('link-checker-input'); @@ -123,10 +123,11 @@ function copyToClipboard(block) { if (buttonsContainer) { const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); sharePopup.textContent = `Copied the text: ${copyText.value}`; - sharePopup.style = 'opacity: 1'; + const translateXValue = Math.abs((sharePopup.offsetWidth - caller.offsetWidth) / 2); + sharePopup.style = `transform:translateX(-${translateXValue}px); opacity: 1`; setTimeout(() => { - sharePopup.style = 'opacity:0;'; - }, 2500); + sharePopup.style = `transform:translateX(-${translateXValue}px); opacity:0;`; + }, 2000); } } @@ -175,6 +176,6 @@ export default function decorate(block) { checkAnother.addEventListener('click', () => resetChecker(block)); shareButton.addEventListener('click', (e) => { e.preventDefault(); - copyToClipboard(block); + copyToClipboard(block, shareButton); }); } From c2817e1d2a4258207989cbcb8c444f69b5ed14c9 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 13:19:25 +0200 Subject: [PATCH 077/248] link checker mobile design implementation --- _src/blocks/link-checker/link-checker.css | 52 ++++++++++++++++++----- _src/blocks/link-checker/link-checker.js | 2 +- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index eb6e53812..f59510925 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -1,14 +1,12 @@ main .section.link-checker-container { - - margin: 50px auto 100px auto; padding: 20px; background-color: #fff; border-radius: 20px; max-width: 1350px; background-color: #006EFF; padding-top: 50px; - padding-bottom: 0px; + padding-bottom: 50px; display: flex; justify-content: center; overflow: visible; @@ -21,6 +19,7 @@ main .section.link-checker-container { width: 100%; height: 100%; background-image: url("../../icons/link-checker-pattern.svg"); + overflow-y: hidden; } &.danger { @@ -95,7 +94,7 @@ main .section.link-checker-container { align-items: center; background-color: white; border-radius: 20px; - padding: 48px 160px 68px; + padding: 20px; text-align: center; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); position: relative; @@ -133,9 +132,11 @@ main .section.link-checker-container { .input-container { display: flex; + flex-direction: column; justify-content: center; width: 100%; gap: 15px; + padding-top: 10px; } input[type="text"] { @@ -144,7 +145,6 @@ main .section.link-checker-container { border-radius: 8px; border: 1px solid #006EFF; width: 100%; - max-width: 444px; margin: 0; position: relative; background: url("../../icons/link-checker-example.svg") no-repeat; @@ -180,9 +180,11 @@ main .section.link-checker-container { background-color: transparent; font-weight: bold; font-size: 16px; + gap:10px; display: inline-flex; - flex-wrap: wrap; - height: 40px; + align-items: center; + height: 4em; + flex-flow: column; } button.share-button:before { content: url("../../icons/share.svg"); @@ -201,14 +203,14 @@ main .section.link-checker-container { .share-popup { position:relative; - top: -6em; + top: -125px; + min-width: fit-content; background-color: #000; color: #fff; padding: 8px 12px; border-radius: 5px; font-size: 14px; - font-weight: bold; - white-space: nowrap; + font-weight: bold; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2); z-index: 10; transition: opacity 0.3s ease-in-out; @@ -264,6 +266,36 @@ main .section.link-checker-container { transform: translateY(-50%); } } + + @media (min-width:768px){ + margin: 50px auto 100px auto; + padding-bottom: 0; + .link-checker{ + padding: 48px 160px 68px; + bottom: -10%; + .input-container{ + flex-direction: unset; + } + input [type="text"]{ + max-width: 444px; + } + .buttons-container{ + flex-flow: unset; + margin-top: 50px; + } + + button.share-button, button.check-another-button { + flex-wrap: wrap; + align-items: center; + flex-flow: wrap; + height: 50%; + } + .share-popup{ + top: -80px; + max-width: unset; + white-space: nowrap; + } + } } @media (min-width: 1200px) { diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 9019e928c..cc8aa9b31 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -105,7 +105,7 @@ function createSharePopup(buttonsContainer) { shareButton.style.maxWidth = `${shareButton.offsetWidth}px`; const sharePopup = document.createElement('div'); sharePopup.classList.add('share-popup'); - shareButton?.insertAdjacentElement('beforeend', sharePopup); + shareButton.insertAdjacentElement('beforeend', sharePopup); return sharePopup; } From 8bf46a8f9447c65689a52151d46fe392ec58f915 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 13:28:01 +0200 Subject: [PATCH 078/248] adjusted buttons margin for mobile --- _src/blocks/link-checker/link-checker.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index f59510925..0de5e774d 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -154,7 +154,7 @@ main .section.link-checker-container { .buttons-container { - margin-top: 40px; + margin-top: 20px; display: flex; gap: 40px; } From 134e718cc5f544764c6a897399767e41e6234ae2 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 14:00:13 +0200 Subject: [PATCH 079/248] changed clipboard popup to display only metadata text --- _src/blocks/link-checker/link-checker.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index cc8aa9b31..132d48ac0 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -109,20 +109,11 @@ function createSharePopup(buttonsContainer) { return sharePopup; } -function copyToClipboard(block, caller) { - // Get the text field - const copyText = document.getElementById('link-checker-input'); - - // Select the text field - copyText?.select(); - copyText?.setSelectionRange(0, 99999); // For mobile devices - - // Copy the text inside the text field - navigator.clipboard.writeText(copyText.value); +function copyToClipboard(block, caller, popupText) { const buttonsContainer = block.querySelector('.buttons-container'); if (buttonsContainer) { const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); - sharePopup.textContent = `Copied the text: ${copyText.value}`; + sharePopup.textContent = `${popupText}`; const translateXValue = Math.abs((sharePopup.offsetWidth - caller.offsetWidth) / 2); sharePopup.style = `transform:translateX(-${translateXValue}px); opacity: 1`; setTimeout(() => { @@ -132,6 +123,7 @@ function copyToClipboard(block, caller) { } export default function decorate(block) { + const { clipboardText } = block.closest('.section').dataset; const inputContainer = document.createElement('div'); inputContainer.classList.add('input-container'); block.appendChild(inputContainer); @@ -176,6 +168,6 @@ export default function decorate(block) { checkAnother.addEventListener('click', () => resetChecker(block)); shareButton.addEventListener('click', (e) => { e.preventDefault(); - copyToClipboard(block, shareButton); + copyToClipboard(block, shareButton, clipboardText); }); } From 23ba424d86d8865ae16a031fa9a04974a2ff3305 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 14:07:52 +0200 Subject: [PATCH 080/248] refactor link-checker layout and structure for improved usability --- _src/blocks/link-checker/link-checker.css | 18 +++++++++++++++--- _src/blocks/link-checker/link-checker.js | 11 ++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index eb6e53812..f9c24d9b8 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -52,6 +52,10 @@ main .section.link-checker-container { .link-checker p:not(:has(img)) { display: none; } + + .link-checke .buttons-container { + display: flex; + } } &.safe { @@ -82,6 +86,10 @@ main .section.link-checker-container { .link-checker p:not(:has(img)) { display: none; } + + .link-checke .buttons-container { + display: flex; + } } .link-checker-wrapper { @@ -89,6 +97,10 @@ main .section.link-checker-container { width: 100%; } + .link-checker-form { + width: 100%; + } + .link-checker { display: flex; flex-direction: column; @@ -155,7 +167,7 @@ main .section.link-checker-container { .buttons-container { margin-top: 40px; - display: flex; + display: none; gap: 40px; } @@ -232,7 +244,7 @@ main .section.link-checker-container { opacity: 1; pointer-events: auto; } - } + .result { margin-top: 20px; font-size: 16px; @@ -268,7 +280,7 @@ main .section.link-checker-container { @media (min-width: 1200px) { .link-checker { - bottom: -20%; + bottom: -15%; } } } diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 2c1c83ddb..e31dcc5e3 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -131,9 +131,12 @@ function copyToClipboard(block) { } export default function decorate(block) { + const formContainer = document.createElement('div'); + formContainer.classList.add('link-checker-form'); + const inputContainer = document.createElement('div'); inputContainer.classList.add('input-container'); - block.appendChild(inputContainer); + formContainer.appendChild(inputContainer); const input = document.createElement('input'); input.type = 'text'; @@ -149,7 +152,7 @@ export default function decorate(block) { const result = document.createElement('div'); result.textContent = 'Add your link or paste it from the device’s clipboard.'; result.className = 'result'; - block.appendChild(result); + formContainer.appendChild(result); const buttonsContainer = document.createElement('div'); buttonsContainer.classList.add('buttons-container'); @@ -165,7 +168,9 @@ export default function decorate(block) { buttonsContainer.appendChild(shareButton); buttonsContainer.appendChild(checkAnother); - block.appendChild(buttonsContainer); + formContainer.appendChild(buttonsContainer); + console.log(block.querySelectorAll(':scope > div')[1]); + block.querySelectorAll(':scope > div')[1].replaceWith(formContainer); const [safeImage, dangerImage] = block.querySelectorAll('picture'); safeImage.classList.add('safe-image'); From 652741a73466605b900cedb78c6f4f77dd94a08d Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 14:09:15 +0200 Subject: [PATCH 081/248] readded clpboard --- _src/blocks/link-checker/link-checker.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 132d48ac0..57dbdd6ac 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -110,6 +110,14 @@ function createSharePopup(buttonsContainer) { } function copyToClipboard(block, caller, popupText) { + const copyText = document.getElementById('link-checker-input'); + + // Select the text field + copyText?.select(); + copyText?.setSelectionRange(0, 99999); // For mobile devices + + // Copy the text inside the text field + navigator.clipboard.writeText(copyText.value); const buttonsContainer = block.querySelector('.buttons-container'); if (buttonsContainer) { const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); From c66cd89a02790a80864ed66cad1b7c34cfe13ba2 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 14:21:59 +0200 Subject: [PATCH 082/248] fix typo in link-checker CSS class name --- _src/blocks/link-checker/link-checker.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index a8f1da438..9b5e51ffd 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -52,7 +52,7 @@ main .section.link-checker-container { display: none; } - .link-checke .buttons-container { + .link-checker .buttons-container { display: flex; } } From 42bbc929b027321100e2f50e0ddb3fcc1b6a63d2 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 14:29:32 +0200 Subject: [PATCH 083/248] fix media queries --- _src/blocks/link-checker/link-checker.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index a8f1da438..dba044685 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -279,9 +279,10 @@ main .section.link-checker-container { } } + } @media (min-width:768px){ margin: 50px auto 100px auto; - padding-bottom: 0; + padding-bottom: 50px; .link-checker{ padding: 48px 160px 68px; bottom: -10%; @@ -315,4 +316,4 @@ main .section.link-checker-container { bottom: -15%; } } -} +} \ No newline at end of file From 2107cda406a9337ba87cc44a9ff16a0a611b8d47 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 14:32:39 +0200 Subject: [PATCH 084/248] fix link-checker CSS class name and update content property --- _src/blocks/link-checker/link-checker.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 976c87573..f86155590 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -12,7 +12,7 @@ main .section.link-checker-container { overflow: visible; &::before { - content: url("../../icons/link-checker-pattern.svg"); + content: ' '; position: absolute; top: 0; left: 0; @@ -86,7 +86,7 @@ main .section.link-checker-container { display: none; } - .link-checke .buttons-container { + .link-checker .buttons-container { display: flex; } } From 03f4417fb5f151d8887fabbcbb6ca788b1f7d9ff Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 14:35:04 +0200 Subject: [PATCH 085/248] centered buttons --- _src/blocks/link-checker/link-checker.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index f86155590..fcc376ab1 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -166,6 +166,7 @@ main .section.link-checker-container { .buttons-container { + justify-content: center; margin-top: 40px; display: none; gap: 40px; From 888e1cd632bdf4e3d7cbab5e8fce3fac91f5e2d0 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 14:40:59 +0200 Subject: [PATCH 086/248] add style changes --- _src/blocks/link-checker/link-checker.css | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index f86155590..50810b5b6 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -55,6 +55,10 @@ main .section.link-checker-container { .link-checker .buttons-container { display: flex; } + + .link-checker > div:nth-child(3) { + display: none; + } } &.safe { @@ -89,6 +93,10 @@ main .section.link-checker-container { .link-checker .buttons-container { display: flex; } + + .link-checker > div:nth-child(3) { + display: none; + } } .link-checker-wrapper { @@ -251,6 +259,7 @@ main .section.link-checker-container { margin-top: 20px; font-size: 16px; border-radius: 8px; + padding-bottom: 30px; } .safe { background-color: #F3FEF8; @@ -278,13 +287,12 @@ main .section.link-checker-container { transform: translateY(-50%); } } - } - @media (min-width:768px){ + @media (min-width:768px) { margin: 50px auto 100px auto; padding-bottom: 50px; .link-checker{ - padding: 48px 160px 68px; + padding: 48px 160px 35px; bottom: -10%; .input-container{ flex-direction: unset; @@ -295,6 +303,7 @@ main .section.link-checker-container { .buttons-container{ flex-flow: unset; margin-top: 50px; + justify-content: center; } button.share-button, button.check-another-button { From 9ae1f931e1d5b1bf084231a4351070aca85ba829 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 14:48:47 +0200 Subject: [PATCH 087/248] Add input validation --- _src/blocks/link-checker/link-checker.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index e8fb9f931..5e3dacba4 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -40,18 +40,19 @@ function changeTexts(block, result) { } async function checkLink(block, input, result) { - let url = input.value.trim(); + const url = input.value.trim(); if (!url) { result.textContent = 'Please enter a URL.'; - result.className = 'result warning'; + result.className = 'result danger'; return; } + // Create the regex for URL validation + const urlRegex = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-_\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,5})?(\/.*)?$/; - try { - url = new URL(`http://${url}`); - } catch (_) { + // Validate the input URL + if (!urlRegex.test(url)) { result.textContent = 'Please enter a valid URL.'; - result.className = 'result warning'; + result.className = 'result danger'; return; } From 127138438c5327209b6df7b001f3556e47ad7dea Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 28 Nov 2024 14:53:52 +0200 Subject: [PATCH 088/248] fixed buttons causing cls --- _src/blocks/link-checker/link-checker.css | 4 ++-- _src/blocks/link-checker/link-checker.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 4a62fae88..40e9e3372 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -178,6 +178,7 @@ main .section.link-checker-container { margin-top: 40px; display: none; gap: 40px; + margin-bottom: 20px; } button.check-url { @@ -309,9 +310,8 @@ main .section.link-checker-container { button.share-button, button.check-another-button { flex-wrap: wrap; - align-items: center; + align-items: baseline; flex-flow: wrap; - height: 50%; } .share-popup{ top: -80px; diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index e8fb9f931..c6bbf53ca 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -103,6 +103,7 @@ function resetChecker(block) { function createSharePopup(buttonsContainer) { const shareButton = buttonsContainer.querySelector('.share-button'); shareButton.style.maxWidth = `${shareButton.offsetWidth}px`; + shareButton.style.maxHeight = `${shareButton.offsetHeight}px`; const sharePopup = document.createElement('div'); sharePopup.classList.add('share-popup'); shareButton.insertAdjacentElement('beforeend', sharePopup); From bda74e66bc0315a217167dd34d353dd5a09a94eb Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 15:08:21 +0200 Subject: [PATCH 089/248] Add error handling and no-response icon for link checker --- _src/blocks/link-checker/link-checker.css | 12 +++++++++++- _src/blocks/link-checker/link-checker.js | 7 +++++-- _src/icons/no-response.svg | 13 +++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 _src/icons/no-response.svg diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 4a62fae88..702fa37db 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -19,7 +19,6 @@ main .section.link-checker-container { width: 100%; height: 100%; background-image: url("../../icons/link-checker-pattern.svg"); - overflow-y: hidden; } &.danger { @@ -288,6 +287,17 @@ main .section.link-checker-container { transform: translateY(-50%); } } + .danger.no-response { + text-align: left; + font-size: 14px; + margin-bottom: 19px; + + &::before { + content: url("../../icons/no-response.svg"); + top: 30%; + left: 15px; + } + } } @media (min-width:768px) { margin: 50px auto 100px auto; diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 5e3dacba4..52aa6d97d 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -61,11 +61,14 @@ async function checkLink(block, input, result) { headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ url }), + body: JSON.stringify({ }), }); if (!response.ok) { - result.textContent = 'Something went wrong on our end'; + result.innerHTML = ` + Something went wrong on our end
+ Something went wrong on our end The system encountered an error while trying to check the link you provided. Please try again in a few minutes.`; + result.className = 'result danger no-response'; return; } diff --git a/_src/icons/no-response.svg b/_src/icons/no-response.svg new file mode 100644 index 000000000..9da6bc625 --- /dev/null +++ b/_src/icons/no-response.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From 884862040a612ca2cb8ff33dcfa8460dc27ba932 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 15:08:47 +0200 Subject: [PATCH 090/248] Update link-checker to include URL in request body --- _src/blocks/link-checker/link-checker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 6c8bc94a9..634821bd7 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -61,7 +61,7 @@ async function checkLink(block, input, result) { headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ }), + body: JSON.stringify({ url }), }); if (!response.ok) { From 5d77779d75db5ca1936b70dbeb0a85e02f94cee3 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 15:38:28 +0200 Subject: [PATCH 091/248] added dotted lines --- _src/blocks/four-cards/four-cards.css | 53 +++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/_src/blocks/four-cards/four-cards.css b/_src/blocks/four-cards/four-cards.css index f734afbc7..b8e034dfe 100644 --- a/_src/blocks/four-cards/four-cards.css +++ b/_src/blocks/four-cards/four-cards.css @@ -254,6 +254,25 @@ margin-bottom: 16px; } +.four-cards-container.dotted-lines { + ul { + li:not(:first-child) { + position: relative; + &:before { + content: ""; + display: block; + width: 1px; + height: 24px; + border: none; + border-left: 2px dotted #006EFF; + position: absolute; + top: -24px; + left: 50%; + } + } + } +} + @media (max-width: 991px) { /* mobile/tablet */ .four-cards-wrapper { padding: var(--body-padding); @@ -269,6 +288,16 @@ grid-template-columns: 1fr 1fr; grid-gap: 14px; } + + .four-cards-container.dotted-lines { + ul { + li:not(:first-child) { + &:before { + display: none; + } + } + } + } } @media (min-width: 992px) { @@ -283,6 +312,30 @@ grid-gap: 14px; } + .four-cards-container.dotted-lines .four-cards > ul { + grid-gap: 30px; + } + + .four-cards-container.dotted-lines { + ul { + li:not(:first-child) { + position: relative; + &:before { + content: ""; + display: block; + width: 30px; + height: 1px; + border: none; + border-top: 2px dotted #006EFF; + margin: 24px 0; + position: absolute; + top: 50%; + left: -30px; + } + } + } + } + .creator-cards .four-cards > ul { grid-template-columns: 300px 300px 300px; grid-gap: 14px; From 7e456cd92ec76e8ec4639591d716428b01013286 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 15:47:09 +0200 Subject: [PATCH 092/248] Refactor link-checker styles for improved readability and consistency --- _src/blocks/link-checker/link-checker.css | 38 +++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 59638274a..fe2b8f442 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -120,14 +120,14 @@ main .section.link-checker-container { h2 { font-weight: bold; - font-size: 40px; + font-size: 32px; color: #006EFF; - margin-bottom: 40px; + margin-bottom: 10px; } p { - font-size: 20px; - margin-bottom: 20px; + font-size: 16px; + margin-bottom: 10px; padding: 0; } @@ -258,9 +258,9 @@ main .section.link-checker-container { .result { margin-top: 20px; - font-size: 16px; + font-size: 14px; border-radius: 8px; - padding-bottom: 30px; + padding-bottom: 20px; } .safe { background-color: #F3FEF8; @@ -299,6 +299,10 @@ main .section.link-checker-container { left: 15px; } } + + > div:nth-child(3) { + font-size: 12px; + } } @media (min-width:768px) { margin: 50px auto 100px auto; @@ -328,6 +332,28 @@ main .section.link-checker-container { max-width: unset; white-space: nowrap; } + + p { + font-size: 20px; + margin-bottom: 20px; + padding: 0; + } + + h2 { + font-size: 40px; + margin-bottom: 40px; + } + + .result { + margin-top: 20px; + font-size: 16px; + border-radius: 8px; + padding-bottom: 30px; + } + + > div:nth-child(3) { + font-size: 16px; + } } } From 29fec78411353db12af690c687565f9fcc243ab0 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 16:00:58 +0200 Subject: [PATCH 093/248] mobile fixes --- _src/blocks/link-checker/link-checker.css | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index fe2b8f442..7ebf8f604 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -309,7 +309,7 @@ main .section.link-checker-container { padding-bottom: 50px; .link-checker{ padding: 48px 160px 35px; - bottom: -10%; + bottom: -20%; .input-container{ flex-direction: unset; } @@ -357,9 +357,19 @@ main .section.link-checker-container { } } - @media (min-width: 1200px) { + @media (min-width: 991px) { + max-height: 400px; + .link-checker { bottom: -15%; } } + + @media (max-width: 768px) { + max-height: 400px; + margin-bottom: 100px; + .link-checker { + bottom: -5%; + } + } } \ No newline at end of file From a72ac2b9b5ac382be717937336fc897de5a8a7ea Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 16:02:38 +0200 Subject: [PATCH 094/248] Remove max-height and margin adjustments for link-checker in responsive styles --- _src/blocks/link-checker/link-checker.css | 9 --------- 1 file changed, 9 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 7ebf8f604..30bc3be8d 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -358,18 +358,9 @@ main .section.link-checker-container { } @media (min-width: 991px) { - max-height: 400px; .link-checker { bottom: -15%; } } - - @media (max-width: 768px) { - max-height: 400px; - margin-bottom: 100px; - .link-checker { - bottom: -5%; - } - } } \ No newline at end of file From fbc02487989f55a79f449f7b88a754b0bcf8c623 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 17:16:46 +0200 Subject: [PATCH 095/248] Enhance link-checker functionality by ensuring URLs have a protocol and include 'www', update status messages to reflect changes, and improve CSS styles for better layout and responsiveness. --- _src/blocks/link-checker/link-checker.css | 65 ++++++++++++++--------- _src/blocks/link-checker/link-checker.js | 18 +++++-- _src/icons/link-checker-pattern-green.svg | 34 ++++++++++++ _src/icons/link-checker-pattern-red.svg | 34 ++++++++++++ 4 files changed, 122 insertions(+), 29 deletions(-) create mode 100644 _src/icons/link-checker-pattern-green.svg create mode 100644 _src/icons/link-checker-pattern-red.svg diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 30bc3be8d..e0b1e4533 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -2,9 +2,7 @@ main .section.link-checker-container { padding: 20px; background-color: #fff; - border-radius: 20px; max-width: 1350px; - background-color: #006EFF; padding-top: 50px; padding-bottom: 50px; display: flex; @@ -18,14 +16,17 @@ main .section.link-checker-container { left: 0; width: 100%; height: 100%; + max-height: 400px; background-image: url("../../icons/link-checker-pattern.svg"); + background-color: #006EFF; + border-radius: 20px; } &.danger { - background-color: #3e030b; &::before { - filter: invert(100%) sepia(0%) saturate(1%) hue-rotate(4deg) brightness(105%) contrast(101%); + background-color: #3e030b; + background-image: url("../../icons/link-checker-pattern-red.svg"); } .check-url { @@ -61,10 +62,10 @@ main .section.link-checker-container { } &.safe { - background-color: #3d8648; &::before { - filter: invert(50%) sepia(17%) saturate(1255%) hue-rotate(91deg) brightness(96%) contrast(95%); + background-color: #3d8648; + background-image: url("../../icons/link-checker-pattern-green.svg"); } .check-url { @@ -195,6 +196,7 @@ main .section.link-checker-container { } button.share-button, button.check-another-button { + position: relative; cursor: pointer; color: #007BFF; border: none; @@ -206,6 +208,7 @@ main .section.link-checker-container { align-items: center; height: 4em; flex-flow: column; + max-height: fit-content; } button.share-button:before { content: url("../../icons/share.svg"); @@ -223,8 +226,8 @@ main .section.link-checker-container { } .share-popup { - position:relative; - top: -125px; + position: absolute; + top: -85px; min-width: fit-content; background-color: #000; color: #fff; @@ -262,33 +265,33 @@ main .section.link-checker-container { border-radius: 8px; padding-bottom: 20px; } - .safe { + .result.safe { background-color: #F3FEF8; - padding: 17px 30px 17px 46px; + padding: 8px 30px 8px 46px; position: relative; + text-align: left; &::before { content: url("../../icons/safe.svg"); position: absolute; - left: 30px; - top: 50%; - transform: translateY(-50%); + left: 14px; + top: 7px; } } - .danger { + .result.danger { background-color: #FDF3F4; - padding: 17px 30px 17px 46px; + padding: 8px 30px 8px 46px; position: relative; + text-align: left; &::before { content: url("../../icons/bulb-pink.svg"); position: absolute; - left: 30px; - top: 50%; - transform: translateY(-50%); + left: 14px; + top: 7px; } } - .danger.no-response { + .result.danger.no-response { text-align: left; font-size: 14px; margin-bottom: 19px; @@ -305,11 +308,11 @@ main .section.link-checker-container { } } @media (min-width:768px) { - margin: 50px auto 100px auto; + margin: 0 auto; padding-bottom: 50px; + .link-checker{ - padding: 48px 160px 35px; - bottom: -20%; + bottom: -5%; .input-container{ flex-direction: unset; } @@ -317,18 +320,22 @@ main .section.link-checker-container { max-width: 444px; } .buttons-container{ - flex-flow: unset; + flex-flow: row; margin-top: 50px; justify-content: center; } + button.check-url { + white-space: nowrap; + } + button.share-button, button.check-another-button { flex-wrap: wrap; align-items: baseline; flex-flow: wrap; } .share-popup{ - top: -80px; + top: -40px; max-width: unset; white-space: nowrap; } @@ -346,7 +353,7 @@ main .section.link-checker-container { .result { margin-top: 20px; - font-size: 16px; + font-size: 14px; border-radius: 8px; padding-bottom: 30px; } @@ -359,6 +366,14 @@ main .section.link-checker-container { @media (min-width: 991px) { + .link-checker { + padding: 48px 160px 35px; + bottom: -10%; + } + } + + @media (min-width: 1200px) { + .link-checker { bottom: -15%; } diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 634821bd7..d242d22b8 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -1,10 +1,21 @@ class StatusMessageFactory { static createMessage(status, url) { - console.log(status); + let urlObject = url; + // Ensure the URL has a protocol + if (!/^https?:\/\//i.test(url)) { + urlObject = `http://${url}`; + } + urlObject = new URL(urlObject); + + // Ensure the URL contains www + if (!urlObject.hostname.startsWith('www.')) { + urlObject.hostname = `www.${urlObject.hostname}`; + } + const messages = { 1: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe' }, 2: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe' }, - 3: { text: `This link looks safe, but the domain '${url.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe' }, + 3: { text: `This link looks safe, but the domain '${urlObject.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe' }, 5: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger' }, 17: { text: 'This link appears suspicious and may not be trustworthy. It’s best to avoid accessing it. Keep your security software active and steer clear of the site.', className: 'result danger' }, 8: { text: 'This link directs to a fraudulent site intended to trick users and steal sensitive data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, @@ -147,7 +158,7 @@ export default function decorate(block) { const input = document.createElement('input'); input.type = 'text'; - input.placeholder = 'Enter URL to check'; + input.placeholder = 'exaple-url.com'; input.id = 'link-checker-input'; inputContainer.appendChild(input); @@ -176,7 +187,6 @@ export default function decorate(block) { buttonsContainer.appendChild(checkAnother); formContainer.appendChild(buttonsContainer); - console.log(block.querySelectorAll(':scope > div')[1]); block.querySelectorAll(':scope > div')[1].replaceWith(formContainer); const [safeImage, dangerImage] = block.querySelectorAll('picture'); diff --git a/_src/icons/link-checker-pattern-green.svg b/_src/icons/link-checker-pattern-green.svg new file mode 100644 index 000000000..e4e1dab21 --- /dev/null +++ b/_src/icons/link-checker-pattern-green.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_src/icons/link-checker-pattern-red.svg b/_src/icons/link-checker-pattern-red.svg new file mode 100644 index 000000000..3ba9626d2 --- /dev/null +++ b/_src/icons/link-checker-pattern-red.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c0f2bb2b94e80f3fcfcee9b8b2c7dac71da2da47 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 17:18:52 +0200 Subject: [PATCH 096/248] Add font --- _src/blocks/link-checker/link-checker.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index e0b1e4533..c6e17162a 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -8,6 +8,7 @@ main .section.link-checker-container { display: flex; justify-content: center; overflow: visible; + font-family: 'IBM Plex Sans', 'Roboto', sans-serif; &::before { content: ' '; From 336bf78dae633c9b709a0701b4dc8fe3d60c63eb Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 28 Nov 2024 17:22:20 +0200 Subject: [PATCH 097/248] Update clipboard copy functionality in link-checker to use text content instead of input value --- _src/blocks/link-checker/link-checker.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index d242d22b8..d9c4e22b9 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -126,14 +126,10 @@ function createSharePopup(buttonsContainer) { } function copyToClipboard(block, caller, popupText) { - const copyText = document.getElementById('link-checker-input'); - - // Select the text field - copyText?.select(); - copyText?.setSelectionRange(0, 99999); // For mobile devices + const copyText = document.getElementsByClassName('result')[0]; // Copy the text inside the text field - navigator.clipboard.writeText(copyText.value); + navigator.clipboard.writeText(copyText.textContent); const buttonsContainer = block.querySelector('.buttons-container'); if (buttonsContainer) { const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); From 68b40409bc3977d7f86540f59fdac13c285a7211 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 29 Nov 2024 18:36:44 +0200 Subject: [PATCH 098/248] Refactor link-checker to improve clipboard functionality, enhance input handling, and update styles for better usability and layout --- _src/blocks/link-checker/link-checker.css | 69 ++++-- _src/blocks/link-checker/link-checker.js | 40 +++- _src/icons/green-shield.svg | 51 +++++ _src/icons/illustration-malware.svg | 256 ++++++++++++++++++++++ 4 files changed, 382 insertions(+), 34 deletions(-) create mode 100644 _src/icons/green-shield.svg create mode 100644 _src/icons/illustration-malware.svg diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index c6e17162a..86ebdc16a 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -37,7 +37,8 @@ main .section.link-checker-container { .link-checker input[type="text"] { max-width: 100%; border: 2px solid #D82E21; - background: none; + padding-right: 15px; + pointer-events: none; } .link-checker .danger-image { @@ -60,6 +61,10 @@ main .section.link-checker-container { .link-checker > div:nth-child(3) { display: none; } + + #copy-to-clipboard { + display: none; + } } &.safe { @@ -80,11 +85,12 @@ main .section.link-checker-container { .link-checker input[type="text"] { max-width: 100%; border: 2px solid #3D8648; - background: none; + padding-right: 15px; + pointer-events: none; } .link-checker .safe-image { - display: block; + display: inline-block; } .link-checker p:not(:has(img)) { @@ -98,6 +104,10 @@ main .section.link-checker-container { .link-checker > div:nth-child(3) { display: none; } + + #copy-to-clipboard { + display: none; + } } .link-checker-wrapper { @@ -162,17 +172,30 @@ main .section.link-checker-container { input[type="text"] { padding: 15px; + padding-right: 35px; font-size: 1em; border-radius: 8px; border: 1px solid #006EFF; width: 100%; margin: 0; position: relative; - background: url("../../icons/link-checker-example.svg") no-repeat; - background-position: right center; - background-position-x: 96%; } + .input-container__container { + width: 100%; + position: relative; + } + + #copy-to-clipboard { + width: 16px; + height: 21px; + background: url(../../icons/link-checker-example.svg) no-repeat; + background-size: contain; + position: absolute; + top: 15px; + right: 15px; + cursor: pointer; + } .buttons-container { justify-content: center; @@ -265,18 +288,24 @@ main .section.link-checker-container { font-size: 14px; border-radius: 8px; padding-bottom: 20px; + display: none; } .result.safe { background-color: #F3FEF8; padding: 8px 30px 8px 46px; position: relative; text-align: left; + display: block; &::before { - content: url("../../icons/safe.svg"); + content: ""; + background: url(../../icons/safe.svg) no-repeat; position: absolute; left: 14px; - top: 7px; + top: 25%; + width: 30px; + height: 30px; + background-size: contain; } } .result.danger { @@ -284,12 +313,17 @@ main .section.link-checker-container { padding: 8px 30px 8px 46px; position: relative; text-align: left; + display: block; &::before { - content: url("../../icons/bulb-pink.svg"); + content: ""; + background: url("../../icons/bulb-pink.svg") no-repeat; position: absolute; left: 14px; - top: 7px; + top: 25%; + width: 30px; + height: 30px; + background-size: contain; } } .result.danger.no-response { @@ -305,6 +339,7 @@ main .section.link-checker-container { } > div:nth-child(3) { + margin-top: 20px; font-size: 12px; } } @@ -313,11 +348,10 @@ main .section.link-checker-container { padding-bottom: 50px; .link-checker{ - bottom: -5%; .input-container{ flex-direction: unset; } - input [type="text"]{ + .input-container__container { max-width: 444px; } .buttons-container{ @@ -332,7 +366,6 @@ main .section.link-checker-container { button.share-button, button.check-another-button { flex-wrap: wrap; - align-items: baseline; flex-flow: wrap; } .share-popup{ @@ -354,7 +387,7 @@ main .section.link-checker-container { .result { margin-top: 20px; - font-size: 14px; + font-size: 16px; border-radius: 8px; padding-bottom: 30px; } @@ -369,14 +402,6 @@ main .section.link-checker-container { .link-checker { padding: 48px 160px 35px; - bottom: -10%; - } - } - - @media (min-width: 1200px) { - - .link-checker { - bottom: -15%; } } } \ No newline at end of file diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index d9c4e22b9..d470a872c 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -110,29 +110,28 @@ function resetChecker(block) { const result = block.querySelector('.result'); const h2 = block.querySelector('h2'); input.removeAttribute('disabled'); - result.textContent = 'Add your link or paste it from the device’s clipboard.'; + input.value = ''; result.className = 'result'; h2.textContent = 'Is This Link Really Safe?'; } -function createSharePopup(buttonsContainer) { - const shareButton = buttonsContainer.querySelector('.share-button'); - shareButton.style.maxWidth = `${shareButton.offsetWidth}px`; - shareButton.style.maxHeight = `${shareButton.offsetHeight}px`; +function createSharePopup(element) { + element.style.maxWidth = `${element.offsetWidth}px`; + element.style.maxHeight = `${element.offsetHeight}px`; const sharePopup = document.createElement('div'); sharePopup.classList.add('share-popup'); - shareButton.insertAdjacentElement('beforeend', sharePopup); + element.insertAdjacentElement('beforeend', sharePopup); return sharePopup; } function copyToClipboard(block, caller, popupText) { - const copyText = document.getElementsByClassName('result')[0]; + const copyText = window.location.href; // Copy the text inside the text field - navigator.clipboard.writeText(copyText.textContent); + navigator.clipboard.writeText(copyText); const buttonsContainer = block.querySelector('.buttons-container'); if (buttonsContainer) { - const sharePopup = block.querySelector('.share-popup') || createSharePopup(buttonsContainer); + const sharePopup = block.querySelector('.share-popup') || createSharePopup(caller); sharePopup.textContent = `${popupText}`; const translateXValue = Math.abs((sharePopup.offsetWidth - caller.offsetWidth) / 2); sharePopup.style = `transform:translateX(-${translateXValue}px); opacity: 1`; @@ -154,9 +153,27 @@ export default function decorate(block) { const input = document.createElement('input'); input.type = 'text'; - input.placeholder = 'exaple-url.com'; + input.placeholder = 'example-url.com'; input.id = 'link-checker-input'; - inputContainer.appendChild(input); + + const copyElement = document.createElement('span'); + copyElement.id = 'copy-to-clipboard'; + + const divContainer = document.createElement('div'); + divContainer.className = 'input-container__container'; + divContainer.appendChild(input); + divContainer.appendChild(copyElement); + + inputContainer.appendChild(divContainer); + + copyElement.addEventListener('click', async () => { + try { + const text = await navigator.clipboard.readText(); + input.value += text; + } catch (error) { + // continue regardless of error + } + }); const button = document.createElement('button'); button.textContent = 'Check URL'; @@ -164,7 +181,6 @@ export default function decorate(block) { inputContainer.appendChild(button); const result = document.createElement('div'); - result.textContent = 'Add your link or paste it from the device’s clipboard.'; result.className = 'result'; formContainer.appendChild(result); diff --git a/_src/icons/green-shield.svg b/_src/icons/green-shield.svg new file mode 100644 index 000000000..eba143758 --- /dev/null +++ b/_src/icons/green-shield.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_src/icons/illustration-malware.svg b/_src/icons/illustration-malware.svg new file mode 100644 index 000000000..d33a59fd2 --- /dev/null +++ b/_src/icons/illustration-malware.svg @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 67fc95a4c6482fc822d63fe89dc0ba6dce5f6a0f Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 2 Dec 2024 19:25:02 +0200 Subject: [PATCH 099/248] Refactor blog-news and link-checker components for improved structure and styling, including link updates and hover effects --- _src/blocks/blog-news/blog-news.css | 4 -- _src/blocks/blog-news/blog-news.js | 13 ++-- _src/blocks/link-checker/link-checker.css | 17 ++--- _src/blocks/link-checker/link-checker.js | 76 ++++++++++++++--------- 4 files changed, 61 insertions(+), 49 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index e7b935d67..79ea6308f 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -25,10 +25,6 @@ gap: 30px; } -.blog-news .blog-card:hover { - transform: scale(1.05); -} - .blog-news .blog-card img { width: 420px; height: 308px; diff --git a/_src/blocks/blog-news/blog-news.js b/_src/blocks/blog-news/blog-news.js index 5b33ab92f..7f3c37f7e 100644 --- a/_src/blocks/blog-news/blog-news.js +++ b/_src/blocks/blog-news/blog-news.js @@ -20,15 +20,16 @@ async function renderBlogGrid(block, endpoint, articlesNumber) { const image = media.getAttribute('url'); // Create a blog card - const blogCard = document.createElement('div'); + const blogCard = document.createElement('a'); + blogCard.setAttribute('href', link); blogCard.classList.add('blog-card'); blogCard.innerHTML = ` - ${title} -
-

${title}

- Find out more -
+ ${title} +
+

${title}

+ Find out more +
`; blogGrid.appendChild(blogCard); diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 86ebdc16a..4b996b431 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -230,20 +230,21 @@ main .section.link-checker-container { gap:10px; display: inline-flex; align-items: center; - height: 4em; - flex-flow: column; - max-height: fit-content; + padding: 15px; + transition: all 0.3s ease-in-out; + + &:hover { + background-color: #dbf0f9; + } } button.share-button:before { content: url("../../icons/share.svg"); - margin-right: 10px; height: 20px; width: 20px; display: inline-block; } button.check-another-button:before { content: url("../../icons/check.svg"); - margin-right: 10px; height: 20px; width: 20px; display: inline-block; @@ -320,7 +321,7 @@ main .section.link-checker-container { background: url("../../icons/bulb-pink.svg") no-repeat; position: absolute; left: 14px; - top: 25%; + top: 15%; width: 30px; height: 30px; background-size: contain; @@ -364,10 +365,10 @@ main .section.link-checker-container { white-space: nowrap; } - button.share-button, button.check-another-button { + /* button.share-button, button.check-another-button { flex-wrap: wrap; flex-flow: wrap; - } + } */ .share-popup{ top: -40px; max-width: unset; diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index d470a872c..71eba29d8 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -1,3 +1,10 @@ +import { + AdobeDataLayerService, + PageLoadedEvent, + PageLoadStartedEvent, + UserDetectedEvent, +} from '../../scripts/libs/data-layer.js'; + class StatusMessageFactory { static createMessage(status, url) { let urlObject = url; @@ -13,25 +20,25 @@ class StatusMessageFactory { } const messages = { - 1: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe' }, - 2: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe' }, - 3: { text: `This link looks safe, but the domain '${urlObject.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe' }, - 5: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger' }, - 17: { text: 'This link appears suspicious and may not be trustworthy. It’s best to avoid accessing it. Keep your security software active and steer clear of the site.', className: 'result danger' }, - 8: { text: 'This link directs to a fraudulent site intended to trick users and steal sensitive data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, - 15: { text: 'This link has been identified in spam emails, which often contain malicious content. Avoid clicking on it, as it may lead to harmful sites or scams. Ensure your security measures are in place.', className: 'result danger' }, - 11: { text: 'This link is associated with apps that could slow down your device or compromise your privacy. It’s best to avoid the site and make sure your security settings are active.', className: 'result danger' }, - 13: { text: 'This URL is linked to cryptocurrency mining activities, which may use your device\'s resources without your consent. Avoid visiting the site and ensure your security protections are in place.', className: 'result danger' }, - 16: { text: 'This URL is likely to contain malware, posing a significant threat. It\'s strongly advised to avoid accessing it and ensure your security protections are active and up to date.', className: 'result danger' }, - 12: { text: 'This link is designed to look like a trusted site using tricky characters. Don’t click the link and make sure your security software is updated to protect your device.', className: 'result danger' }, - 6: { text: 'This URL is linked to a server used to command and control malware on infected devices. Don’t click the link and make sure your security software is up to date to keep your device safe.', className: 'result danger' }, - 14: { text: 'This URL is linked to crypto mining activity, which could use your device\'s resources if accessed. It’s recommended not to click the link and ensure your security software is up to date.', className: 'result danger' }, - 10: { text: 'This link is connected to harmful ads that could affect your device and expose your personal data, such as your passwords, credit card information, email addresses, or browsing history. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, - 18: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, - 4: { text: 'This link is dangerous and can compromise your personal information or harm your device. Do not click it, and ensure your security software is up-to-date to stay protected from threats.', className: 'result danger' }, - 7: { text: 'This link is a threat, exposing you to malicious ads and phishing attempts that can steal your information and damage your device. Do not interact with it, and ensure your security software is updated.', className: 'result danger' }, - 9: { text: 'This link leads to a phishing site designed to steal personal information like passwords or financial data. Stay away from the site and ensure your security software is active.', className: 'result danger' }, - other: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger' }, + 1: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe', status: 'safe' }, + 2: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe', status: 'so_far_so_good_1' }, + 3: { text: `This link looks safe, but the domain '${urlObject.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe', status: 'so_far_so_good_2' }, + 4: { text: 'This link is dangerous and can compromise your personal information or harm your device. Do not click it, and ensure your security software is up-to-date to stay protected from threats.', className: 'result danger', status: 'malware & phishing' }, + 5: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger', status: 'malware' }, + 6: { text: 'This URL is linked to a server used to command and control malware on infected devices. Don’t click the link and make sure your security software is up to date to keep your device safe.', className: 'result danger', status: 'c&c' }, + 7: { text: 'This link is a threat, exposing you to malicious ads and phishing attempts that can steal your information and damage your device. Do not interact with it, and ensure your security software is updated.', className: 'result danger', status: 'malvertising & fraud & phishing' }, + 8: { text: 'This link directs to a fraudulent site intended to trick users and steal sensitive data. Stay away from the site and ensure your security software is active.', className: 'result danger', status: 'fraud' }, + 9: { text: 'This link leads to a phishing site designed to steal personal information like passwords or financial data. Stay away from the site and ensure your security software is active.', className: 'result danger', status: 'phishing' }, + 10: { text: 'This link is connected to harmful ads that could affect your device and expose your personal data, such as your passwords, credit card information, email addresses, or browsing history. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger', status: 'malvertising' }, + 11: { text: 'This link is associated with apps that could slow down your device or compromise your privacy. It’s best to avoid the site and make sure your security settings are active.', className: 'result danger', status: 'pua' }, + 12: { text: 'This link is designed to look like a trusted site using tricky characters. Don’t click the link and make sure your security software is updated to protect your device.', className: 'result danger', status: 'homograph' }, + 13: { text: 'This URL is linked to cryptocurrency mining activities, which may use your device\'s resources without your consent. Avoid visiting the site and ensure your security protections are in place.', className: 'result danger', status: 'miner' }, + 14: { text: 'This URL is linked to crypto mining activity, which could use your device\'s resources if accessed. It’s recommended not to click the link and ensure your security software is up to date.', className: 'result danger', status: 'miner-server' }, + 15: { text: 'This link has been identified in spam emails, which often contain malicious content. Avoid clicking on it, as it may lead to harmful sites or scams. Ensure your security measures are in place.', className: 'result danger', status: 'spam' }, + 16: { text: 'This URL is likely to contain malware, posing a significant threat. It\'s strongly advised to avoid accessing it and ensure your security protections are active and up to date.', className: 'result danger', status: 'malware-hd' }, + 17: { text: 'This link appears suspicious and may not be trustworthy. It’s best to avoid accessing it. Keep your security software active and steer clear of the site.', className: 'result danger', status: 'untrusted' }, + 18: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger', status: 'malicious' }, + other: { text: 'This link is unsafe and could harm your device or steal your personal information. Avoid clicking on it and keep your security software updated to stay safe.', className: 'result danger', status: 'other' }, }; return messages[status] || { text: `Status: ${status}`, className: 'result warning' }; } @@ -50,19 +57,20 @@ function changeTexts(block, result) { } } -async function checkLink(block, input, result) { - const url = input.value.trim(); - if (!url) { - result.textContent = 'Please enter a URL.'; - result.className = 'result danger'; - return; - } - // Create the regex for URL validation - const urlRegex = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-_\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,5})?(\/.*)?$/; +const isValidUrl = (urlString) => { + const urlPattern = new RegExp('^(https?:\\/\\/)?' // validate protocol + + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' // validate domain name + + '((\\d{1,3}\\.){3}\\d{1,3}))' // validate OR ip (v4) address + + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' // validate port and path + + '(\\?[;&a-z\\d%_.~+=-]*)?' // validate query string + + '(\\#[-a-z\\d_]*)?$', 'i'); // validate fragment locator + return !!urlPattern.test(urlString); +}; - // Validate the input URL - if (!urlRegex.test(url)) { - result.textContent = 'Please enter a valid URL.'; +async function checkLink(block, input, result) { + const url = input.value.toLowerCase().trim(); + if (!url || !isValidUrl(url)) { + result.textContent = 'Please enter a valid URL'; result.className = 'result danger'; return; } @@ -92,6 +100,12 @@ async function checkLink(block, input, result) { input.setAttribute('disabled', ''); changeTexts(block, message.className.split(' ')[1]); + + const newObject = await new PageLoadStartedEvent(); + newObject.page.info.name = `${newObject.page.info.name}::${message.status}`; + AdobeDataLayerService.push(newObject); + AdobeDataLayerService.push(await new UserDetectedEvent()); + AdobeDataLayerService.push(new PageLoadedEvent()); } function resetChecker(block) { From 6281758c24a51187143d77a63bdfe70819ef4470 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 10:53:20 +0200 Subject: [PATCH 100/248] Enhance link-checker styles and improve status message handling, including hover effects and URL validation updates --- _src/blocks/link-checker/link-checker.css | 1 + _src/blocks/link-checker/link-checker.js | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 4b996b431..c7e328ad4 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -235,6 +235,7 @@ main .section.link-checker-container { &:hover { background-color: #dbf0f9; + border-radius: 8px; } } button.share-button:before { diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 71eba29d8..99664a482 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -45,26 +45,30 @@ class StatusMessageFactory { } function changeTexts(block, result) { - switch (result) { + switch (result.status) { case 'safe': block.querySelector('h2').textContent = "You're safe"; break; - case 'danger': - block.querySelector('h2').textContent = 'Definitely Don’t Go There'; + case 'so_far_so_good_1': + block.querySelector('h2').textContent = 'So far, so good'; + break; + case 'so_far_so_good_2': + block.querySelector('h2').textContent = 'So far, so good'; break; default: + block.querySelector('h2').textContent = 'Definitely Don’t Go There'; break; } } const isValidUrl = (urlString) => { const urlPattern = new RegExp('^(https?:\\/\\/)?' // validate protocol - + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' // validate domain name + + '((([a-z\\d]([a-z\\d-_]*[a-z\\d])*)\\.)+[a-z]{2,}|' // validate domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' // validate OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' // validate port and path + '(\\?[;&a-z\\d%_.~+=-]*)?' // validate query string + '(\\#[-a-z\\d_]*)?$', 'i'); // validate fragment locator - return !!urlPattern.test(urlString); + return urlPattern.test(urlString); }; async function checkLink(block, input, result) { @@ -99,7 +103,7 @@ async function checkLink(block, input, result) { block.closest('.section').classList.add(message.className.split(' ')[1]); input.setAttribute('disabled', ''); - changeTexts(block, message.className.split(' ')[1]); + changeTexts(block, message); const newObject = await new PageLoadStartedEvent(); newObject.page.info.name = `${newObject.page.info.name}::${message.status}`; From 17a3098bcf0dca34274260ff44a7dbdf729d80dd Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 10:59:53 +0200 Subject: [PATCH 101/248] Fix URL validation regex in link-checker to correctly handle query strings --- _src/blocks/link-checker/link-checker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 99664a482..146e6b027 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -66,7 +66,7 @@ const isValidUrl = (urlString) => { + '((([a-z\\d]([a-z\\d-_]*[a-z\\d])*)\\.)+[a-z]{2,}|' // validate domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' // validate OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' // validate port and path - + '(\\?[;&a-z\\d%_.~+=-]*)?' // validate query string + + '(\\?[;&a-z\\d%\\/_.~+=-]*)?' // validate query string + '(\\#[-a-z\\d_]*)?$', 'i'); // validate fragment locator return urlPattern.test(urlString); }; From 82951e178ca8a3b1ec2285221a1c4593663b90ba Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 11:56:29 +0200 Subject: [PATCH 102/248] Reduce font size in link-checker component for improved readability --- _src/blocks/link-checker/link-checker.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index c7e328ad4..fdfbac197 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -395,7 +395,7 @@ main .section.link-checker-container { } > div:nth-child(3) { - font-size: 16px; + font-size: 14px; } } } From 7f9f69ea1a0bafbd8334692aa1dd25fc26711030 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 13:04:00 +0200 Subject: [PATCH 103/248] Update link-checker to improve event handling and reset functionality; modify share button text for clarity --- _src/blocks/link-checker/link-checker.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 146e6b027..4f6821de0 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -106,13 +106,13 @@ async function checkLink(block, input, result) { changeTexts(block, message); const newObject = await new PageLoadStartedEvent(); - newObject.page.info.name = `${newObject.page.info.name}::${message.status}`; + newObject.page.info.name = `${newObject.page.info.name}:${message.status}`; AdobeDataLayerService.push(newObject); AdobeDataLayerService.push(await new UserDetectedEvent()); AdobeDataLayerService.push(new PageLoadedEvent()); } -function resetChecker(block) { +async function resetChecker(block) { const classesToRemove = ['danger', 'safe']; const section = block.closest('.section'); @@ -131,6 +131,11 @@ function resetChecker(block) { input.value = ''; result.className = 'result'; h2.textContent = 'Is This Link Really Safe?'; + + const newObject = await new PageLoadStartedEvent(); + AdobeDataLayerService.push(newObject); + AdobeDataLayerService.push(await new UserDetectedEvent()); + AdobeDataLayerService.push(new PageLoadedEvent()); } function createSharePopup(element) { @@ -206,7 +211,7 @@ export default function decorate(block) { buttonsContainer.classList.add('buttons-container'); const shareButton = document.createElement('button'); - shareButton.innerHTML = 'Share Result'; + shareButton.innerHTML = 'Share Link Checker'; shareButton.classList.add('share-button'); const checkAnother = document.createElement('button'); From f6a47865fe4ccb454d09370779c6dda745869ef0 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 13:14:17 +0200 Subject: [PATCH 104/248] Refactor link-checker CSS by removing unused styles and optimizing layout for better responsiveness --- _src/blocks/link-checker/link-checker.css | 7 ------- 1 file changed, 7 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index fdfbac197..16c43e319 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -353,9 +353,6 @@ main .section.link-checker-container { .input-container{ flex-direction: unset; } - .input-container__container { - max-width: 444px; - } .buttons-container{ flex-flow: row; margin-top: 50px; @@ -366,10 +363,6 @@ main .section.link-checker-container { white-space: nowrap; } - /* button.share-button, button.check-another-button { - flex-wrap: wrap; - flex-flow: wrap; - } */ .share-popup{ top: -40px; max-width: unset; From 7c0e4c95906e1fe0de8f52ae6ed2668f437044b2 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 15:04:52 +0200 Subject: [PATCH 105/248] Update link-checker styles and improve error message clarity; adjust padding and icon display --- _src/blocks/link-checker/link-checker.css | 13 +++++++++---- _src/blocks/link-checker/link-checker.js | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 16c43e319..9a88c1153 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -294,7 +294,7 @@ main .section.link-checker-container { } .result.safe { background-color: #F3FEF8; - padding: 8px 30px 8px 46px; + padding: 8px 30px 8px 55px; position: relative; text-align: left; display: block; @@ -312,7 +312,7 @@ main .section.link-checker-container { } .result.danger { background-color: #FDF3F4; - padding: 8px 30px 8px 46px; + padding: 8px 30px 8px 55px; position: relative; text-align: left; display: block; @@ -334,9 +334,14 @@ main .section.link-checker-container { margin-bottom: 19px; &::before { - content: url("../../icons/no-response.svg"); - top: 30%; + content: ""; + background: url(../../icons/no-response.svg) no-repeat; + position: absolute; left: 15px; + top: 20%; + width: 25px; + height: 25px; + background-size: contain; } } diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 4f6821de0..c3a4d8da0 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -89,8 +89,8 @@ async function checkLink(block, input, result) { if (!response.ok) { result.innerHTML = ` - Something went wrong on our end
- Something went wrong on our end The system encountered an error while trying to check the link you provided. Please try again in a few minutes.`; + Something went wrong
+ The system encountered an error while trying to check the link you provided. Please try again in a few minutes.`; result.className = 'result danger no-response'; return; } From 284e2b4419a8ecc0a81b0606fa081bc60b2876b3 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 15:23:50 +0200 Subject: [PATCH 106/248] Enhance link-checker input handling by adding inputDiv for better display management; update styles to hide text input and show inputDiv --- _src/blocks/link-checker/link-checker.css | 29 ++++++++++++++++++++--- _src/blocks/link-checker/link-checker.js | 5 ++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 9a88c1153..19811c174 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -34,13 +34,21 @@ main .section.link-checker-container { display: none; } - .link-checker input[type="text"] { + .link-checker input[type="text"], .link-checker #inputDiv { max-width: 100%; border: 2px solid #D82E21; padding-right: 15px; pointer-events: none; } + .link-checker input[type="text"] { + display: none; + } + + .link-checker #inputDiv { + display: block; + } + .link-checker .danger-image { display: block; } @@ -82,13 +90,21 @@ main .section.link-checker-container { margin-bottom: 16px; } - .link-checker input[type="text"] { + .link-checker input[type="text"], .link-checker #inputDiv { max-width: 100%; border: 2px solid #3D8648; padding-right: 15px; pointer-events: none; } + .link-checker input[type="text"] { + display: none; + } + + .link-checker #inputDiv { + display: block; + } + .link-checker .safe-image { display: inline-block; } @@ -170,7 +186,7 @@ main .section.link-checker-container { padding-top: 10px; } - input[type="text"] { + input[type="text"],#inputDiv { padding: 15px; padding-right: 35px; font-size: 1em; @@ -181,6 +197,13 @@ main .section.link-checker-container { position: relative; } + #inputDiv { + text-align: left; + word-wrap: break-word; + pointer-events: none; + display: none; + } + .input-container__container { width: 100%; position: relative; diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index c3a4d8da0..0ab212ba5 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -102,6 +102,7 @@ async function checkLink(block, input, result) { result.className = message.className; block.closest('.section').classList.add(message.className.split(' ')[1]); input.setAttribute('disabled', ''); + document.getElementById('inputDiv').textContent = url; changeTexts(block, message); @@ -182,9 +183,13 @@ export default function decorate(block) { const copyElement = document.createElement('span'); copyElement.id = 'copy-to-clipboard'; + const inputDiv = document.createElement('div'); + inputDiv.setAttribute('id', 'inputDiv'); + const divContainer = document.createElement('div'); divContainer.className = 'input-container__container'; divContainer.appendChild(input); + divContainer.appendChild(inputDiv); divContainer.appendChild(copyElement); inputContainer.appendChild(divContainer); From f8f04a644cc139280da27583230c2bec0303f660 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 3 Dec 2024 17:47:53 +0200 Subject: [PATCH 107/248] Add bot prevention mechanism to link-checker; implement challenge response handling and create BotPrevention utility --- _src/blocks/link-checker/link-checker.js | 19 +++- _src/scripts/utils/bot-prevention.js | 115 +++++++++++++++++++++++ 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 _src/scripts/utils/bot-prevention.js diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 0ab212ba5..3753a8088 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -4,6 +4,9 @@ import { PageLoadStartedEvent, UserDetectedEvent, } from '../../scripts/libs/data-layer.js'; +import { + BotPrevention, +} from '../../scripts/utils/bot-prevention.js'; class StatusMessageFactory { static createMessage(status, url) { @@ -79,7 +82,7 @@ async function checkLink(block, input, result) { return; } - const response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { + let response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -87,6 +90,19 @@ async function checkLink(block, input, result) { body: JSON.stringify({ url }), }); + if (response.status === 401) { + const challengeData = await response.json(); + const solvedChallenge = await BotPrevention.solveChallange(challengeData); + response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + // eslint-disable-next-line max-len + body: JSON.stringify({ url, pow_challenge: challengeData.pow_challenge, pow_solution: solvedChallenge.nonces }), + }); + } + if (!response.ok) { result.innerHTML = ` Something went wrong
@@ -97,6 +113,7 @@ async function checkLink(block, input, result) { const data = await response.json(); const { status } = data; + console.log(data); const message = StatusMessageFactory.createMessage(status, url); result.textContent = message.text; result.className = message.className; diff --git a/_src/scripts/utils/bot-prevention.js b/_src/scripts/utils/bot-prevention.js new file mode 100644 index 000000000..7bc870567 --- /dev/null +++ b/_src/scripts/utils/bot-prevention.js @@ -0,0 +1,115 @@ +// eslint-disable-next-line import/prefer-default-export +export class BotPrevention { + static MAX_EXECUTION_TIME = 2 * 60 * 1000; + + static EXECUTION_TIME_LIMIT = 0.5 * 1000; + + static MIN_DIFFICULTY = 2; + + static MIN_COMPLEXITY = 100; + + static POW_CONFIG = {}; + + static async solveChallange({pow_challenge, difficulty, complexity, allow_inc}) { + try { + const nonces = []; + let powPrefix = pow_challenge; + let executionTime = 0; + const startExecution = Date.now(); + for (let i = 0; i < complexity; i++) { + const solution = await this.findNonce(powPrefix, difficulty); + powPrefix += solution.nonce; + nonces.push(solution.nonce); + + executionTime = Date.now() - startExecution; + if (allow_inc === true && executionTime >= this.EXECUTION_TIME_LIMIT) { + break; + } + if (this.MAX_EXECUTION_TIME > 0 && executionTime > this.MAX_EXECUTION_TIME) { + throw new Error('Max execution time exceceded!'); + } + } + return { nonces, executionTime }; + } catch (err) { + return {}; + } + } + + static generateStringOfZeroes(charNo) { + let string = ''; + for (let i = 0; i < charNo; i++) { + string += '0'; + } + return string; + } + + static convertHexCharToBinaryString(char) { + switch (char.toUpperCase()) { + case '0': return '0000'; + case '1': return '0001'; + case '2': return '0010'; + case '3': return '0011'; + case '4': return '0100'; + case '5': return '0101'; + case '6': return '0110'; + case '7': return '0111'; + case '8': return '1000'; + case '9': return '1001'; + case 'A': return '1010'; + case 'B': return '1011'; + case 'C': return '1100'; + case 'D': return '1101'; + case 'E': return '1110'; + case 'F': return '1111'; + default: return '0000'; + } + } + + static extractLeadingBitsFromHexString(hexString, numBits) { + let bitString = ''; + const numChars = Math.ceil(numBits / 4); + for (let i = 0; i < numChars; i++) { + bitString = `${bitString}${this.convertHexCharToBinaryString(hexString.charAt(i))}`; + } + bitString = bitString.substr(0, numBits); + return bitString; + } + + static async findNonce(challenge, difficulty) { + try { + const startExecution = Date.now(); + let nonce = 1; + let executionTime = 1; + let hashedValue = await this.sha256(challenge + nonce); + const solutionPrefix = this.generateStringOfZeroes(difficulty); + + while (this.extractLeadingBitsFromHexString(hashedValue, difficulty) !== solutionPrefix) { + nonce++; + hashedValue = await this.sha256(challenge + nonce); + executionTime = Date.now() - startExecution; + if (this.MAX_EXECUTION_TIME > 0 && executionTime > this.MAX_EXECUTION_TIME) { + throw new Error('Max execution time exceceded!'); + } + } + return { nonce, executionTime }; + } catch (err) { + return {}; + } + } + + static async sha256(message) { + // Encode the message as UTF-8 + const msgBuffer = new TextEncoder().encode(message); + + // Compute the hash + const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); + + // Convert ArrayBuffer to byte array + const hashArray = Array.from(new Uint8Array(hashBuffer)); + + // Convert bytes to hex string + const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); + + return hashHex; + } +} From 83595a34f8358b6eb72af582c7fb3cc1da5ff6a6 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 4 Dec 2024 12:31:56 +0200 Subject: [PATCH 108/248] Add loading indicator to link-checker; implement loader-circle class for visual feedback during link checking --- _src/blocks/link-checker/link-checker.js | 3 ++- _src/styles/styles.css | 27 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 3753a8088..69cafca93 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -82,6 +82,7 @@ async function checkLink(block, input, result) { return; } + input.closest('.input-container').classList.add('loader-circle'); let response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { method: 'POST', headers: { @@ -113,7 +114,6 @@ async function checkLink(block, input, result) { const data = await response.json(); const { status } = data; - console.log(data); const message = StatusMessageFactory.createMessage(status, url); result.textContent = message.text; result.className = message.className; @@ -122,6 +122,7 @@ async function checkLink(block, input, result) { document.getElementById('inputDiv').textContent = url; changeTexts(block, message); + input.closest('.input-container').classList.remove('loader-circle'); const newObject = await new PageLoadStartedEvent(); newObject.page.info.name = `${newObject.page.info.name}:${message.status}`; diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 92bf8fc67..c56a3983f 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1610,6 +1610,33 @@ main .section.blue a.button.modal::after { visibility: hidden; } + +.loader-circle { + width: 48px !important; + height: 48px !important; + border: 5px solid #006EFF !important; + border-bottom-color: transparent !important; + border-radius: 50% !important; + position: relative !important; + display: inline-block !important; + box-sizing: border-box !important; + animation: rotation 1s linear infinite !important; +} + +.loader-circle * { + visibility: hidden !important; + display: none !important; +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + @media (min-width: 768px) { .buttons-align-right > div { flex-direction: row; From b747bb77facd212a0922ebccc867d885ae7961c6 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 4 Dec 2024 12:37:54 +0200 Subject: [PATCH 109/248] Adjust link-checker icon position for improved layout; move icon top position from 25% to 15% --- _src/blocks/link-checker/link-checker.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 19811c174..850066195 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -327,7 +327,7 @@ main .section.link-checker-container { background: url(../../icons/safe.svg) no-repeat; position: absolute; left: 14px; - top: 25%; + top: 15%; width: 30px; height: 30px; background-size: contain; From e00f802a63216809212b9f739db33aea03a70f2c Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 4 Dec 2024 12:40:53 +0200 Subject: [PATCH 110/248] Update .eslintignore to exclude bot-prevention utility and add error logging in renderBlogGrid function --- .eslintignore | 1 + _src/blocks/blog-news/blog-news.js | 1 + 2 files changed, 2 insertions(+) diff --git a/.eslintignore b/.eslintignore index 7403691d5..04fb617de 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,4 +4,5 @@ _src/scripts/vendor _src/vendor _src/plugins _src/scripts/libs/** +_src/scripts/utils/bot-prevention.js tools diff --git a/_src/blocks/blog-news/blog-news.js b/_src/blocks/blog-news/blog-news.js index 7f3c37f7e..7323297b7 100644 --- a/_src/blocks/blog-news/blog-news.js +++ b/_src/blocks/blog-news/blog-news.js @@ -35,6 +35,7 @@ async function renderBlogGrid(block, endpoint, articlesNumber) { blogGrid.appendChild(blogCard); }); } catch (error) { + // eslint-disable-next-line no-console console.error(error); } } From bca5c2665577b9431c215e099ae1a110810b00f5 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 4 Dec 2024 15:57:50 +0200 Subject: [PATCH 111/248] Add Nimbus Client ID header to link-checker requests --- _src/blocks/link-checker/link-checker.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 69cafca93..2c497cff9 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -87,6 +87,7 @@ async function checkLink(block, input, result) { method: 'POST', headers: { 'Content-Type': 'application/json', + 'X-Nimbus-ClientID': '81b10964-a3c1-44f6-b5ac-7eac82db3ab1', }, body: JSON.stringify({ url }), }); @@ -98,6 +99,7 @@ async function checkLink(block, input, result) { method: 'POST', headers: { 'Content-Type': 'application/json', + 'X-Nimbus-ClientID': '81b10964-a3c1-44f6-b5ac-7eac82db3ab1', }, // eslint-disable-next-line max-len body: JSON.stringify({ url, pow_challenge: challengeData.pow_challenge, pow_solution: solvedChallenge.nonces }), @@ -109,6 +111,7 @@ async function checkLink(block, input, result) { Something went wrong
The system encountered an error while trying to check the link you provided. Please try again in a few minutes.`; result.className = 'result danger no-response'; + input.closest('.input-container').classList.remove('loader-circle'); return; } From efc163ec35daa2a82d90e12b2bb31e2d2a66bb3a Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 4 Dec 2024 18:02:26 +0200 Subject: [PATCH 112/248] Refactor blog and link-checker components to use

and

tags for improved semantics; enhance styles for questions-answers section --- _src/blocks/blog-news/blog-news.css | 3 ++- _src/blocks/blog-news/blog-news.js | 2 +- _src/blocks/link-checker/link-checker.css | 8 ++++---- _src/blocks/link-checker/link-checker.js | 12 ++++++------ .../questions-answers/questions-answers.css | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index 79ea6308f..2e8339a64 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -33,9 +33,10 @@ border-radius: 20px; } -.blog-news .blog-card h3 { +.blog-news .blog-card p { font-size: 1.2rem; margin-bottom: 24px; + font-weight: bold; color: #000000; } diff --git a/_src/blocks/blog-news/blog-news.js b/_src/blocks/blog-news/blog-news.js index 7323297b7..f95420642 100644 --- a/_src/blocks/blog-news/blog-news.js +++ b/_src/blocks/blog-news/blog-news.js @@ -27,7 +27,7 @@ async function renderBlogGrid(block, endpoint, articlesNumber) { blogCard.innerHTML = ` ${title}
-

${title}

+

${title}

Find out more
`; diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 850066195..6807af704 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -53,7 +53,7 @@ main .section.link-checker-container { display: block; } - .link-checker h2 { + .link-checker h1 { color: #EA0220; margin-bottom: 16px; } @@ -86,7 +86,7 @@ main .section.link-checker-container { display: none; } - .link-checker h2 { + .link-checker h1 { margin-bottom: 16px; } @@ -146,7 +146,7 @@ main .section.link-checker-container { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); position: relative; - h2 { + h1 { font-weight: bold; font-size: 32px; color: #006EFF; @@ -403,7 +403,7 @@ main .section.link-checker-container { padding: 0; } - h2 { + h1 { font-size: 40px; margin-bottom: 40px; } diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 2c497cff9..3f7d4e10b 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -50,16 +50,16 @@ class StatusMessageFactory { function changeTexts(block, result) { switch (result.status) { case 'safe': - block.querySelector('h2').textContent = "You're safe"; + block.querySelector('h1').textContent = "You're safe"; break; case 'so_far_so_good_1': - block.querySelector('h2').textContent = 'So far, so good'; + block.querySelector('h1').textContent = 'So far, so good'; break; case 'so_far_so_good_2': - block.querySelector('h2').textContent = 'So far, so good'; + block.querySelector('h1').textContent = 'So far, so good'; break; default: - block.querySelector('h2').textContent = 'Definitely Don’t Go There'; + block.querySelector('h1').textContent = 'Definitely Don’t Go There'; break; } } @@ -148,11 +148,11 @@ async function resetChecker(block) { // Reset the input and result elements const input = block.querySelector('#link-checker-input'); const result = block.querySelector('.result'); - const h2 = block.querySelector('h2'); + const h1 = block.querySelector('h1'); input.removeAttribute('disabled'); input.value = ''; result.className = 'result'; - h2.textContent = 'Is This Link Really Safe?'; + h1.textContent = 'Is This Link Really Safe?'; const newObject = await new PageLoadStartedEvent(); AdobeDataLayerService.push(newObject); diff --git a/_src/blocks/questions-answers/questions-answers.css b/_src/blocks/questions-answers/questions-answers.css index ff528f049..f567dcfb0 100644 --- a/_src/blocks/questions-answers/questions-answers.css +++ b/_src/blocks/questions-answers/questions-answers.css @@ -32,6 +32,21 @@ font: italic normal normal 14px/16px var(--body-font-family); } +.questions-answers-container .questions-answers-item .question h3 { + position: relative; + font: normal normal bold 18px / 21px var(--body-font-family) !important; + color: #000; + display: flex; + justify-content: space-between; + align-items: center; + padding-right: 25px; + margin-bottom: 0; +} + +.questions-answers-container .questions-answers-item.expanded .question h3 { + color: #006EFF; +} + .questions-answers .questions-answers-item { margin: 16px 0; padding: 16px 16px 16px 40px; From b056785cc4d01aadb771ddf4dac974460a4ff743 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 11:50:54 +0200 Subject: [PATCH 113/248] DEX-20840 | removed hardcoded campaign --- _src/scripts/libs/store/store.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index c211ec87a..05a664f29 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -923,19 +923,15 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - // TODO: delete this parameter as it is for testing purposes only - static campaign = "TSExpired0MRDLP24"; - static async getProductVariations(productId, campaign) { const pathVariablesResolverObject = { "{locale}": Page.locale, "{bundleId}": productId, - "{campaignId}": this.campaign // TODO: replace with campaign received as parameter + "{campaignId}": campaign }; // get the correct path to get the prices - // TODO: add a check for campaign to be not null let productPath = campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; // replace all variables from the path @@ -1100,7 +1096,7 @@ class StoreConfig { } if (!Constants.ZUROA_LOCALES.includes(Page.locale)) { - return ""; + return Store.NO_PROMOTION; } const jsonFilePath = "https://www.bitdefender.com/pages/fragment-collection/zuoracampaign.json"; From f92a6f0ee06b95cf8666812080cc21e4ec06a7ad Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 12:17:34 +0200 Subject: [PATCH 114/248] added functionality for dynamic priceCondition texts --- _src/blocks/products/products.js | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index b15e5f951..aa75ab908 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -53,16 +53,14 @@ function renderPlanSelector(plans, defaultSelection) { liStoreParameters, `${label}`, ); - - // set the - if (defaultSelection === label) { - li.classList.add('active'); - } - li.addEventListener('click', () => { root.querySelectorAll('.active').forEach((option) => option.classList.remove('active')); li.classList.add('active'); }); + // set the default selection + if (defaultSelection === label) { + li.click(); + } ul.appendChild(li); } @@ -274,7 +272,7 @@ function renderPriceCondition(text) { return createTag( 'div', { - class: 'price', + class: 'price condition', }, `${text}`, ); @@ -389,7 +387,7 @@ export default function decorate(block) { } }); - // Height matching logic + // Height matching and Dynamic texts logic and Dynamic texts const cards = block.querySelectorAll('.product-card'); const featuredCard = block.querySelector('.product-card.featured'); cards.forEach((card) => { @@ -399,7 +397,16 @@ export default function decorate(block) { const firstPElement = card.querySelector('p:not(:has(img, .icon))'); firstPElement.classList.add('img-adjacent-text'); } - + const planSelector = card.querySelector('.variant-selector'); + const dynamicPriceTexts = [...metadata.dynamicPriceTexts.split(',')]; + const priceConditionEl = card.querySelector('.price.condition em'); + planSelector?.querySelectorAll('li')?.forEach((option, idx) => { + option.addEventListener('click', () => { + if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { + priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found + } + }); + }); if (!card.classList.contains('featured')) { // If there is no featured card, do nothing if (!featuredCard) { @@ -414,6 +421,7 @@ export default function decorate(block) { } }); matchHeights(block, '.price.nanoblock:not(:last-of-type)'); + matchHeights(block, '.price.condition'); matchHeights(block, 'h3:nth-of-type(2)'); matchHeights(block, 'p:nth-of-type(2)'); matchHeights(block, 'p:nth-of-type(3)'); From 20d966c4da7f507f8fcb5892457ddbda44d1a44b Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 12:31:01 +0200 Subject: [PATCH 115/248] added fix for cyclic dependencies --- _src/scripts/lib-franklin.js | 4 ++-- _src/scripts/libs/data-layer.js | 18 ++++-------------- _src/scripts/libs/page.js | 23 +++++++++++++++++++++++ _src/scripts/libs/store/store.js | 4 ++-- _src/scripts/utils/utils.js | 9 --------- 5 files changed, 31 insertions(+), 27 deletions(-) diff --git a/_src/scripts/lib-franklin.js b/_src/scripts/lib-franklin.js index 50ed9d53b..dec75195e 100644 --- a/_src/scripts/lib-franklin.js +++ b/_src/scripts/lib-franklin.js @@ -11,7 +11,7 @@ * governing permissions and limitations under the License. */ -import { getParamValue } from "./utils/utils.js"; +import Page from './libs/page.js'; const STICKY_NAVIGATION_SECTION_METADATA_KEY = 'sticky-navigation-item'; export const ALL_FRANKLIN_DEV_SUBDOMAINS = ['localhost', '.hlx.page', '.hlx.live']; @@ -661,7 +661,7 @@ export function decorateTemplateAndTheme() { element.classList.add(toClassName(c.trim())); }); }; - const dark = getParamValue('theme'); + const dark = Page.getParamValue('theme'); if (dark) addClasses(document.body, 'dark-mode'); const template = getMetadata('template'); if (template) addClasses(document.body, template); diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index e6085ce40..b8a713709 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -69,16 +69,6 @@ export class PageLoadStartedEvent { return meta || ''; } - /** - * - * @param {string} param -> the parameter to be searched in the URL - * @returns {string} -> value of the parameter - */ - #getParamValue(param) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.get(param); - } - /** * get experiment details from Target * @returns {Promise<{ @@ -193,7 +183,7 @@ export class PageLoadStartedEvent { subSubSubSection: pageSectionData.subSubSubSection, destinationURL: window.location.href, queryString: window.location.search, - referringURL: this.#getParamValue('adobe_mc_ref') || this.#getParamValue('ref') || document.referrer || '', + referringURL: Page.getParamValue('adobe_mc_ref') || Page.getParamValue('ref') || document.referrer || '', serverName: 'hlx.live', // indicator for AEM Success Edge language: pageSectionData.locale, sysEnv: UserAgent.os, @@ -201,9 +191,9 @@ export class PageLoadStartedEvent { { experimentDetails: pageSectionData.experimentDetails }), }, attributes: { - promotionID: this.#getParamValue('pid') || '', - internalPromotionID: this.#getParamValue('icid') || '', - trackingID: this.#getParamValue('cid') || '', + promotionID: Page.getParamValue('pid') || '', + internalPromotionID: Page.getParamValue('icid') || '', + trackingID: Page.getParamValue('cid') || '', time: this.#getCurrentTime(), date: this.#getCurrentDate(), domain: pageSectionData.domain, diff --git a/_src/scripts/libs/page.js b/_src/scripts/libs/page.js index fc0887e3b..016afa4db 100644 --- a/_src/scripts/libs/page.js +++ b/_src/scripts/libs/page.js @@ -22,6 +22,11 @@ export default class Page { */ static pageName; + /** + * @type {object} - {theme: 'dark', key: 'value'} + */ + static queryParams; + /** * @type {'dev' | 'stage' | 'prod'} */ @@ -38,6 +43,8 @@ export default class Page { this.environment = this.#getEnvironment(); this.pageName = window.location.pathname.split('/').filter(Boolean).pop(); + + this.queryParams = this.#getQueryParams(); } static #getLocale() { @@ -66,4 +73,20 @@ export default class Page { } return 'dev'; } + + /** + * Returns the environment name based on the hostname + * @returns {object} + */ + static #getQueryParams() { + return new URLSearchParams(window.location.search); + } + + /** + * Returns the value of the respective key from the query params + * @param {string} key + */ + static getParamValue(key) { + return this.queryParams[key]; + } } diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 23d02d040..e1259ea93 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1,6 +1,6 @@ import { Constants } from "../constants.js"; import { Target, Visitor } from "../data-layer.js"; -import { getParamValue, GLOBAL_V2_LOCALES, setUrlParams } from "../../utils/utils.js"; +import { GLOBAL_V2_LOCALES, setUrlParams } from "../../utils/utils.js"; import Page from "../page.js"; import { getMetadata } from "../../utils/utils.js"; import { User } from "../../libs/user.js" @@ -924,7 +924,7 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - static campaign = getParamValue('vcampaign'); + static campaign = Page.getParamValue('vcampaign'); static async getProductVariations(productId, campaign) { const locale = await Target.getVlaicuGeoIpPrice() ? await User.locale : Page.locale; diff --git a/_src/scripts/utils/utils.js b/_src/scripts/utils/utils.js index ff009547f..304683869 100644 --- a/_src/scripts/utils/utils.js +++ b/_src/scripts/utils/utils.js @@ -135,15 +135,6 @@ export function checkIfConsumerPage() { return lastSegmentInPath === 'consumer'; } -/** - * Returns the value of a query parameter - * @returns {String} - */ -export function getParamValue(param) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.get(param); -} - // eslint-disable-next-line import/prefer-default-export export function createTag(tag, attributes, html) { const el = document.createElement(tag); From 98bebd0275b039c23d0778585f00d63d49513f90 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 12:34:08 +0200 Subject: [PATCH 116/248] added queryParams to Page class --- _src/scripts/libs/data-layer.js | 18 ++++-------------- _src/scripts/libs/page.js | 23 +++++++++++++++++++++++ _src/scripts/utils/utils.js | 9 --------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 5d62548de..926b22fc9 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -69,16 +69,6 @@ export class PageLoadStartedEvent { return meta || ''; } - /** - * - * @param {string} param -> the parameter to be searched in the URL - * @returns {string} -> value of the parameter - */ - #getParamValue(param) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.get(param); - } - /** * get experiment details from Target * @returns {Promise<{ @@ -193,7 +183,7 @@ export class PageLoadStartedEvent { subSubSubSection: pageSectionData.subSubSubSection, destinationURL: window.location.href, queryString: window.location.search, - referringURL: this.#getParamValue('adobe_mc_ref') || this.#getParamValue('ref') || document.referrer || '', + referringURL: Page.getParamValue('adobe_mc_ref') || Page.getParamValue('ref') || document.referrer || '', serverName: 'hlx.live', // indicator for AEM Success Edge language: pageSectionData.locale, sysEnv: UserAgent.os, @@ -201,9 +191,9 @@ export class PageLoadStartedEvent { { experimentDetails: pageSectionData.experimentDetails }), }, attributes: { - promotionID: this.#getParamValue('pid') || '', - internalPromotionID: this.#getParamValue('icid') || '', - trackingID: this.#getParamValue('cid') || '', + promotionID: Page.getParamValue('pid') || '', + internalPromotionID: Page.getParamValue('icid') || '', + trackingID: Page.getParamValue('cid') || '', time: this.#getCurrentTime(), date: this.#getCurrentDate(), domain: pageSectionData.domain, diff --git a/_src/scripts/libs/page.js b/_src/scripts/libs/page.js index fc0887e3b..016afa4db 100644 --- a/_src/scripts/libs/page.js +++ b/_src/scripts/libs/page.js @@ -22,6 +22,11 @@ export default class Page { */ static pageName; + /** + * @type {object} - {theme: 'dark', key: 'value'} + */ + static queryParams; + /** * @type {'dev' | 'stage' | 'prod'} */ @@ -38,6 +43,8 @@ export default class Page { this.environment = this.#getEnvironment(); this.pageName = window.location.pathname.split('/').filter(Boolean).pop(); + + this.queryParams = this.#getQueryParams(); } static #getLocale() { @@ -66,4 +73,20 @@ export default class Page { } return 'dev'; } + + /** + * Returns the environment name based on the hostname + * @returns {object} + */ + static #getQueryParams() { + return new URLSearchParams(window.location.search); + } + + /** + * Returns the value of the respective key from the query params + * @param {string} key + */ + static getParamValue(key) { + return this.queryParams[key]; + } } diff --git a/_src/scripts/utils/utils.js b/_src/scripts/utils/utils.js index ff009547f..304683869 100644 --- a/_src/scripts/utils/utils.js +++ b/_src/scripts/utils/utils.js @@ -135,15 +135,6 @@ export function checkIfConsumerPage() { return lastSegmentInPath === 'consumer'; } -/** - * Returns the value of a query parameter - * @returns {String} - */ -export function getParamValue(param) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.get(param); -} - // eslint-disable-next-line import/prefer-default-export export function createTag(tag, attributes, html) { const el = document.createElement(tag); From a11d04dc0db49ccfd3f18e175a70db639f10c49a Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 12:53:29 +0200 Subject: [PATCH 117/248] updated the code to use the correct campaign variable --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 05a664f29..b592bf012 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1192,7 +1192,7 @@ export class Store { || this.#getUrlPromotion() || product.promotion || getMetadata("pid") - || await this.config.zuoraCampaign; + || await this.config.campaign; return await this.#apiCall( product From 3bc099c0b3ba03d1663a7d2c0635930b0daf23ae Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 13:07:52 +0200 Subject: [PATCH 118/248] created separate ids object --- _src/scripts/libs/constants.js | 53 +++++++++++++++++++++++++++++++- _src/scripts/libs/store/store.js | 16 +++++----- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 7ed832003..7843acb93 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -12,7 +12,7 @@ export const Constants = { DEV_DOMAINS: ['localhost', 'stage', '.hlx.'], - PRODUCT_ID_MAPPINGS: { + PRODUCT_ID_MAPPINGS_ZUORA: { av: "com.bitdefender.cl.av", is: "com.bitdefender.cl.is", tsmd: "com.bitdefender.cl.tsmd", @@ -63,6 +63,57 @@ export const Constants = { us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', }, + PRODUCT_ID_MAPPINGS_VLAICU: { + av: "com.bitdefender.cl.av", + is: "com.bitdefender.cl.is", + tsmd: "com.bitdefender.cl.tsmd", + fp: "com.bitdefender.cl.fp", + ps: "com.bitdefender.premiumsecurity", + psm: "com.bitdefender.premiumsecurity", + psp: "com.bitdefender.premiumsecurityplus", + pspm: "com.bitdefender.premiumsecurityplus", + soho: "com.bitdefender.soho", + mac: "com.bitdefender.avformac", + vpn: "com.bitdefender.vpn", + "vpn-monthly": "com.bitdefender.vpn", + pass: "com.bitdefender.passwordmanager", + passm: "com.bitdefender.passwordmanager", + pass_sp: "com.bitdefender.passwordmanager", + pass_spm: "com.bitdefender.passwordmanager", + bms: "com.bitdefender.bms", + mobile: "com.bitdefender.bms", + ios: "com.bitdefender.iosprotection", + mobileios: "com.bitdefender.iosprotection", + dip: "com.bitdefender.dataprivacy", + dipm: "com.bitdefender.dataprivacy", + avpm: 'com.bitdefender.cl.avplus.v2', + ultsec: "", + ultsecplus: "", + ultsecm: "", + ultsecplusm: "", + idthefts: "", + idtheftp: "", + idtheftsm: "", + idtheftpm: "", + // DLP + ts_i: 'com.bitdefender.tsmd.v2', + ts_f: 'com.bitdefender.tsmd.v2', + ps_i: 'com.bitdefender.premiumsecurity.v2', + ps_f: 'com.bitdefender.premiumsecurity.v2', + us_i: 'com.bitdefender.ultimatesecurityeu.v2', + us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', + us_f: 'com.bitdefender.ultimatesecurityeu.v2', + us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', + us_pf: 'com.bitdefender.ultimatesecurityeu.v2', + us_pf_m: 'com.bitdefender.ultimatesecurityeu.v2', + us_pi: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pi_m: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', +}, + PRODUCT_ID_NAME_MAPPINGS: { pass: "Bitdefender Password Manager", pass_sp: "Bitdefender Password Manager Shared Plan", diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index c0a62d824..d8156b332 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -827,7 +827,7 @@ class BitCheckout { } static async getProductVariationsPrice(id, campaignId) { - let payload = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId))?.payload; + let payload = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS_ZUORA[id], campaignId))?.payload; if (!payload || payload.length === 0) { return null @@ -844,7 +844,7 @@ class BitCheckout { window.StoreProducts.product[id] = { product_alias: id, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS_ZUORA[id], product_name: payload[0].name, variations: {} } @@ -887,8 +887,8 @@ class BitCheckout { } const devicesObj = { currency_iso: devices.currency, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], - platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS_ZUORA[id], + platform_product_id: Constants.PRODUCT_ID_MAPPINGS_ZUORA[id], promotion: campaignId, price: devices.price, variation: { @@ -968,7 +968,7 @@ class Vlaicu { } static async getProductVariationsPrice(id, campaignId) { - const productInfo = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id.trim()], campaignId))?.product; + const productInfo = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS_VLAICU[id.trim()], campaignId))?.product; if (!productInfo) { return null; } @@ -980,7 +980,7 @@ class Vlaicu { window.StoreProducts.product[id] = { product_alias: id, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS_VLAICU[id], product_name: productInfo.productName, variations: {} } @@ -1009,8 +1009,8 @@ class Vlaicu { const devicesObj = { currency_iso: productVariation.currency, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], - platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS_VLAICU[id], + platform_product_id: Constants.PRODUCT_ID_MAPPINGS_VLAICU[id], promotion: campaignId, price: productVariation.price, buyLink: productVariation.buyLink, From 17bad918f699152bae73b798bf3389f920d6da5d Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 13:11:14 +0200 Subject: [PATCH 119/248] added functionality for multiple cards metadata --- _src/blocks/products/products.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index aa75ab908..bb089f576 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -390,7 +390,7 @@ export default function decorate(block) { // Height matching and Dynamic texts logic and Dynamic texts const cards = block.querySelectorAll('.product-card'); const featuredCard = block.querySelector('.product-card.featured'); - cards.forEach((card) => { + cards.forEach((card, cardIndex) => { const hasImage = card.querySelector('img') !== null; if (hasImage && !block.classList.contains('plans') && !block.classList.contains('compact')) { // If the image exists, set max-width to the paragraph next to the image @@ -398,7 +398,8 @@ export default function decorate(block) { firstPElement.classList.add('img-adjacent-text'); } const planSelector = card.querySelector('.variant-selector'); - const dynamicPriceTexts = [...metadata.dynamicPriceTexts.split(',')]; + const dynamicPriceTextsKey = `dynamicPriceTexts${cardIndex + 1}`; + const dynamicPriceTexts = [...metadata[dynamicPriceTextsKey].split(',')]; const priceConditionEl = card.querySelector('.price.condition em'); planSelector?.querySelectorAll('li')?.forEach((option, idx) => { option.addEventListener('click', () => { From 4079070bd63b2301b96f63352b6bb192fbabfb1c Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 13:19:06 +0200 Subject: [PATCH 120/248] covered case where metadata might be missing --- _src/blocks/products/products.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index bb089f576..420a69921 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -399,15 +399,17 @@ export default function decorate(block) { } const planSelector = card.querySelector('.variant-selector'); const dynamicPriceTextsKey = `dynamicPriceTexts${cardIndex + 1}`; - const dynamicPriceTexts = [...metadata[dynamicPriceTextsKey].split(',')]; - const priceConditionEl = card.querySelector('.price.condition em'); - planSelector?.querySelectorAll('li')?.forEach((option, idx) => { - option.addEventListener('click', () => { - if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { - priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found - } + if (metadata[dynamicPriceTextsKey]) { + const dynamicPriceTexts = [...metadata[dynamicPriceTextsKey].split(',')]; + const priceConditionEl = card.querySelector('.price.condition em'); + planSelector?.querySelectorAll('li')?.forEach((option, idx) => { + option.addEventListener('click', () => { + if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { + priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found + } + }); }); - }); + } if (!card.classList.contains('featured')) { // If there is no featured card, do nothing if (!featuredCard) { From 408835e730d2bb3f57f251762b0e32695645c957 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 14:36:24 +0200 Subject: [PATCH 121/248] removed unnecessary forEach loop for improved performance --- _src/blocks/products/products.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 420a69921..794b82312 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -54,7 +54,7 @@ function renderPlanSelector(plans, defaultSelection) { `${label}`, ); li.addEventListener('click', () => { - root.querySelectorAll('.active').forEach((option) => option.classList.remove('active')); + root.querySelector('.active')?.classList.remove('active'); li.classList.add('active'); }); // set the default selection @@ -387,7 +387,7 @@ export default function decorate(block) { } }); - // Height matching and Dynamic texts logic and Dynamic texts + // Height matching and Dynamic texts logic const cards = block.querySelectorAll('.product-card'); const featuredCard = block.querySelector('.product-card.featured'); cards.forEach((card, cardIndex) => { From 909bd2913fa84958565e14a7e8f4b1a48ad1fe7a Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 16:27:42 +0200 Subject: [PATCH 122/248] completed the missing bundle ids --- _src/scripts/libs/constants.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 7843acb93..92119235f 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -36,14 +36,14 @@ export const Constants = { dip: "com.bitdefender.dataprivacy", dipm: "com.bitdefender.dataprivacy", avpm: 'com.bitdefender.cl.avplus.v2', - ultsec: "", - ultsecplus: "", - ultsecm: "", - ultsecplusm: "", - idthefts: "", - idtheftp: "", - idtheftsm: "", - idtheftpm: "", + ultsec: "com.bitdefender.ultimatesecurityus", + ultsecplus: "com.bitdefender.ultimatesecurityplusus", + ultsecm: "com.bitdefender.ultimatesecurityus", + ultsecplusm: "com.bitdefender.ultimatesecurityplusus", + idthefts: "com.bitdefender.idtheftstandard", + idtheftp: "com.bitdefender.idtheftpremium", + idtheftsm: "com.bitdefender.idtheftstandard", + idtheftpm: "com.bitdefender.idtheftpremium", // DLP ts_i: 'com.bitdefender.tsmd.v2', ts_f: 'com.bitdefender.tsmd.v2', @@ -87,14 +87,14 @@ export const Constants = { dip: "com.bitdefender.dataprivacy", dipm: "com.bitdefender.dataprivacy", avpm: 'com.bitdefender.cl.avplus.v2', - ultsec: "", - ultsecplus: "", - ultsecm: "", - ultsecplusm: "", - idthefts: "", - idtheftp: "", - idtheftsm: "", - idtheftpm: "", + ultsec: "com.bitdefender.ultimatesecurityus", + ultsecplus: "com.bitdefender.ultimatesecurityplusus", + ultsecm: "com.bitdefender.ultimatesecurityus", + ultsecplusm: "com.bitdefender.ultimatesecurityplusus", + idthefts: "com.bitdefender.idtheftstandard", + idtheftp: "com.bitdefender.idtheftpremium", + idtheftsm: "com.bitdefender.idtheftstandard", + idtheftpm: "com.bitdefender.idtheftpremium", // DLP ts_i: 'com.bitdefender.tsmd.v2', ts_f: 'com.bitdefender.tsmd.v2', From 93fcd961c637a78a7debcb075cf466e6d4e728ef Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 16:33:23 +0200 Subject: [PATCH 123/248] added missing bundle ids --- _src/scripts/libs/constants.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 133a16799..42907ded8 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -36,14 +36,14 @@ export const Constants = { dip: "com.bitdefender.dataprivacy", dipm: "com.bitdefender.dataprivacy", avpm: 'com.bitdefender.cl.avplus.v2', - ultsec: "", - ultsecplus: "", - ultsecm: "", - ultsecplusm: "", - idthefts: "", - idtheftp: "", - idtheftsm: "", - idtheftpm: "", + ultsec: "com.bitdefender.ultimatesecurityus", + ultsecplus: "com.bitdefender.ultimatesecurityplusus", + ultsecm: "com.bitdefender.ultimatesecurityus", + ultsecplusm: "com.bitdefender.ultimatesecurityplusus", + idthefts: "com.bitdefender.idtheftstandard", + idtheftp: "com.bitdefender.idtheftpremium", + idtheftsm: "com.bitdefender.idtheftstandard", + idtheftpm: "com.bitdefender.idtheftpremium", // DLP ts_i: 'com.bitdefender.tsmd.v2', ts_f: 'com.bitdefender.tsmd.v2', From 2b0832f1371a18fe2b967db4aec02561d0a4152c Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 17:05:47 +0200 Subject: [PATCH 124/248] changed Vlaicu mappings --- _src/scripts/libs/constants.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 92119235f..2f958c96c 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -1,3 +1,5 @@ +import Page from "./page" + export const Constants = { DEV_BASE_URL: ['localhost', 'stage', '.hlx.'].some((domain) => window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : '', @@ -67,7 +69,7 @@ export const Constants = { av: "com.bitdefender.cl.av", is: "com.bitdefender.cl.is", tsmd: "com.bitdefender.cl.tsmd", - fp: "com.bitdefender.cl.fp", + fp: ['nl-nl', 'nl-be'].includes(Page.locale) ? "com.bitdefender.fp" : "com.bitdefender.cl.fp", ps: "com.bitdefender.premiumsecurity", psm: "com.bitdefender.premiumsecurity", psp: "com.bitdefender.premiumsecurityplus", From 7df577f306f57bc5abbc8704be8f363eaed7d48e Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 5 Dec 2024 17:11:21 +0200 Subject: [PATCH 125/248] added .js to import --- _src/scripts/libs/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 2f958c96c..3e8e22a67 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -1,4 +1,4 @@ -import Page from "./page" +import Page from "./page.js" export const Constants = { DEV_BASE_URL: ['localhost', 'stage', '.hlx.'].some((domain) => From d217715939a043f6716d846a8d8f9ba2615c4aac Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 17:23:25 +0200 Subject: [PATCH 126/248] fixed repeating arrow pattern and inconsistent size --- _src/styles/styles.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 72c235225..80086ecfd 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1006,11 +1006,11 @@ p.info-button-container a.info-button.modal:hover { a.button::after, input[type="submit"]::after, main .section.link-right a::after { content: ''; - width: 24px; - height: 24px; + min-width: 24px; + min-height: 24px; /* stylelint-disable-next-line property-no-vendor-prefix */ - -webkit-mask:url('/_src/icons/arrow-right.svg'); - mask: url('/_src/icons/arrow-right.svg'); + -webkit-mask:url('/_src/icons/arrow-right.svg') no-repeat; + mask: url('/_src/icons/arrow-right.svg') no-repeat; background-color: var(--button-link-color); display: inline-block; transition: all .2s cubic-bezier(.4,0,.2,1); From d13a63fecbe3934f57b9ad7cd23125b042d70c9f Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 17:31:23 +0200 Subject: [PATCH 127/248] Update CSS styles across multiple components for improved layout and responsiveness; increase max-width to 1330px and adjust padding --- _src/blocks/blog-news/blog-news.css | 13 +--- _src/blocks/columns/columns.css | 62 +++++++------------ _src/blocks/link-checker/link-checker.css | 2 + .../particle-background.css | 15 +---- .../questions-answers/questions-answers.css | 2 +- 5 files changed, 30 insertions(+), 64 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index 2e8339a64..7f1e85363 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -1,7 +1,7 @@ .blog-news { - max-width: 1200px; + max-width: 1330px; margin: 0 auto; - padding: 20px; + padding: 0 20px; } .blog-news h2 { @@ -57,18 +57,9 @@ } @media (min-width: 1440px){ - .blog-news{ - padding: 0; - } .blog-news .blog-grid{ grid-template-columns: repeat(3, 1fr) } } -@media(min-width: 1600px){ - .blog-news{ - max-width: 1320px; - } -} - diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 801b84f49..529b7847b 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1358,9 +1358,16 @@ main .section.two-columns .right-col .products.plans a.button:any-link { } .columns-container.multi-blocks{ - .columns-wrapper{ - padding: 20px; - min-width: 99%; + max-width: 1330px; + padding: 0 var(--section-desktop-padding); + margin: 0 auto; + display: flex; + flex-direction: column; + gap: 30px; + + .columns-wrapper { + padding: 0; + margin: 0; } .columns{ @@ -1368,7 +1375,7 @@ main .section.two-columns .right-col .products.plans a.button:any-link { background: #F6F6F6 0% 0% no-repeat padding-box; border-radius: 20px; opacity: 1; - padding:20px; + padding: 20px; } .columns > div > .columns-img-col img { @@ -1434,53 +1441,28 @@ main .section.two-columns .right-col .products.plans a.button:any-link { margin-bottom: 0; } - @media (min-width:767px) { - display: grid; - grid-auto-flow: column; - justify-content: center; - - div{ - height: 100%; - gap: 20px; - align-content: flex-start; - } - - .columns{ - max-width: 500px; - } - - .columns > div > div { - flex: unset; - align-content: center; - } - } + @media (min-width: 991px) { + max-width: 1330px; + padding: 0 var(--section-desktop-padding); + margin: 0 auto; + display: flex; + flex-direction: row; + gap: 30px; - @media (min-width: 1200px){ .columns{ - min-width: 560px; - } - - .columns > div >div{ - width: 50%; + max-width: 630px; } .columns > div > .columns-img-col img { - position: static; object-fit: cover; display: block; border-radius: 20px; } } - @media(min-width:1400px){ - .columns{ - min-width: 640px; - } - } - - @media(min-width:1600px){ - .columns{ - min-width: 650px; + @media (min-width: 1200px){ + .columns > div >div{ + width: 50%; } } } diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 6807af704..ab5c8f90d 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -378,6 +378,8 @@ main .section.link-checker-container { padding-bottom: 50px; .link-checker{ + padding: 48px 60px 35px; + .input-container{ flex-direction: unset; } diff --git a/_src/blocks/particle-background/particle-background.css b/_src/blocks/particle-background/particle-background.css index c83edcfc4..64a6ece6a 100644 --- a/_src/blocks/particle-background/particle-background.css +++ b/_src/blocks/particle-background/particle-background.css @@ -18,7 +18,7 @@ .we-container { margin: 0 auto; padding: 0 20px; - max-width: 1290px; + max-width: 1330px; position: relative; } @@ -54,18 +54,9 @@ } } -@media (min-width: 991px) { /* mobile/tablet */ - .particle-background-container.we-container { - max-width: 1300px; - padding-left: 50px; - padding-right: 50px; - } -} - @media (min-width: 1200px) { .particle-background-container.we-container { - max-width: 1290px; - padding-left: 20px; - padding-right: 20px; + max-width: 1330px; + padding: 0 20px; } } diff --git a/_src/blocks/questions-answers/questions-answers.css b/_src/blocks/questions-answers/questions-answers.css index f567dcfb0..6a7256a78 100644 --- a/_src/blocks/questions-answers/questions-answers.css +++ b/_src/blocks/questions-answers/questions-answers.css @@ -4,7 +4,7 @@ @media (min-width: 992px) { /* desktop */ .questions-answers-wrapper { - max-width: var(--section-desktop-max-width); + max-width: 1330px; padding: 0 var(--section-desktop-padding); margin: 0 auto; } From 07235bdb2d1ec0c2dbaded7000a791ba1cbe67b1 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 17:38:05 +0200 Subject: [PATCH 128/248] Enhance height matching functionality by including direct child columns in the matchHeights call --- _src/blocks/columns/columns.js | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/columns/columns.js b/_src/blocks/columns/columns.js index b2d557b79..1b5ebd37e 100644 --- a/_src/blocks/columns/columns.js +++ b/_src/blocks/columns/columns.js @@ -186,6 +186,7 @@ export default function decorate(block, options) { matchHeights(block.closest('.section'), '.columns'); matchHeights(block.closest('.section'), 'table'); matchHeights(block.closest('.section'), 'p:nth-last-of-type(2)'); + matchHeights(block.closest('.section'), '.columns > div'); } if (block.classList.contains('awards-fragment')) { matchHeights(block, 'p:last-of-type'); From a4f3bf9f425184a595193aa8de03745652b89350 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 17:50:52 +0200 Subject: [PATCH 129/248] Add height property to span elements in columns.css for consistent layout --- _src/blocks/columns/columns.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 529b7847b..05dee8714 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1406,6 +1406,7 @@ main .section.two-columns .right-col .products.plans a.button:any-link { span{ margin: 0; + height: 50px; } h3{ From ebeb4382e03b8f792d62e3fc4178ba6ad883d9a4 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 17:52:41 +0200 Subject: [PATCH 130/248] Update height matching functionality to target

tags in blog-news component --- _src/blocks/blog-news/blog-news.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/blog-news/blog-news.js b/_src/blocks/blog-news/blog-news.js index f95420642..9c3a0f277 100644 --- a/_src/blocks/blog-news/blog-news.js +++ b/_src/blocks/blog-news/blog-news.js @@ -46,5 +46,5 @@ export default function decorate(block) { block.appendChild(blogGrid); blogGrid.classList.add('blog-grid'); renderBlogGrid(block, endpoint, articlesNumber); - matchHeights(block, 'h3'); + matchHeights(block, 'p'); } From 2fbc10eda7aafc23a1fd8410e2996baf3a189753 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 17:56:18 +0200 Subject: [PATCH 131/248] Enhance blog-news component styles by resetting margin and adding flex layout for blog card content --- _src/blocks/blog-news/blog-news.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index 7f1e85363..21d54dfde 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -38,6 +38,7 @@ margin-bottom: 24px; font-weight: bold; color: #000000; + margin: 0; } .blog-news .blog-card a { @@ -50,6 +51,12 @@ text-decoration: underline; } +.blog-news .blog-card .blog-card-content { + display: flex; + flex-direction: column; + gap: 24px; +} + @media (min-width:767px){ .blog-news .blog-card{ text-align: left; From fee6d11d293e36f32fe18a3803b962f75d7008c5 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 17:59:56 +0200 Subject: [PATCH 132/248] Remove fixed height from span elements and align text columns to flex-start for improved layout --- _src/blocks/columns/columns.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 05dee8714..94f35d037 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1406,7 +1406,6 @@ main .section.two-columns .right-col .products.plans a.button:any-link { span{ margin: 0; - height: 50px; } h3{ @@ -1459,6 +1458,10 @@ main .section.two-columns .right-col .products.plans a.button:any-link { display: block; border-radius: 20px; } + + .columns > div > .columns-text-col { + align-self: flex-start; + } } @media (min-width: 1200px){ From 0957b89030ecc1142926157884bcfa87102f45b6 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 5 Dec 2024 18:03:45 +0200 Subject: [PATCH 133/248] Adjust desktop max width for sections to improve layout consistency --- _src/styles/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/styles/styles.css b/_src/styles/styles.css index c56a3983f..f2cd54d6c 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -90,7 +90,7 @@ /* body width */ --body-max-width: 1920px; --body-padding: 20px; - --section-desktop-max-width: 1300px; + --section-desktop-max-width: 1290px; --section-desktop-padding: 20px; --section-large-desktop-max-width: 1332px; --section-large-desktop-padding: 50px; From 0051612feb084e17da73f9404894d93e9ae40df1 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 18:12:14 +0200 Subject: [PATCH 134/248] added checked attribute to selector for default selection --- _src/blocks/products/products.js | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 794b82312..1d859ebd2 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -56,6 +56,7 @@ function renderPlanSelector(plans, defaultSelection) { li.addEventListener('click', () => { root.querySelector('.active')?.classList.remove('active'); li.classList.add('active'); + li.checked = true; }); // set the default selection if (defaultSelection === label) { From b9118f6e8efb912f8fd2594f8a62bc3928b06936 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 5 Dec 2024 18:31:35 +0200 Subject: [PATCH 135/248] remove checked value at active button change --- _src/blocks/products/products.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 1d859ebd2..6f50ed528 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -53,15 +53,22 @@ function renderPlanSelector(plans, defaultSelection) { liStoreParameters, `${label}`, ); + + // set the default selection + if (defaultSelection === label) { + li.classList.add('active'); + li.checked = true; + } + li.addEventListener('click', () => { - root.querySelector('.active')?.classList.remove('active'); + const previousButtonActive = root.querySelector('.active'); + if (previousButtonActive) { + previousButtonActive.classList.remove('active'); + previousButtonActive.checked = false; + } li.classList.add('active'); li.checked = true; }); - // set the default selection - if (defaultSelection === label) { - li.click(); - } ul.appendChild(li); } @@ -404,6 +411,9 @@ export default function decorate(block) { const dynamicPriceTexts = [...metadata[dynamicPriceTextsKey].split(',')]; const priceConditionEl = card.querySelector('.price.condition em'); planSelector?.querySelectorAll('li')?.forEach((option, idx) => { + if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { + priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found + } option.addEventListener('click', () => { if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found From dbe2426692240698442a1ce296d0e14b9b88e741 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 11:38:18 +0200 Subject: [PATCH 136/248] Refactor blog-card styles to improve layout and maintain consistency --- _src/blocks/blog-news/blog-news.css | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index 21d54dfde..551963dd8 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -26,8 +26,6 @@ } .blog-news .blog-card img { - width: 420px; - height: 308px; object-fit: cover; background-color: #FFD6D6; border-radius: 20px; @@ -57,10 +55,8 @@ gap: 24px; } -@media (min-width:767px){ - .blog-news .blog-card{ - text-align: left; - } +.blog-news .blog-card .blog-card-content { + text-align: left; } @media (min-width: 1440px){ @@ -68,5 +64,13 @@ grid-template-columns: repeat(3, 1fr) } + .blog-news .blog-card img { + width: 420px; + height: 308px; + object-fit: cover; + background-color: #FFD6D6; + border-radius: 20px; + } + } From 04d448705049faa2cb0370fef852ea243d3f5d36 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 14:36:39 +0200 Subject: [PATCH 137/248] Update link-checker styles and structure for improved layout and accessibility --- _src/blocks/link-checker/link-checker.css | 15 +++++++++------ _src/blocks/link-checker/link-checker.js | 8 +++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index ab5c8f90d..e66ffe628 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -36,7 +36,7 @@ main .section.link-checker-container { .link-checker input[type="text"], .link-checker #inputDiv { max-width: 100%; - border: 2px solid #D82E21; + border: 2px dashed #D82E21; padding-right: 15px; pointer-events: none; } @@ -47,6 +47,7 @@ main .section.link-checker-container { .link-checker #inputDiv { display: block; + margin-bottom: 24px; } .link-checker .danger-image { @@ -66,7 +67,7 @@ main .section.link-checker-container { display: flex; } - .link-checker > div:nth-child(3) { + .link-checker .privacy-policy { display: none; } @@ -92,7 +93,7 @@ main .section.link-checker-container { .link-checker input[type="text"], .link-checker #inputDiv { max-width: 100%; - border: 2px solid #3D8648; + border: 2px dashed #3D8648; padding-right: 15px; pointer-events: none; } @@ -103,6 +104,8 @@ main .section.link-checker-container { .link-checker #inputDiv { display: block; + margin-bottom: 24px; + } .link-checker .safe-image { @@ -117,7 +120,7 @@ main .section.link-checker-container { display: flex; } - .link-checker > div:nth-child(3) { + .link-checker .privacy-policy { display: none; } @@ -368,7 +371,7 @@ main .section.link-checker-container { } } - > div:nth-child(3) { + .privacy-policy { margin-top: 20px; font-size: 12px; } @@ -417,7 +420,7 @@ main .section.link-checker-container { padding-bottom: 30px; } - > div:nth-child(3) { + .privacy-policy { font-size: 14px; } } diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 3f7d4e10b..6131ae08d 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -189,6 +189,9 @@ function copyToClipboard(block, caller, popupText) { export default function decorate(block) { const { clipboardText } = block.closest('.section').dataset; + const privacyPolicyDiv = block.querySelector(':scope > div:nth-child(3)'); + privacyPolicyDiv.classList.add('privacy-policy'); + const formContainer = document.createElement('div'); formContainer.classList.add('link-checker-form'); @@ -204,13 +207,13 @@ export default function decorate(block) { const copyElement = document.createElement('span'); copyElement.id = 'copy-to-clipboard'; - const inputDiv = document.createElement('div'); + const inputDiv = document.createElement('p'); inputDiv.setAttribute('id', 'inputDiv'); const divContainer = document.createElement('div'); divContainer.className = 'input-container__container'; divContainer.appendChild(input); - divContainer.appendChild(inputDiv); + block.prepend(inputDiv); divContainer.appendChild(copyElement); inputContainer.appendChild(divContainer); @@ -249,7 +252,6 @@ export default function decorate(block) { formContainer.appendChild(buttonsContainer); block.querySelectorAll(':scope > div')[1].replaceWith(formContainer); - const [safeImage, dangerImage] = block.querySelectorAll('picture'); safeImage.classList.add('safe-image'); dangerImage.classList.add('danger-image'); From 6182f9be352c31cd61edc754c200549a6c3c4eee Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 14:41:31 +0200 Subject: [PATCH 138/248] Center align text in link-checker input div for improved layout --- _src/blocks/link-checker/link-checker.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index e66ffe628..e6a469848 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -48,6 +48,7 @@ main .section.link-checker-container { .link-checker #inputDiv { display: block; margin-bottom: 24px; + text-align: center; } .link-checker .danger-image { @@ -105,7 +106,7 @@ main .section.link-checker-container { .link-checker #inputDiv { display: block; margin-bottom: 24px; - + text-align: center; } .link-checker .safe-image { From fe880648398f83bc20ed1406fd0e2b35a0a60d1e Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 14:55:46 +0200 Subject: [PATCH 139/248] Clear error message when input is emptied in link-checker --- _src/blocks/link-checker/link-checker.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 6131ae08d..a337ccde3 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -262,4 +262,14 @@ export default function decorate(block) { e.preventDefault(); copyToClipboard(block, shareButton, clipboardText); }); + + // if the text is cleared, do not display any error + input.addEventListener('input', () => { + const url = input.value.trim(); + // If the input is cleared, reset the result text and class + if (url === '') { + result.textContent = ''; + result.className = ''; + } + }); } From 2f3208b47dd69ff40dcb55c07b6888f6eef135b1 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 15:02:33 +0200 Subject: [PATCH 140/248] Clear link-checker result on paste event for better user experience --- _src/blocks/link-checker/link-checker.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index a337ccde3..5a7201589 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -272,4 +272,8 @@ export default function decorate(block) { result.className = ''; } }); + input.addEventListener('paste', () => { + result.textContent = ''; + result.className = ''; + }); } From a63c5714728dbd81591611e55e5c3dfd6ddc1705 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 15:05:16 +0200 Subject: [PATCH 141/248] Remove top margin from link-checker result for improved layout --- _src/blocks/link-checker/link-checker.css | 1 - 1 file changed, 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index e6a469848..159a2e6be 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -313,7 +313,6 @@ main .section.link-checker-container { } .result { - margin-top: 20px; font-size: 14px; border-radius: 8px; padding-bottom: 20px; From 80defada1b10c33491f9eb4b484ce9791195d21c Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 15:15:41 +0200 Subject: [PATCH 142/248] Remove top margin from link-checker result for improved layout --- _src/blocks/link-checker/link-checker.css | 1 - 1 file changed, 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 159a2e6be..47786579f 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -414,7 +414,6 @@ main .section.link-checker-container { } .result { - margin-top: 20px; font-size: 16px; border-radius: 8px; padding-bottom: 30px; From 80fa056d440552c2bc362397b052f1af1b541ec4 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 16:04:53 +0200 Subject: [PATCH 143/248] Adjust margin for danger result in link-checker for improved layout --- _src/blocks/link-checker/link-checker.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index 47786579f..e4fa446a7 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -75,6 +75,9 @@ main .section.link-checker-container { #copy-to-clipboard { display: none; } + .link-checker .result.danger { + margin-top: 0; + } } &.safe { @@ -337,6 +340,7 @@ main .section.link-checker-container { } } .result.danger { + margin-top: 24px; background-color: #FDF3F4; padding: 8px 30px 8px 55px; position: relative; From 2f94320be86262c662c2f414e81a09e2e53871c5 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Fri, 6 Dec 2024 16:14:58 +0200 Subject: [PATCH 144/248] Update safe link message to include security software recommendation for better user guidance --- _src/blocks/link-checker/link-checker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 5a7201589..423b23b84 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -24,7 +24,7 @@ class StatusMessageFactory { const messages = { 1: { text: 'The link is safe with no signs of harmful activity. You can go ahead and keep staying cautious online.', className: 'result safe', status: 'safe' }, - 2: { text: 'We haven\'t seen any suspicious activity from this link.', className: 'result safe', status: 'so_far_so_good_1' }, + 2: { text: 'We haven\'t found any suspicious activity with this link. However, to stay safe going forward, make sure to use reliable security software and scan your system regularly.', className: 'result safe', status: 'so_far_so_good_1' }, 3: { text: `This link looks safe, but the domain '${urlObject.hostname}' has been connected to harmful links in the past. To stay protected, check any other links from this domain using our tool and keep your security software updated.`, className: 'result safe', status: 'so_far_so_good_2' }, 4: { text: 'This link is dangerous and can compromise your personal information or harm your device. Do not click it, and ensure your security software is up-to-date to stay protected from threats.', className: 'result danger', status: 'malware & phishing' }, 5: { text: 'This link is known to distribute malware. Accessing it may harm your device, steal your data, or allow unauthorized access. Stay away from the site and ensure your security software is active.', className: 'result danger', status: 'malware' }, From 245a0b203f5892acaca5fe079320967d9735b4ec Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 9 Dec 2024 10:54:59 +0200 Subject: [PATCH 145/248] Refactor CSS styles for blog news and link checker components for improved layout and consistency --- _src/blocks/blog-news/blog-news.css | 7 ++--- _src/blocks/four-cards/four-cards.css | 18 +++++++------ _src/blocks/link-checker/link-checker.css | 32 +++++++++++++++-------- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/_src/blocks/blog-news/blog-news.css b/_src/blocks/blog-news/blog-news.css index 551963dd8..e8863be30 100644 --- a/_src/blocks/blog-news/blog-news.css +++ b/_src/blocks/blog-news/blog-news.css @@ -33,10 +33,10 @@ .blog-news .blog-card p { font-size: 1.2rem; + margin: 0; margin-bottom: 24px; font-weight: bold; - color: #000000; - margin: 0; + color: #000; } .blog-news .blog-card a { @@ -53,9 +53,6 @@ display: flex; flex-direction: column; gap: 24px; -} - -.blog-news .blog-card .blog-card-content { text-align: left; } diff --git a/_src/blocks/four-cards/four-cards.css b/_src/blocks/four-cards/four-cards.css index b8e034dfe..afdfd288b 100644 --- a/_src/blocks/four-cards/four-cards.css +++ b/_src/blocks/four-cards/four-cards.css @@ -258,7 +258,8 @@ ul { li:not(:first-child) { position: relative; - &:before { + + &::before { content: ""; display: block; width: 1px; @@ -292,7 +293,7 @@ .four-cards-container.dotted-lines { ul { li:not(:first-child) { - &:before { + &::before { display: none; } } @@ -312,15 +313,12 @@ grid-gap: 14px; } - .four-cards-container.dotted-lines .four-cards > ul { - grid-gap: 30px; - } - .four-cards-container.dotted-lines { ul { li:not(:first-child) { position: relative; - &:before { + + &::before { content: ""; display: block; width: 30px; @@ -335,11 +333,15 @@ } } } - + .creator-cards .four-cards > ul { grid-template-columns: 300px 300px 300px; grid-gap: 14px; } + + .four-cards-container.dotted-lines .four-cards > ul { + grid-gap: 30px; + } } @media (min-width: 1200px) { diff --git a/_src/blocks/link-checker/link-checker.css b/_src/blocks/link-checker/link-checker.css index e4fa446a7..8e5ab526f 100644 --- a/_src/blocks/link-checker/link-checker.css +++ b/_src/blocks/link-checker/link-checker.css @@ -1,4 +1,5 @@ +/* stylelint-disable */ main .section.link-checker-container { padding: 20px; background-color: #fff; @@ -8,7 +9,7 @@ main .section.link-checker-container { display: flex; justify-content: center; overflow: visible; - font-family: 'IBM Plex Sans', 'Roboto', sans-serif; + font-family: 'IBM Plex Sans', Roboto, sans-serif; &::before { content: ' '; @@ -24,7 +25,6 @@ main .section.link-checker-container { } &.danger { - &::before { background-color: #3e030b; background-image: url("../../icons/link-checker-pattern-red.svg"); @@ -75,13 +75,13 @@ main .section.link-checker-container { #copy-to-clipboard { display: none; } + .link-checker .result.danger { margin-top: 0; } } &.safe { - &::before { background-color: #3d8648; background-image: url("../../icons/link-checker-pattern-green.svg"); @@ -150,7 +150,7 @@ main .section.link-checker-container { border-radius: 20px; padding: 20px; text-align: center; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + box-shadow: 0 4px 8px rgb(0 0 0 / 10%); position: relative; h1 { @@ -168,6 +168,7 @@ main .section.link-checker-container { .safe-image { display: none; + img { max-width: 196px; } @@ -175,6 +176,7 @@ main .section.link-checker-container { .danger-image { display: none; + img { max-width: 196px; } @@ -219,7 +221,7 @@ main .section.link-checker-container { #copy-to-clipboard { width: 16px; height: 21px; - background: url(../../icons/link-checker-example.svg) no-repeat; + background: url("../../icons/link-checker-example.svg") no-repeat; background-size: contain; position: absolute; top: 15px; @@ -245,6 +247,7 @@ main .section.link-checker-container { font-weight: bold; font-size: 1em; } + button.check-url:hover { background-color: #0056b3; } @@ -268,13 +271,15 @@ main .section.link-checker-container { border-radius: 8px; } } - button.share-button:before { + + button.share-button::before { content: url("../../icons/share.svg"); height: 20px; width: 20px; display: inline-block; } - button.check-another-button:before { + + button.check-another-button::before { content: url("../../icons/check.svg"); height: 20px; width: 20px; @@ -291,7 +296,7 @@ main .section.link-checker-container { border-radius: 5px; font-size: 14px; font-weight: bold; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2); + box-shadow: 0 4px 6px rgb(0 0 0 / 20%); z-index: 10; transition: opacity 0.3s ease-in-out; pointer-events: none; @@ -309,6 +314,7 @@ main .section.link-checker-container { border-right: 6px solid transparent; border-top: 6px solid #000; } + .button-container .share-button:hover + .share-popup, .button-container .share-button:focus + .share-popup { opacity: 1; @@ -321,6 +327,7 @@ main .section.link-checker-container { padding-bottom: 20px; display: none; } + .result.safe { background-color: #F3FEF8; padding: 8px 30px 8px 55px; @@ -330,7 +337,7 @@ main .section.link-checker-container { &::before { content: ""; - background: url(../../icons/safe.svg) no-repeat; + background: url("../../icons/safe.svg") no-repeat; position: absolute; left: 14px; top: 15%; @@ -339,6 +346,7 @@ main .section.link-checker-container { background-size: contain; } } + .result.danger { margin-top: 24px; background-color: #FDF3F4; @@ -358,6 +366,7 @@ main .section.link-checker-container { background-size: contain; } } + .result.danger.no-response { text-align: left; font-size: 14px; @@ -365,7 +374,7 @@ main .section.link-checker-container { &::before { content: ""; - background: url(../../icons/no-response.svg) no-repeat; + background: url("../../icons/no-response.svg") no-repeat; position: absolute; left: 15px; top: 20%; @@ -380,6 +389,7 @@ main .section.link-checker-container { font-size: 12px; } } + @media (min-width:768px) { margin: 0 auto; padding-bottom: 50px; @@ -390,6 +400,7 @@ main .section.link-checker-container { .input-container{ flex-direction: unset; } + .buttons-container{ flex-flow: row; margin-top: 50px; @@ -430,7 +441,6 @@ main .section.link-checker-container { } @media (min-width: 991px) { - .link-checker { padding: 48px 160px 35px; } From 613642561f2e8edabdb67639a7c3fe3b5746627d Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 9 Dec 2024 10:57:14 +0200 Subject: [PATCH 146/248] Change to prod route --- _src/blocks/link-checker/link-checker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 423b23b84..3e54c0f70 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -83,7 +83,7 @@ async function checkLink(block, input, result) { } input.closest('.input-container').classList.add('loader-circle'); - let response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { + let response = await fetch('https://eu.nimbus.bitdefender.net/tools/link-checker', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -95,7 +95,7 @@ async function checkLink(block, input, result) { if (response.status === 401) { const challengeData = await response.json(); const solvedChallenge = await BotPrevention.solveChallange(challengeData); - response = await fetch('https://beta.nimbus.bitdefender.net/tools/link-checker', { + response = await fetch('https://eu.nimbus.bitdefender.net/tools/link-checker', { method: 'POST', headers: { 'Content-Type': 'application/json', From 3e333216147f47a0fdd30d9fbf1b1dbc52579230 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 9 Dec 2024 11:57:05 +0200 Subject: [PATCH 147/248] added price functionality to price condition nanoblock --- _src/blocks/products/products.css | 2 +- _src/blocks/products/products.js | 3 ++- _src/styles/styles.css | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/_src/blocks/products/products.css b/_src/blocks/products/products.css index e7e5367d6..7a29cdb77 100644 --- a/_src/blocks/products/products.css +++ b/_src/blocks/products/products.css @@ -56,7 +56,7 @@ .product-card .price em { color: black; font-size: var(--body-font-size-xxs); - display: block; + display: inline-block; font-style: normal; line-height: 1.4em; font-weight: bold; diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 6f50ed528..a9e31d17d 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -277,12 +277,13 @@ function renderLowestPrice(...params) { * @returns Root node of the nanoblock */ function renderPriceCondition(text) { + const updatedText = text.replace('BilledPrice', ''); return createTag( 'div', { class: 'price condition', }, - `${text}`, + `${updatedText}`, ); } diff --git a/_src/styles/styles.css b/_src/styles/styles.css index d8d667bb1..2d872fa15 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1079,7 +1079,7 @@ a.button.modal, a.button.central, main .section.link-right a { border: none; margin: 0; padding: 0; - white-space: nowrap; + white-space: normal; overflow: hidden; text-overflow: ellipsis; } From 06a57d33b63c9e250e13ffcbcecdf0e613fe6992 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 9 Dec 2024 13:07:39 +0200 Subject: [PATCH 148/248] Refactor URL validation regex in link-checker for improved accuracy --- _src/blocks/link-checker/link-checker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 3e54c0f70..308edddd7 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -68,8 +68,8 @@ const isValidUrl = (urlString) => { const urlPattern = new RegExp('^(https?:\\/\\/)?' // validate protocol + '((([a-z\\d]([a-z\\d-_]*[a-z\\d])*)\\.)+[a-z]{2,}|' // validate domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' // validate OR ip (v4) address - + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' // validate port and path - + '(\\?[;&a-z\\d%\\/_.~+=-]*)?' // validate query string + + '(\\:\\d+)?(\\/[-a-z\\d%_.~+@]*)*' // validate port and path + + '(\\?[;&a-z\\d%\\/_@.~+=-]*)?' // validate query string + '(\\#[-a-z\\d_]*)?$', 'i'); // validate fragment locator return urlPattern.test(urlString); }; From 6db28f4ca68e3dbfad63dcfbd1ccf877ab48c5e4 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 9 Dec 2024 13:45:35 +0200 Subject: [PATCH 149/248] added functionality for prices inside dynamic text --- _src/blocks/products/products.js | 34 ++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index a9e31d17d..67d4c12ac 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -412,14 +412,36 @@ export default function decorate(block) { const dynamicPriceTexts = [...metadata[dynamicPriceTextsKey].split(',')]; const priceConditionEl = card.querySelector('.price.condition em'); planSelector?.querySelectorAll('li')?.forEach((option, idx) => { - if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { - priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found - } - option.addEventListener('click', () => { + if (dynamicPriceTexts.some((text) => text.includes('{BilledPrice}'))) { + option.addEventListener('click', () => { + if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { + const textTemplate = dynamicPriceTexts[idx] || ''; + const [before, after] = textTemplate.split('{BilledPrice}'); + + if (priceConditionEl) { + const nodesToRemove = Array.from(priceConditionEl.childNodes).filter( + (node) => node.nodeType === Node.TEXT_NODE, + ); + + // Clear only non- text nodes so that the priceEl is untouched + nodesToRemove.forEach((node) => priceConditionEl.removeChild(node)); + + // eslint-disable-next-line max-len + if (before) priceConditionEl.insertBefore(document.createTextNode(before), priceConditionEl.firstChild); + if (after) priceConditionEl.appendChild(document.createTextNode(after)); + } + } + }); + } else { if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { - priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; // Fallback to empty if text not found + priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; } - }); + option.addEventListener('click', () => { + if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { + priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; + } + }); + } }); } if (!card.classList.contains('featured')) { From 4d345517e2748d1aadbee4ec1b93f3cdbff80d80 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 9 Dec 2024 14:10:49 +0200 Subject: [PATCH 150/248] added missing parameters to buy links --- _src/scripts/libs/constants.js | 4 +++- _src/scripts/libs/store/store.js | 20 +++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 42907ded8..a40b456fd 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -1,3 +1,5 @@ +import Page from "./page.js" + export const Constants = { DEV_BASE_URL: ['localhost', 'stage', '.hlx.'].some((domain) => window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : '', @@ -16,7 +18,7 @@ export const Constants = { av: "com.bitdefender.cl.av", is: "com.bitdefender.cl.is", tsmd: "com.bitdefender.cl.tsmd", - fp: "com.bitdefender.fp", + fp: ['nl-nl', 'nl-be'].includes(Page.locale) ? "com.bitdefender.fp" : "com.bitdefender.cl.fp", ps: "com.bitdefender.premiumsecurity", psm: "com.bitdefender.premiumsecurity", psp: "com.bitdefender.premiumsecurityplus", diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index b592bf012..4080c10ff 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -475,7 +475,10 @@ export class Product { } if (Store.config.provider === "vlaicu" && yearsOption.buyLink) { - option.buyLink = yearsOption.buyLink; + const buyLink = new URL(yearsOption.buyLink); + buyLink.searchParams.set("SHOPURL", `${window.location.origin}${window.location.pathname}`); + buyLink.searchParams.set("SRC", this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); + option.buyLink = buyLink.href; return option; } @@ -965,10 +968,14 @@ class Vlaicu { } static async getProductVariationsPrice(id, campaignId) { - const productInfo = (await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId))?.product; + const productInfoResponse = await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId); + const productInfo = productInfoResponse?.product; if (!productInfo) { return null; } + const isReceivedPromotionValid = productInfoResponse.campaign && + productInfoResponse.campaignType && + productInfoResponse.campaignType === "def"; let payload = productInfo?.options; if (!payload || !payload.length) { @@ -979,6 +986,7 @@ class Vlaicu { product_alias: id, product_id: Constants.PRODUCT_ID_MAPPINGS[id], product_name: productInfo.productName, + promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, variations: {} } @@ -1008,7 +1016,9 @@ class Vlaicu { currency_iso: productVariation.currency, product_id: Constants.PRODUCT_ID_MAPPINGS[id], platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], - promotion: campaignId, + promotion: isReceivedPromotionValid ? + productInfoResponse.campaign : + campaignId, price: productVariation.price, buyLink: productVariation.buyLink, variation: { @@ -1237,8 +1247,8 @@ export class Store { } return { - ...product, - ...productInfo + ...productInfo, + ...product } } catch (error) { return null; From 3623fd222523320c286e540a755aeec310bf62f8 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 9 Dec 2024 14:13:58 +0200 Subject: [PATCH 151/248] refactored dynamic texts function for better readability and fewer event listeners --- _src/blocks/products/products.js | 42 ++++++++++++-------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 67d4c12ac..598000f57 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -412,36 +412,24 @@ export default function decorate(block) { const dynamicPriceTexts = [...metadata[dynamicPriceTextsKey].split(',')]; const priceConditionEl = card.querySelector('.price.condition em'); planSelector?.querySelectorAll('li')?.forEach((option, idx) => { - if (dynamicPriceTexts.some((text) => text.includes('{BilledPrice}'))) { - option.addEventListener('click', () => { - if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { - const textTemplate = dynamicPriceTexts[idx] || ''; + option.addEventListener('click', () => { + if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { + const textTemplate = dynamicPriceTexts[idx] || ''; + if (textTemplate.includes('{BilledPrice}')) { const [before, after] = textTemplate.split('{BilledPrice}'); - - if (priceConditionEl) { - const nodesToRemove = Array.from(priceConditionEl.childNodes).filter( - (node) => node.nodeType === Node.TEXT_NODE, - ); - - // Clear only non- text nodes so that the priceEl is untouched - nodesToRemove.forEach((node) => priceConditionEl.removeChild(node)); - - // eslint-disable-next-line max-len - if (before) priceConditionEl.insertBefore(document.createTextNode(before), priceConditionEl.firstChild); - if (after) priceConditionEl.appendChild(document.createTextNode(after)); - } + const nodesToRemove = Array.from(priceConditionEl.childNodes).filter( + (node) => node.nodeType === Node.TEXT_NODE, + ); + // Clear only non- text nodes + nodesToRemove.forEach((node) => priceConditionEl.removeChild(node)); + // eslint-disable-next-line max-len + if (before) priceConditionEl.insertBefore(document.createTextNode(before), priceConditionEl.firstChild); + if (after) priceConditionEl.appendChild(document.createTextNode(after)); + } else { + priceConditionEl.textContent = textTemplate; } - }); - } else { - if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { - priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; } - option.addEventListener('click', () => { - if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { - priceConditionEl.textContent = dynamicPriceTexts[idx] || ''; - } - }); - } + }); }); } if (!card.classList.contains('featured')) { From 09092ca86f099e3c8e1f767c93ddbe0a3f6b2797 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 9 Dec 2024 15:48:48 +0200 Subject: [PATCH 152/248] modified modal button style to use global settings --- _src/styles/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 2d872fa15..3b271ec2f 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1079,7 +1079,6 @@ a.button.modal, a.button.central, main .section.link-right a { border: none; margin: 0; padding: 0; - white-space: normal; overflow: hidden; text-overflow: ellipsis; } From dbab39f49f689440d50aa6006d7ff95319dd4dbb Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 9 Dec 2024 16:00:47 +0200 Subject: [PATCH 153/248] added comments to explain store interaction --- _src/blocks/products/products.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 598000f57..9c3e3a4bf 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -415,12 +415,14 @@ export default function decorate(block) { option.addEventListener('click', () => { if (option.classList.contains('active') && priceConditionEl && dynamicPriceTexts) { const textTemplate = dynamicPriceTexts[idx] || ''; + // in order to preserve the store eventListeners we can't replace the priceElement + // every time another option is selected therefore we're using a string template if (textTemplate.includes('{BilledPrice}')) { const [before, after] = textTemplate.split('{BilledPrice}'); const nodesToRemove = Array.from(priceConditionEl.childNodes).filter( (node) => node.nodeType === Node.TEXT_NODE, ); - // Clear only non- text nodes + // Clear only non- text nodes (this element contains store events) nodesToRemove.forEach((node) => priceConditionEl.removeChild(node)); // eslint-disable-next-line max-len if (before) priceConditionEl.insertBefore(document.createTextNode(before), priceConditionEl.firstChild); From f404685e2aa936e1ffe64e2721246a0f8145c055 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 9 Dec 2024 17:35:23 +0200 Subject: [PATCH 154/248] commented out loadEager plugin execution with a note for future consideration --- _src/scripts/scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 169524e4e..24e7bf5df 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -341,7 +341,8 @@ async function loadEager(doc) { createMetadata('footer', `${getLocalizedResourceUrl('footer')}`); decorateTemplateAndTheme(); - await window.hlx.plugins.run('loadEager'); + // TODO: if experiments stop working correctly please consider bringing this back: + // await window.hlx.plugins.run('loadEager'); AdobeDataLayerService.push(await new PageLoadStartedEvent()); await resolveNonProductsDataLayer(); From 77911f6e31dd34c5c7b4bf2305fa3cff46337042 Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 9 Dec 2024 21:28:36 +0200 Subject: [PATCH 155/248] DEX-21186 - Adding Zuora products mapping into excell on sharepoint --- _src/scripts/libs/store/store.js | 75 ++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 23947dae3..21cd8b006 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -751,6 +751,55 @@ export class Product { } class BitCheckout { + static cachedZuoraConfig = null; + static async fetchZuoraConfig() { + // If cached data exists, return it directly + if (this.cachedZuoraConfig) { + return this.cachedZuoraConfig; + } + + const defaultJsonFilePath = '/zuoraconfig.json'; + const jsonFilePath = window.location.hostname === 'www.bitdefender.com' + ? `https://${window.location.hostname}/pages/zuoraconfig.json` + : defaultJsonFilePath; + + try { + const response = await fetch(jsonFilePath); + + if (!response.ok) { + console.error(`Failed to fetch data. Status: ${response.status}`); + return {}; + } + + const { data = [] } = await response.json(); + const zuoraConfigData = { + CAMPAIGN_NAME: data[0]?.CAMPAIGN_NAME || '', + CAMPAIGN_PRODS: {}, + CAMPAIGN_MONTHLY_PRODS: [], + }; + + // build zuoraConfigData + data.forEach((item) => { + if (item.ZUORA_PRODS) { + const [key, value] = item.ZUORA_PRODS.split(':').map((itm) => itm.trim()); + const clearKey = key.replace('*', ''); + zuoraConfigData.CAMPAIGN_PRODS[clearKey] = value; + + if (key.includes('*')) { + zuoraConfigData.CAMPAIGN_MONTHLY_PRODS.push(clearKey); + } + } + }); + + // Cache the fetched data + this.cachedZuoraConfig = zuoraConfigData; + + return zuoraConfigData; + } catch (error) { + console.error(`Error fetching Zuora config: ${error.message}`); + return {}; + } + } static monthlyProducts = ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m"] @@ -869,8 +918,14 @@ class BitCheckout { } } - static async getProductVariationsPrice(id, campaignId) { - let payload = (await this.getProductVariations(this.productId[id], campaignId))?.payload; + static async getProductVariationsPrice(id, fetchedData) { + const { + CAMPAIGN_MONTHLY_PRODS: monthlyProducts, + CAMPAIGN_NAME: campaign, + CAMPAIGN_PRODS: productId, + } = fetchedData; + + let payload = (await this.getProductVariations(productId[id], campaign))?.payload; if (!payload || payload.length === 0) { return null @@ -887,7 +942,7 @@ class BitCheckout { window.StoreProducts.product[id] = { product_alias: id, - product_id: this.productId[id], + product_id: productId[id], product_name: payload[0].name, variations: {} } @@ -914,11 +969,11 @@ class BitCheckout { billingPeriod = 10; } - if (this.monthlyProducts.indexOf(id) === -1 && billingPeriod === 0 || this.monthlyProducts.indexOf(id) !== -1 && billingPeriod !== 0) { + if (monthlyProducts.indexOf(id) === -1 && billingPeriod === 0 || monthlyProducts.indexOf(id) !== -1 && billingPeriod !== 0) { return; } - if (this.monthlyProducts.indexOf(id) !== -1) { + if (monthlyProducts.indexOf(id) !== -1) { billingPeriod = 1; } @@ -931,8 +986,8 @@ class BitCheckout { const devicesObj = { currency_iso: devices.currency, currency_label: "€", - product_id: this.productId[id], - platform_product_id: this.productId[id], + product_id: productId[id], + platform_product_id: productId[id], promotion: campaignId, region_id: 22, platform_id: 16, @@ -961,7 +1016,11 @@ class BitCheckout { static async loadProduct(id, campaign) { window.StoreProducts = window.StoreProducts || []; window.StoreProducts.product = window.StoreProducts.product || {} - return await this.getProductVariationsPrice(id, campaign); + + const fetchedData = await this.fetchZuoraConfig(); + if (campaign) fetchedData.CAMPAIGN_NAME = campaign; + + return await this.getProductVariationsPrice(id, fetchedData); } } From 69b48a2415ee2e3b7a632c7b94ac428f8c11263f Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 9 Dec 2024 21:41:15 +0200 Subject: [PATCH 156/248] DEX-21186 - Adding Zuora products mapping into excell on sharepoint --- _src/scripts/libs/store/store.js | 39 +++++++++++++++----------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 21cd8b006..9c43ef08c 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -23,7 +23,10 @@ export const monthlyProducts = { "us_pf_m": "us_pf_m", "us_pi_m": "us_pi_m", "us_pie_m": "us_pie_m", - "us_pfe_m": "us_pfe_m" + "us_pfe_m": "us_pfe_m", + "secpassm": "secpassm", + "vbsm": "vbsm", + "scm": "scm", } export const loadScript = (baseUrl, url) => { @@ -491,6 +494,7 @@ export class Product { if (windowURL.searchParams.has("channel")) { zuoraCart.searchParams.set("channel", windowURL.searchParams.get("channel")); } + zuoraCart.searchParams.set("product_id", this.productId); zuoraCart.searchParams.set("payment_period", monthlyProducts[this.id] ? `${devices}d1m` : `${devices}d${years}y`); zuoraCart.searchParams.set("country", "NL"); @@ -753,15 +757,10 @@ export class Product { class BitCheckout { static cachedZuoraConfig = null; static async fetchZuoraConfig() { - // If cached data exists, return it directly - if (this.cachedZuoraConfig) { - return this.cachedZuoraConfig; - } - const defaultJsonFilePath = '/zuoraconfig.json'; const jsonFilePath = window.location.hostname === 'www.bitdefender.com' - ? `https://${window.location.hostname}/pages/zuoraconfig.json` - : defaultJsonFilePath; + ? `https://${window.location.hostname}/pages/zuoraconfig.json` + : defaultJsonFilePath; try { const response = await fetch(jsonFilePath); @@ -778,10 +777,9 @@ class BitCheckout { CAMPAIGN_MONTHLY_PRODS: [], }; - // build zuoraConfigData - data.forEach((item) => { + data.forEach(item => { if (item.ZUORA_PRODS) { - const [key, value] = item.ZUORA_PRODS.split(':').map((itm) => itm.trim()); + const [key, value] = item.ZUORA_PRODS.split(':').map(s => s.trim()); const clearKey = key.replace('*', ''); zuoraConfigData.CAMPAIGN_PRODS[clearKey] = value; @@ -791,9 +789,6 @@ class BitCheckout { } }); - // Cache the fetched data - this.cachedZuoraConfig = zuoraConfigData; - return zuoraConfigData; } catch (error) { console.error(`Error fetching Zuora config: ${error.message}`); @@ -801,13 +796,14 @@ class BitCheckout { } } - static monthlyProducts = ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", + + static monthlyProducts2 = ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "secpassm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m"] // this products come with device_no set differently from the init-selector api where they are set to 1 static wrongDeviceNumber = ["bms", "mobile", "ios", "mobileios", "psm", "passm"] - static productId = { + static productId2 = { av: "com.bitdefender.cl.av", is: "com.bitdefender.cl.is", tsmd: "com.bitdefender.cl.tsmd", @@ -824,6 +820,8 @@ class BitCheckout { passm: "com.bitdefender.passwordmanager", pass_sp: "com.bitdefender.passwordmanager", pass_spm: "com.bitdefender.passwordmanager", + secpass: 'com.bitdefender.securepass', + secpassm: 'com.bitdefender.securepass', bms: "com.bitdefender.bms", mobile: "com.bitdefender.bms", ios: "com.bitdefender.iosprotection", @@ -854,7 +852,7 @@ class BitCheckout { pass: "Bitdefender Password Manager", pass_sp: "Bitdefender Password Manager Shared Plan", passm: "Bitdefender Password Manager", - pass_spm: "Bitdefender Password Manager Shared Plan" + pass_spm: "Bitdefender Password Manager Shared Plan", } static getKey() { @@ -923,7 +921,7 @@ class BitCheckout { CAMPAIGN_MONTHLY_PRODS: monthlyProducts, CAMPAIGN_NAME: campaign, CAMPAIGN_PRODS: productId, - } = fetchedData; + } = fetchedData; let payload = (await this.getProductVariations(productId[id], campaign))?.payload; @@ -988,7 +986,7 @@ class BitCheckout { currency_label: "€", product_id: productId[id], platform_product_id: productId[id], - promotion: campaignId, + promotion: campaign, region_id: 22, platform_id: 16, price: devices.price, @@ -1019,7 +1017,6 @@ class BitCheckout { const fetchedData = await this.fetchZuoraConfig(); if (campaign) fetchedData.CAMPAIGN_NAME = campaign; - return await this.getProductVariationsPrice(id, fetchedData); } } @@ -1081,7 +1078,7 @@ export class Store { gb: "uk", ch: "de", at: "de", - us: "en", + us: "us", mx: "en", nz: "au", } From a1a48be2063ac6a7ccaf299beb4c2b6700f3a74b Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 9 Dec 2024 21:43:48 +0200 Subject: [PATCH 157/248] removing unused const --- _src/scripts/libs/store/store.js | 49 -------------------------------- 1 file changed, 49 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 9c43ef08c..095fee9da 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -796,58 +796,9 @@ class BitCheckout { } } - - static monthlyProducts2 = ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "secpassm", "dipm", "us_i_m", - "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m"] - // this products come with device_no set differently from the init-selector api where they are set to 1 static wrongDeviceNumber = ["bms", "mobile", "ios", "mobileios", "psm", "passm"] - static productId2 = { - av: "com.bitdefender.cl.av", - is: "com.bitdefender.cl.is", - tsmd: "com.bitdefender.cl.tsmd", - fp: "com.bitdefender.fp", - ps: "com.bitdefender.premiumsecurity", - psm: "com.bitdefender.premiumsecurity", - psp: "com.bitdefender.premiumsecurityplus", - pspm: "com.bitdefender.premiumsecurityplus", - soho: "com.bitdefender.soho", - mac: "com.bitdefender.avformac", - vpn: "com.bitdefender.vpn", - "vpn-monthly": "com.bitdefender.vpn", - pass: "com.bitdefender.passwordmanager", - passm: "com.bitdefender.passwordmanager", - pass_sp: "com.bitdefender.passwordmanager", - pass_spm: "com.bitdefender.passwordmanager", - secpass: 'com.bitdefender.securepass', - secpassm: 'com.bitdefender.securepass', - bms: "com.bitdefender.bms", - mobile: "com.bitdefender.bms", - ios: "com.bitdefender.iosprotection", - mobileios: "com.bitdefender.iosprotection", - dip: "com.bitdefender.dataprivacy", - dipm: "com.bitdefender.dataprivacy", - avpm: 'com.bitdefender.cl.avplus.v2', - // DLP - ts_i: 'com.bitdefender.tsmd.v2', - ts_f: 'com.bitdefender.tsmd.v2', - ps_i: 'com.bitdefender.premiumsecurity.v2', - ps_f: 'com.bitdefender.premiumsecurity.v2', - us_i: 'com.bitdefender.ultimatesecurityeu.v2', - us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_f: 'com.bitdefender.ultimatesecurityeu.v2', - us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pi: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pi_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', - } - static names = { pass: "Bitdefender Password Manager", pass_sp: "Bitdefender Password Manager Shared Plan", From 8aa974415cb8269c64994ab84aced2b1d06ef51f Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 9 Dec 2024 21:48:59 +0200 Subject: [PATCH 158/248] update --- _src/scripts/libs/store/store.js | 1 - 1 file changed, 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 57aa5ea72..aba984c3c 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1034,7 +1034,6 @@ export class Store { ch: "de", at: "de", us: "us", - us: "us", mx: "en", nz: "au", } From 895f6614b1a5c2a94b73a1730ce44954a54f4e78 Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 9 Dec 2024 21:49:34 +0200 Subject: [PATCH 159/248] update --- _src/scripts/libs/store/store.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index aba984c3c..095fee9da 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -27,10 +27,6 @@ export const monthlyProducts = { "secpassm": "secpassm", "vbsm": "vbsm", "scm": "scm", - "us_pfe_m": "us_pfe_m", - "secpassm": "secpassm", - "vbsm": "vbsm", - "scm": "scm", } export const loadScript = (baseUrl, url) => { From 25d1310afdbdcb0d905362dc6220fbb1806c8365 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 10 Dec 2024 14:05:57 +0200 Subject: [PATCH 160/248] fixed mega menu error due to missconfigured query --- _src/blocks/header/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/header/header.js b/_src/blocks/header/header.js index 8237de484..f5b31a03f 100644 --- a/_src/blocks/header/header.js +++ b/_src/blocks/header/header.js @@ -580,7 +580,7 @@ async function runDefaultHeaderLogic(block) { await Promise.allSettled(loadedLinks); contentDiv.style.display = 'block'; - document.querySelector('body > div:first-child').classList.add('header-with-language-banner'); + nav.classList.add('header-with-language-banner'); adobeMcAppendVisitorId(shadowRoot); loginFunctionality(shadowRoot); From eb5e113a2ba5b7a399ceaf17e8d61b090ecfee94 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 10 Dec 2024 15:44:06 +0200 Subject: [PATCH 161/248] added missing bundle id --- _src/scripts/libs/constants.js | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index a40b456fd..c5b2d8237 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -63,6 +63,7 @@ export const Constants = { us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', + secpass: 'com.bitdefender.securepass' }, PRODUCT_ID_NAME_MAPPINGS: { From fda76193a1b5bb7c3754568787a80fd3ee33d560 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 10 Dec 2024 16:03:05 +0200 Subject: [PATCH 162/248] for ro domain, Vlaicu will be triggered by default --- _src/scripts/libs/store/store.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 4080c10ff..050d2bd0f 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1138,7 +1138,8 @@ class StoreConfig { * @returns {"init"|"zuora"|"vlaicu"} the prices provider to be used */ #getProvider(vlaicuFlag) { - if (vlaicuFlag) { + // TODO: please remove the locale check when we start using only Vlaicu + if (vlaicuFlag || Page.locale === "ro-ro") { return "vlaicu"; } From 8091af15aa56ddec9ee7492cf78645d6f9aa3af3 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Tue, 10 Dec 2024 16:43:14 +0200 Subject: [PATCH 163/248] solved merge issues --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 8403701b9..dad1a5e73 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -798,7 +798,7 @@ class BitCheckout { } }); - cachedZuoraConfig = zuoraConfigData; + this.cachedZuoraConfig = zuoraConfigData; return zuoraConfigData; } catch (error) { console.error(`Error fetching Zuora config: ${error.message}`); From 5f0854f36ee65e93c3046d2b0df3126e8ee59b31 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 11 Dec 2024 11:08:31 +0200 Subject: [PATCH 164/248] fixed styling issues found during block testing --- _src/blocks/image-columns/image-columns.css | 5 +++++ _src/styles/styles.css | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/_src/blocks/image-columns/image-columns.css b/_src/blocks/image-columns/image-columns.css index f0f074fc0..8b5bea194 100644 --- a/_src/blocks/image-columns/image-columns.css +++ b/_src/blocks/image-columns/image-columns.css @@ -99,6 +99,10 @@ flex: 0 1 25%; } +main .section.wide .image-columns img{ + height: auto; +} + @media (min-width: 992px) { .image-columns > div > .image-columns-txt-col h3 { margin-bottom: 26px; @@ -134,6 +138,7 @@ align-items: flex-start; flex-direction: unset; column-gap: 58px; + align-items: center; } .image-columns > div > div { diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 3b271ec2f..350e30e04 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -982,7 +982,6 @@ a.button:any-link, input[type="submit"] { color: var(--button-link-color); background-color: var(--button-background-color); border: 2px solid var(--button-background-color); - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-radius: 8px; From 4bd59737f8eaa2338332412fa6571782e0a017ef Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 11 Dec 2024 11:38:29 +0200 Subject: [PATCH 165/248] changed empty string with constant --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index dad1a5e73..a71142be8 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -1170,7 +1170,7 @@ class StoreConfig { const fetchedData = await BitCheckout.cachedZuoraConfig; if (!Object.keys(fetchedData).length) { console.error(`Failed to fetch data.`); - return ""; + return Store.NO_PROMOTION; } return fetchedData.CAMPAIGN_NAME; From c044bb663d6fc3ddf7472c8a4ea7bc7770eae329 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 11 Dec 2024 12:10:11 +0200 Subject: [PATCH 166/248] update the endpoint for zuoraConfig --- _src/scripts/libs/store/store.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index a71142be8..fadbd1d01 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -763,19 +763,19 @@ export class Product { } class BitCheckout { - static cachedZuoraConfig = this.#fetchZuoraConfig(); + static #cachedZuoraConfig = null; - static async #fetchZuoraConfig() { - const defaultJsonFilePath = '/zuoraconfig.json'; - const jsonFilePath = window.location.hostname === 'www.bitdefender.com' - ? `https://${window.location.hostname}/pages/zuoraconfig.json` - : defaultJsonFilePath; + static async fetchZuoraConfig() { + if (this.#cachedZuoraConfig) { + return this.#cachedZuoraConfig + } try { - const response = await fetch(jsonFilePath); + const response = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/nl-nl/consumer/zuoraconfig.json`); if (!response.ok) { console.error(`Failed to fetch data. Status: ${response.status}`); + this.#cachedZuoraConfig = {}; return {}; } @@ -798,10 +798,11 @@ class BitCheckout { } }); - this.cachedZuoraConfig = zuoraConfigData; + this.#cachedZuoraConfig = zuoraConfigData; return zuoraConfigData; } catch (error) { console.error(`Error fetching Zuora config: ${error.message}`); + this.#cachedZuoraConfig = {}; return {}; } } @@ -973,7 +974,7 @@ class BitCheckout { window.StoreProducts = window.StoreProducts || []; window.StoreProducts.product = window.StoreProducts.product || {} - const fetchedData = await this.cachedZuoraConfig; + const fetchedData = await this.fetchZuoraConfig(); if (campaign) fetchedData.CAMPAIGN_NAME = campaign; return await this.getProductVariationsPrice(id, fetchedData); } @@ -1167,7 +1168,7 @@ class StoreConfig { return Store.NO_PROMOTION; } - const fetchedData = await BitCheckout.cachedZuoraConfig; + const fetchedData = await BitCheckout.fetchZuoraConfig(); if (!Object.keys(fetchedData).length) { console.error(`Failed to fetch data.`); return Store.NO_PROMOTION; From b5947023e4e2ddeb82dc26339f788067eb3d740b Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 11 Dec 2024 14:33:21 +0200 Subject: [PATCH 167/248] add browser detection and update hero link for Firefox --- _src/blocks/hero/hero.js | 6 ++++++ _src/scripts/utils/utils.js | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/_src/blocks/hero/hero.js b/_src/blocks/hero/hero.js index ebd244c1d..f83a70723 100644 --- a/_src/blocks/hero/hero.js +++ b/_src/blocks/hero/hero.js @@ -4,6 +4,7 @@ import { createTag, createNanoBlock, renderNanoBlocks, + getBrowserName, } from '../../scripts/utils/utils.js'; /** @@ -91,6 +92,7 @@ export default function decorate(block) { stopAutomaticModalRefresh, signature, percentProduct, + firefoxUrl, } = block.closest('.section').dataset; buildHeroBlock(block); @@ -138,4 +140,8 @@ export default function decorate(block) { if (block.querySelector('.button-container a[href*="/consumer/thank-you"]')) { block.querySelector('.button-container a[href*="/consumer/thank-you"]').classList.add('await-loader'); } + + if (firefoxUrl && getBrowserName() === 'Firefox') { + block.querySelector('a').href = firefoxUrl; + } } diff --git a/_src/scripts/utils/utils.js b/_src/scripts/utils/utils.js index ff009547f..fcdcecc96 100644 --- a/_src/scripts/utils/utils.js +++ b/_src/scripts/utils/utils.js @@ -822,6 +822,21 @@ export function openUrlForOs(urlMacos, urlWindows, urlAndroid, urlIos, anchorSel } } +export function getBrowserName() { + const { userAgent } = navigator; + + if (userAgent.includes('Firefox')) { + return 'Firefox'; + } if (userAgent.includes('Edg')) { + return 'Edge'; + } if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) { + return 'Chrome'; + } if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) { + return 'Safari'; + } + return 'Unknown'; +} + export function decorateBlockWithRegionId(element, id) { // we could consider to use `element.setAttribute('s-object-region', id);` in the future if (element) element.id = id; From 52573034621efa67417c34279b75054359dbe859 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 11 Dec 2024 14:36:40 +0200 Subject: [PATCH 168/248] refactor: remove unnecessary toLowerCase() call in URL validation --- _src/blocks/link-checker/link-checker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/link-checker/link-checker.js b/_src/blocks/link-checker/link-checker.js index 308edddd7..03d01b06d 100644 --- a/_src/blocks/link-checker/link-checker.js +++ b/_src/blocks/link-checker/link-checker.js @@ -75,7 +75,7 @@ const isValidUrl = (urlString) => { }; async function checkLink(block, input, result) { - const url = input.value.toLowerCase().trim(); + const url = input.value.trim(); if (!url || !isValidUrl(url)) { result.textContent = 'Please enter a valid URL'; result.className = 'result danger'; From e9e6b43d35ec3183f247bb2cb4545a622e7fc03d Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 11 Dec 2024 16:19:50 +0200 Subject: [PATCH 169/248] updated the id mappings to include secpassm --- _src/scripts/libs/constants.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 22e270639..b936886b6 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -63,7 +63,8 @@ export const Constants = { us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', - secpass: 'com.bitdefender.securepass' + secpass: 'com.bitdefender.securepass', + secpassm: 'com.bitdefender.securepass' }, PRODUCT_ID_NAME_MAPPINGS: { @@ -73,7 +74,7 @@ export const Constants = { pass_spm: "Bitdefender Password Manager Shared Plan" }, - MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm"], + MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm", "secpassm"], WRONG_DEVICES_PRODUCT_IDS: { 'pass_sp': { From 2b7b4f8f8586d25696aa040a673945fd62e546fe Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 11 Dec 2024 16:49:02 +0200 Subject: [PATCH 170/248] added fix for other domains other than Vlaicu ones --- _src/scripts/libs/store/store.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index fadbd1d01..d29f499df 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -477,7 +477,7 @@ export class Product { if (Store.config.provider === "vlaicu" && yearsOption.buyLink) { const buyLink = new URL(yearsOption.buyLink); buyLink.searchParams.set("SHOPURL", `${window.location.origin}${window.location.pathname}`); - buyLink.searchParams.set("SRC", this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); + buyLink.searchParams.set("SRC", this.promotion && this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); option.buyLink = buyLink.href; return option; @@ -994,7 +994,7 @@ class Vlaicu { }; // get the correct path to get the prices - let productPath = campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + let productPath = campaign && campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); @@ -1165,13 +1165,13 @@ class StoreConfig { } if (!Constants.ZUROA_LOCALES.includes(Page.locale)) { - return Store.NO_PROMOTION; + return ""; } const fetchedData = await BitCheckout.fetchZuoraConfig(); if (!Object.keys(fetchedData).length) { console.error(`Failed to fetch data.`); - return Store.NO_PROMOTION; + return ""; } return fetchedData.CAMPAIGN_NAME; From ff01c4f00a35db92e5f93f4bc28326daf9f24412 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 12:37:20 +0200 Subject: [PATCH 171/248] prepared Vlaicu for deployment to production on all domains --- _src/scripts/libs/constants.js | 2 + _src/scripts/libs/store/store.js | 463 +++---------------------------- 2 files changed, 37 insertions(+), 428 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index b936886b6..88bea0063 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -111,4 +111,6 @@ export const Constants = { LOGIN_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) ? window.location.origin : 'https://www.bitdefender.com', + + NO_PROMOTION: "ignore" } \ No newline at end of file diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index d29f499df..0a3998bbb 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -408,23 +408,9 @@ export class Product { if (!yearsOption) { return null; } - const buyCart = new URL(`https://www.bitdefender.com/site/Store/buy/${this.id}/${devices}/${years}/${this.promotion ? `pid.${this.promotion}` : ""}`); - buyCart.searchParams.set("CURRENCY", this.currency); - buyCart.searchParams.set("DCURRENCY", this.currency); - buyCart.searchParams.set("CART", "1"); - buyCart.searchParams.set("CARD", "2"); - buyCart.searchParams.set("SHORT_FORM", "1"); - buyCart.searchParams.set("LANG", Page.langauge); - buyCart.searchParams.set("force_country", Store.getCountry()); - - if (window.UC_UI) { - buyCart.searchParams.set("ucControllerId", window.UC_UI.getControllerId()); - } - const option = new ProductOption({ price: Number(Number(yearsOption.price).toFixed(2)), priceDiscounted: Number(Number(yearsOption.discount?.discounted_price).toFixed(2)), - buyLink: buyCart.href, isDiscounted: yearsOption.discount?.discounted_price ? true : false, currency: this.currency, symbol: this.symbol, @@ -458,65 +444,21 @@ export class Product { } } + let buyLink = new URL(yearsOption.buyLink); + buyLink.searchParams.set("SHOPURL", `${window.location.origin}/${window.location.pathname.split('/')[1]}/`); + buyLink.searchParams.set("REF", this.promotion && this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); + buyLink.searchParams.set("SRC", `${window.location.origin}${window.location.pathname}`); + // replace the buy links with target links if they exist and return the option if (Store.targetBuyLinkMappings[this.productAlias] && Store.targetBuyLinkMappings[this.productAlias][productVariation]) { - option.buyLink = Store.targetBuyLinkMappings[this.productAlias][productVariation]; - return option; + buyLink = new URL(Store.targetBuyLinkMappings[this.productAlias][productVariation]); } - //Init Selector Settings - if (Store.config.provider === "init") { - if (bundle) { - option.buyLink = option.buyLink.replace("buy", "buybundle"); - } - - return option; - } - - if (Store.config.provider === "vlaicu" && yearsOption.buyLink) { - const buyLink = new URL(yearsOption.buyLink); - buyLink.searchParams.set("SHOPURL", `${window.location.origin}${window.location.pathname}`); - buyLink.searchParams.set("SRC", this.promotion && this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); - option.buyLink = buyLink.href; - - return option; - } - - //Zuora settings - const windowURL = new URL(window.location.href) - const zuoraCart = new URL("/index.html:step=cart?theme=light", Store.config.zuora.cartUrl) - - if (this.promotion) { - zuoraCart.searchParams.set("campaign", this.promotion); - } - if (windowURL.searchParams.has("lang")) { - zuoraCart.searchParams.set("language", windowURL.searchParams.get("lang")); - } - if (windowURL.searchParams.has("language")) { - zuoraCart.searchParams.set("language", windowURL.searchParams.get("language")); - } - if (windowURL.searchParams.has("event")) { - zuoraCart.searchParams.set("event", windowURL.searchParams.get("event")); - } - if (windowURL.searchParams.has("channel")) { - zuoraCart.searchParams.set("channel", windowURL.searchParams.get("channel")); - } - - zuoraCart.searchParams.set("product_id", this.productId); - zuoraCart.searchParams.set("payment_period", monthlyProducts[this.id] ? `${devices}d1m` : `${devices}d${years}y`); - zuoraCart.searchParams.set("country", "NL"); - zuoraCart.searchParams.set("language", "nl_NL"); - zuoraCart.searchParams.set("client", "8f768650-6915-11ed-83e3-e514e761ac46"); - - if (bundle) { - zuoraCart.searchParams.set("bundle_id", this.productId); - zuoraCart.searchParams.set("bundle_payment_period", monthlyProducts[bundle.id] - ? `${bundle.getDevices()}d1m` - : `${bundle.getDevices()}d${bundle.getSubscription("years")}y`); + if (window.UC_UI) { + buyLink.searchParams.set("ucControllerId", window.UC_UI.getControllerId()); } - - option.buyLink = zuoraCart.href; + option.buyLink = buyLink.href; return option; } @@ -762,224 +704,6 @@ export class Product { } } -class BitCheckout { - static #cachedZuoraConfig = null; - - static async fetchZuoraConfig() { - if (this.#cachedZuoraConfig) { - return this.#cachedZuoraConfig - } - - try { - const response = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/nl-nl/consumer/zuoraconfig.json`); - - if (!response.ok) { - console.error(`Failed to fetch data. Status: ${response.status}`); - this.#cachedZuoraConfig = {}; - return {}; - } - - const { data = [] } = await response.json(); - const zuoraConfigData = { - CAMPAIGN_NAME: data[0]?.CAMPAIGN_NAME || '', - CAMPAIGN_PRODS: {}, - CAMPAIGN_MONTHLY_PRODS: [], - }; - - data.forEach(item => { - if (item.ZUORA_PRODS) { - const [key, value] = item.ZUORA_PRODS.split(':').map(s => s.trim()); - const clearKey = key.replace('*', ''); - zuoraConfigData.CAMPAIGN_PRODS[clearKey] = value; - - if (key.includes('*')) { - zuoraConfigData.CAMPAIGN_MONTHLY_PRODS.push(clearKey); - } - } - }); - - this.#cachedZuoraConfig = zuoraConfigData; - return zuoraConfigData; - } catch (error) { - console.error(`Error fetching Zuora config: ${error.message}`); - this.#cachedZuoraConfig = {}; - return {}; - } - } - - // this products come with device_no set differently from the init-selector api where they are set to 1 - static wrongDeviceNumber = ["bms", "mobile", "ios", "mobileios", "psm", "passm"] - - static names = { - pass: "Bitdefender Password Manager", - pass_sp: "Bitdefender Password Manager Shared Plan", - passm: "Bitdefender Password Manager", - pass_spm: "Bitdefender Password Manager Shared Plan", - } - - static getKey() { - const hostname = window.location.hostname; - if (/^(author-p23952-e68330|www|new)/.test(hostname)) { - return 'bb22f980-fa19-11ed-b443-87a99951e6d5'; - } - if (/^(localhost|local.bitdefender.com)/.test(hostname)) { - return '3405af40-c88e-11ed-9a49-e17059797c0c'; - } - if (/^(author-p23952-e81192|dev1|.hlx.)/.test(hostname)) { - return '91d619d0-c88e-11ed-9ff9-3bfdc38b7fc4'; - } - if (/^(author-p23952-e68355|stage)/.test(hostname)) { - return '213462b0-c88d-11ed-87f8-99121213a0e3'; - } - } - - static config(key) { - return { - key: key || this.getKey(), - country: 'NL', - language: 'nl_NL', - debug: false, - request_timeout: 15000, //default value if not set 3500 - default_scenario: 'www.checkout.v1', - disable_auto_generated_new_session: false, - return_url: document.referrer ? document.referrer : window.location.href, - central: true - }; - } - - static async getProductVariations(productId, campaign) { - const endpoint = new URL("/v1/info/variations/price", Store.config.zuora.endpoint); - endpoint.searchParams.set("product_id", productId); - if (campaign !== Store.NO_PROMOTION) { - endpoint.searchParams.set("campaign", campaign); - } - endpoint.searchParams.set("country_code", "NL"); - - try { - const response = await fetch( - endpoint.href, - { - method: "GET", - headers: { - "X-Public-Key": Store.config.zuora.key, - "Content-Type": "application/json" - } - } - ); - - if (!response.ok) { - return null; - } - - return await response.json(); - } catch (error) { - console.error(error); - return null; - } - } - - static async getProductVariationsPrice(id, fetchedData) { - const { - CAMPAIGN_MONTHLY_PRODS: monthlyProducts, - CAMPAIGN_NAME: campaign, - CAMPAIGN_PRODS: productId, - } = fetchedData; - - let payload = (await this.getProductVariations(productId[id], campaign))?.payload; - - if (!payload || payload.length === 0) { - return null - } - - /** - * this rules splits one product into multiple products - * for example com.bitdefender.passwordmanager maps 2 products - * Password Manager and Password Manager Shared Plan - */ - if (Constants.PRODUCT_ID_NAME_MAPPINGS[id]) { - payload = payload.filter(product => product.name === Constants.PRODUCT_ID_NAME_MAPPINGS[id]) - } - - window.StoreProducts.product[id] = { - product_alias: id, - product_id: productId[id], - product_name: payload[0].name, - variations: {} - } - - payload.forEach(period => { - let billingPeriod; - switch (period.billing_period) { - case "Month": - billingPeriod = 0; - break; - case "Annual": - billingPeriod = 1; - break; - case "Two_Years": - billingPeriod = 2; - break; - case "Three_Years": - billingPeriod = 3; - break; - case "Five_Years": - billingPeriod = 5; - break; - default: - billingPeriod = 10; - } - - if (monthlyProducts.indexOf(id) === -1 && billingPeriod === 0 || monthlyProducts.indexOf(id) !== -1 && billingPeriod !== 0) { - return; - } - - if (monthlyProducts.indexOf(id) !== -1) { - billingPeriod = 1; - } - - period.pricing.forEach(devices => { - let devices_no = devices.devices_no; - - if (this.wrongDeviceNumber.includes(id)) { - devices_no = 1; - } - const devicesObj = { - currency_iso: devices.currency, - product_id: productId[id], - platform_product_id: productId[id], - promotion: campaign, - price: devices.price, - variation: { - variation_name: `${devices_no}u-${billingPeriod}y`, - years: billingPeriod, - billing_period: period.billing_period, - payment_period: period.payment_period - } - } - if (devices.discount > 0) { - devicesObj['discount'] = { - discounted_price: devices.total, - discount_value: devices.discount, - } - } - - window.StoreProducts.product[id].variations[devices_no] = window.StoreProducts.product[id].variations[devices_no] ? window.StoreProducts.product[id].variations[devices_no] : {} - window.StoreProducts.product[id].variations[devices_no][billingPeriod] = devicesObj - }) - }) - return window.StoreProducts.product[id]; - } - - static async loadProduct(id, campaign) { - window.StoreProducts = window.StoreProducts || []; - window.StoreProducts.product = window.StoreProducts.product || {} - - const fetchedData = await this.fetchZuoraConfig(); - if (campaign) fetchedData.CAMPAIGN_NAME = campaign; - return await this.getProductVariationsPrice(id, fetchedData); - } -} - class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; @@ -994,7 +718,7 @@ class Vlaicu { }; // get the correct path to get the prices - let productPath = campaign && campaign !== Store.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + let productPath = campaign !== Constants.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); @@ -1116,16 +840,12 @@ class Vlaicu { class StoreConfig { - /** - * - * @param {boolean} vlaicuFlag - */ - constructor(vlaicuFlag) { + constructor() { /** * Api used to fetch the prices - * @type {"init"|"zuora"|"vlaicu"} + * @type {"vlaicu"} */ - this.provider = this.#getProvider(vlaicuFlag); + this.provider = "vlaicu"; /** * default promotion @@ -1133,19 +853,6 @@ class StoreConfig { */ this.campaign = this.#getCampaign(); - /** - * @type {{ - * cartUrl: string - * key: string, - * endpoint: string - * }} - */ - this.zuora = { - cartUrl: "https://checkout.bitdefender.com", - key: "bb22f980-fa19-11ed-b443-87a99951e6d5", - endpoint: "https://checkout-service.bitdefender.com" - }; - /** * @type {string} */ @@ -1154,9 +861,9 @@ class StoreConfig { : window.location.origin; /** - * @type {"GET"|"POST"} + * @type {"GET"} */ - this.httpMethod = this.#getHTTPMethod(vlaicuFlag); + this.httpMethod = "GET"; } async #getCampaign() { @@ -1165,41 +872,22 @@ class StoreConfig { } if (!Constants.ZUROA_LOCALES.includes(Page.locale)) { - return ""; - } - - const fetchedData = await BitCheckout.fetchZuoraConfig(); - if (!Object.keys(fetchedData).length) { - console.error(`Failed to fetch data.`); - return ""; - } - - return fetchedData.CAMPAIGN_NAME; - } - - /** - * - * @returns {"GET"|"POST"} the http method used to get prices - */ - #getHTTPMethod(vlaicuFlag) { - if (vlaicuFlag) { - return "GET"; + return Constants.NO_PROMOTION; } - return "POST"; - }; + try { + const response = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/nl-nl/consumer/zuoraconfig.json`); + if (!response.ok) { + console.error(`Failed to fetch data.`); + return Constants.NO_PROMOTION; + } - /** - * @param {boolean} vlaicuFlag - * @returns {"init"|"zuora"|"vlaicu"} the prices provider to be used - */ - #getProvider(vlaicuFlag) { - // TODO: please remove the locale check when we start using only Vlaicu - if (vlaicuFlag || Page.locale === "ro-ro") { - return "vlaicu"; + const { data = [] } = await response.json(); + return data[0].CAMPAIGN_NAME ? data[0].CAMPAIGN_NAME : Constants.NO_PROMOTION; + } catch(e) { + console.error(`Failed to fetch data.`); + return Constants.NO_PROMOTION; } - - return Constants.ZUROA_LOCALES.includes(Page.locale) ? "zuora" : "init"; } } @@ -1215,7 +903,6 @@ export class Store { static consumer = "consumer"; static business = "business"; - static NO_PROMOTION = "ignore"; static products = {}; /** country equals the geographic location given by IP */ static country = Page.country; @@ -1224,9 +911,9 @@ export class Store { static baseUrl = Constants.DEV_BASE_URL; /** - * @type {StoreConfig | null} + * @type {StoreConfig} */ - static config = null; + static config = new StoreConfig(); static targetBuyLinkMappings = null; /** @@ -1237,11 +924,6 @@ export class Store { */ static async getProducts(productsInfo) { if (!Array.isArray(productsInfo)) { return null; } - - // create the store config if it does not exist - if (!this.config) { - this.config = new StoreConfig(await Target.getVlaicuFlag()); - } // get the target buyLink mappings if (!this.targetBuyLinkMappings) { @@ -1254,7 +936,7 @@ export class Store { this.products = (await Promise .allSettled( productsInfo.map(async product => { - // target > url > produs > global_campaign > default campaign for zuora + // target > url > produs > global_campaign > default campaign product.promotion = await Target.getCampaign() || this.#getUrlPromotion() || product.promotion @@ -1278,92 +960,18 @@ export class Store { * @returns {Promise} */ static async #apiCall(productInfo) { - if (this.config.provider === "zuora") { - try { - const product = await BitCheckout.loadProduct(productInfo.id, productInfo.promotion); - - if (!product) { - return null - } - - return { - ...product, - ...productInfo - } - } catch (error) { - return null; - } - } - - if (this.config.provider === "vlaicu") { - try { - const product = await Vlaicu.loadProduct(productInfo.id, productInfo.promotion); - - if (!product) { - return null; - } - - return { - ...productInfo, - ...product - } - } catch (error) { - return null; - } - } - - const data = JSON.stringify({ - ev: 1, - product_id: productInfo.id, - config: { - country_code: this.country, - ...(productInfo.promotion !== Store.NO_PROMOTION && { extra_params: { pid: productInfo.promotion } }), - ...(productInfo.promotion === Store.NO_PROMOTION && { ignore_promotions: true }) - } - }); - - const apiURL = new URL(`https://www.bitdefender.com/site/Store/ajax${this.config.httpMethod === "GET" ? `/${encodeURI(btoa(data))}/` : "" - }`); - - apiURL.searchParams.set("force_country", this.mappedCountry); - try { - let response - - switch (this.config.httpMethod) { - case "POST": - const formData = new FormData(); - formData.append('data', data); - response = await fetch(apiURL.href, - { - body: formData, - method: "post" - } - ); - break; - case "GET": - response = await fetch(apiURL.href); - break; - default: - return null; - } - - if (!response.ok) { - return null; - } + const product = await Vlaicu.loadProduct(productInfo.id, productInfo.promotion); - const product = await response.json(); - - if (!product.data.product.variations || product.data.product.variations.length === 0) { + if (!product) { return null; } return { - ...product.data.product, - ...productInfo + ...productInfo, + ...product } } catch (error) { - console.error(error); return null; } } @@ -1401,5 +1009,4 @@ export class Store { window.Store = Store; window.Product = Product; window.ProductOption = ProductOption; -window.ProductInfo = ProductInfo; -window.BitCheckout = BitCheckout; \ No newline at end of file +window.ProductInfo = ProductInfo; \ No newline at end of file From 6127468587946d9176c93290c096574817705e2f Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 12:39:21 +0200 Subject: [PATCH 172/248] removed vlaicuFlag --- _src/scripts/libs/data-layer.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/_src/scripts/libs/data-layer.js b/_src/scripts/libs/data-layer.js index 926b22fc9..79a66b9b4 100644 --- a/_src/scripts/libs/data-layer.js +++ b/_src/scripts/libs/data-layer.js @@ -637,20 +637,6 @@ export class Target { */ static #buyLinksMbox = this.getOffer('buyLinks-mbox'); - /** - * @typedef {{content: {vlaicuFlag: string}}} VlaicuFlagMbox - * @type {Promise} - */ - static #vlaicuFlagMbox = this.getOffer('vlaicu-flag-mbox'); - - /** - * get the flag which marks wether the page should use Vlaicu or not - * @returns {Promise} - */ - static async getVlaicuFlag() { - return Boolean((await this.#vlaicuFlagMbox)?.content?.vlaicuFlag || null); - } - /** * get the product-buy link mappings from Target ( * e.g From 34c99489d9e14ac231643e79b8620f81f777ce81 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 12:49:45 +0200 Subject: [PATCH 173/248] added correct campaign for tests --- _src/scripts/libs/store/store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 58c061d59..f62cba20a 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -710,14 +710,14 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - static campaign = Page.getParamValue('vcampaign'); + static campaign = "WINTERMCWEB24"; static async getProductVariations(productId, campaign) { const locale = await Target.getVlaicuGeoIpPrice() ? await User.locale : Page.locale; const pathVariablesResolverObject = { "{locale}": locale, "{bundleId}": productId, - "{campaignId}": campaign !== Store.NO_PROMOTION ? campaign : this.campaign + "{campaignId}": this.campaign }; // get the correct path to get the prices From 9fc1a6750f85a12a3cdd8aa5cda7794a99a5ddb0 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 13:03:48 +0200 Subject: [PATCH 174/248] deleted missconfigured constants --- _src/scripts/libs/constants.js | 57 ++------------------------------ _src/scripts/libs/store/store.js | 11 +++--- 2 files changed, 8 insertions(+), 60 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 8a8bdc33c..382b761f8 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -14,60 +14,7 @@ export const Constants = { DEV_DOMAINS: ['localhost', 'stage', '.hlx.'], - PRODUCT_ID_MAPPINGS_ZUORA: { - av: "com.bitdefender.cl.av", - is: "com.bitdefender.cl.is", - tsmd: "com.bitdefender.cl.tsmd", - fp: ['nl-nl', 'nl-be'].includes(Page.locale) ? "com.bitdefender.fp" : "com.bitdefender.cl.fp", - ps: "com.bitdefender.premiumsecurity", - psm: "com.bitdefender.premiumsecurity", - psp: "com.bitdefender.premiumsecurityplus", - pspm: "com.bitdefender.premiumsecurityplus", - soho: "com.bitdefender.soho", - mac: "com.bitdefender.avformac", - vpn: "com.bitdefender.vpn", - "vpn-monthly": "com.bitdefender.vpn", - pass: "com.bitdefender.passwordmanager", - passm: "com.bitdefender.passwordmanager", - pass_sp: "com.bitdefender.passwordmanager", - pass_spm: "com.bitdefender.passwordmanager", - bms: "com.bitdefender.bms", - mobile: "com.bitdefender.bms", - ios: "com.bitdefender.iosprotection", - mobileios: "com.bitdefender.iosprotection", - dip: "com.bitdefender.dataprivacy", - dipm: "com.bitdefender.dataprivacy", - avpm: 'com.bitdefender.cl.avplus.v2', - ultsec: "com.bitdefender.ultimatesecurityus", - ultsecplus: "com.bitdefender.ultimatesecurityplusus", - ultsecm: "com.bitdefender.ultimatesecurityus", - ultsecplusm: "com.bitdefender.ultimatesecurityplusus", - idthefts: "com.bitdefender.idtheftstandard", - idtheftp: "com.bitdefender.idtheftpremium", - idtheftsm: "com.bitdefender.idtheftstandard", - idtheftpm: "com.bitdefender.idtheftpremium", - // DLP - ts_i: 'com.bitdefender.tsmd.v2', - ts_f: 'com.bitdefender.tsmd.v2', - ps_i: 'com.bitdefender.premiumsecurity.v2', - ps_f: 'com.bitdefender.premiumsecurity.v2', - us_i: 'com.bitdefender.ultimatesecurityeu.v2', - us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_f: 'com.bitdefender.ultimatesecurityeu.v2', - us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pi: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pi_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', - secpass: 'com.bitdefender.securepass', - secpassm: 'com.bitdefender.securepass' - }, - - PRODUCT_ID_MAPPINGS_VLAICU: { + PRODUCT_ID_MAPPINGS: { av: "com.bitdefender.cl.av", is: "com.bitdefender.cl.is", tsmd: "com.bitdefender.cl.tsmd", @@ -116,6 +63,8 @@ export const Constants = { us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', + secpass: 'com.bitdefender.securepass', + secpassm: 'com.bitdefender.securepass' }, PRODUCT_ID_NAME_MAPPINGS: { diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index f62cba20a..1d0ed9dd4 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -713,9 +713,8 @@ class Vlaicu { static campaign = "WINTERMCWEB24"; static async getProductVariations(productId, campaign) { - const locale = await Target.getVlaicuGeoIpPrice() ? await User.locale : Page.locale; const pathVariablesResolverObject = { - "{locale}": locale, + "{locale}": Page.locale, "{bundleId}": productId, "{campaignId}": this.campaign }; @@ -754,7 +753,7 @@ class Vlaicu { } static async getProductVariationsPrice(id, campaignId) { - const productInfoResponse = await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS_VLAICU[id.trim()], campaignId); + const productInfoResponse = await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id.trim()], campaignId); const productInfo = productInfoResponse?.product; if (!productInfo) { return null; @@ -770,7 +769,7 @@ class Vlaicu { window.StoreProducts.product[id] = { product_alias: id, - product_id: Constants.PRODUCT_ID_MAPPINGS_VLAICU[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id], product_name: productInfo.productName, promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, variations: {} @@ -800,8 +799,8 @@ class Vlaicu { const devicesObj = { currency_iso: productVariation.currency, - product_id: Constants.PRODUCT_ID_MAPPINGS_VLAICU[id], - platform_product_id: Constants.PRODUCT_ID_MAPPINGS_VLAICU[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id], + platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, From 4707ea9e8bed1440cac24a09db9ec157ae4e2052 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 13:07:42 +0200 Subject: [PATCH 175/248] made Vlaicu use only promotion path on stage --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 1d0ed9dd4..a4ff5c06c 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -720,7 +720,7 @@ class Vlaicu { }; // get the correct path to get the prices - let productPath = campaign !== Constants.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + let productPath = this.promotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); From 2c2a5075b2e8b72614b6926cdfda52db547fabd6 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 13:09:17 +0200 Subject: [PATCH 176/248] added TODOs --- _src/scripts/libs/store/store.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index a4ff5c06c..e9f6dc829 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -710,8 +710,9 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - static campaign = "WINTERMCWEB24"; + // TODO: please remove this.campaign from here and only use campaign received as parameter + static campaign = "WINTERMCWEB24"; static async getProductVariations(productId, campaign) { const pathVariablesResolverObject = { "{locale}": Page.locale, @@ -722,6 +723,9 @@ class Vlaicu { // get the correct path to get the prices let productPath = this.promotionPath; + // TODO: please uncomment the code below and remove the one above + // let productPath = campaign !== Constants.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); productPath = productPath.replace(pathVariablesRegex, (matched) => { From 1de61a36a6728d606ec3cd938a57cbcd51cf5429 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 13:18:33 +0200 Subject: [PATCH 177/248] updated the buy link parameters for Vlaicu --- _src/scripts/libs/store/store.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index d29f499df..70cd7678d 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -476,8 +476,9 @@ export class Product { if (Store.config.provider === "vlaicu" && yearsOption.buyLink) { const buyLink = new URL(yearsOption.buyLink); - buyLink.searchParams.set("SHOPURL", `${window.location.origin}${window.location.pathname}`); - buyLink.searchParams.set("SRC", this.promotion && this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); + buyLink.searchParams.set("SHOPURL", `${window.location.origin}/${window.location.pathname.split('/')[1]}/`); + buyLink.searchParams.set("REF", this.promotion && this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); + buyLink.searchParams.set("SRC", `${window.location.origin}${window.location.pathname}`); option.buyLink = buyLink.href; return option; From 8d15cf8defeb543777bce7931c77fa04ba25a904 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 12 Dec 2024 13:47:15 +0200 Subject: [PATCH 178/248] package and lint updates --- _src/blocks/columns/columns.css | 4 +- _src/blocks/hero/hero.css | 6 +- _src/blocks/image-columns/image-columns.css | 1 - .../product-comparison-table.css | 2 +- .../products-sideview/products-sideview.css | 2 +- _src/blocks/products/products.css | 3 +- _src/blocks/ribbon/ribbon.css | 4 +- .../scuderia-ferrari-section.css | 32 +- _src/blocks/video-carousel/video-carousel.css | 11 + package-lock.json | 2438 +++++++++++------ 10 files changed, 1659 insertions(+), 844 deletions(-) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 94f35d037..4ce33247a 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -1143,7 +1143,6 @@ main .section.two-columns .right-col .products.plans a.button:any-link { } .columns-container.icon-corners { - .columns-wrapper { border-radius: 20px; } @@ -1309,7 +1308,6 @@ main .section.two-columns .right-col .products.plans a.button:any-link { } .columns-container.icon-corners { - .columns { padding: 100px; } @@ -1395,6 +1393,7 @@ main .section.two-columns .right-col .products.plans a.button:any-link { width: 100%; justify-content: center; } + table{ margin-bottom: 15px; } @@ -1437,6 +1436,7 @@ main .section.two-columns .right-col .products.plans a.button:any-link { tr:last-of-type td{ height: 25px; } + .columns > div > .columns-img-col { margin-bottom: 0; } diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index da28efe0c..a1b56c0c2 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -666,13 +666,15 @@ main .hero.ferrari .breadcrumb{ display: flex; flex-direction: column; width: 100%; - padding: 0px 20px 0px 0px; + padding: 0 20px 0 0; } + main .hero.ferrari .hero-content > div img{ max-height: 225px; max-width: 813px; } + main .hero.ferrari h1{ font-size: 60px; font-weight: 300; @@ -895,6 +897,7 @@ main .hero.ferrari .breadcrumb{ main .hero.ferrari .hero-content { min-height: 768px; } + main .hero.ferrari h1 { max-width: 60%; } @@ -955,6 +958,7 @@ main .hero.ferrari .breadcrumb{ main .v2 .hero h1+p { font-size: var(--body-font-size-xs); } + main .hero.ferrari .hero-picture{ display: block; } diff --git a/_src/blocks/image-columns/image-columns.css b/_src/blocks/image-columns/image-columns.css index 8b5bea194..a539ff083 100644 --- a/_src/blocks/image-columns/image-columns.css +++ b/_src/blocks/image-columns/image-columns.css @@ -135,7 +135,6 @@ main .section.wide .image-columns img{ } .image-columns > div { - align-items: flex-start; flex-direction: unset; column-gap: 58px; align-items: center; diff --git a/_src/blocks/product-comparison-table/product-comparison-table.css b/_src/blocks/product-comparison-table/product-comparison-table.css index e5c958ce7..5ebc6ce2c 100644 --- a/_src/blocks/product-comparison-table/product-comparison-table.css +++ b/_src/blocks/product-comparison-table/product-comparison-table.css @@ -310,7 +310,7 @@ div[role="row"].expandable-row div[role="cell"] p:first-of-type { } .product-comparison-table .old-price-box, .product-comparison-table .new-price-box{ - font-family: 'Arial', sans-serif; + font-family: Arial, sans-serif; } @media (max-width: 580px) { diff --git a/_src/blocks/products-sideview/products-sideview.css b/_src/blocks/products-sideview/products-sideview.css index c161adf85..5e3a201bf 100644 --- a/_src/blocks/products-sideview/products-sideview.css +++ b/_src/blocks/products-sideview/products-sideview.css @@ -30,7 +30,7 @@ .products-sideview .price-element-wrapper { margin: 20px 0; - font-family: 'Arial', sans-serif;; + font-family: Arial, sans-serif;; } .products-sideview .pricing-wrapper > p:last-child { diff --git a/_src/blocks/products/products.css b/_src/blocks/products/products.css index 7a29cdb77..b77763dea 100644 --- a/_src/blocks/products/products.css +++ b/_src/blocks/products/products.css @@ -385,7 +385,7 @@ } .product-card .price.nanoblock, .product-card .featured.nanoblock{ - font-family: 'Arial', sans-serif; + font-family: Arial, sans-serif; } @media (max-width: 480px) { @@ -507,6 +507,7 @@ right: -60px; border: 20px white solid; } + .product-card .img-adjacent-text{ width: 74%; } diff --git a/_src/blocks/ribbon/ribbon.css b/_src/blocks/ribbon/ribbon.css index 7f2d21dc4..a8279147f 100644 --- a/_src/blocks/ribbon/ribbon.css +++ b/_src/blocks/ribbon/ribbon.css @@ -1,7 +1,7 @@ main .ribbon-container { color: white; text-align: center; - background-position: 0px -18px; + background-position: 0 -18px; background-repeat: repeat; background-blend-mode: unset; background-color: black; @@ -10,7 +10,7 @@ main .ribbon-container { } .ribbon-container * { - font-family: "Arial", sans-serif!important; + font-family: Arial, sans-serif!important; font-size: var(--body-font-size-xs); } diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index 8cde8b489..fe272d140 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -9,6 +9,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper background-color: #006EFF; padding: 20px; color: #fff; + img{ display: none; } @@ -17,9 +18,11 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.quotes-left{ align-items: baseline; text-align: left; + div{ justify-content: flex-end; } + p:last-of-type{ line-height: 1.23; } @@ -59,7 +62,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper padding: 0; } - P{ + p{ font-size: 24px; } @@ -87,6 +90,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper object-fit: cover; z-index: 0; } + div:last-of-type{ max-width: 80%; } @@ -103,15 +107,18 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper text-align: center; padding: 20px; margin-bottom: 40px; - margin-top: 0px; + margin-top: 0; + h2{ font-size: 24px; font-weight: 300; } + div:first-child{ min-width: 100%; justify-items: center; } + .video-container{ width: 100%; } @@ -128,7 +135,8 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.image-right{ padding: 20px; background-color: #F4FAFF; - color: #000000; + color: #000; + h2{ color: #006EFF; } @@ -137,12 +145,15 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper @media (min-width: 767px){ .scuderia-ferrari-section{ padding:5%; + h3{ font-size: 40px; } + p{ font-size: 26px; } + div:first-child{ display: flex; flex-flow: column; @@ -151,6 +162,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.video-block{ padding:5%; + h2{ line-height: 1; font-size: 44px; @@ -174,7 +186,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.image-right{ padding: 5%; background-color: #F4FAFF; - color: #000000; + color: #000; h2{ font-size: 32px; @@ -246,6 +258,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.quotes-left{ align-items: end; + div:last-of-type{ padding-bottom: 50px; } @@ -253,6 +266,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.quotes-right{ align-items: center; + p:nth-last-of-type(2){ font-size: 26px; font-weight: 400; @@ -263,6 +277,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper @media (min-width:1020px){ .scuderia-ferrari-section{ padding: 5%; + div:first-child{ max-width: 80%; } @@ -286,13 +301,13 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.image-right{ padding: 5%; + img{ display: block; top:10%; right: 8%; min-height: 80%; height: auto; - max-width: 655px; object-position: center; border-radius: 40px; z-index: 0; @@ -315,6 +330,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper @media (min-width: 1200px){ .scuderia-ferrari-section{ padding:7% 10%; + h2{ font-size: 36px; } @@ -330,6 +346,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.video-block{ padding:5% 10%; + h2{ font-size: 54px; } @@ -347,6 +364,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper p strong{ font-size: 22px; } + div:last-of-type{ padding: 5%; } @@ -387,6 +405,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper img{ max-width: 35%; } + a.button.primary{ font-size: 23px; padding: 15px 29px; @@ -408,6 +427,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper @media (min-width:1750px){ .scuderia-ferrari-section{ padding: 5% 15%; + h2{ font-size: 42px; } @@ -488,7 +508,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } .scuderia-ferrari-section.quotes-left{ - padding: 25% 15% 5% 15%; + padding: 25% 15% 5%; p{ font-size: 64px; diff --git a/_src/blocks/video-carousel/video-carousel.css b/_src/blocks/video-carousel/video-carousel.css index 085eabcb9..5d2fe43eb 100644 --- a/_src/blocks/video-carousel/video-carousel.css +++ b/_src/blocks/video-carousel/video-carousel.css @@ -126,6 +126,7 @@ .carousel-container{ padding-left: 8%; } + .carousel-item iframe { min-width: 600px; height: 360px; @@ -151,6 +152,7 @@ grid-auto-flow: row; gap: 10px; } + .carousel-item{ padding: 0; padding-bottom: 10px; @@ -179,6 +181,7 @@ .carousel-container{ padding:4%; } + .carousel-item{ text-align: left; width: 300px; @@ -205,10 +208,12 @@ .carousel-container{ padding:5%; } + .carousel-item{ width: 280px; font-size: 18px; } + .carousel-item iframe{ min-width: 280px; min-height: 200px; @@ -219,10 +224,12 @@ .carousel-container{ padding:5% 10%; } + .carousel-item{ width: 320px; font-size: 23px; } + .carousel-item iframe{ min-width: 320px; min-height: 240px; @@ -233,9 +240,11 @@ .carousel-container{ padding:5% 10%; } + .carousel-item{ width: 380px; } + .carousel-item iframe{ min-width: 380px; min-height: 280px; @@ -246,10 +255,12 @@ .carousel-container{ padding-left: 15%; } + .carousel-item{ width: 440px; font-size: 23px; } + .carousel-item iframe{ min-width: 440px; min-height: 300px; diff --git a/package-lock.json b/package-lock.json index 186399cb5..d9957de81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,42 +28,12 @@ "stylelint-config-standard": "30.0.1" } }, - "node_modules/@75lb/deep-merge": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", - "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", - "dev": true, - "dependencies": { - "lodash.assignwith": "^4.2.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@75lb/deep-merge/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -73,12 +43,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -86,10 +58,11 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -99,6 +72,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", @@ -129,6 +103,7 @@ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", "dev": true, + "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -143,29 +118,32 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -173,63 +151,30 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -238,91 +183,59 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.3" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -331,33 +244,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -366,23 +278,23 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", - "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", + "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", "dev": true, "funding": [ { @@ -394,17 +306,18 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", - "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", + "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", "dev": true, "funding": [ { @@ -416,14 +329,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", - "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", + "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", "dev": true, "funding": [ { @@ -435,12 +349,13 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/selector-specificity": { @@ -448,6 +363,7 @@ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -464,6 +380,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -487,6 +404,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -502,6 +420,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -514,6 +433,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -523,15 +443,25 @@ "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", "integrity": "sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "^4.2.12" } }, + "node_modules/@hapi/bourne": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", + "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -546,6 +476,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -558,13 +489,16 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -579,6 +513,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -588,21 +523,24 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -613,6 +551,7 @@ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-scope": "5.1.1" } @@ -622,6 +561,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -635,6 +575,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -644,6 +585,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -657,6 +599,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -677,6 +620,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -694,15 +638,27 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@sinonjs/fake-timers": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0" } @@ -712,6 +668,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", @@ -719,15 +676,16 @@ } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@tsparticles/engine": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.3.0.tgz", - "integrity": "sha512-Sr24epYquTelGrUbMaknXTscib8IMQJrbmShJnEemU+wpZNIPtAh09sQgGtq1pUxrGQRUSQIgaybYuXcNgk8rg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.7.1.tgz", + "integrity": "sha512-GYzBgq/oOE9YJdOL1++MoawWmYg4AvVct6CIrJGx84ZRb3U2owYmLsRGabYl0qX1CWWOvUG569043RJmyp/vQA==", "funding": [ { "type": "github", @@ -742,13 +700,15 @@ "url": "https://www.buymeacoffee.com/matteobruni" } ], - "hasInstallScript": true + "hasInstallScript": true, + "license": "MIT" }, "node_modules/@types/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -757,29 +717,33 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.6.tgz", "integrity": "sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/chai": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", - "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", - "dev": true + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/co-body": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", "integrity": "sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*" @@ -789,13 +753,15 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -804,19 +770,22 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/convert-source-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.3.tgz", "integrity": "sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/cookies": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/express": "*", @@ -828,31 +797,35 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", + "@types/express-serve-static-core": "^5.0.0", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", + "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -861,28 +834,32 @@ } }, "node_modules/@types/http-assert": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", - "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==", - "dev": true + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", + "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -892,6 +869,7 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -900,19 +878,22 @@ "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/keygrip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/koa": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", "dev": true, + "license": "MIT", "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", @@ -929,6 +910,7 @@ "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", "dev": true, + "license": "MIT", "dependencies": { "@types/koa": "*" } @@ -937,58 +919,67 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse5": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -998,6 +989,7 @@ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -1008,6 +1000,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -1019,6 +1012,7 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -1028,6 +1022,7 @@ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -1038,6 +1033,7 @@ "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.6.tgz", "integrity": "sha512-CNjNVhd4FplRY8PPWIAt02vAowJAVcOoTNrR/NNb/o9pka7yI9qdjpWrWhEbPr2pOXonWb52AeAgdK66B8ZH7w==", "dev": true, + "license": "MIT", "dependencies": { "errorstacks": "^2.2.0" }, @@ -1050,6 +1046,7 @@ "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz", "integrity": "sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.4" }, @@ -1057,26 +1054,12 @@ "node": ">=10.0.0" } }, - "node_modules/@web/config-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@web/config-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1084,17 +1067,12 @@ "node": ">=10" } }, - "node_modules/@web/config-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@web/dev-server": { "version": "0.1.38", "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.38.tgz", "integrity": "sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.11", "@types/command-line-args": "^5.0.0", @@ -1124,6 +1102,7 @@ "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", "dev": true, + "license": "MIT", "dependencies": { "@types/koa": "^2.11.6", "@types/ws": "^7.4.0", @@ -1153,6 +1132,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -1164,13 +1144,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@web/dev-server-rollup": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.4.1.tgz", "integrity": "sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/plugin-node-resolve": "^13.0.4", "@web/dev-server-core": "^0.4.1", @@ -1188,19 +1170,21 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } }, "node_modules/@web/dev-server/node_modules/command-line-usage": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", - "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", - "table-layout": "^3.0.0", + "table-layout": "^4.1.0", "typical": "^7.1.1" }, "engines": { @@ -1208,31 +1192,25 @@ } }, "node_modules/@web/dev-server/node_modules/table-layout": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", - "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "dev": true, + "license": "MIT", "dependencies": { - "@75lb/deep-merge": "^1.1.1", "array-back": "^6.2.2", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.0", - "stream-read-all": "^3.0.1", - "typical": "^7.1.1", "wordwrapjs": "^5.1.0" }, - "bin": { - "table-layout": "bin/cli.js" - }, "engines": { "node": ">=12.17" } }, "node_modules/@web/dev-server/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } @@ -1242,6 +1220,7 @@ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } @@ -1251,6 +1230,7 @@ "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.1.tgz", "integrity": "sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse5": "^6.0.1", "parse5": "^6.0.1" @@ -1264,6 +1244,7 @@ "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.15.1.tgz", "integrity": "sha512-61L4mvDSvs8Dp3TdKe7WHc8kxHndHlGheWiIFEMgbfetJua6MZ4jyPThISIHSEq3LdAv9key2aDIdmyzk0YJ6w==", "dev": true, + "license": "MIT", "dependencies": { "@web/browser-logs": "^0.2.2", "@web/config-loader": "^0.1.3", @@ -1295,6 +1276,7 @@ "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.11.0.tgz", "integrity": "sha512-3Eq8C1XEGmfq7iwUvXy0xXfI/fbJNIq2ImDKTVdnwT4+5uTt1i8UFZxZ0PLdkWrhXVtiWI6zcZK/2VBzsGyHBA==", "dev": true, + "license": "MIT", "dependencies": { "@web/test-runner-core": "^0.10.20", "@web/test-runner-coverage-v8": "^0.5.0", @@ -1310,6 +1292,7 @@ "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.5.tgz", "integrity": "sha512-W+wLg10jEAJY9N6tNWqG1daKmAzxGmTbO/H9fFfcgOgdxdn+hHiR4r2/x1iylKbFLujHUQlnjNQeu2d6eDPFqg==", "dev": true, + "license": "MIT", "dependencies": { "@web/test-runner-core": "^0.10.27", "mkdirp": "^1.0.4" @@ -1323,6 +1306,7 @@ "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.29.tgz", "integrity": "sha512-0/ZALYaycEWswHhpyvl5yqo0uIfCmZe8q14nGPi1dMmNiqLcHjyFGnuIiLexI224AW74ljHcHllmDlXK9FUKGA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.11", "@types/babel__code-frame": "^7.0.2", @@ -1359,13 +1343,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@web/test-runner-coverage-v8": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.5.0.tgz", "integrity": "sha512-4eZs5K4JG7zqWEhVSO8utlscjbVScV7K6JVwoWWcObFTGAaBMbDVzwGRimyNSzvmfTdIO/Arze4CeUUfCl4iLQ==", "dev": true, + "license": "MIT", "dependencies": { "@web/test-runner-core": "^0.10.20", "istanbul-lib-coverage": "^3.0.0", @@ -1381,6 +1367,7 @@ "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.7.5.tgz", "integrity": "sha512-12/OBq6efPCAvJpcz3XJs2OO5nHe7GtBibZ8Il1a0QtsGpRmuJ4/m1EF0Fj9f6KHg7JdpGo18A37oE+5hXjHwg==", "dev": true, + "license": "MIT", "dependencies": { "@types/mocha": "^8.2.0", "@web/test-runner-core": "^0.10.20" @@ -1394,6 +1381,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -1403,10 +1391,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1419,20 +1408,19 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "4" - }, + "license": "MIT", "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -1440,6 +1428,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1456,6 +1445,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -1471,6 +1461,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1480,6 +1471,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1492,6 +1484,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1504,13 +1497,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1520,6 +1515,7 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -1536,6 +1532,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -1556,6 +1553,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1565,6 +1563,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1583,6 +1582,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1601,6 +1601,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -1623,6 +1624,7 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1632,6 +1634,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -1641,6 +1644,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1650,6 +1654,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.14" } @@ -1666,6 +1671,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -1677,9 +1683,9 @@ } }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dev": true, "license": "MIT", "dependencies": { @@ -1692,7 +1698,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1712,13 +1719,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -1731,6 +1740,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1742,27 +1752,29 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -1778,11 +1790,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -1810,6 +1823,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1820,6 +1834,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -1829,6 +1844,7 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -1841,6 +1857,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1850,6 +1867,7 @@ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" @@ -1859,16 +1877,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" }, "engines": { "node": ">= 0.4" @@ -1882,6 +1931,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1891,6 +1941,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1903,6 +1954,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -1920,14 +1972,15 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -1942,13 +1995,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -1967,6 +2022,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1981,6 +2037,7 @@ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2" }, @@ -1996,6 +2053,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2011,6 +2069,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2027,6 +2086,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2038,13 +2098,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/chalk-template/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2054,6 +2116,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2061,11 +2124,22 @@ "node": ">=8" } }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -2078,6 +2152,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2101,13 +2176,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/chrome-launcher": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -2121,23 +2198,12 @@ "node": ">=12.13.0" } }, - "node_modules/chrome-launcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -2150,6 +2216,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -2159,21 +2226,27 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", + "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", "dev": true, + "license": "MIT", "dependencies": { + "@hapi/bourne": "^3.0.0", "inflation": "^2.0.0", "qs": "^6.5.2", "raw-body": "^2.3.3", "type-is": "^1.6.16" + }, + "engines": { + "node": ">=8.0.0" } }, "node_modules/color-convert": { @@ -2181,6 +2254,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -2189,13 +2263,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -2215,6 +2291,7 @@ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -2230,6 +2307,7 @@ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -2245,6 +2323,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2254,6 +2333,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2262,19 +2342,22 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -2287,6 +2370,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2295,13 +2379,15 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookies": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" @@ -2315,6 +2401,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -2341,15 +2428,17 @@ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dev": true, + "license": "MIT", "dependencies": { "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2360,10 +2449,11 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } @@ -2373,6 +2463,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -2386,6 +2477,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -2434,9 +2526,9 @@ } }, "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", "dev": true, "license": "MIT", "dependencies": { @@ -2452,6 +2544,7 @@ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -2469,6 +2562,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2486,6 +2580,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -2502,15 +2597,17 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2526,6 +2623,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2535,6 +2633,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -2551,6 +2650,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2563,10 +2663,11 @@ "license": "MIT" }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -2578,13 +2679,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -2593,13 +2696,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2609,6 +2714,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2626,6 +2732,7 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2635,6 +2742,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -2661,13 +2769,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2677,6 +2787,7 @@ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -2686,6 +2797,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -2695,13 +2807,15 @@ "version": "0.0.981744", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -2711,6 +2825,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -2723,6 +2838,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2730,29 +2846,48 @@ "node": ">=6.0.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.738", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", - "integrity": "sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==", - "dev": true + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2762,6 +2897,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -2784,6 +2920,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -2792,13 +2929,15 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.1.tgz", "integrity": "sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -2815,7 +2954,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -2831,10 +2970,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -2855,13 +2994,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2871,21 +3008,24 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -2898,6 +3038,7 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -2912,19 +3053,21 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -2934,10 +3077,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2946,22 +3090,29 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "8.35.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint/eslintrc": "^2.0.0", "@eslint/js": "8.35.0", @@ -3019,6 +3170,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, + "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -3038,6 +3190,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -3049,15 +3202,17 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -3075,6 +3230,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -3084,6 +3240,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -3113,6 +3270,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -3122,6 +3280,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3134,6 +3293,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3147,6 +3307,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -3165,6 +3326,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } @@ -3174,6 +3336,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3189,6 +3352,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3205,6 +3369,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3216,25 +3381,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3251,6 +3406,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3263,6 +3419,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3272,6 +3429,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3284,6 +3442,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3299,6 +3458,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3308,6 +3468,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3320,6 +3481,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3332,6 +3494,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3349,6 +3512,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3357,10 +3521,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3373,6 +3538,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3382,6 +3548,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3394,6 +3561,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3403,6 +3571,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3411,13 +3580,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -3427,6 +3598,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3436,6 +3608,7 @@ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -3456,6 +3629,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -3470,13 +3644,15 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3492,19 +3668,29 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } @@ -3514,6 +3700,7 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -3523,6 +3710,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -3532,6 +3720,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -3540,10 +3729,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3556,6 +3746,7 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^3.0.1" }, @@ -3568,6 +3759,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3584,6 +3776,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -3594,10 +3787,11 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -3625,6 +3819,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -3649,6 +3844,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3657,13 +3853,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -3671,6 +3869,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3684,6 +3883,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3693,6 +3893,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -3711,6 +3912,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3720,6 +3922,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -3729,21 +3932,28 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3757,6 +3967,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3769,6 +3980,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -3785,7 +3997,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3806,6 +4020,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3818,6 +4033,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -3830,6 +4046,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -3844,6 +4061,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3856,17 +4074,20 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -3880,6 +4101,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -3899,15 +4121,17 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3917,13 +4141,15 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3933,6 +4159,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -3942,6 +4169,7 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3951,6 +4179,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3960,6 +4189,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -3968,10 +4198,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3980,10 +4214,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3996,6 +4231,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -4011,6 +4247,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4023,6 +4260,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4035,6 +4273,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4046,7 +4285,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", @@ -4065,13 +4305,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4084,6 +4326,7 @@ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, + "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" @@ -4097,6 +4340,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -4113,6 +4357,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4131,30 +4376,18 @@ "node": ">= 14" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/iconv-lite": { @@ -4162,6 +4395,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -4187,13 +4421,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -4203,6 +4439,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4219,6 +4456,7 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4228,6 +4466,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -4237,6 +4476,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4246,6 +4486,7 @@ "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -4254,7 +4495,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4264,19 +4507,22 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -4290,13 +4536,15 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -4312,15 +4560,36 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4331,6 +4600,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -4339,13 +4609,14 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", + "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4359,6 +4630,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -4374,6 +4646,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4382,23 +4655,30 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -4413,6 +4693,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4428,6 +4709,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -4443,15 +4725,33 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4461,6 +4761,7 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4476,6 +4777,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4483,17 +4785,32 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4506,17 +4823,20 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4530,6 +4850,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4539,6 +4860,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4548,6 +4870,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4560,13 +4883,16 @@ "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4575,11 +4901,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -4595,6 +4935,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4603,12 +4944,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4618,12 +4961,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", + "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.7", + "has-symbols": "^1.0.3", + "safe-regex-test": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4637,6 +4983,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -4647,11 +4994,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -4659,11 +5020,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -4675,13 +5054,15 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz", + "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18.0.0" }, @@ -4693,13 +5074,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -4709,6 +5092,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -4723,6 +5107,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4732,6 +5117,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4744,6 +5130,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -4757,6 +5144,7 @@ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -4766,13 +5154,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -4821,37 +5211,10 @@ } } }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/jsdom/node_modules/parse5": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", - "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4875,9 +5238,9 @@ } }, "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", "dev": true, "license": "MIT", "dependencies": { @@ -4911,46 +5274,52 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -4962,13 +5331,15 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keygrip": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, + "license": "MIT", "dependencies": { "tsscmp": "1.0.6" }, @@ -4981,6 +5352,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -4990,6 +5362,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4998,13 +5371,15 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/koa": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -5038,13 +5413,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/koa-convert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, + "license": "MIT", "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" @@ -5058,6 +5435,7 @@ "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz", "integrity": "sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==", "dev": true, + "license": "MIT", "dependencies": { "etag": "^1.8.1" } @@ -5067,6 +5445,7 @@ "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "http-errors": "^1.7.3", @@ -5081,6 +5460,7 @@ "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.1.0", "koa-send": "^5.0.0" @@ -5094,6 +5474,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -5103,6 +5484,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5116,6 +5498,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -5126,6 +5509,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5134,19 +5518,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5161,43 +5548,43 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", @@ -5216,6 +5603,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -5225,6 +5613,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -5234,6 +5623,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -5244,26 +5634,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5271,17 +5647,12 @@ "node": ">=10" } }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5293,13 +5664,25 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5309,13 +5692,15 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5325,6 +5710,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -5351,6 +5737,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5363,17 +5750,19 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5385,6 +5774,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5394,6 +5784,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5406,6 +5797,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5415,6 +5807,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5424,6 +5817,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5436,6 +5830,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5445,6 +5840,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -5459,6 +5855,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -5470,24 +5867,27 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanocolors": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -5495,6 +5895,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5506,13 +5907,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5522,6 +5925,7 @@ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0", "@sinonjs/fake-timers": "^11.2.2", @@ -5535,17 +5939,29 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/nise/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/node-fetch": { @@ -5553,6 +5969,7 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5572,35 +5989,40 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -5611,26 +6033,12 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5638,33 +6046,32 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "dev": true, "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5674,6 +6081,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5683,6 +6091,7 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -5701,6 +6110,7 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5715,6 +6125,7 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5732,6 +6143,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -5744,6 +6156,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -5753,6 +6166,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5774,6 +6188,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -5787,17 +6202,18 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -5808,6 +6224,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -5823,6 +6240,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -5838,6 +6256,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5847,6 +6266,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -5859,6 +6279,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -5876,13 +6297,15 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5892,6 +6315,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5901,6 +6325,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5910,6 +6335,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5918,19 +6344,22 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5940,6 +6369,7 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -5948,19 +6378,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5973,6 +6406,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -5985,6 +6419,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -5998,6 +6433,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -6010,6 +6446,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6025,6 +6462,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -6037,6 +6475,7 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, + "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -6051,6 +6490,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -6060,6 +6500,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -6072,14 +6513,15 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -6095,10 +6537,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -6108,19 +6551,22 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" }, @@ -6133,10 +6579,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6149,13 +6596,15 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -6165,6 +6614,7 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -6173,13 +6623,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6190,6 +6642,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6199,6 +6652,7 @@ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "cross-fetch": "3.1.5", "debug": "4.3.4", @@ -6217,11 +6671,64 @@ "node": ">=10.18.1" } }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/puppeteer-core/node_modules/ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6239,10 +6746,11 @@ } }, "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -6271,13 +6779,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6287,6 +6797,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -6302,6 +6813,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -6318,6 +6830,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6327,6 +6840,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -6342,6 +6856,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -6359,6 +6874,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6372,6 +6888,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -6384,6 +6901,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6399,6 +6917,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -6411,6 +6930,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -6419,13 +6939,15 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -6438,6 +6960,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -6447,6 +6970,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -6456,6 +6980,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6470,6 +6995,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -6482,6 +7008,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -6495,20 +7022,45 @@ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", + "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "dunder-proto": "^1.0.0", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6522,6 +7074,7 @@ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6534,6 +7087,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6543,6 +7097,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6560,6 +7115,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6569,6 +7125,7 @@ "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", "dev": true, + "license": "MIT", "dependencies": { "http-errors": "~1.6.2", "path-is-absolute": "1.0.1" @@ -6582,6 +7139,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6591,6 +7149,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -6605,19 +7164,22 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/resolve-path/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -6631,6 +7193,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -6640,7 +7203,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -6652,10 +7217,11 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -6692,19 +7258,22 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -6732,13 +7301,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -6755,7 +7326,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/saxes": { "version": "6.0.0", @@ -6775,6 +7347,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -6784,6 +7357,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6801,6 +7375,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6815,13 +7390,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6834,20 +7411,79 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6860,7 +7496,8 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sinon": { "version": "15.0.1", @@ -6868,6 +7505,7 @@ "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", "deprecated": "16.1.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "10.0.2", @@ -6886,6 +7524,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6895,6 +7534,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6907,6 +7547,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6916,6 +7557,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -6933,6 +7575,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6948,6 +7591,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6959,22 +7603,25 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6984,6 +7631,7 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -6993,47 +7641,43 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/stream-read-all": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", - "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -7043,6 +7687,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7053,15 +7698,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7071,15 +7720,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7089,6 +7743,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7106,6 +7761,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7118,6 +7774,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7127,6 +7784,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -7139,6 +7797,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7150,13 +7809,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/stylelint": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", "integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", "dev": true, + "license": "MIT", "dependencies": { "@csstools/css-parser-algorithms": "^2.0.1", "@csstools/css-tokenizer": "^2.0.1", @@ -7217,6 +7878,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-10.0.1.tgz", "integrity": "sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==", "dev": true, + "license": "MIT", "peerDependencies": { "stylelint": "^15.0.0" } @@ -7226,6 +7888,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-30.0.1.tgz", "integrity": "sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==", "dev": true, + "license": "MIT", "dependencies": { "stylelint-config-recommended": "^10.0.1" }, @@ -7237,13 +7900,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7253,6 +7918,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -7265,6 +7931,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -7278,6 +7945,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7287,6 +7955,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7299,6 +7968,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7320,10 +7990,11 @@ "license": "MIT" }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -7340,6 +8011,7 @@ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -7355,6 +8027,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7364,20 +8037,22 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -7388,13 +8063,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -7407,6 +8084,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -7422,48 +8100,42 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tldts": { - "version": "6.1.54", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.54.tgz", - "integrity": "sha512-rDaL1t59gb/Lg0HPMUGdV1vAKLQcXwU74D26aMaYV4QW7mnMvShd1Vmkg3HYAPWx2JCTUmsrXt/Yl9eJ5UFBQw==", + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.67.tgz", + "integrity": "sha512-714VbegxoZ9WF5/IsVCy9rWXKUpPkJq87ebWLXQzNawce96l5oRrRf2eHzB4pT2g/4HQU1dYbu+sdXClYxlDKQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.54" + "tldts-core": "^6.1.67" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.54", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.54.tgz", - "integrity": "sha512-5cc42+0G0EjYRDfIJHKraaT3I5kPm7j6or3Zh1T9sF+Ftj1T+isT4thicUyQQ1bwN7/xjHQIuY2fXCoXP8Haqg==", + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.67.tgz", + "integrity": "sha512-12K5O4m3uUW6YM5v45Z7wc6NTSmAYj4Tq3de7eXghZkp879IlfPJrUWeWFwu1FS94U5t2vwETgJ1asu8UGNKVQ==", "dev": true, "license": "MIT" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7476,6 +8148,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -7498,6 +8171,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -7510,6 +8184,7 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7519,6 +8194,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -7531,6 +8207,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7543,6 +8220,7 @@ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.x" } @@ -7552,6 +8230,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7560,10 +8239,11 @@ } }, "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7573,6 +8253,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7585,6 +8266,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -7598,6 +8280,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7612,6 +8295,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -7627,17 +8311,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -7647,17 +8333,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -7671,6 +8358,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7680,6 +8368,7 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -7695,30 +8384,33 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -7734,9 +8426,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -7750,6 +8443,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -7758,19 +8452,22 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-compile-cache": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -7784,13 +8481,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -7801,6 +8500,7 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7823,6 +8523,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } @@ -7868,6 +8569,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -7881,6 +8583,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -7892,26 +8595,78 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -7926,11 +8681,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "license": "MIT", "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -7944,6 +8710,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7953,6 +8720,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7967,6 +8735,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7982,6 +8751,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7993,19 +8763,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -8019,6 +8792,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -8027,10 +8801,11 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -8068,13 +8843,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -8084,6 +8861,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -8094,6 +8872,7 @@ "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -8103,6 +8882,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, From c6ad1963daaf03c7f064e4b47bf41b51f08878ea Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 12 Dec 2024 14:45:52 +0200 Subject: [PATCH 179/248] lint fix --- .../scuderia-ferrari-section.css | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index fe272d140..943c539b4 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -18,14 +18,10 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.quotes-left{ align-items: baseline; text-align: left; - + div{ justify-content: flex-end; } - - p:last-of-type{ - line-height: 1.23; - } } .scuderia-ferrari-section.quotes-right{ @@ -37,8 +33,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper div{ align-items: end; } - - p:last-of-type, p:nth-last-of-type(2){ + p:nth-last-of-type(2){ line-height: 1.23; font-size: 12px; } @@ -61,16 +56,17 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper z-index: 1; padding: 0; } - + p{ font-size: 24px; } - + p strong{ font-size: 16px; } p:last-of-type{ + line-height: 1.23; font-size: 12px; } From a1c185bb15487d17d1332d3eb34256a998a0880d Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 12 Dec 2024 14:49:30 +0200 Subject: [PATCH 180/248] scuderia lint fix --- .../scuderia-ferrari-section.css | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index 943c539b4..86d65db18 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -18,7 +18,10 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper .scuderia-ferrari-section.quotes-left{ align-items: baseline; text-align: left; - + p{ + font-size: 24px; + } + div{ justify-content: flex-end; } @@ -33,6 +36,11 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper div{ align-items: end; } + + p{ + font-size: 24px; + } + p:nth-last-of-type(2){ line-height: 1.23; font-size: 12px; From b944f69b9bd482613154cbbc7be714ac3eea16a3 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 12 Dec 2024 14:55:12 +0200 Subject: [PATCH 181/248] refactored scuderia css to fix descending specificity --- .../scuderia-ferrari-section.css | 141 +++++++++--------- 1 file changed, 73 insertions(+), 68 deletions(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index 86d65db18..4870b034b 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -15,88 +15,93 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } } -.scuderia-ferrari-section.quotes-left{ - align-items: baseline; - text-align: left; - p{ - font-size: 24px; - } - - div{ - justify-content: flex-end; - } -} +.scuderia-ferrari-section { + &.quotes-left { + align-items: baseline; + text-align: left; -.scuderia-ferrari-section.quotes-right{ - display: inline-flex; - text-align: right; - align-items: end; - justify-content: right; + p { + font-size: 24px; + } - div{ - align-items: end; + div { + justify-content: flex-end; + } } - p{ - font-size: 24px; - } + &.quotes-right { + display: inline-flex; + text-align: right; + align-items: end; + justify-content: right; - p:nth-last-of-type(2){ - line-height: 1.23; - font-size: 12px; - } -} + div { + align-items: end; + } -.scuderia-ferrari-section.quotes-left, .scuderia-ferrari-section.quotes-right{ - width: 100%; - background-color: #FF2800; - padding: 20px; - flex-flow: column; + p { + font-size: 24px; - div{ - padding: 10px; + &:nth-last-of-type(2) { + line-height: 1.23; + font-size: 12px; + } + } } - - >div{ - display: flex; + + /* Shared styles for quotes sections */ + &.quotes-left, + &.quotes-right { + width: 100%; + background-color: #FF2800; + padding: 20px; flex-flow: column; - justify-content: center; - z-index: 1; - padding: 0; - } - - p{ - font-size: 24px; - } - p strong{ - font-size: 16px; - } + div { + padding: 10px; - p:last-of-type{ - line-height: 1.23; - font-size: 12px; - } + &:last-of-type { + max-width: 80%; + } + } - h2{ - line-height: 0.66; - } + > div { + display: flex; + flex-flow: column; + justify-content: center; + z-index: 1; + padding: 0; + } - img{ - display: block; - position: absolute; - top: 0; - bottom: auto; - left: 0; - right: 0; - height: 100%; - width: 100%; - object-fit: cover; - z-index: 0; - } + p { + font-size: 24px; + + strong { + font-size: 16px; + } + + &:last-of-type { + line-height: 1.23; + font-size: 12px; + } + } - div:last-of-type{ - max-width: 80%; + h2 { + line-height: 0.66; + } + + img { + display: block; + position: absolute; + top: 0; + bottom: auto; + left: 0; + right: 0; + height: 100%; + width: 100%; + object-fit: cover; + z-index: 0; + } } } From ff46c245c04d3bdc200903aa7901e01e683c619a Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 12 Dec 2024 15:10:25 +0200 Subject: [PATCH 182/248] lint fix --- .../scuderia-ferrari-section.css | 144 +++++++++--------- 1 file changed, 75 insertions(+), 69 deletions(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index 4870b034b..ac3434ec6 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -15,96 +15,102 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } } -.scuderia-ferrari-section { - &.quotes-left { - align-items: baseline; - text-align: left; +.scuderia-ferrari-section.quotes-left { + align-items: baseline; + text-align: left; - p { - font-size: 24px; - } + > div { + display: flex; + flex-flow: column; + justify-content: center; + z-index: 1; + padding: 0; + } - div { - justify-content: flex-end; - } + div { + justify-content: flex-end; + padding: 10px; } - &.quotes-right { - display: inline-flex; - text-align: right; - align-items: end; - justify-content: right; + div:last-of-type { + max-width: 80%; + } - div { - align-items: end; - } + p { + font-size: 24px; + } +} - p { - font-size: 24px; +.scuderia-ferrari-section.quotes-right { + display: inline-flex; + text-align: right; + align-items: end; + justify-content: right; - &:nth-last-of-type(2) { - line-height: 1.23; - font-size: 12px; - } - } + > div { + display: flex; + flex-flow: column; + justify-content: center; + z-index: 1; + padding: 0; } - /* Shared styles for quotes sections */ - &.quotes-left, - &.quotes-right { - width: 100%; - background-color: #FF2800; - padding: 20px; - flex-flow: column; + div { + align-items: end; + padding: 10px; + } - div { - padding: 10px; + div:last-of-type { + max-width: 80%; + } - &:last-of-type { - max-width: 80%; - } - } + p { + font-size: 24px; + } - > div { - display: flex; - flex-flow: column; - justify-content: center; - z-index: 1; - padding: 0; - } + p:nth-last-of-type(2) { + line-height: 1.23; + font-size: 12px; + } +} - p { - font-size: 24px; +.scuderia-ferrari-section.quotes-left, +.scuderia-ferrari-section.quotes-right { + width: 100%; + background-color: #FF2800; + padding: 20px; + flex-flow: column; - strong { - font-size: 16px; - } + p { + font-size: 24px; - &:last-of-type { - line-height: 1.23; - font-size: 12px; - } + strong { + font-size: 16px; } - h2 { - line-height: 0.66; + &:last-of-type { + line-height: 1.23; + font-size: 12px; } + } - img { - display: block; - position: absolute; - top: 0; - bottom: auto; - left: 0; - right: 0; - height: 100%; - width: 100%; - object-fit: cover; - z-index: 0; - } + h2 { + line-height: 0.66; } -} + img { + display: block; + position: absolute; + top: 0; + bottom: auto; + left: 0; + right: 0; + height: 100%; + width: 100%; + object-fit: cover; + z-index: 0; + } +} .scuderia-ferrari-section.video-block{ display: flex; From 52b3f3d5bb9f118753c21897b47276b95c062bc9 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 12 Dec 2024 15:20:55 +0200 Subject: [PATCH 183/248] lint fix --- .../scuderia-ferrari-section.css | 57 +++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index ac3434ec6..43a4f40ce 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -16,6 +16,11 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } .scuderia-ferrari-section.quotes-left { + width: 100%; + background-color: #FF2800; + padding: 20px; + flex-flow: column; + display: flex; align-items: baseline; text-align: left; @@ -38,10 +43,40 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper p { font-size: 24px; + + strong { + font-size: 16px; + } + + &:last-of-type { + line-height: 1.23; + font-size: 12px; + } + } + + h2 { + line-height: 0.66; + } + + img { + display: block; + position: absolute; + top: 0; + bottom: auto; + left: 0; + right: 0; + height: 100%; + width: 100%; + object-fit: cover; + z-index: 0; } } .scuderia-ferrari-section.quotes-right { + width: 100%; + background-color: #FF2800; + padding: 20px; + flex-flow: column; display: inline-flex; text-align: right; align-items: end; @@ -64,23 +99,6 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper max-width: 80%; } - p { - font-size: 24px; - } - - p:nth-last-of-type(2) { - line-height: 1.23; - font-size: 12px; - } -} - -.scuderia-ferrari-section.quotes-left, -.scuderia-ferrari-section.quotes-right { - width: 100%; - background-color: #FF2800; - padding: 20px; - flex-flow: column; - p { font-size: 24px; @@ -110,6 +128,11 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper object-fit: cover; z-index: 0; } + + p:nth-last-of-type(2) { + line-height: 1.23; + font-size: 12px; + } } .scuderia-ferrari-section.video-block{ From b6d496ef28eab46a2f8764bb41445305ce4886d4 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 12 Dec 2024 16:34:49 +0200 Subject: [PATCH 184/248] added extra case for de-de domain and soho product --- _src/scripts/libs/store/store.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index e9f6dc829..17a7f9726 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -717,7 +717,10 @@ class Vlaicu { const pathVariablesResolverObject = { "{locale}": Page.locale, "{bundleId}": productId, - "{campaignId}": this.campaign + "{campaignId}": campaign !== Constants.NO_PROMOTION && + Page.locale === 'de-de' && productId === 'com.bitdefender.soho' ? + campaign : + this.campaign }; // get the correct path to get the prices From 9659acb88e2056d4af94bc8b17f1b3f23cfd5c49 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Fri, 13 Dec 2024 11:36:12 +0200 Subject: [PATCH 185/248] prepared the locale for the soho product on de-de --- _src/scripts/libs/store/store.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 17a7f9726..0aff78bbc 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -715,10 +715,12 @@ class Vlaicu { static campaign = "WINTERMCWEB24"; static async getProductVariations(productId, campaign) { const pathVariablesResolverObject = { - "{locale}": Page.locale, + "{locale}": Page.locale === "de-de" && productId === "com.bitdefender.soho" ? + "" : + Page.locale, "{bundleId}": productId, "{campaignId}": campaign !== Constants.NO_PROMOTION && - Page.locale === 'de-de' && productId === 'com.bitdefender.soho' ? + Page.locale === "de-de" && productId === "com.bitdefender.soho" ? campaign : this.campaign }; From edf17e2b9ccf9b4d11681149e7a98faffb565ff0 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Fri, 13 Dec 2024 11:41:03 +0200 Subject: [PATCH 186/248] added correct locale for soho call on de --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 0aff78bbc..8cf00cf41 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -716,7 +716,7 @@ class Vlaicu { static async getProductVariations(productId, campaign) { const pathVariablesResolverObject = { "{locale}": Page.locale === "de-de" && productId === "com.bitdefender.soho" ? - "" : + "en-mt" : Page.locale, "{bundleId}": productId, "{campaignId}": campaign !== Constants.NO_PROMOTION && From 096cdc66bf76d944ad1afc6a81adfc18621b8ffb Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Fri, 13 Dec 2024 12:10:02 +0200 Subject: [PATCH 187/248] made corner case for SOHO on de --- _src/scripts/libs/constants.js | 5 ++++- _src/scripts/libs/store/store.js | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 88bea0063..9d51a5367 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -112,5 +112,8 @@ export const Constants = { LOGIN_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) ? window.location.origin : 'https://www.bitdefender.com', - NO_PROMOTION: "ignore" + NO_PROMOTION: "ignore", + + // TODO: please remove this once digital river starts working correctly + SOHO_CORNER_CASES_LOCALSE: ["de-de", "de-at", "de-ch"] } \ No newline at end of file diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 0a3998bbb..bccd340b4 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -709,16 +709,27 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - static async getProductVariations(productId, campaign) { + /** + * TODO: please remove this function and all its calls once digital river works correctly + * @param {string} productId + * @returns {boolean} -> check if the product is soho and the domain is de-de + */ + static #isSohoCornerCase = (productId) => + Constants.SOHO_CORNER_CASES_LOCALSE.includes(Page.locale) && productId === "com.bitdefender.soho" + static async getProductVariations(productId, campaign) { const pathVariablesResolverObject = { - "{locale}": Page.locale, + // TODO: please remove the ternary operators below and only use Page.locale + // and campaign once digital river works correctly + "{locale}": this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale, "{bundleId}": productId, - "{campaignId}": campaign + "{campaignId}": this.#isSohoCornerCase(productId) ? "SOHO_DE" : campaign }; // get the correct path to get the prices - let productPath = campaign !== Constants.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + let productPath = campaign !== Constants.NO_PROMOTION || this.#isSohoCornerCase(productId) ? + this.promotionPath : + this.defaultPromotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); From 797f29ff13c563ebcd57b67e1db8da4facb8fc0a Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 16 Dec 2024 11:56:01 +0200 Subject: [PATCH 188/248] added correct ids --- _src/scripts/libs/constants.js | 8 ++++---- _src/scripts/libs/store/store.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 9d51a5367..592f8f5d2 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -55,10 +55,10 @@ export const Constants = { us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', us_f: 'com.bitdefender.ultimatesecurityeu.v2', us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pi: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pi_m: 'com.bitdefender.ultimatesecurityplusus.v2', + us_pf: 'com.bitdefender.ultimatesecurityus.v2', + us_pf_m: 'com.bitdefender.ultimatesecurityus.v2', + us_pi: 'com.bitdefender.ultimatesecurityus.v2', + us_pi_m: 'com.bitdefender.ultimatesecurityus.v2', us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index bccd340b4..e597bd405 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -446,7 +446,7 @@ export class Product { let buyLink = new URL(yearsOption.buyLink); buyLink.searchParams.set("SHOPURL", `${window.location.origin}/${window.location.pathname.split('/')[1]}/`); - buyLink.searchParams.set("REF", this.promotion && this.promotion !== Store.NO_PROMOTION ? this.promotion : "N/A"); + buyLink.searchParams.set("REF", this.promotion && this.promotion !== Store.NO_PROMOTION ? `WEBSITES_${this.promotion}` : "N/A"); buyLink.searchParams.set("SRC", `${window.location.origin}${window.location.pathname}`); // replace the buy links with target links if they exist and return the option From 6c4b414c85a3fa3f2684394ea1e5571573da275b Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 16 Dec 2024 13:15:52 +0200 Subject: [PATCH 189/248] update hero banner img --- _src/blocks/hero/hero.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index 4f1c835c1..8d80e90fe 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -333,13 +333,12 @@ main .hero p.button-container.discount-bubble-container { } main .hero img { - object-fit: cover; - width: 100%; height: 100%; } main .hero .hero-picture picture img { position: absolute; + right: 0; /* display: none; */ padding-left: 200px; From 303ab9b2dbcf488392497c99deedc83546c309e9 Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 16 Dec 2024 13:19:18 +0200 Subject: [PATCH 190/248] update --- _src/blocks/hero/hero.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index 3d266332f..4ad944a51 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -346,6 +346,7 @@ main .hero p.button-container.discount-bubble-container { main .hero img { height: 100%; + max-width: unset; } main .hero .hero-picture picture img { From a874b52b9d05940938d00620c876058d9bb3c9ac Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 16 Dec 2024 13:19:31 +0200 Subject: [PATCH 191/248] lint errors fixes --- .../scuderia-ferrari-section.css | 92 +++++-------------- 1 file changed, 24 insertions(+), 68 deletions(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index 43a4f40ce..e28a1f6cd 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -15,15 +15,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } } -.scuderia-ferrari-section.quotes-left { - width: 100%; - background-color: #FF2800; - padding: 20px; - flex-flow: column; - display: flex; - align-items: baseline; - text-align: left; - +.scuderia-ferrari-section.quotes-right, .scuderia-ferrari-section.quotes-left { > div { display: flex; flex-flow: column; @@ -32,15 +24,6 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper padding: 0; } - div { - justify-content: flex-end; - padding: 10px; - } - - div:last-of-type { - max-width: 80%; - } - p { font-size: 24px; @@ -54,10 +37,6 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } } - h2 { - line-height: 0.66; - } - img { display: block; position: absolute; @@ -70,6 +49,28 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper object-fit: cover; z-index: 0; } + + h2 { + line-height: 0.66; + } + + div { + padding: 10px; + + &:last-of-type { + max-width: 80%; + } + } +} + +.scuderia-ferrari-section.quotes-left { + width: 100%; + background-color: #FF2800; + padding: 20px; + flex-flow: column; + display: flex; + align-items: baseline; + text-align: left; } .scuderia-ferrari-section.quotes-right { @@ -82,51 +83,8 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper align-items: end; justify-content: right; - > div { - display: flex; - flex-flow: column; - justify-content: center; - z-index: 1; - padding: 0; - } - - div { - align-items: end; - padding: 10px; - } - div:last-of-type { - max-width: 80%; - } - - p { - font-size: 24px; - - strong { - font-size: 16px; - } - - &:last-of-type { - line-height: 1.23; - font-size: 12px; - } - } - - h2 { - line-height: 0.66; - } - - img { - display: block; - position: absolute; - top: 0; - bottom: auto; - left: 0; - right: 0; - height: 100%; - width: 100%; - object-fit: cover; - z-index: 0; + align-items: end; } p:nth-last-of-type(2) { @@ -303,8 +261,6 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper } .scuderia-ferrari-section.quotes-right{ - align-items: center; - p:nth-last-of-type(2){ font-size: 26px; font-weight: 400; From a3798c24ef4ca1ca1aea0f883ad40fdad3a9926c Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 16 Dec 2024 13:29:50 +0200 Subject: [PATCH 192/248] Readd a function --- _src/scripts/utils/utils.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/_src/scripts/utils/utils.js b/_src/scripts/utils/utils.js index dbcb4feaa..097745203 100644 --- a/_src/scripts/utils/utils.js +++ b/_src/scripts/utils/utils.js @@ -828,6 +828,15 @@ export function getBrowserName() { return 'Unknown'; } +/** + * Returns the value of a query parameter + * @returns {String} + */ +export function getParamValue(param) { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.get(param); +} + export function decorateBlockWithRegionId(element, id) { // we could consider to use `element.setAttribute('s-object-region', id);` in the future if (element) element.id = id; From 9e35215667112ca4b9b9761a248456b00fba51a8 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 16 Dec 2024 15:28:04 +0200 Subject: [PATCH 193/248] fixed missing bundle ids --- _src/blocks/products-sideview/products-sideview.js | 4 ++-- _src/scripts/libs/constants.js | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/_src/blocks/products-sideview/products-sideview.js b/_src/blocks/products-sideview/products-sideview.js index bfff5e412..6bb60ae0c 100644 --- a/_src/blocks/products-sideview/products-sideview.js +++ b/_src/blocks/products-sideview/products-sideview.js @@ -140,14 +140,14 @@ function updateBuyLink(block) { } function renderPrice(block, _firstProduct, secondProduct) { - const variant = '5-1'; + const variant = '7-1'; const priceElement = document.createElement('div'); priceElement.classList.add('price-element-wrapper'); const oldPrice = document.createElement('div'); oldPrice.classList.add('prod-oldprice', 'await-loader'); oldPrice.setAttribute('data-store-price', 'full'); - oldPrice.setAttribute('data-store-hide', 'data-store-hide="no-price=discounted"'); + oldPrice.setAttribute('data-store-hide', 'no-price=discounted'); const el = document.createElement('DIV'); el.classList.add('price'); diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index 592f8f5d2..af284a9fe 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -64,7 +64,11 @@ export const Constants = { us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', secpass: 'com.bitdefender.securepass', - secpassm: 'com.bitdefender.securepass' + secpassm: 'com.bitdefender.securepass', + vsb: 'com.bitdefender.vsb', + vsbm: 'com.bitdefender.vsb', + sc: 'com.bitdefender.ccp', + scm: 'com.bitdefender.ccp' }, PRODUCT_ID_NAME_MAPPINGS: { @@ -74,7 +78,7 @@ export const Constants = { pass_spm: "Bitdefender Password Manager Shared Plan" }, - MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm", "secpassm"], + MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm", "secpassm", "vsbm", "scm"], WRONG_DEVICES_PRODUCT_IDS: { 'pass_sp': { From d964a5130681cdea96f7f9b839b5792b728af70d Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Mon, 16 Dec 2024 15:36:48 +0200 Subject: [PATCH 194/248] update --- _src/blocks/hero/hero.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index 4ad944a51..c334c29bf 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -345,8 +345,8 @@ main .hero p.button-container.discount-bubble-container { } main .hero img { + object-fit: cover; height: 100%; - max-width: unset; } main .hero .hero-picture picture img { From 605bd1d0c6c906bff599d588461b38046b6e2dfc Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 16 Dec 2024 15:55:45 +0200 Subject: [PATCH 195/248] fixed data layer --- _src/blocks/products-sideview/products-sideview.js | 2 +- _src/scripts/libs/store/store.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/blocks/products-sideview/products-sideview.js b/_src/blocks/products-sideview/products-sideview.js index 6bb60ae0c..f28b74a97 100644 --- a/_src/blocks/products-sideview/products-sideview.js +++ b/_src/blocks/products-sideview/products-sideview.js @@ -140,7 +140,7 @@ function updateBuyLink(block) { } function renderPrice(block, _firstProduct, secondProduct) { - const variant = '7-1'; + const variant = '12-1'; const priceElement = document.createElement('div'); priceElement.classList.add('price-element-wrapper'); diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index e597bd405..162cee29f 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -809,7 +809,7 @@ class Vlaicu { const devicesObj = { currency_iso: productVariation.currency, product_id: Constants.PRODUCT_ID_MAPPINGS[id], - platform_product_id: Constants.PRODUCT_ID_MAPPINGS[id], + platform_product_id: productInfoResponse.platformProductId || Constants.PRODUCT_ID_MAPPINGS[id], promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, From f716372027ffedd7aad8b9919f19e1949c6ffb46 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Mon, 16 Dec 2024 16:29:40 +0200 Subject: [PATCH 196/248] reverte to old base variant --- _src/blocks/products-sideview/products-sideview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/products-sideview/products-sideview.js b/_src/blocks/products-sideview/products-sideview.js index f28b74a97..c183dec24 100644 --- a/_src/blocks/products-sideview/products-sideview.js +++ b/_src/blocks/products-sideview/products-sideview.js @@ -140,7 +140,7 @@ function updateBuyLink(block) { } function renderPrice(block, _firstProduct, secondProduct) { - const variant = '12-1'; + const variant = '5-1'; const priceElement = document.createElement('div'); priceElement.classList.add('price-element-wrapper'); From cc254fd7f6b78fa73791aaf5cd86851c4707defb Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 16 Dec 2024 17:20:01 +0200 Subject: [PATCH 197/248] Refactor hero.css to remove unnecessary position property from half-width picture container --- _src/blocks/hero/hero.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index 11f76981e..775abc51c 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -557,8 +557,6 @@ main .smaller_icon .hero .hero-content>div table tr td:first-of-type { } .hero-container.half-width-picture .hero-picture picture { - position: relative; - &::after { content: ''; position: absolute; From 12c7a61fb21edc9ae9c56adb79faf435781d2493 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 17 Dec 2024 15:09:44 +0200 Subject: [PATCH 198/248] Refactor campaign handling in Vlaicu class to remove hardcoded value and improve path resolution logic --- _src/scripts/libs/store/store.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 11cc1ee39..a7cc54377 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -709,7 +709,6 @@ class Vlaicu { static defaultPromotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}"; static promotionPath = "/p-api/v1/products/{bundleId}/locale/{locale}/campaign/{campaignId}"; - static campaign = "WINTERMCWEB24"; /** * TODO: please remove this function and all its calls once digital river works correctly @@ -725,11 +724,11 @@ class Vlaicu { // and campaign once digital river works correctly "{locale}": this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale, "{bundleId}": productId, - "{campaignId}": this.#isSohoCornerCase(productId) ? "SOHO_DE" : this.campaign + "{campaignId}": this.#isSohoCornerCase(productId) ? "SOHO_DE" : campaign }; // get the correct path to get the prices - let productPath = this.promotionPath + let productPath = campaign !== Constants.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); From 278a44829348a9cbaca82c4ffe57a6c7f5bb0899 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 17 Dec 2024 15:29:17 +0200 Subject: [PATCH 199/248] test locale --- _src/scripts/libs/store/store.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index a7cc54377..d873e7fd3 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -719,10 +719,15 @@ class Vlaicu { Constants.SOHO_CORNER_CASES_LOCALSE.includes(Page.locale) && productId === "com.bitdefender.soho" static async getProductVariations(productId, campaign) { + let locale = this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale; + let geoIpFlag = await Target.getOffer('vlaicu-flag-mbox').geoIpPrice; + if (geoIpFlag) { + locale = await User.locale; + } const pathVariablesResolverObject = { // TODO: please remove the ternary operators below and only use Page.locale // and campaign once digital river works correctly - "{locale}": this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale, + "{locale}": locale, "{bundleId}": productId, "{campaignId}": this.#isSohoCornerCase(productId) ? "SOHO_DE" : campaign }; From ca5da3b706e941963c12128b8da6e465e7f85e07 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 17 Dec 2024 15:48:53 +0200 Subject: [PATCH 200/248] Fix geoIpFlag assignment to correctly access geoIpPrice from the offer response --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index d873e7fd3..9bf9e6eed 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -720,7 +720,7 @@ class Vlaicu { static async getProductVariations(productId, campaign) { let locale = this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale; - let geoIpFlag = await Target.getOffer('vlaicu-flag-mbox').geoIpPrice; + let geoIpFlag = await Target.getOffer('vlaicu-flag-mbox')[0].content.geoIpPrice; if (geoIpFlag) { locale = await User.locale; } From 52a8be7c8d635123533a044eaf9da3dbf3513e8a Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 17 Dec 2024 16:10:11 +0200 Subject: [PATCH 201/248] Fix geoIpFlag assignment to correctly access geoIpPrice from the offer response --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 9bf9e6eed..c796dac69 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -720,7 +720,7 @@ class Vlaicu { static async getProductVariations(productId, campaign) { let locale = this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale; - let geoIpFlag = await Target.getOffer('vlaicu-flag-mbox')[0].content.geoIpPrice; + let geoIpFlag = await Target.getOffer('vlaicu-flag-mbox').content.geoIpPrice; if (geoIpFlag) { locale = await User.locale; } From b0a362c095e1bd99df8ed505895b65887bfa7e27 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 18 Dec 2024 14:56:22 +0200 Subject: [PATCH 202/248] Add method to retrieve geoIpPrice from offer response and update product variations logic --- _src/scripts/libs/store/store.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index c796dac69..7b75d193d 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -718,9 +718,19 @@ class Vlaicu { static #isSohoCornerCase = (productId) => Constants.SOHO_CORNER_CASES_LOCALSE.includes(Page.locale) && productId === "com.bitdefender.soho" + static $getGeoIpFlag = async () => { + const offer = await Target.getOffer('vlaicu-flag-mbox'); + + if (offer && offer.content && typeof offer.content.geoIpPrice !== 'undefined') { + return offer.content.geoIpPrice; + } + + return null; + } + static async getProductVariations(productId, campaign) { let locale = this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale; - let geoIpFlag = await Target.getOffer('vlaicu-flag-mbox').content.geoIpPrice; + let geoIpFlag = await this.$getGeoIpFlag(); if (geoIpFlag) { locale = await User.locale; } From 2bd893664cb28648f71efd52335898363c496883 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 18 Dec 2024 15:53:59 +0200 Subject: [PATCH 203/248] Fix formatting in mbox-canvas.js import statements --- _src/blocks/mbox-canvas/mbox-canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index 62557f001..0fe859879 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -1,5 +1,5 @@ import { Target } from '../../scripts/libs/data-layer.js'; -import { decorateMain , detectModalButtons } from '../../scripts/scripts.js'; +import { decorateMain, detectModalButtons } from '../../scripts/scripts.js'; import { loadBlocks } from '../../scripts/lib-franklin.js'; function decorateHTMLOffer(aemHeaderHtml) { From e0705b2cf9883d474f349acc8c2f94e4190281fd Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Wed, 18 Dec 2024 15:59:31 +0200 Subject: [PATCH 204/248] added config in Franklin for product ids --- _src/blocks/products/products.js | 2 +- _src/scripts/libs/constants.js | 189 +++++++++--------- .../globalTextVariable.js | 4 +- _src/scripts/libs/store/store.js | 67 ++----- _src/scripts/scripts.js | 2 + 5 files changed, 118 insertions(+), 146 deletions(-) diff --git a/_src/blocks/products/products.js b/_src/blocks/products/products.js index 4661fe452..e4dff1cea 100644 --- a/_src/blocks/products/products.js +++ b/_src/blocks/products/products.js @@ -45,7 +45,7 @@ function renderPlanSelector(plans, defaultSelection) { liStoreParameters['data-store-click-set-product'] = ''; liStoreParameters['data-store-product-id'] = productCode; liStoreParameters['data-store-department'] = 'consumer'; - liStoreParameters['data-product-type'] = Constants.MONTHLY_PRODUCTS.includes(productCode) ? 'monthly' : 'yearly'; + liStoreParameters['data-product-type'] = Constants.PRODUCT_ID_MAPPINGS[productCode].isMonthlyProduct ? 'monthly' : 'yearly'; liStoreParameters['data-store-product-option'] = variation; } diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index af284a9fe..f031d300d 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -1,86 +1,48 @@ import Page from "./page.js" -export const Constants = { - DEV_BASE_URL: ['localhost', 'stage', '.hlx.'].some((domain) => - window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : '', - - FINGERPRINT_LOCAL_STORAGE_NAME: 'rhvID', - - NO_FINGERPRINT_COOKIE_NAME: 'fgpnoneBD', - - LOGIN_LOGGED_USER_EXPIRY_COOKIE_NAME: 'bdcslue', - - ZUROA_LOCALES: ['nl-nl', 'nl-be'], - - DEV_DOMAINS: ['localhost', 'stage', '.hlx.'], - - PRODUCT_ID_MAPPINGS: { - av: "com.bitdefender.cl.av", - is: "com.bitdefender.cl.is", - tsmd: "com.bitdefender.cl.tsmd", - fp: ['nl-nl', 'nl-be'].includes(Page.locale) ? "com.bitdefender.fp" : "com.bitdefender.cl.fp", - ps: "com.bitdefender.premiumsecurity", - psm: "com.bitdefender.premiumsecurity", - psp: "com.bitdefender.premiumsecurityplus", - pspm: "com.bitdefender.premiumsecurityplus", - soho: "com.bitdefender.soho", - mac: "com.bitdefender.avformac", - vpn: "com.bitdefender.vpn", - "vpn-monthly": "com.bitdefender.vpn", - pass: "com.bitdefender.passwordmanager", - passm: "com.bitdefender.passwordmanager", - pass_sp: "com.bitdefender.passwordmanager", - pass_spm: "com.bitdefender.passwordmanager", - bms: "com.bitdefender.bms", - mobile: "com.bitdefender.bms", - ios: "com.bitdefender.iosprotection", - mobileios: "com.bitdefender.iosprotection", - dip: "com.bitdefender.dataprivacy", - dipm: "com.bitdefender.dataprivacy", - avpm: 'com.bitdefender.cl.avplus.v2', - ultsec: "com.bitdefender.ultimatesecurityus", - ultsecplus: "com.bitdefender.ultimatesecurityplusus", - ultsecm: "com.bitdefender.ultimatesecurityus", - ultsecplusm: "com.bitdefender.ultimatesecurityplusus", - idthefts: "com.bitdefender.idtheftstandard", - idtheftp: "com.bitdefender.idtheftpremium", - idtheftsm: "com.bitdefender.idtheftstandard", - idtheftpm: "com.bitdefender.idtheftpremium", - // DLP - ts_i: 'com.bitdefender.tsmd.v2', - ts_f: 'com.bitdefender.tsmd.v2', - ps_i: 'com.bitdefender.premiumsecurity.v2', - ps_f: 'com.bitdefender.premiumsecurity.v2', - us_i: 'com.bitdefender.ultimatesecurityeu.v2', - us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_f: 'com.bitdefender.ultimatesecurityeu.v2', - us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf: 'com.bitdefender.ultimatesecurityus.v2', - us_pf_m: 'com.bitdefender.ultimatesecurityus.v2', - us_pi: 'com.bitdefender.ultimatesecurityus.v2', - us_pi_m: 'com.bitdefender.ultimatesecurityus.v2', - us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', - secpass: 'com.bitdefender.securepass', - secpassm: 'com.bitdefender.securepass', - vsb: 'com.bitdefender.vsb', - vsbm: 'com.bitdefender.vsb', - sc: 'com.bitdefender.ccp', - scm: 'com.bitdefender.ccp' - }, - - PRODUCT_ID_NAME_MAPPINGS: { - pass: "Bitdefender Password Manager", - pass_sp: "Bitdefender Password Manager Shared Plan", - passm: "Bitdefender Password Manager", - pass_spm: "Bitdefender Password Manager Shared Plan" - }, - - MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm", "secpassm", "vsbm", "scm"], - - WRONG_DEVICES_PRODUCT_IDS: { +export class Constants { + static DEV_BASE_URL = ['localhost', 'stage', '.hlx.'].some((domain) => + window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : ''; + + static FINGERPRINT_LOCAL_STORAGE_NAME = 'rhvID'; + + static NO_FINGERPRINT_COOKIE_NAME = 'fgpnoneBD'; + + static LOGIN_LOGGED_USER_EXPIRY_COOKIE_NAME = 'bdcslue'; + + static ZUROA_LOCALES = ['nl-nl', 'nl-be']; + + static DEV_DOMAINS = ['localhost', 'stage', '.hlx.']; + + static PRODUCT_ID_MAPPINGS_CALL = this.#getVlaicuProductIdsMapping(); + + /** + * @typedef {Object} VlaicuDataEntry + * @property {string} websiteId + * @property {string} storeBundleId + * @property {boolean} isMonthlyProduct + * @property {string} campaign + */ + + /** + * + * @typedef {{ + * [key: string]: VlaicuDataEntry + * }} VlaicuData + */ + + /** + * @typedef {{ + * campaign: string + * }} VlaicuDataCampaign + */ + + /** + * @type {VlaicuData & VlaicuDataCampaign | null} + */ + static PRODUCT_ID_MAPPINGS = null; + + static WRONG_DEVICES_PRODUCT_IDS = { 'pass_sp': { contentDevices: 1, providerDevices: 4, @@ -97,27 +59,68 @@ export const Constants = { contentDevices: 10, providerDevices: 1, } - }, + }; - DISABLE_TARGET_PARAMS: { + static DISABLE_TARGET_PARAMS = { key: "dotest", value: "1" - }, + }; - TARGET_EXPERIMENT_METADATA_KEY: "target-experiment-location", + static TARGET_EXPERIMENT_METADATA_KEY = "target-experiment-location"; - ADOBE_TARGET_SESSION_ID_PARAM: "adobeTargetSessionId", + static ADOBE_TARGET_SESSION_ID_PARAM = "adobeTargetSessionId"; - TARGET_TENANT: "bitdefender", + static TARGET_TENANT = "bitdefender"; - PUBLIC_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) - ? '' : 'https://www.bitdefender.com', + static PUBLIC_URL_ORIGIN = ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) + ? '' : 'https://www.bitdefender.com'; - LOGIN_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) - ? window.location.origin : 'https://www.bitdefender.com', + static LOGIN_URL_ORIGIN = ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) + ? window.location.origin : 'https://www.bitdefender.com'; - NO_PROMOTION: "ignore", + static NO_PROMOTION = "ignore"; // TODO: please remove this once digital river starts working correctly - SOHO_CORNER_CASES_LOCALSE: ["de-de", "de-at", "de-ch"] + static SOHO_CORNER_CASES_LOCALSE = ["de-de", "de-at", "de-ch"]; + + /** + * fetch all the product id mappings for Vlaicu from websites + */ + static async #getVlaicuProductIdsMapping() { + try { + const localeForVlaicuConfig = this.ZUROA_LOCALES.includes(Page.locale) ? "nl-nl" : "en-us"; + const response = await fetch(`/${localeForVlaicuConfig}/consumer/vlaicuconfig.json`); + if (!response.ok) { + console.error(`Failed to fetch data.`); + return; + } + + /** + * @type {{ + * websiteId: string, + * bundleId: string, + * isMonthlyProduct: boolean, + * campaign: string + * }[]} + */ + const data = (await response.json())?.data; + if (!data) { + return; + } + + const vlaicuProductIdsMapping = data.reduce((accumulator, currentValue) => { + accumulator[currentValue.websiteId] = { + ...currentValue, + isMonthlyProduct: currentValue.isMonthlyProduct === "false" ? false : true + }; + return accumulator; + }, {}); + vlaicuProductIdsMapping.campaign = data[0].campaign || this.NO_PROMOTION; + + this.PRODUCT_ID_MAPPINGS = vlaicuProductIdsMapping; + } catch(e) { + console.error(`Failed to fetch data.`); + return; + } + }; } \ No newline at end of file diff --git a/_src/scripts/libs/store/resolver/staticGlobalAttributes/globalTextVariable.js b/_src/scripts/libs/store/resolver/staticGlobalAttributes/globalTextVariable.js index c2b7b3965..d75dd4f96 100644 --- a/_src/scripts/libs/store/resolver/staticGlobalAttributes/globalTextVariable.js +++ b/_src/scripts/libs/store/resolver/staticGlobalAttributes/globalTextVariable.js @@ -1,5 +1,5 @@ import { GlobalContext } from "../resolver.js"; -import { monthlyProducts } from "../../store.js"; +import { Constants } from "../../../constants.js"; /** * @param {string} hideCondition @@ -33,7 +33,7 @@ const getMinOrMax = (value, options, fn) => { for (const option of options) { let localValue = fn(option); - localValue = monthlyProducts[option.getId()] ? localValue * 12 : localValue; + localValue = Constants.PRODUCT_ID_MAPPINGS[option.getId()].isMonthlyProduct ? localValue * 12 : localValue; if (localValue && (value === "min" && localValue < minOrMax) || (value === "max" && localValue > minOrMax)) { minOrMax = localValue; productValue = option; diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 162cee29f..0295b00e2 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -4,31 +4,6 @@ import { GLOBAL_V2_LOCALES, setUrlParams } from "../../utils/utils.js"; import Page from "../page.js"; import { getMetadata } from "../../utils/utils.js"; -export const monthlyProducts = { - "ultsecm": "ultsecm", - "ultsecplusm": "ultsecplusm", - "psm": "psm", - "pspm": "pspm", - "vpn-monthly": "vpn-monthly", - "passm": "passm", - "idtheftsm": "idtheftsm", - "idtheftpm": "idtheftpm", - "dipm": "dipm", - "smarthome_m": "smarthome_m", - "vipsupport_m": "vipsupport_m", - "pctuneup_m": "pctuneup_m", - "pass_spm": "pass_spm", - "us_i_m": "us_i_m", - "us_f_m": "us_f_m", - "us_pf_m": "us_pf_m", - "us_pi_m": "us_pi_m", - "us_pie_m": "us_pie_m", - "us_pfe_m": "us_pfe_m", - "secpassm": "secpassm", - "vbsm": "vbsm", - "scm": "scm", -} - export const loadScript = (baseUrl, url) => { return new Promise(function (resolve) { const script = document.createElement("script"); @@ -259,7 +234,7 @@ export class ProductOption { getSubscription(modifier = "years") { switch (modifier) { case "years": - return monthlyProducts[this.id] ? this.subscription : this.subscription / 12; + return Constants.PRODUCT_ID_MAPPINGS[this.id].isMonthlyProduct ? this.subscription : this.subscription / 12; case "months": return this.subscription; } @@ -420,7 +395,7 @@ export class Product { productAlias: this.productAlias, department: this.department, devices, - subscription: monthlyProducts[this.id] ? 1 : years * 12, + subscription: Constants.PRODUCT_ID_MAPPINGS[this.id].isMonthlyProduct ? 1 : years * 12, avangateId: this.avangateId }); @@ -492,7 +467,7 @@ export class Product { const priceFull = Number(Number(entries.price).toFixed(2)); if ((value === "min" && priceFull < price) || (value === "max" && priceFull > price)) { price = priceFull; - subscription = monthlyProducts[this.id] ? 1 : Number(years) * 12; + subscription = Constants.PRODUCT_ID_MAPPINGS[this.id].isMonthlyProduct ? 1 : Number(years) * 12; } } } @@ -531,7 +506,7 @@ export class Product { const priceDiscounted = Number(Number(entry.discount?.discounted_price).toFixed(2)); if ((value === "min" && priceDiscounted < price) || (value === "max" && priceDiscounted > price)) { price = priceDiscounted; - subscription = monthlyProducts[this.id] ? 1 : Number(years) * 12; + subscription = Constants.PRODUCT_ID_MAPPINGS[this.id].isMonthlyProduct ? 1 : Number(years) * 12; } } } @@ -611,7 +586,7 @@ export class Product { const priceDiscounted = Number(Number(value.discount?.discounted_price || value.price).toFixed(2)); if (priceDiscounted < price) { price = priceDiscounted; - subscription = monthlyProducts[this.id] ? 1 : Number(years) * 12; + subscription = Constants.PRODUCT_ID_MAPPINGS[this.id].isMonthlyProduct ? 1 : Number(years) * 12; } } } @@ -697,7 +672,7 @@ export class Product { case "years": return subscriptions.map(subscription => Number(subscription)); case "months": - return monthlyProducts[this.id] + return Constants.PRODUCT_ID_MAPPINGS[this.id].isMonthlyProduct ? subscriptions.map(subscription => Number(subscription)) : subscriptions.map(subscription => Number(subscription) * 12); } @@ -762,7 +737,7 @@ class Vlaicu { } static async getProductVariationsPrice(id, campaignId) { - const productInfoResponse = await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id], campaignId); + const productInfoResponse = await this.getProductVariations(Constants.PRODUCT_ID_MAPPINGS[id].bundleId, campaignId); const productInfo = productInfoResponse?.product; if (!productInfo) { return null; @@ -778,7 +753,7 @@ class Vlaicu { window.StoreProducts.product[id] = { product_alias: id, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id].bundleId, product_name: productInfo.productName, promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, variations: {} @@ -790,7 +765,7 @@ class Vlaicu { * for monthly products only add the monthly variations * e.g for vpn-monthly we do not care about the product variation if it passes 12 months (more than a year) */ - if (Constants.MONTHLY_PRODUCTS.includes(id) && productVariation.months >= 12) { + if (Constants.PRODUCT_ID_MAPPINGS[id].isMonthlyProduct && productVariation.months >= 12) { return; } @@ -799,7 +774,7 @@ class Vlaicu { * e.g for tsmd we do not care about the product variation if it is below 12 months (less than a year) */ - if (!Constants.MONTHLY_PRODUCTS.includes(id) && productVariation.months < 12) { + if (!Constants.PRODUCT_ID_MAPPINGS[id].isMonthlyProduct && productVariation.months < 12) { return; } @@ -808,8 +783,8 @@ class Vlaicu { const devicesObj = { currency_iso: productVariation.currency, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], - platform_product_id: productInfoResponse.platformProductId || Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id].bundleId, + platform_product_id: productInfoResponse.platformProductId || Constants.PRODUCT_ID_MAPPINGS[id].bundleId, promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, @@ -886,19 +861,7 @@ class StoreConfig { return Constants.NO_PROMOTION; } - try { - const response = await fetch(`${Constants.PUBLIC_URL_ORIGIN}/nl-nl/consumer/zuoraconfig.json`); - if (!response.ok) { - console.error(`Failed to fetch data.`); - return Constants.NO_PROMOTION; - } - - const { data = [] } = await response.json(); - return data[0].CAMPAIGN_NAME ? data[0].CAMPAIGN_NAME : Constants.NO_PROMOTION; - } catch(e) { - console.error(`Failed to fetch data.`); - return Constants.NO_PROMOTION; - } + return Constants.PRODUCT_ID_MAPPINGS?.campaign || Constants.NO_PROMOTION; } } @@ -936,6 +899,10 @@ export class Store { static async getProducts(productsInfo) { if (!Array.isArray(productsInfo)) { return null; } + if (!Constants.PRODUCT_ID_MAPPINGS) { + return null; + } + // get the target buyLink mappings if (!this.targetBuyLinkMappings) { this.targetBuyLinkMappings = await Target.getBuyLinksMapping(); diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 24e7bf5df..bbbf5ef02 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -28,6 +28,7 @@ import { getPageExperimentKey, GLOBAL_EVENTS, pushTrialDownloadToDataLayer, } from './utils/utils.js'; +import { Constants } from './libs/constants.js'; const LCP_BLOCKS = ['hero']; // add your LCP blocks to the list @@ -503,6 +504,7 @@ async function loadPage() { await window.hlx.plugins.load('eager'); await loadEager(document); await window.hlx.plugins.load('lazy'); + await Constants.PRODUCT_ID_MAPPINGS_CALL; await loadLazy(document); await StoreResolver.resolve(); From 8d8640db4f5786629d47e1772404bb6d0b741fa5 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 18 Dec 2024 16:25:16 +0200 Subject: [PATCH 205/248] Lint fixes --- _src/blocks/webview-table/webview-table.css | 202 +++++++++++--------- _src/blocks/webview-table/webview-table.js | 2 +- _src/blocks/webview/webview.css | 35 ++-- _src/blocks/webview/webview.js | 2 +- 4 files changed, 129 insertions(+), 112 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index ac32a2d82..e2f91925d 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -1,6 +1,6 @@ :root { --first-table-cell-color: #e4f2ff; - --yes-check-color: #44AA44; + --yes-check-color: #4A4; --no-check-color: #FD3434; --expandable-row-background-color: #0040F0; --expandable-row-text-color: #fff; @@ -12,27 +12,20 @@ min-height: 4rem; } -.webview-table-wrapper { - max-width: 770px; - height: 512px; - margin: 0 auto; - font-family: "Segoe UI", Arial, sans-serif; -} - .webview-table { width: 100%; height: 512px; - padding: 0 25px; display: table; font-size: 14px; background-color: #141517; - color: #999999; + color: #999; } .webview-table h1 { text-align: center; - font: bold 24px "Segoe UI"; + font: bold 24px; + font-family: "Segoe UI", Arial, sans-serif; color: #F7F7F7; margin: 10px 0 14px; } @@ -55,20 +48,24 @@ padding-bottom: 8px; border-right: none; border-left: none; + p{ margin: 1px; padding: 0; line-height: 1; } + p:first-of-type{ margin-top: 8px; font-size: 14px; } + p:last-of-type{ margin-bottom: 4px; font-size: 16px; } } + .webview-comparison-header div[role="columnheader"]:first-child { min-width: 292px; } @@ -93,29 +90,107 @@ border-top: 1px solid black; align-items: baseline; } -.webview-table div[role="row"]:last-of-type div[role='cell']:first-child{ - visibility: hidden; + +.webview-table .yes-check::after { + content: ''; + width: 3px; + height: 7px; + border: solid black; + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} + +.webview-table .price-box { + flex-flow: column; + color: #e4f2ff; + text-align: center; +} + +.webview-table-wrapper { + max-width: 770px; + height: 512px; + margin: 0 auto; + font-family: "Segoe UI", Arial, sans-serif; + + &.light-mode { + background-color: #fff; + color: black; + + h1 { + color: black; + } + + div[role="columnheader"] { + background-color: #fff; + color: #000; + } + + div[role="cell"] { + color: #515B6D; + background-color: #fff; + border-color: #F5F5F5; + + &:first-child { + color: #000; + background-color: #F9F9FE; + border-color: #FFF; + } + + .price-box { + color: black; + + .prod-oldprice{ + color: #515B6D; + } + + .prod-newprice{ + color: #000 !important; + } + } + } + + .yes-check::after { + border: solid #FFF; + border-width: 0 2px 2px 0; + } + + .button { + background-color: #fff; + } + + .featured{ + background-color: #F9F9FE; + } + } } .webview-table div[role='row']:last-of-type div[role='cell'] { border-radius: 0 0 4px 4px; + + &:first-child { + visibility: hidden; + } + .buy-box{ display: flex; flex-direction: column; - gap: 0px; + gap: 0; + .prod-oldprice{ text-align: center; text-decoration: line-through; - font: normal normal normal 14px Segoe UI; - letter-spacing: 0px; + font: normal normal normal 14px; + font-family: "Segoe UI", Arial, sans-serif; + letter-spacing: 0; opacity: 1; } .prod-newprice{ text-align: center; - font: normal normal bold 20px Segoe UI; - letter-spacing: 0px; - color: #FFFFFF; + font: normal normal bold 20px; + font-family: "Segoe UI", Arial, sans-serif; + letter-spacing: 0; + color: #FFF; opacity: 1; line-height: 1; } @@ -139,6 +214,7 @@ padding: 6px 16px; border-radius: 4px; text-align: center; + &::after { display: none; content: none; @@ -151,11 +227,25 @@ text-align: center; } +.webview-table-wrapper .webview-table .featured { + background-color: #202123; + + .button{ + background-color: #006EFF; + } + + .button-text{ + color: #FFF; + } +} + .webview-table-wrapper .webview-table .current .button{ border-color: #767676; + .button-text{ color: #767676; } + &::after { display: none; content: none; @@ -171,12 +261,6 @@ padding: 2px; } -.webview-table .price_box { - flex-flow: column; - color: #e4f2ff; - text-align: center; -} - .webview-table .yes-check { width: 18px; height: 18px; @@ -188,15 +272,6 @@ color: black; } -.webview-table .yes-check::after { - content: ''; - width: 3px; - height: 7px; - border: solid black; - border-width: 0 2px 2px 0; - transform: rotate(45deg); -} - .webview-table .no-check { height: 1rem; width: 0.625rem; @@ -218,63 +293,4 @@ .webview-table .no-check::before { transform: rotate(-45deg); -} - -.webview-table-wrapper .webview-table .featured{ - background-color: #202123; - .button{ - background-color: #006EFF; - } - .button-text{ - color: #FFFFFF; - } -} - -.webview-table-wrapper .light-mode { - background-color: #fff; - color: black; -} - -.webview-table-wrapper .light-mode h1 { - color: black; -} - -.webview-table-wrapper .light-mode div[role="columnheader"] { - background-color: #fff; - color: #000; -} - -.webview-table-wrapper .light-mode div[role='cell']:first-child { - color: #000; - background-color: #F9F9FE; - border-color: #FFF; -} - -.webview-table-wrapper .light-mode div[role="cell"] { - color: #515B6D; - background-color: #fff; - border-color: #F5F5F5; -} - -.webview-table-wrapper .light-mode div[role="cell"] .price_box { - color: black; - .prod-oldprice{ - color: #515B6D; - } - .prod-newprice{ - color: #000000 !important; - } -} - -.webview-table-wrapper .light-mode .yes-check::after { - border: solid #FFFFFF; - border-width: 0 2px 2px 0; -} - -.webview-table-wrapper .light-mode .button { - background-color: #fff; -} - -.webview-table-wrapper .light-mode div .featured{ - background-color: #F9F9FE; } \ No newline at end of file diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index 0c53c8180..ac36abaf7 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -100,7 +100,7 @@ function renderPrices(block, metadata) { // Populate buy box for non-current products if (!isCurrent) { buyBox.innerHTML = ` -

+
diff --git a/_src/blocks/webview/webview.css b/_src/blocks/webview/webview.css index 51b9f3f25..e7a28cd50 100644 --- a/_src/blocks/webview/webview.css +++ b/_src/blocks/webview/webview.css @@ -2,24 +2,11 @@ max-width: 768px; padding: 0 var(--section-desktop-padding); margin: 0 auto; - background: url(../../icons/pattern.png) repeat-x; + background: url("../../icons/pattern.png") repeat-x; background-size: 188px 104px; text-align: center; font-family: "Segoe UI", Arial, sans-serif; - &.dark-mode { - background-color: black; - - .webview { - color: white; - - .button.secondary { - background-color: black; - border-color: black; - } - } - } - .webview { max-width: 438px; margin: auto; @@ -101,14 +88,15 @@ } .prod-newprice { - font: normal normal bold 24px / 30px Segoe UI; + font: normal normal bold 24px / 30px; + font-family: "Segoe UI", Arial, sans-serif; line-height: 0.7; } .under-price-text { font-size: var(--body-font-size-xxs); line-height: var(--body-font-size-xxs); - color: #666666; + color: #666; p { margin: 0; @@ -116,10 +104,23 @@ } } - .price_box { + .price-box { display: flex; flex-direction: column; gap: 9px; } } + + &.dark-mode { + background-color: black; + + .webview { + color: white; + + .button.secondary { + background-color: black; + border-color: black; + } + } + } } \ No newline at end of file diff --git a/_src/blocks/webview/webview.js b/_src/blocks/webview/webview.js index 3720013e8..ac87e8788 100644 --- a/_src/blocks/webview/webview.js +++ b/_src/blocks/webview/webview.js @@ -20,7 +20,7 @@ export default async function decorate(block) { if (child.textContent.includes('{PRICE_BOX}') && product) { child.innerHTML = child.innerHTML.replace('{PRICE_BOX}', '
Price box
'); child.innerHTML = ` -
+
${saveText || ''} From 0524f1bff7ea46872a81724e1da1e1de389d0816 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Wed, 18 Dec 2024 16:29:51 +0200 Subject: [PATCH 206/248] Rename offer identifier in $getGeoIpFlag method to 'geoip-flag-mbox' --- _src/scripts/libs/store/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 2f4c3a217..9903408b2 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -719,7 +719,7 @@ class Vlaicu { Constants.SOHO_CORNER_CASES_LOCALSE.includes(Page.locale) && productId === "com.bitdefender.soho" static $getGeoIpFlag = async () => { - const offer = await Target.getOffer('vlaicu-flag-mbox'); + const offer = await Target.getOffer('geoip-flag-mbox'); if (offer && offer.content && typeof offer.content.geoIpPrice !== 'undefined') { return offer.content.geoIpPrice; From fe937b9c5dda243bd90eb42d318e19cdd12a9626 Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Wed, 18 Dec 2024 22:06:32 +0200 Subject: [PATCH 207/248] DEX-18029 - AB test - Downloads page (+free tools) --- .../template-factories/ab-downloads.css | 807 ++++++++++++++++++ 1 file changed, 807 insertions(+) create mode 100644 _src/scripts/template-factories/ab-downloads.css diff --git a/_src/scripts/template-factories/ab-downloads.css b/_src/scripts/template-factories/ab-downloads.css new file mode 100644 index 000000000..b8c7e041f --- /dev/null +++ b/_src/scripts/template-factories/ab-downloads.css @@ -0,0 +1,807 @@ +.ab-downloads main * { + font-family: Arial; +} + +.ab-downloads .breadcrumb { + display: none; +} + +.ab-downloads main h2, .ab-downloads main .default-content-wrapper h2 { + font-size: 34px; + font-weight: 700; + line-height: 39.1px; + text-align: center; + max-width: 655px; + margin: 0 auto; +} + +.ab-downloads main .section.wide.awards h2 { + font-size: 40px; + font-weight: 700; + line-height: 42px; +} + +.ab-downloads main .section.wide.awards h4 { + font-size: 22px; + font-weight: 700; + line-height: 26px; + margin: 1em auto; +} + +.ab-downloads main .hero h1 { + font-size: 40px; + font-weight: 700; + line-height: 42px; + color: #006DFF; +} + +.ab-downloads main .hero h2 { + font-size: 22px; + font-weight: 700; + line-height: 26px; + color: #161616; + text-align: left; + max-width: auto; + margin: 0; +} + +.ab-downloads main .hero .hero-content ul li { + font-size: 14px; + font-weight: 400; + line-height: 16.1px; + padding: 0 0 0 25px; +} + +.ab-downloads main .hero ul li::before { + width: 17px; + height: 17px; + top: 0; + background-color: #1C7928; +} + +.ab-downloads main .hero ul li::after { + top: 3px; + left: 6px; +} + +.ab-downloads main .hero a.button.modal, .ab-downloads main .hero a.button.central { + height: 45px; + background-color: #D70000; + color: white; + font-size: 16px; + font-weight: 500; + line-height: 18.4px; + text-align: center; + border-radius: 10px; + padding: 0 1.5em; +} + +.ab-downloads main .hero a.button.modal::after, .ab-downloads main .hero a.button.central::after, .ab-downloads main .section.wide.awards a::after { + display: none; +} + +.ab-downloads main .small-content.columns-container img { + width: auto; + height: 31px; +} + +.ab-downloads main .small-content.columns-container h5 { + font-size: 16px; + font-weight: 700; + line-height: 18.4px; + color: #161616; + margin: 5px 0 1em; +} + +.ab-downloads main .small-content.columns-container p { + font-size: 16px; + font-weight: 400; + line-height: 24px; + color: #161616; + margin: 0; +} + +.ab-downloads main .small-content.columns-container .block { + margin-top: 3em; +} + +.ab-downloads main .small-content.columns-container .block > div { + gap: 18px; +} + +.ab-downloads main .small-content.columns-container .block > div > div { + background-color: #F6F6F6; + border-radius: 20px; + padding: 1.5em 3em; +} + +.ab-downloads main .boxes-type.columns-container .block > div > div { + background-color: #F6F6F6; + border-radius: 20px; + padding: 2em 3em; +} + +.ab-downloads main .boxes-type.columns-container .block { + margin-top: 3em; +} + +.ab-downloads main .boxes-type.columns-container .block > div { + gap: 18px; +} + +.ab-downloads main .boxes-type.columns-container .block h3 { + font-weight: bold; + font-size: 22px; + line-height: 26px; + margin-top: 0; + margin-bottom: 4px; +} + +.ab-downloads main .boxes-type.columns-container .block hr { + margin-top: 10px; + margin-bottom: 15px; +} + +.ab-downloads main .boxes-type.columns-container .block p, .ab-downloads main .boxes-type.columns-container .block li { + font-size: 14px; + font-weight: 400; + line-height: 16.1px; + margin: 0; +} + +.ab-downloads main .boxes-type.columns-container .block a { + width: 100%; + height: 45px; + display: flex; + align-items: center; + justify-content: center; + background-color: #D70000; + color: white; + font-size: 16px; + font-weight: 500; + line-height: 18.4px; + margin: 1em 0; +} + +.ab-downloads main .boxes-type.columns-container .block em { + font-size: 16px; + font-weight: 700; + line-height: 18.4px; + font-style: normal; + display: flex; + align-items: center; +} + +.ab-downloads main .boxes-type.columns-container .block > div > div:not(:first-of-type) em::before { + content: ''; + min-width: 19px; + min-height: 20px; + -webkit-mask: url('../../icons/arrow-right.svg') no-repeat; + mask: url('../../icons/arrow-right.svg') no-repeat; + display: inline-block; + transition: all .2s cubic-bezier(.4,0,.2,1); + transform: translateX(0); + opacity: 0; + margin-left: -5px; + margin-right: 6px; + background-color: #006DFF; + opacity: 1; + transform: rotate(180deg); +} + +.ab-downloads main .boxes-type.columns-container a::after { + display: none; +} + +.ab-downloads main .boxes-type.columns-container ul { + padding-left: 0; + margin-left: 0; + margin-bottom: 0; +} + +.ab-downloads main .boxes-type.columns-container ul li { + font-size: 14px; + line-height: 17px; + margin-bottom: 8px; + list-style-type: none; + background: url(https://bitdefender.com/icons/circle-check-sharp-solid.svg) top 2px left no-repeat transparent; + padding-left: 22px; + background-size: 13px; + position: relative; + margin: 10px 0 !important; +} + +.ab-downloads main .boxes-type.columns-container > .default-content-wrapper:last-of-type p { + text-align: center; + color: #3D3D3D; +} + +.ab-downloads main .boxes-type.columns-container > .default-content-wrapper:last-of-type p a { + text-decoration: none; + color: #3D3D3D; +} + +.ab-downloads main .blue-titles.image-columns-container .block { + margin-top: 3em; +} + +.ab-downloads main .blue-titles.image-columns-container .block > div { + align-items: flex-start; +} + +.ab-downloads main .blue-titles.image-columns-container .block h4 { + font-size: 22px; + font-weight: 700; + line-height: 26px; + color: #006DFF; +} + +.ab-downloads main .blue-titles.image-columns-container .block p { + font-size: 16px; + font-weight: 400; + line-height: 24px; + color: #161616; + padding: 0; + margin-bottom: 2em; +} + +.ab-downloads main .blue-titles.image-columns-container .block p a, .ab-downloads main .section.wide.awards a { + height: 45px; + background-color: transparent; + border: 2px solid #006DFF; + color: #006DFF; + border-radius: 10px; + font-size: 16px; + font-weight: 700; + line-height: 18.4px; + text-align: center; + padding: 0 1em; +} + +.ab-downloads main .blue-titles.image-columns-container .block p span, .ab-downloads main .section.wide.awards a span { + transform: none; +} + +.ab-downloads main .blue-titles.image-columns-container .block p a::after { + min-width: 23px; + min-height: 20px; + background-color: #006DFF; + opacity: 1; + margin: 0; + padding: 0; + transform: rotate(90deg); +} + +.ab-downloads main .blue-titles.image-columns-container > .default-content-wrapper:first-of-type { + text-align: center; +} + +.ab-downloads main .full-grey-bck.columns-container { + background-color: #F6F6F6; + border-radius: 20px; + padding: 2em; +} + +.ab-downloads main .full-grey-bck.columns-container .block > div { + gap: 5em; +} + +.ab-downloads main .full-grey-bck.columns-container h3 { + font-size: 24px; + font-weight: 700; + line-height: 27.6px; + text-align: left; + color: #161616; + min-height: unset !important; + margin-bottom: 0; +} + +.ab-downloads main .full-grey-bck.columns-container .columns-text-col > p:first-of-type { + font-size: 16px; + font-weight: 700; + line-height: 18.4px; + margin-top: 8px; + margin-bottom: 0; +} + +.ab-downloads main .full-grey-bck.columns-container .columns-text-col > p:first-of-type u { + color: #006DFF; + text-decoration: none; +} + +.ab-downloads main .full-grey-bck.columns-container > div { + align-items: flex-start; +} + +.ab-downloads main .full-grey-bck.columns-container ul { + padding: 0; + padding-left: 16px; + margin: 2em 0; +} + +.ab-downloads main .full-grey-bck.columns-container ul li { + color: #161616; + font-size: 16px; + font-weight: 400; + line-height: 24px; + list-style-type: disc; + padding: 0; +} + +.ab-downloads main .full-grey-bck.columns-container .block > div > div:last-of-type p.button-container { + display: none; +} + +.ab-downloads main .full-grey-bck.columns-container p.button-container { + margin: 0; +} + +.ab-downloads main .full-grey-bck.columns-container p.button-container a { + background-color: #D70000; + font-size: 16px; + font-weight: 700; + line-height: 18.4px; +} + +.ab-downloads main .has-dropdown.columns-container h2 { + margin: 0; + text-align: left; +} + +.ab-downloads main .has-dropdown.columns-container .default-content-wrapper img { + border-radius: 10px; +} + +.ab-downloads main .has-dropdown.columns-container .block { + border-top: 1px solid #E5E7EB; + margin-top: 1.5em; + padding-top: 1em; +} + +.ab-downloads main .has-dropdown.columns-container .block > div { + align-items: self-start; +} + +.ab-downloads main .has-dropdown.columns-container h3 { + color: #006DFF; + font-size: 22px; + font-weight: 700; + line-height: 26px; + min-height: unset !important; +} + +.ab-downloads main .has-dropdown.columns-container .columns-left-col p { + font-size: 16px; + font-weight: 400; + line-height: 24px; + color: #4F4F4F; +} + +.ab-downloads main .has-dropdown.columns-container ul { + margin-left: 0; + padding-left: 0; + margin-top: 0; +} + +.ab-downloads main .has-dropdown.columns-container ul li { + border-bottom: 1px solid #D1D1D1; + padding-left: 0; + padding-bottom: 1em; + margin-left: 0; + margin-top: 0; + cursor: pointer; +} + +.ab-downloads main .has-dropdown.columns-container ul li strong { + font-size: 14px; + font-weight: 700; + line-height: 16.1px; + display: inline-flex; + align-items: center; +} + +.ab-downloads main .has-dropdown.columns-container ul li strong::before { + content: ''; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid #006EFF; + margin-right: 9px; + display: inline-block; +} + +.ab-downloads main .has-dropdown.columns-container ul li em { + font-size: 14px; + font-weight: 400; + line-height: 16.1px; + color: #4F4F4F; + font-style: normal; + margin-top: 10px; + display: none; +} + +.ab-downloads main .has-dropdown.columns-container ul:hover li em { + display: block; +} + +.ab-downloads main .accordion.terms-of-use { + margin-top: 3em; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item { + background-color: #F4F8FF; + box-shadow: none; + padding: 1em 2em 1em 2.5em +} + +.ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-header::before { + content: '+'; + position: absolute; + left: -20px; + font-size: 20px; + font-weight: 400; + line-height: 16px; + color: #006DFF; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item.expanded .accordion-item-header::before { + content: '-'; + top: 0; + font-size: 28px; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-header::after { + display: none; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-header { + padding-bottom: 0; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item h3 { + font-size: 16px; + font-weight: 700; + line-height: 18.4px; + color: #161616; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item.expanded h3 { + color: #006DFF; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-content p { + margin-top: 10px; +} + +.ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-content p, .ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-content p * { + font-size: 14px; + font-weight: 400; + line-height: 16.1px; + color: #161616; +} + +.ab-downloads main .accordion-container > .default-content-wrapper:last-of-type p { + font-size: 14px; + font-weight: 400; + line-height: 16.1px; + color: #161616; +} + +@media(max-width: 767px) { + .ab-downloads main { + display: grid; + } + + .ab-downloads main .main .hero-container { + order: 1 + } + .ab-downloads main .has-dropdown.columns-container { + order: 2; + padding-top: 0; + } + .ab-downloads main .small-content.columns-container { + order: 3; + padding: 0; + } + .ab-downloads main .blue-title-v1.image-columns-container { + order: 4; + padding-bottom: 0; + } + .ab-downloads main .full-grey-bck.columns-container { + order: 5; + padding: 5px; + } + .ab-downloads main .boxes-type.columns-container { + order: 6; + } + .ab-downloads main .blue-title-v2.image-columns-container { + order: 7; + padding-top: 0; + padding-bottom: 0; + } + .ab-downloads main .section.wide.awards { + order: 8; + padding: 0; + } + .ab-downloads main .accordion-container { + order: 9; + } + + .ab-downloads main .hero { + padding: 0; + min-height: auto; + } + + .ab-downloads main .hero .hero-content { + padding-bottom: 0; + } + + .ab-downloads main .hero h1 { + font-size: 23px; + font-weight: 500; + line-height: 29.9px; + } + + .ab-downloads main .hero h1 br { + display: none; + } + + .ab-downloads main h2, .ab-downloads main .default-content-wrapper h2 { + font-size: 18px; + font-weight: 500; + line-height: 22.1px; + text-align: left; + } + + .ab-downloads main .hero h2 { + font-size: 13px; + font-weight: 600; + line-height: 16.9px; + } + + .ab-downloads main .hero .hero-content ul li { + font-size: 11px; + font-weight: 400; + line-height: 14.3px; + } + + .ab-downloads main .has-dropdown.columns-container h3 { + font-size: 13px; + font-weight: 600; + line-height: 16.9px; + } + + .ab-downloads main .has-dropdown.columns-container .columns-left-col p { + font-size: 12px; + font-weight: 400; + line-height: 15.6px; + } + + .ab-downloads main .has-dropdown.columns-container ul li strong { + font-size: 11px; + font-weight: 600; + line-height: 14.3px; + } + + .ab-downloads main .has-dropdown.columns-container ul li em { + font-size: 11px; + font-weight: 400; + line-height: 14.3px; + } + + .ab-downloads main .small-content.columns-container .block, .ab-downloads main .boxes-type.columns-container .block, .ab-downloads main .has-dropdown.columns-container .block, .ab-downloads main .blue-titles.image-columns-container .block { + margin-top: 0; + } + + .ab-downloads main .has-dropdown.columns-container .columns-wrapper { + padding-top: 0; + } + + .ab-downloads main .has-dropdown.columns-container .columns-text-col { + width: 100%; + } + + .ab-downloads main .small-content.columns-container * { + text-align: left; + padding-top: 0; + } + + .ab-downloads main .small-content.columns-container .block > div > div { + border-radius: 8px; + padding: 1em; + } + + .ab-downloads main .small-content.columns-container h5 { + font-size: 12px; + font-weight: 600; + line-height: 15.6px; + margin: 5px 0; + } + + .ab-downloads main .small-content.columns-container p { + font-size: 11px; + font-weight: 400; + line-height: 14.3px; + } + + .ab-downloads main .blue-titles.image-columns-container > .default-content-wrapper:first-of-type { + padding-top: 0; + padding-bottom: 0; + } + + .ab-downloads main .blue-titles.image-columns-container .block .image-columns-img-col { + display: none; + } + + .ab-downloads main .blue-titles.image-columns-container .block h4 { + font-size: 13px; + font-weight: 600; + line-height: 16.9px; + } + + .ab-downloads main .blue-titles.image-columns-container .block p { + font-size: 12px; + font-weight: 400; + line-height: 15.6px; + margin-bottom: 1em; + } + + .ab-downloads main .blue-titles.image-columns-container .block p a, .ab-downloads main .section.wide.awards a { + width: 100%; + font-size: 14px; + font-weight: 700; + line-height: 16.1px; + } + + .ab-downloads main .blue-titles.image-columns-container .block p span, .ab-downloads main .section.wide.awards a span { + display: inline-block; + margin: 0 auto; + } + + .ab-downloads main .blue-titles.image-columns-container .default-content-wrapper p { + text-align: left; + } + + .ab-downloads main .has-dropdown.columns-container .default-content-wrapper { + padding-bottom: 0; + } + + .ab-downloads main .full-grey-bck.columns-container p.button-container a, .ab-downloads main .boxes-type.columns-container .block a { + width: 100%; + height: 36px; + font-size: 14px; + font-weight: 700; + line-height: 16.1px; + } + + .ab-downloads main .full-grey-bck.columns-container p.button-container a span { + display: block; + width: 100%; + font-size: 14px; + font-weight: 700; + line-height: 16.1px; + } + + .ab-downloads main .full-grey-bck.columns-container h3 { + font-size: 17px; + font-weight: 500; + line-height: 22.1px; + } + + .ab-downloads main .full-grey-bck.columns-container .columns-text-col > p:first-of-type, .ab-downloads main .full-grey-bck.columns-container .columns-text-col > p:first-of-type u, .ab-downloads main .full-grey-bck.columns-container ul li { + font-size: 12px; + font-weight: 600; + line-height: 15.6px; + } + + .ab-downloads main .full-grey-bck.columns-container ul { + margin: 1em 0; + } + + .ab-downloads main .full-grey-bck.columns-container .block > div { + gap: 2em; + } + + .ab-downloads main .boxes-type.columns-container .default-content-wrapper { + padding-top: 0; + padding-bottom: 0; + } + + .ab-downloads main .boxes-type.columns-container .columns-wrapper { + padding-left: 0; + padding-right: 0; + } + + .ab-downloads main .boxes-type.columns-container .block > div > div { + padding: 1.5em; + } + + .ab-downloads main .boxes-type.columns-container .block h3 { + font-size: 17px; + font-weight: 500; + line-height: 22.1px; + } + + .ab-downloads main .boxes-type.columns-container .block h3 br { + display: none; + } + + .ab-downloads main .boxes-type.columns-container .block p, .ab-downloads main .boxes-type.columns-container .block li { + font-size: 11px; + font-weight: 400; + line-height: 14.3px; + } + + .ab-downloads main .boxes-type.columns-container .block em { + font-size: 12px; + font-weight: 600; + line-height: 15.6px; + } + + .ab-downloads main .section.wide.awards .default-content-wrapper { + border-radius: 0; + background-color: #0853C5; + padding: 2em; + } + + .ab-downloads main .section.wide.awards .default-content-wrapper * { + color: white; + text-align: center; + } + + .ab-downloads main .section.wide.awards .default-content-wrapper h2 { + font-size: 23px; + font-weight: 500; + line-height: 29.9px; + } + + .ab-downloads main .section.wide.awards .default-content-wrapper h4 { + font-size: 13px; + font-weight: 600; + line-height: 16.9px; + } + + .ab-downloads main .section.wide.awards .default-content-wrapper p { + margin-bottom: 0; + } + + .ab-downloads main .section.wide.awards .default-content-wrapper a { + background-color: #006DFF; + font-size: 14px; + font-weight: 700; + line-height: 16.1px; + } + + .ab-downloads main h2, .ab-downloads main .default-content-wrapper h2 { + max-width: unset; + } + + .ab-downloads main .accordion.terms-of-use .accordion-item h3 { + font-size: 12px; + font-weight: 600; + line-height: 15.6px; + } + + .ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-content p, .ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-content p *, .ab-downloads main .accordion.terms-of-use .accordion-item .accordion-item-content *, .ab-downloads main .accordion-container > .default-content-wrapper:last-of-type p { + font-size: 11px; + font-weight: 400; + line-height: 14.3px; + } + + .ab-downloads main .full-grey-bck.columns-container .block > div > div:first-of-type p.button-container { + display: none; + } + + .ab-downloads main .full-grey-bck.columns-container .block > div > div:last-of-type p.button-container { + display: block; + } +} + +@media(max-width: 550px) { + .ab-downloads main .hero a.button.modal, .ab-downloads main .hero a.button.central { + width: 100%; + text-align: center; + display: flex; + align-items: center; + justify-content: center; + } +} \ No newline at end of file From 5b5f0a9e9035fd8bc8f462b5ef65637dbade700d Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Thu, 19 Dec 2024 12:53:23 +0200 Subject: [PATCH 208/248] updates --- .../template-factories/ab-downloads.css | 110 ++++++++++++++---- 1 file changed, 89 insertions(+), 21 deletions(-) diff --git a/_src/scripts/template-factories/ab-downloads.css b/_src/scripts/template-factories/ab-downloads.css index b8c7e041f..35bba2c7f 100644 --- a/_src/scripts/template-factories/ab-downloads.css +++ b/_src/scripts/template-factories/ab-downloads.css @@ -15,6 +15,21 @@ margin: 0 auto; } +.ab-downloads main .section.wide.awards .default-content-wrapper { + border-radius: 15px; + background-color: #0853C5; + padding: 2em; +} + +.ab-downloads main .section.wide.awards .default-content-wrapper * { + color: white; + text-align: center; +} + +.ab-downloads main .section.wide.awards .default-content-wrapper a { + background-color: #006DFF; +} + .ab-downloads main .section.wide.awards h2 { font-size: 40px; font-weight: 700; @@ -221,6 +236,10 @@ color: #3D3D3D; } +.ab-downloads main .blue-titles.image-columns-container { + padding-top: 0; +} + .ab-downloads main .blue-titles.image-columns-container .block { margin-top: 3em; } @@ -276,7 +295,7 @@ text-align: center; } -.ab-downloads main .full-grey-bck.columns-container { +.ab-downloads main .full-grey-bck.columns-container > div.columns-wrapper { background-color: #F6F6F6; border-radius: 20px; padding: 2em; @@ -284,6 +303,7 @@ .ab-downloads main .full-grey-bck.columns-container .block > div { gap: 5em; + align-items: flex-start; } .ab-downloads main .full-grey-bck.columns-container h3 { @@ -328,10 +348,6 @@ padding: 0; } -.ab-downloads main .full-grey-bck.columns-container .block > div > div:last-of-type p.button-container { - display: none; -} - .ab-downloads main .full-grey-bck.columns-container p.button-container { margin: 0; } @@ -343,7 +359,12 @@ line-height: 18.4px; } +.ab-downloads main .has-dropdown.columns-container { + padding-bottom: 0; +} + .ab-downloads main .has-dropdown.columns-container h2 { + max-width: 100%; margin: 0; text-align: left; } @@ -355,19 +376,52 @@ .ab-downloads main .has-dropdown.columns-container .block { border-top: 1px solid #E5E7EB; margin-top: 1.5em; - padding-top: 1em; + padding-top: 0; } .ab-downloads main .has-dropdown.columns-container .block > div { align-items: self-start; } -.ab-downloads main .has-dropdown.columns-container h3 { - color: #006DFF; - font-size: 22px; - font-weight: 700; - line-height: 26px; - min-height: unset !important; +.ab-downloads main .has-dropdown.columns-container .block > div:first-of-type { + background-color: #E4F2FF; + padding: 1em 3em; + margin-bottom: 1em; +} + +.ab-downloads main .has-dropdown.columns-container .block > div:first-of-type img { + width: 170px; +} + +.ab-downloads main .has-dropdown.columns-container .block > div:first-of-type > div { + display: flex; + align-items: center; + gap: 2em; +} + +.ab-downloads main .has-dropdown.columns-container .block > div:first-of-type p { + font-family: Roboto; + font-size: 18px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0.5px; +} + +.ab-downloads main .has-dropdown.columns-container .block > div:first-of-type p strong { + padding-bottom: 15px; + display: inline-block; +} + +.ab-downloads main .has-dropdown.columns-container .block > div:last-of-type { + min-height: 17em; +} + +.ab-downloads main .has-dropdown.columns-container p { + font-family: Roboto; + font-size: 18px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0.5px; } .ab-downloads main .has-dropdown.columns-container .columns-left-col p { @@ -739,13 +793,6 @@ .ab-downloads main .section.wide.awards .default-content-wrapper { border-radius: 0; - background-color: #0853C5; - padding: 2em; - } - - .ab-downloads main .section.wide.awards .default-content-wrapper * { - color: white; - text-align: center; } .ab-downloads main .section.wide.awards .default-content-wrapper h2 { @@ -765,7 +812,6 @@ } .ab-downloads main .section.wide.awards .default-content-wrapper a { - background-color: #006DFF; font-size: 14px; font-weight: 700; line-height: 16.1px; @@ -791,9 +837,31 @@ display: none; } - .ab-downloads main .full-grey-bck.columns-container .block > div > div:last-of-type p.button-container { + .ab-downloads main .has-dropdown.columns-container .block > div:first-of-type { + background-color: transparent; + padding: 0; + } + + .ab-downloads main .has-dropdown.columns-container .block > div:first-of-type img { + display: none; + } + + .ab-downloads main .has-dropdown.columns-container .block > div:first-of-type > div { display: block; } + + .ab-downloads main .has-dropdown.columns-container .block > div:first-of-type p { + font-size: 12px; + font-weight: 400; + line-height: 15.6px; + } + + .ab-downloads main .has-dropdown.columns-container .block > div:first-of-type p strong { + font-size: 13px; + font-weight: 600; + line-height: 16.9px; + color: #006DFF; + } } @media(max-width: 550px) { From 265eb1e0c7fb4f0bce2ca8692bf93b5f3e07110f Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Thu, 19 Dec 2024 13:21:05 +0200 Subject: [PATCH 209/248] update hero banner --- .../template-factories/ab-downloads.css | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/_src/scripts/template-factories/ab-downloads.css b/_src/scripts/template-factories/ab-downloads.css index 35bba2c7f..816461ea5 100644 --- a/_src/scripts/template-factories/ab-downloads.css +++ b/_src/scripts/template-factories/ab-downloads.css @@ -540,6 +540,30 @@ color: #161616; } +@media (min-width: 1600px) { + main .hero-container .block { + max-width: var(--section-large-desktop-max-width); + padding-left: var(--section-large-desktop-padding); + padding-right: var(--section-large-desktop-padding); + border-radius: 10px; + overflow: hidden; + margin: 1em auto; + background-color: #F8F8F8; + } +} + +@media (min-width: 990px) { + main .hero-container .block { + max-width: var(--section-desktop-max-width); + min-height: unset; + padding: 1em var(--section-desktop-padding) 1em var(--section-desktop-padding); + border-radius: 10px; + overflow: hidden; + margin: 1em auto; + background-color: #F8F8F8; + } +} + @media(max-width: 767px) { .ab-downloads main { display: grid; From 906c69761af822f4f4a348e67e5a546e9243fec1 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 19 Dec 2024 14:43:30 +0200 Subject: [PATCH 210/248] Solve comments --- _src/scripts/libs/store/store.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 9903408b2..4b98db1f9 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -718,7 +718,7 @@ class Vlaicu { static #isSohoCornerCase = (productId) => Constants.SOHO_CORNER_CASES_LOCALSE.includes(Page.locale) && productId === "com.bitdefender.soho" - static $getGeoIpFlag = async () => { + static #getGeoIpFlag = async () => { const offer = await Target.getOffer('geoip-flag-mbox'); if (offer && offer.content && typeof offer.content.geoIpPrice !== 'undefined') { @@ -730,7 +730,7 @@ class Vlaicu { static async getProductVariations(productId, campaign) { let locale = this.#isSohoCornerCase(productId) ? "en-mt" : Page.locale; - let geoIpFlag = await this.$getGeoIpFlag(); + let geoIpFlag = await this.#getGeoIpFlag(); if (geoIpFlag) { locale = await User.locale; } @@ -743,7 +743,9 @@ class Vlaicu { }; // get the correct path to get the prices - let productPath = campaign !== Constants.NO_PROMOTION ? this.promotionPath : this.defaultPromotionPath; + let productPath = campaign !== Constants.NO_PROMOTION || this.#isSohoCornerCase(productId) ? + this.promotionPath : + this.defaultPromotionPath; // replace all variables from the path const pathVariablesRegex = new RegExp(Object.keys(pathVariablesResolverObject).join("|"),"gi"); From d0a32ba3aaada11e7bdf32d9dec907df30c3c47d Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 19 Dec 2024 15:01:48 +0200 Subject: [PATCH 211/248] add constants class --- _src/scripts/libs/constants.js | 243 +++++++++++++++++---------------- 1 file changed, 123 insertions(+), 120 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index af284a9fe..95d17340c 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -1,123 +1,126 @@ import Page from "./page.js" -export const Constants = { - DEV_BASE_URL: ['localhost', 'stage', '.hlx.'].some((domain) => - window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : '', - - FINGERPRINT_LOCAL_STORAGE_NAME: 'rhvID', - - NO_FINGERPRINT_COOKIE_NAME: 'fgpnoneBD', - - LOGIN_LOGGED_USER_EXPIRY_COOKIE_NAME: 'bdcslue', - - ZUROA_LOCALES: ['nl-nl', 'nl-be'], - - DEV_DOMAINS: ['localhost', 'stage', '.hlx.'], - - PRODUCT_ID_MAPPINGS: { - av: "com.bitdefender.cl.av", - is: "com.bitdefender.cl.is", - tsmd: "com.bitdefender.cl.tsmd", - fp: ['nl-nl', 'nl-be'].includes(Page.locale) ? "com.bitdefender.fp" : "com.bitdefender.cl.fp", - ps: "com.bitdefender.premiumsecurity", - psm: "com.bitdefender.premiumsecurity", - psp: "com.bitdefender.premiumsecurityplus", - pspm: "com.bitdefender.premiumsecurityplus", - soho: "com.bitdefender.soho", - mac: "com.bitdefender.avformac", - vpn: "com.bitdefender.vpn", - "vpn-monthly": "com.bitdefender.vpn", - pass: "com.bitdefender.passwordmanager", - passm: "com.bitdefender.passwordmanager", - pass_sp: "com.bitdefender.passwordmanager", - pass_spm: "com.bitdefender.passwordmanager", - bms: "com.bitdefender.bms", - mobile: "com.bitdefender.bms", - ios: "com.bitdefender.iosprotection", - mobileios: "com.bitdefender.iosprotection", - dip: "com.bitdefender.dataprivacy", - dipm: "com.bitdefender.dataprivacy", - avpm: 'com.bitdefender.cl.avplus.v2', - ultsec: "com.bitdefender.ultimatesecurityus", - ultsecplus: "com.bitdefender.ultimatesecurityplusus", - ultsecm: "com.bitdefender.ultimatesecurityus", - ultsecplusm: "com.bitdefender.ultimatesecurityplusus", - idthefts: "com.bitdefender.idtheftstandard", - idtheftp: "com.bitdefender.idtheftpremium", - idtheftsm: "com.bitdefender.idtheftstandard", - idtheftpm: "com.bitdefender.idtheftpremium", - // DLP - ts_i: 'com.bitdefender.tsmd.v2', - ts_f: 'com.bitdefender.tsmd.v2', - ps_i: 'com.bitdefender.premiumsecurity.v2', - ps_f: 'com.bitdefender.premiumsecurity.v2', - us_i: 'com.bitdefender.ultimatesecurityeu.v2', - us_i_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_f: 'com.bitdefender.ultimatesecurityeu.v2', - us_f_m: 'com.bitdefender.ultimatesecurityeu.v2', - us_pf: 'com.bitdefender.ultimatesecurityus.v2', - us_pf_m: 'com.bitdefender.ultimatesecurityus.v2', - us_pi: 'com.bitdefender.ultimatesecurityus.v2', - us_pi_m: 'com.bitdefender.ultimatesecurityus.v2', - us_pie: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pie_m: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe: 'com.bitdefender.ultimatesecurityplusus.v2', - us_pfe_m: 'com.bitdefender.ultimatesecurityplusus.v2', - secpass: 'com.bitdefender.securepass', - secpassm: 'com.bitdefender.securepass', - vsb: 'com.bitdefender.vsb', - vsbm: 'com.bitdefender.vsb', - sc: 'com.bitdefender.ccp', - scm: 'com.bitdefender.ccp' - }, - - PRODUCT_ID_NAME_MAPPINGS: { - pass: "Bitdefender Password Manager", - pass_sp: "Bitdefender Password Manager Shared Plan", - passm: "Bitdefender Password Manager", - pass_spm: "Bitdefender Password Manager Shared Plan" - }, - - MONTHLY_PRODUCTS: ["psm", "pspm", "vpn-monthly", "passm", "pass_spm", "dipm", "us_i_m", "us_f_m", "us_pf_m", "us_pi_m", "us_pie_m", "us_pfe_m", "ultsecm", "ultsecplusm", "idtheftsm", "idtheftpm", "secpassm", "vsbm", "scm"], - - WRONG_DEVICES_PRODUCT_IDS: { - 'pass_sp': { - contentDevices: 1, - providerDevices: 4, - }, - 'pass_spm': { - contentDevices: 1, - providerDevices: 4, - }, - 'vpn': { - contentDevices: 10, - providerDevices: 1, - }, - 'vpn-monthly': { - contentDevices: 10, - providerDevices: 1, - } - }, - - DISABLE_TARGET_PARAMS: { - key: "dotest", - value: "1" - }, - - TARGET_EXPERIMENT_METADATA_KEY: "target-experiment-location", - - ADOBE_TARGET_SESSION_ID_PARAM: "adobeTargetSessionId", - - TARGET_TENANT: "bitdefender", - - PUBLIC_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) - ? '' : 'https://www.bitdefender.com', +export class Constants { + static DEV_BASE_URL = ['localhost', 'stage', '.hlx.'].some((domain) => + window.location.hostname.includes(domain)) ? 'https://www.bitdefender.com' : ''; - LOGIN_URL_ORIGIN: ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) - ? window.location.origin : 'https://www.bitdefender.com', - - NO_PROMOTION: "ignore", - - // TODO: please remove this once digital river starts working correctly - SOHO_CORNER_CASES_LOCALSE: ["de-de", "de-at", "de-ch"] -} \ No newline at end of file + static FINGERPRINT_LOCAL_STORAGE_NAME = 'rhvID'; + + static NO_FINGERPRINT_COOKIE_NAME = 'fgpnoneBD'; + + static LOGIN_LOGGED_USER_EXPIRY_COOKIE_NAME = 'bdcslue'; + + static ZUROA_LOCALES = ['nl-nl', 'nl-be']; + + static DEV_DOMAINS = ['localhost', 'stage', '.hlx.']; + + static PRODUCT_ID_MAPPINGS_CALL = this.#getVlaicuProductIdsMapping(); + + /** + * @typedef {Object} VlaicuDataEntry + * @property {string} websiteId + * @property {string} storeBundleId + * @property {boolean} isMonthlyProduct + * @property {string} campaign + */ + + /** + * + * @typedef {{ + * [key: string]: VlaicuDataEntry + * }} VlaicuData + */ + + /** + * @typedef {{ + * campaign: string + * }} VlaicuDataCampaign + */ + + /** + * @type {VlaicuData & VlaicuDataCampaign | null} + */ + static PRODUCT_ID_MAPPINGS = null; + + static WRONG_DEVICES_PRODUCT_IDS = { + 'pass_sp': { + contentDevices: 1, + providerDevices: 4, + }, + 'pass_spm': { + contentDevices: 1, + providerDevices: 4, + }, + 'vpn': { + contentDevices: 10, + providerDevices: 1, + }, + 'vpn-monthly': { + contentDevices: 10, + providerDevices: 1, + } + }; + + static DISABLE_TARGET_PARAMS = { + key: "dotest", + value: "1" + }; + + static TARGET_EXPERIMENT_METADATA_KEY = "target-experiment-location"; + + static ADOBE_TARGET_SESSION_ID_PARAM = "adobeTargetSessionId"; + + static TARGET_TENANT = "bitdefender"; + + static PUBLIC_URL_ORIGIN = ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) + ? '' : 'https://www.bitdefender.com'; + + static LOGIN_URL_ORIGIN = ['www.', 'stage.'].some(domain => window.location.hostname.includes(domain)) + ? window.location.origin : 'https://www.bitdefender.com'; + + static NO_PROMOTION = "ignore"; + + // TODO: please remove this once digital river starts working correctly + static SOHO_CORNER_CASES_LOCALSE = ["de-de", "de-at", "de-ch"]; + + /** + * fetch all the product id mappings for Vlaicu from websites + */ + static async #getVlaicuProductIdsMapping() { + try { + const localeForVlaicuConfig = this.ZUROA_LOCALES.includes(Page.locale) ? "nl-nl" : "en-us"; + const response = await fetch(`/${localeForVlaicuConfig}/consumer/vlaicuconfig.json`); + if (!response.ok) { + console.error(`Failed to fetch data.`); + return; + } + + /** + * @type {{ + * websiteId: string, + * bundleId: string, + * isMonthlyProduct: boolean, + * campaign: string + * }[]} + */ + const data = (await response.json())?.data; + if (!data) { + return; + } + + const vlaicuProductIdsMapping = data.reduce((accumulator, currentValue) => { + accumulator[currentValue.websiteId] = { + ...currentValue, + isMonthlyProduct: currentValue.isMonthlyProduct === "false" ? false : true + }; + return accumulator; + }, {}); + vlaicuProductIdsMapping.campaign = data[0].campaign || this.NO_PROMOTION; + + this.PRODUCT_ID_MAPPINGS = vlaicuProductIdsMapping; + } catch(e) { + console.error(`Failed to fetch data.`); + return; + } + }; + } \ No newline at end of file From 6818222e854f39c9954cb4c6577257f4014b5de4 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Thu, 19 Dec 2024 15:17:01 +0200 Subject: [PATCH 212/248] re add deleted code --- _src/scripts/libs/store/store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/store/store.js b/_src/scripts/libs/store/store.js index 9c8001f04..17249e792 100644 --- a/_src/scripts/libs/store/store.js +++ b/_src/scripts/libs/store/store.js @@ -799,8 +799,8 @@ class Vlaicu { const devicesObj = { currency_iso: productVariation.currency, - product_id: Constants.PRODUCT_ID_MAPPINGS[id], - platform_product_id: productInfoResponse.platformProductId || Constants.PRODUCT_ID_MAPPINGS[id], + product_id: Constants.PRODUCT_ID_MAPPINGS[id].bundleId, + platform_product_id: productInfoResponse.platformProductId || Constants.PRODUCT_ID_MAPPINGS[id].bundleId, promotion: isReceivedPromotionValid ? productInfoResponse.campaign : campaignId, From 0f958962c91905badc2ffd2da4c32fe2f2fbc817 Mon Sep 17 00:00:00 2001 From: Manuel ENACHE Date: Thu, 19 Dec 2024 15:19:41 +0200 Subject: [PATCH 213/248] feat: generate new sitemaps --- _src/sitemap/csg/sitemap_de-at.xml | 2 + _src/sitemap/csg/sitemap_de-ch.xml | 2 + _src/sitemap/csg/sitemap_de-de.xml | 2 + _src/sitemap/csg/sitemap_en-ae.xml | 209 + _src/sitemap/csg/sitemap_en-au.xml | 209 + _src/sitemap/csg/sitemap_en-bg.xml | 209 + _src/sitemap/csg/sitemap_en-bz.xml | 208 + _src/sitemap/csg/sitemap_en-ca.xml | 209 + _src/sitemap/csg/sitemap_en-cz.xml | 209 + _src/sitemap/csg/sitemap_en-dk.xml | 209 + _src/sitemap/csg/sitemap_en-gb.xml | 213 ++ _src/sitemap/csg/sitemap_en-hu.xml | 209 + _src/sitemap/csg/sitemap_en-id.xml | 209 + _src/sitemap/csg/sitemap_en-il.xml | 209 + _src/sitemap/csg/sitemap_en-in.xml | 209 + _src/sitemap/csg/sitemap_en-jm.xml | 208 + _src/sitemap/csg/sitemap_en-kr.xml | 209 + _src/sitemap/csg/sitemap_en-lv.xml | 208 + _src/sitemap/csg/sitemap_en-mt.xml | 208 + _src/sitemap/csg/sitemap_en-my.xml | 209 + _src/sitemap/csg/sitemap_en-no.xml | 209 + _src/sitemap/csg/sitemap_en-nz.xml | 209 + _src/sitemap/csg/sitemap_en-ph.xml | 209 + _src/sitemap/csg/sitemap_en-pl.xml | 209 + _src/sitemap/csg/sitemap_en-sa.xml | 209 + _src/sitemap/csg/sitemap_en-th.xml | 209 + _src/sitemap/csg/sitemap_en-us.xml | 210 +- _src/sitemap/csg/sitemap_en-za.xml | 209 + _src/sitemap/csg/sitemap_es-bz.xml | 2 + _src/sitemap/csg/sitemap_es-cl.xml | 2 + _src/sitemap/csg/sitemap_es-co.xml | 2 + _src/sitemap/csg/sitemap_es-es.xml | 2 + _src/sitemap/csg/sitemap_es-mx.xml | 2 + _src/sitemap/csg/sitemap_es-pe.xml | 2 + _src/sitemap/csg/sitemap_fr-fr.xml | 2 + _src/sitemap/csg/sitemap_it-it.xml | 2 + _src/sitemap/csg/sitemap_nl-nl.xml | 8 +- _src/sitemap/csg/sitemap_pt-br.xml | 2 + _src/sitemap/csg/sitemap_pt-pt.xml | 2 + _src/sitemap/csg/sitemap_ro-ro.xml | 2 + _src/sitemap/csg/sitemap_sv-se.xml | 2 +- _src/sitemap/csg/sitemap_zh-tw.xml | 5716 +++------------------------- 42 files changed, 5701 insertions(+), 5279 deletions(-) diff --git a/_src/sitemap/csg/sitemap_de-at.xml b/_src/sitemap/csg/sitemap_de-at.xml index 90708005d..db4f325a5 100644 --- a/_src/sitemap/csg/sitemap_de-at.xml +++ b/_src/sitemap/csg/sitemap_de-at.xml @@ -1633,6 +1633,7 @@ + @@ -1856,6 +1857,7 @@ + diff --git a/_src/sitemap/csg/sitemap_de-ch.xml b/_src/sitemap/csg/sitemap_de-ch.xml index d091cf12e..abf5f1097 100644 --- a/_src/sitemap/csg/sitemap_de-ch.xml +++ b/_src/sitemap/csg/sitemap_de-ch.xml @@ -1632,6 +1632,7 @@ + @@ -1855,6 +1856,7 @@ + diff --git a/_src/sitemap/csg/sitemap_de-de.xml b/_src/sitemap/csg/sitemap_de-de.xml index c7fab09e9..929091e51 100644 --- a/_src/sitemap/csg/sitemap_de-de.xml +++ b/_src/sitemap/csg/sitemap_de-de.xml @@ -1628,6 +1628,7 @@ + @@ -1851,6 +1852,7 @@ + diff --git a/_src/sitemap/csg/sitemap_en-ae.xml b/_src/sitemap/csg/sitemap_en-ae.xml index aab966bf6..11fe8c38e 100644 --- a/_src/sitemap/csg/sitemap_en-ae.xml +++ b/_src/sitemap/csg/sitemap_en-ae.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-ae/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-au.xml b/_src/sitemap/csg/sitemap_en-au.xml index 32dad1707..6d994d712 100644 --- a/_src/sitemap/csg/sitemap_en-au.xml +++ b/_src/sitemap/csg/sitemap_en-au.xml @@ -263,6 +263,7 @@ + @@ -2511,6 +2512,7 @@ + @@ -4897,4 +4899,211 @@ + + https://www.bitdefender.com/en-au/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-bg.xml b/_src/sitemap/csg/sitemap_en-bg.xml index 3894a6874..f56b5a8c3 100644 --- a/_src/sitemap/csg/sitemap_en-bg.xml +++ b/_src/sitemap/csg/sitemap_en-bg.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-bg/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-bz.xml b/_src/sitemap/csg/sitemap_en-bz.xml index 4467979ca..1994806cc 100644 --- a/_src/sitemap/csg/sitemap_en-bz.xml +++ b/_src/sitemap/csg/sitemap_en-bz.xml @@ -484,6 +484,7 @@ + @@ -1150,6 +1151,7 @@ + @@ -4851,4 +4853,210 @@ + + https://www.bitdefender.com/en-bz/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-ca.xml b/_src/sitemap/csg/sitemap_en-ca.xml index c8412fb4c..b3260134c 100644 --- a/_src/sitemap/csg/sitemap_en-ca.xml +++ b/_src/sitemap/csg/sitemap_en-ca.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-ca/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-cz.xml b/_src/sitemap/csg/sitemap_en-cz.xml index 08b302559..881ccf12e 100644 --- a/_src/sitemap/csg/sitemap_en-cz.xml +++ b/_src/sitemap/csg/sitemap_en-cz.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-cz/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-dk.xml b/_src/sitemap/csg/sitemap_en-dk.xml index 090f8f88a..2285c1863 100644 --- a/_src/sitemap/csg/sitemap_en-dk.xml +++ b/_src/sitemap/csg/sitemap_en-dk.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-dk/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-gb.xml b/_src/sitemap/csg/sitemap_en-gb.xml index cf6539ab9..c6fc8c5ed 100644 --- a/_src/sitemap/csg/sitemap_en-gb.xml +++ b/_src/sitemap/csg/sitemap_en-gb.xml @@ -733,6 +733,7 @@ + @@ -2071,6 +2072,7 @@ + @@ -4910,4 +4912,215 @@ + + https://www.bitdefender.com/en-gb/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://www.bitdefender.com/en-gb/consumer/index-copy + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-hu.xml b/_src/sitemap/csg/sitemap_en-hu.xml index d251be707..4448f7127 100644 --- a/_src/sitemap/csg/sitemap_en-hu.xml +++ b/_src/sitemap/csg/sitemap_en-hu.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-hu/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-id.xml b/_src/sitemap/csg/sitemap_en-id.xml index 5c21a29f0..e3f2ae68b 100644 --- a/_src/sitemap/csg/sitemap_en-id.xml +++ b/_src/sitemap/csg/sitemap_en-id.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-id/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-il.xml b/_src/sitemap/csg/sitemap_en-il.xml index 48b7dd937..840739a80 100644 --- a/_src/sitemap/csg/sitemap_en-il.xml +++ b/_src/sitemap/csg/sitemap_en-il.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-il/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-in.xml b/_src/sitemap/csg/sitemap_en-in.xml index e7fa3166f..7fc475d98 100644 --- a/_src/sitemap/csg/sitemap_en-in.xml +++ b/_src/sitemap/csg/sitemap_en-in.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-in/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-jm.xml b/_src/sitemap/csg/sitemap_en-jm.xml index c8edaef49..edecf5cb4 100644 --- a/_src/sitemap/csg/sitemap_en-jm.xml +++ b/_src/sitemap/csg/sitemap_en-jm.xml @@ -484,6 +484,7 @@ + @@ -1150,6 +1151,7 @@ + @@ -4851,4 +4853,210 @@ + + https://www.bitdefender.com/en-jm/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-kr.xml b/_src/sitemap/csg/sitemap_en-kr.xml index fac4e1b5d..52ca925f9 100644 --- a/_src/sitemap/csg/sitemap_en-kr.xml +++ b/_src/sitemap/csg/sitemap_en-kr.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-kr/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-lv.xml b/_src/sitemap/csg/sitemap_en-lv.xml index 57c087250..73ca38626 100644 --- a/_src/sitemap/csg/sitemap_en-lv.xml +++ b/_src/sitemap/csg/sitemap_en-lv.xml @@ -485,6 +485,7 @@ + @@ -1151,6 +1152,7 @@ + @@ -4851,4 +4853,210 @@ + + https://www.bitdefender.com/en-lv/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-mt.xml b/_src/sitemap/csg/sitemap_en-mt.xml index 570f4968c..1519edbb4 100644 --- a/_src/sitemap/csg/sitemap_en-mt.xml +++ b/_src/sitemap/csg/sitemap_en-mt.xml @@ -484,6 +484,7 @@ + @@ -1150,6 +1151,7 @@ + @@ -4851,4 +4853,210 @@ + + https://www.bitdefender.com/en-mt/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-my.xml b/_src/sitemap/csg/sitemap_en-my.xml index 42b39d4db..10bd397c2 100644 --- a/_src/sitemap/csg/sitemap_en-my.xml +++ b/_src/sitemap/csg/sitemap_en-my.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-my/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-no.xml b/_src/sitemap/csg/sitemap_en-no.xml index 2a5365fb8..cce27e57a 100644 --- a/_src/sitemap/csg/sitemap_en-no.xml +++ b/_src/sitemap/csg/sitemap_en-no.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-no/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-nz.xml b/_src/sitemap/csg/sitemap_en-nz.xml index 109fd50c8..f6f62a255 100644 --- a/_src/sitemap/csg/sitemap_en-nz.xml +++ b/_src/sitemap/csg/sitemap_en-nz.xml @@ -263,6 +263,7 @@ + @@ -2512,6 +2513,7 @@ + @@ -4898,4 +4900,211 @@ + + https://www.bitdefender.com/en-nz/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-ph.xml b/_src/sitemap/csg/sitemap_en-ph.xml index 9dbb9cc6d..1f1035a6d 100644 --- a/_src/sitemap/csg/sitemap_en-ph.xml +++ b/_src/sitemap/csg/sitemap_en-ph.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-ph/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-pl.xml b/_src/sitemap/csg/sitemap_en-pl.xml index b907c83ce..69da41ed1 100644 --- a/_src/sitemap/csg/sitemap_en-pl.xml +++ b/_src/sitemap/csg/sitemap_en-pl.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-pl/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-sa.xml b/_src/sitemap/csg/sitemap_en-sa.xml index dd96fb7a6..bcddcd295 100644 --- a/_src/sitemap/csg/sitemap_en-sa.xml +++ b/_src/sitemap/csg/sitemap_en-sa.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-sa/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-th.xml b/_src/sitemap/csg/sitemap_en-th.xml index de1d13879..007ea9e08 100644 --- a/_src/sitemap/csg/sitemap_en-th.xml +++ b/_src/sitemap/csg/sitemap_en-th.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-th/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-us.xml b/_src/sitemap/csg/sitemap_en-us.xml index f509d3cad..82f7da85f 100644 --- a/_src/sitemap/csg/sitemap_en-us.xml +++ b/_src/sitemap/csg/sitemap_en-us.xml @@ -486,6 +486,7 @@ + @@ -3646,6 +3647,7 @@ + @@ -3831,7 +3833,6 @@ https://www.bitdefender.com/en-us/consumer/small-business-security - @@ -4962,4 +4963,211 @@ + + https://www.bitdefender.com/en-us/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_en-za.xml b/_src/sitemap/csg/sitemap_en-za.xml index 1ae1359b8..ce47cc771 100644 --- a/_src/sitemap/csg/sitemap_en-za.xml +++ b/_src/sitemap/csg/sitemap_en-za.xml @@ -486,6 +486,7 @@ + @@ -1155,6 +1156,7 @@ + @@ -4873,4 +4875,211 @@ + + https://www.bitdefender.com/en-za/consumer/link-checker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_es-bz.xml b/_src/sitemap/csg/sitemap_es-bz.xml index 138dd6c81..751f177f1 100644 --- a/_src/sitemap/csg/sitemap_es-bz.xml +++ b/_src/sitemap/csg/sitemap_es-bz.xml @@ -1842,6 +1842,7 @@ + @@ -2510,6 +2511,7 @@ + diff --git a/_src/sitemap/csg/sitemap_es-cl.xml b/_src/sitemap/csg/sitemap_es-cl.xml index 6eef29a38..a277c55ff 100644 --- a/_src/sitemap/csg/sitemap_es-cl.xml +++ b/_src/sitemap/csg/sitemap_es-cl.xml @@ -1842,6 +1842,7 @@ + @@ -2510,6 +2511,7 @@ + diff --git a/_src/sitemap/csg/sitemap_es-co.xml b/_src/sitemap/csg/sitemap_es-co.xml index b2cf04aca..6c681dbb0 100644 --- a/_src/sitemap/csg/sitemap_es-co.xml +++ b/_src/sitemap/csg/sitemap_es-co.xml @@ -1842,6 +1842,7 @@ + @@ -2510,6 +2511,7 @@ + diff --git a/_src/sitemap/csg/sitemap_es-es.xml b/_src/sitemap/csg/sitemap_es-es.xml index 7a09857c6..05f0205c6 100644 --- a/_src/sitemap/csg/sitemap_es-es.xml +++ b/_src/sitemap/csg/sitemap_es-es.xml @@ -1396,6 +1396,7 @@ + @@ -2288,6 +2289,7 @@ + diff --git a/_src/sitemap/csg/sitemap_es-mx.xml b/_src/sitemap/csg/sitemap_es-mx.xml index 21d917fc8..baf10d2b3 100644 --- a/_src/sitemap/csg/sitemap_es-mx.xml +++ b/_src/sitemap/csg/sitemap_es-mx.xml @@ -1842,6 +1842,7 @@ + @@ -2510,6 +2511,7 @@ + diff --git a/_src/sitemap/csg/sitemap_es-pe.xml b/_src/sitemap/csg/sitemap_es-pe.xml index f7a77ee4d..b816f433d 100644 --- a/_src/sitemap/csg/sitemap_es-pe.xml +++ b/_src/sitemap/csg/sitemap_es-pe.xml @@ -1842,6 +1842,7 @@ + @@ -2510,6 +2511,7 @@ + diff --git a/_src/sitemap/csg/sitemap_fr-fr.xml b/_src/sitemap/csg/sitemap_fr-fr.xml index 2389a0d99..6cca62348 100644 --- a/_src/sitemap/csg/sitemap_fr-fr.xml +++ b/_src/sitemap/csg/sitemap_fr-fr.xml @@ -1596,6 +1596,7 @@ + @@ -2710,6 +2711,7 @@ + diff --git a/_src/sitemap/csg/sitemap_it-it.xml b/_src/sitemap/csg/sitemap_it-it.xml index 855e35f17..4c74465ad 100644 --- a/_src/sitemap/csg/sitemap_it-it.xml +++ b/_src/sitemap/csg/sitemap_it-it.xml @@ -1611,6 +1611,7 @@ + @@ -2056,6 +2057,7 @@ + diff --git a/_src/sitemap/csg/sitemap_nl-nl.xml b/_src/sitemap/csg/sitemap_nl-nl.xml index 91246b701..281413037 100644 --- a/_src/sitemap/csg/sitemap_nl-nl.xml +++ b/_src/sitemap/csg/sitemap_nl-nl.xml @@ -1819,6 +1819,7 @@ + @@ -2933,6 +2934,7 @@ + @@ -4464,10 +4466,4 @@ - - https://www.bitdefender.com/nl-nl/consumer/small-business-security - - - - \ No newline at end of file diff --git a/_src/sitemap/csg/sitemap_pt-br.xml b/_src/sitemap/csg/sitemap_pt-br.xml index 24b8ff0c8..53e12ca08 100644 --- a/_src/sitemap/csg/sitemap_pt-br.xml +++ b/_src/sitemap/csg/sitemap_pt-br.xml @@ -2060,6 +2060,7 @@ + @@ -2505,6 +2506,7 @@ + diff --git a/_src/sitemap/csg/sitemap_pt-pt.xml b/_src/sitemap/csg/sitemap_pt-pt.xml index 12ff72385..642080de8 100644 --- a/_src/sitemap/csg/sitemap_pt-pt.xml +++ b/_src/sitemap/csg/sitemap_pt-pt.xml @@ -487,6 +487,7 @@ + @@ -3384,6 +3385,7 @@ + diff --git a/_src/sitemap/csg/sitemap_ro-ro.xml b/_src/sitemap/csg/sitemap_ro-ro.xml index f26db6a64..7e66e06e4 100644 --- a/_src/sitemap/csg/sitemap_ro-ro.xml +++ b/_src/sitemap/csg/sitemap_ro-ro.xml @@ -1614,6 +1614,7 @@ + @@ -2060,6 +2061,7 @@ + diff --git a/_src/sitemap/csg/sitemap_sv-se.xml b/_src/sitemap/csg/sitemap_sv-se.xml index eab0e78c3..c2357a828 100644 --- a/_src/sitemap/csg/sitemap_sv-se.xml +++ b/_src/sitemap/csg/sitemap_sv-se.xml @@ -672,7 +672,6 @@ https://www.bitdefender.com/sv-se/consumer/small-business-security - @@ -2067,6 +2066,7 @@ + diff --git a/_src/sitemap/csg/sitemap_zh-tw.xml b/_src/sitemap/csg/sitemap_zh-tw.xml index 8a4c5d804..1928bf7b6 100644 --- a/_src/sitemap/csg/sitemap_zh-tw.xml +++ b/_src/sitemap/csg/sitemap_zh-tw.xml @@ -1,5276 +1,450 @@ - https://www.bitdefender.com/zh-tw/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/footer - - - - - https://www.bitdefender.com/zh-tw/nav - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/accordion - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/awards-search - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/barchart - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/buttons - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/columns - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/embed - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/features - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/form - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/fragment-metadata - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/hero - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/image-columns - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/product-comparison-table - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/products - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/quote-carousel - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/section-metadata - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/stickynav - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/tabs - - - - - https://www.bitdefender.com/zh-tw/sidekick/blocks/tags - - - - - https://www.bitdefender.com/zh-tw/sidekick/icons/standard-icons - - - - - https://www.bitdefender.com/zh-tw/solutions/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/404 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/antivirus - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/antivirus-for-mac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/antivirus-free-for-android - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/awards - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/digital-identity-protection - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/family-pack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/footer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/free-antivirus - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/internet-security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/mobile-security-android - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/mobile-security-ios - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/nav - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/password-manager - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/premium-security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/small-office-security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/thank-you - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/total-security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/trafficlight - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/virus-scanner-for-mac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.bitdefender.com/zh-tw/solutions/vpn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + https://www.bitdefender.com/zh-tw/consumer/mobile-security-android + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://www.bitdefender.com/zh-tw/consumer/trafficlight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 586c48fe9142c74e05ff2127986407952b23d52a Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 20 Dec 2024 14:01:24 +0200 Subject: [PATCH 214/248] added hero banner for ferrari page --- _src/blocks/hero/hero.css | 58 +++++++++++++++++++++++++++++++++++++++ _src/blocks/hero/hero.js | 8 ++++++ _src/styles/styles.css | 10 +++++++ 3 files changed, 76 insertions(+) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index 3ee5751cb..b24eee7e3 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -625,6 +625,44 @@ main .hero.ferrari .breadcrumb{ height: 50px; } +main .hero-container.ferrari-migration .hero{ + background-color:#006DFF; + font-family: "IBM Plex Sans", sans-serif; +} + +main .hero-container.ferrari-migration .hero .hero-content h1{ + color: #FFF; + line-height: 0.8; +} +main .hero-container.ferrari-migration .hero .hero-content h2{ + color: #FFF; + font-weight: 300; +} + +main .hero-container.ferrari-migration .hero .hero-content p{ + color: #fff; +} + +main .hero-container.ferrari-migration .hero .hero-content .breadcrumb{ + display: none; +} + +main .hero-container.ferrari-migration .hero .hero-content a{ + font-size: 18px; + font-weight: 700; + background-color: #fff; + border-radius: 10px; + padding: 15px 10px; +} + +main .hero-container.ferrari-migration .hero .hero-content a img{ + position: relative; + bottom: -10px; + height: 87px; + margin-right: 10px; + border-radius: 5px; +} + @media(max-width: 989px) { main .hero.new2024design { background-color: #006FFF; @@ -838,6 +876,26 @@ main .hero.ferrari .breadcrumb{ right: -11em !important; bottom: -3em; } + main .hero-container.ferrari-migration .hero{ + min-height: 600px; + align-content: center; + } + + main .hero-container.ferrari-migration .hero .hero-content h1{ + font-size: 60px; + font-weight: 300; + line-height: 0.7; + } + + main .hero-container.ferrari-migration .hero .hero-content h2{ + font-size: 32px; + font-weight: 300; + margin-top: 50px; + } + + main .hero-container.ferrari-migration .hero .hero-picture img{ + width: 50%; + } } @media (max-width: 1399px) { diff --git a/_src/blocks/hero/hero.js b/_src/blocks/hero/hero.js index f83a70723..3c1c32727 100644 --- a/_src/blocks/hero/hero.js +++ b/_src/blocks/hero/hero.js @@ -93,6 +93,7 @@ export default function decorate(block) { signature, percentProduct, firefoxUrl, + buttonImage, } = block.closest('.section').dataset; buildHeroBlock(block); @@ -122,6 +123,13 @@ export default function decorate(block) { modalButton.setAttribute('data-stop-automatic-modal-refresh', true); }); } + + if (buttonImage) { + const buttonImageEl = document.createElement('img'); + buttonImageEl.setAttribute('src', buttonImage); + const heroBtn = block.querySelector('a'); + heroBtn.insertAdjacentElement('afterbegin', buttonImageEl); + } } // make discount dynamic diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 350e30e04..612cd4410 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1552,6 +1552,16 @@ main .section.blue a.button.modal::after { text-align: center; } +.centered-img{ + text-align: center; +} + +.centered-img img{ + position: relative; + width: 70%; + left: -3%; +} + .align-left { text-align: left; } From a2f5cd33c1d97d6646fce0281aa4dd390aae9feb Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 20 Dec 2024 14:17:26 +0200 Subject: [PATCH 215/248] fixes for webview table --- _src/blocks/webview-table/webview-table.css | 23 ++++++++++++++++----- _src/blocks/webview-table/webview-table.js | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index e2f91925d..cb231b47c 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -24,7 +24,8 @@ .webview-table h1 { text-align: center; - font: bold 24px; + font-size: 24px; + font-weight: 700; font-family: "Segoe UI", Arial, sans-serif; color: #F7F7F7; margin: 10px 0 14px; @@ -112,7 +113,7 @@ margin: 0 auto; font-family: "Segoe UI", Arial, sans-serif; - &.light-mode { + .webview-table.light-mode { background-color: #fff; color: black; @@ -120,6 +121,10 @@ color: black; } + .webview-comparison-header{ + background-color: #FFF; + } + div[role="columnheader"] { background-color: #fff; color: #000; @@ -159,7 +164,7 @@ } .featured{ - background-color: #F9F9FE; + background-color: #F9F9FE !important; } } } @@ -179,7 +184,7 @@ .prod-oldprice{ text-align: center; text-decoration: line-through; - font: normal normal normal 14px; + font-size: 14px; font-family: "Segoe UI", Arial, sans-serif; letter-spacing: 0; opacity: 1; @@ -187,7 +192,8 @@ .prod-newprice{ text-align: center; - font: normal normal bold 20px; + font-size: 20px; + font-weight: 700; font-family: "Segoe UI", Arial, sans-serif; letter-spacing: 0; color: #FFF; @@ -220,6 +226,13 @@ content: none; } + &:hover{ + filter: brightness(0.9); + } + + &:hover span.button-text{ + transform: none; + } } .webview-table .button .button-text { diff --git a/_src/blocks/webview-table/webview-table.js b/_src/blocks/webview-table/webview-table.js index ac36abaf7..2d5169f8a 100644 --- a/_src/blocks/webview-table/webview-table.js +++ b/_src/blocks/webview-table/webview-table.js @@ -69,7 +69,7 @@ function renderPrices(block, metadata) { // Determine if current product or featured product const isFeatured = index + 1 === Number(featuredProduct); const isCurrent = Number(currentProduct) === index + 1; - if (prodName) { + if (prodName && !isCurrent) { cell.setAttribute('data-store-context', ''); cell.setAttribute('data-store-id', prodName); cell.setAttribute('data-store-option', `${prodUsers}-${prodYears}`); From e12a696ba6af3b09f55425d8e640a3f5b1443980 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 20 Dec 2024 14:24:51 +0200 Subject: [PATCH 216/248] lint fix --- _src/blocks/webview-table/webview-table.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index cb231b47c..e4d5d1833 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -113,7 +113,7 @@ margin: 0 auto; font-family: "Segoe UI", Arial, sans-serif; - .webview-table.light-mode { + .light-mode { background-color: #fff; color: black; @@ -160,12 +160,16 @@ } .button { - background-color: #fff; + background-color: #fff !important; } .featured{ background-color: #F9F9FE !important; } + + .featured .button-text{ + color: #006EFF !important; + } } } From 393dd2580dc016dd6895b56d86628fecebb5772f Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 20 Dec 2024 14:27:21 +0200 Subject: [PATCH 217/248] lint fix --- _src/blocks/webview-table/webview-table.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index e4d5d1833..fb8a58a16 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -107,6 +107,11 @@ text-align: center; } +.webview-table .button .button-text { + color: #006EFF; + text-align: center; +} + .webview-table-wrapper { max-width: 770px; height: 512px; @@ -239,11 +244,6 @@ } } - .webview-table .button .button-text { - color: #006EFF; - text-align: center; -} - .webview-table-wrapper .webview-table .featured { background-color: #202123; From baf649968af12e20fcd7e9beb614681a21cd9b0e Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 20 Dec 2024 14:57:49 +0200 Subject: [PATCH 218/248] featured button on light mode color adjustment --- _src/blocks/webview-table/webview-table.css | 43 +++++++++++---------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/_src/blocks/webview-table/webview-table.css b/_src/blocks/webview-table/webview-table.css index fb8a58a16..e93a500f3 100644 --- a/_src/blocks/webview-table/webview-table.css +++ b/_src/blocks/webview-table/webview-table.css @@ -107,6 +107,25 @@ text-align: center; } +.webview-table-wrapper .webview-table .button{ + justify-content: center; + border: 2px solid #006EFF; + background-color: black; + width: 122px; + padding: 6px 16px; + border-radius: 4px; + text-align: center; + + &::after { + display: none; + content: none; + } + + &:hover span.button-text{ + transform: none; + } +} + .webview-table .button .button-text { color: #006EFF; text-align: center; @@ -172,8 +191,8 @@ background-color: #F9F9FE !important; } - .featured .button-text{ - color: #006EFF !important; + .featured .button{ + background-color: #006EFF !important; } } } @@ -219,29 +238,10 @@ .webview-table-wrapper .webview-table .button-container{ margin-top: 2px; margin-bottom: 4px; -} - -.webview-table-wrapper .webview-table .button{ - justify-content: center; - border: 2px solid #006EFF; - background-color: black; - width: 122px; - padding: 6px 16px; - border-radius: 4px; - text-align: center; - - &::after { - display: none; - content: none; - } &:hover{ filter: brightness(0.9); } - - &:hover span.button-text{ - transform: none; - } } .webview-table-wrapper .webview-table .featured { @@ -258,6 +258,7 @@ .webview-table-wrapper .webview-table .current .button{ border-color: #767676; + pointer-events: none; .button-text{ color: #767676; From 2cd85a5819152550e6eecb06f8abc54df6358473 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 23 Dec 2024 12:07:40 +0200 Subject: [PATCH 219/248] added ferrari page styles for franklin --- _src/blocks/columns/columns.css | 41 ++++++++++++++++ _src/blocks/dropdown-box/dropdown-box.css | 1 - _src/blocks/embed/embed.css | 9 ++++ _src/blocks/hero/hero.css | 4 +- _src/blocks/image-columns/image-columns.css | 53 +++++++++++++++++++++ _src/blocks/image-columns/image-columns.js | 3 ++ _src/styles/styles.css | 7 +++ 7 files changed, 115 insertions(+), 3 deletions(-) diff --git a/_src/blocks/columns/columns.css b/_src/blocks/columns/columns.css index 4ce33247a..d26d586fc 100644 --- a/_src/blocks/columns/columns.css +++ b/_src/blocks/columns/columns.css @@ -286,6 +286,36 @@ width: 100%; } +.columns.ferrari-text > div{ + align-items: unset; +} + +.columns.ferrari-text h2{ + color:#006DFF; + font-weight: 300; +} +.columns.ferrari-text .columns-text-col{ + font-weight: 300; +} + +.section.ferrari-quote .columns.ferrari-text .columns-text-col{ + color:#006DFF; +} + +.columns.ferrari-text .columns-text-col.button-container{ + align-self: flex-end; +} + +.section.ferrari-quote .columns.ferrari-text .columns-text-col a{ + background: none; + border: none; + color:#006DFF; + text-align: right; + text-decoration: underline; + letter-spacing: 0; + display: block; +} + /* stylelint-disable-next-line selector-class-pattern */ .v2_benefits .columns-container .default-content-wrapper { margin-bottom: 3em; @@ -589,6 +619,17 @@ flex-direction: column; justify-content: space-between; } + + .columns.ferrari-text h2{ + font-size: 45px; + } + .columns.ferrari-text .columns-text-col{ + font-size: 30px; + } + + .section.ferrari-quote .columns.ferrari-text .columns-text-col{ + font-size: 20px; + } } @media (min-width: 992px) { /* desktop */ diff --git a/_src/blocks/dropdown-box/dropdown-box.css b/_src/blocks/dropdown-box/dropdown-box.css index 2c132c7b7..cbe2840b7 100644 --- a/_src/blocks/dropdown-box/dropdown-box.css +++ b/_src/blocks/dropdown-box/dropdown-box.css @@ -367,7 +367,6 @@ .dropdown-box-container.dropdown-slider .slider-box .description { position: absolute; - top: 12em; right: 0; padding-left: 5%; display: none; diff --git a/_src/blocks/embed/embed.css b/_src/blocks/embed/embed.css index dde6988ff..18949cb11 100644 --- a/_src/blocks/embed/embed.css +++ b/_src/blocks/embed/embed.css @@ -65,3 +65,12 @@ main .embed .embed-placeholder-play button::before { top: 0.25rem; left: 0.4375rem; } + +main .ferrari.embed-container .embed{ + max-width: 1332px; + padding: 0 20px; +} + +main .ferrari.embed-container .embed iframe{ + border-radius: 10px; +} \ No newline at end of file diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index b24eee7e3..e9b234add 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -628,11 +628,12 @@ main .hero.ferrari .breadcrumb{ main .hero-container.ferrari-migration .hero{ background-color:#006DFF; font-family: "IBM Plex Sans", sans-serif; + font-weight: 300; } main .hero-container.ferrari-migration .hero .hero-content h1{ color: #FFF; - line-height: 0.8; + line-height: 1; } main .hero-container.ferrari-migration .hero .hero-content h2{ color: #FFF; @@ -884,7 +885,6 @@ main .hero-container.ferrari-migration .hero .hero-content a img{ main .hero-container.ferrari-migration .hero .hero-content h1{ font-size: 60px; font-weight: 300; - line-height: 0.7; } main .hero-container.ferrari-migration .hero .hero-content h2{ diff --git a/_src/blocks/image-columns/image-columns.css b/_src/blocks/image-columns/image-columns.css index a539ff083..77ba091e8 100644 --- a/_src/blocks/image-columns/image-columns.css +++ b/_src/blocks/image-columns/image-columns.css @@ -103,6 +103,54 @@ main .section.wide .image-columns img{ height: auto; } +.ferrari .image-columns-wrapper{ + padding: 20px; +} + +main .image-columns.quotes > div{ + gap: 20px; +} + +main .image-columns.quotes >div > .image-columns-txt-col{ + display: flex; + flex-flow: column; + justify-content: space-between; + padding: 30px; + border-radius: 10px; + background-color: #006dff; + color: #fff; + font-size: 20px; +} + +main .image-columns.quotes > div > .image-columns-txt-col p{ + font-size: 25px; + font-weight: 300; + padding: 0; +} + +main .image-columns.quotes > div > .image-columns-img-col{ + align-items: unset; +} + +main .image-columns.quotes > div > .image-columns-img-col img{ + position: static; + height: auto; + max-width: 100%; +} + +@media (min-width: 767px){ + .image-columns.quotes > div { + flex-direction: unset; + column-gap: 58px; + align-items: center; + } + + .image-columns.quotes > div > div { + flex: 1; + order: unset; + } +} + @media (min-width: 992px) { .image-columns > div > .image-columns-txt-col h3 { margin-bottom: 26px; @@ -126,6 +174,11 @@ main .section.wide .image-columns img{ .image-columns > div > .image-columns-txt-col p { font-size: 18px; } + + .ferrari .image-columns-wrapper{ + padding: 0; + max-width: 1292px; + } } @media (min-width: 992px) { /* desktop */ diff --git a/_src/blocks/image-columns/image-columns.js b/_src/blocks/image-columns/image-columns.js index 7b896eb67..243fc4401 100644 --- a/_src/blocks/image-columns/image-columns.js +++ b/_src/blocks/image-columns/image-columns.js @@ -1,3 +1,5 @@ +import { matchHeights } from '../../scripts/utils/utils.js'; + export default function decorate(block) { const cols = [...block.firstElementChild.children]; block.classList.add(`columns-${cols.length}-cols`); @@ -22,4 +24,5 @@ export default function decorate(block) { } }); }); + matchHeights(block, '.image-columns.quotes > div > div'); } diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 612cd4410..44999a64a 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1121,6 +1121,13 @@ a.button.modal:hover::after, a.button.central:hover::after, main .section.link-r width: 100%; } +.red_logo_svg p { + color: transparent; + background: url('../../_src/icons/b-logo-red.svg') no-repeat center transparent; + font-size: 120px; + margin: 0 auto 0.5em; +} + main .section[data-backgroundcolor='black'] { background-color: black; } From 492cfce7946f940fa472401a8460ff48be07b7ba Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 23 Dec 2024 12:48:18 +0200 Subject: [PATCH 220/248] fix scuderia ferrari banner --- _src/blocks/hero/hero.css | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index e9b234add..f96ca8e69 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -352,9 +352,6 @@ main .hero img { main .hero .hero-picture picture img { position: absolute; right: 0; - - /* display: none; */ - padding-left: 200px; } main .hero a.button { @@ -688,6 +685,7 @@ main .hero-container.ferrari-migration .hero .hero-content a img{ padding-left: 0; object-fit:cover; object-position: bottom; + width: 100%; } main .hero.ferrari .hero-content{ From adfea174b24637e64b2ecf5c3198404b14d9da5a Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 23 Dec 2024 12:54:17 +0200 Subject: [PATCH 221/248] adjusted query --- _src/blocks/hero/hero.css | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/_src/blocks/hero/hero.css b/_src/blocks/hero/hero.css index f96ca8e69..254249782 100644 --- a/_src/blocks/hero/hero.css +++ b/_src/blocks/hero/hero.css @@ -708,11 +708,6 @@ main .hero-container.ferrari-migration .hero .hero-content a img{ } - main .hero.ferrari .hero-content > div img{ - max-height: 225px; - max-width: 813px; - } - main .hero.ferrari h1{ font-size: 60px; font-weight: 300; @@ -875,6 +870,12 @@ main .hero-container.ferrari-migration .hero .hero-content a img{ right: -11em !important; bottom: -3em; } + + main .hero.ferrari .hero-content > div img{ + max-height: 225px; + max-width: 813px; + } + main .hero-container.ferrari-migration .hero{ min-height: 600px; align-content: center; From f3c47be00bc41394b8b06e705f4aacf4b81cb6ff Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 23 Dec 2024 14:28:07 +0200 Subject: [PATCH 222/248] adjusted styles --- .../scuderia-ferrari-section.css | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css index e28a1f6cd..42517ddd2 100644 --- a/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css +++ b/_src/blocks/scuderia-ferrari-section/scuderia-ferrari-section.css @@ -245,11 +245,6 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper font-weight: 700; margin: 0; } - - div:last-of-type{ - max-width: 80%; - padding: 3%; - } } .scuderia-ferrari-section.quotes-left{ @@ -265,6 +260,15 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper font-size: 26px; font-weight: 400; } + + > div:last-of-type{ + align-self: center; + } + + div:last-of-type{ + padding: 5%; + max-width: 80%; + } } } @@ -402,7 +406,7 @@ main .scuderia-ferrari-section-container, main .scuderia-ferrari-section-wrapper a.button.primary{ font-size: 23px; - padding: 15px 29px; + padding: 15px 29px; } a.button span.button-text{ From 469b1b5253dfc51cb95350bb8c5e49a27c6ef0bd Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 23 Dec 2024 16:19:40 +0200 Subject: [PATCH 223/248] renamed ferrari colab image metadata --- _src/styles/styles.css | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 44999a64a..b4ab26bbf 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1559,13 +1559,12 @@ main .section.blue a.button.modal::after { text-align: center; } -.centered-img{ - text-align: center; -} -.centered-img img{ + +.ferrari-img img{ + display: block; position: relative; - width: 70%; + margin: auto; left: -3%; } @@ -1660,6 +1659,10 @@ main .section.blue a.button.modal::after { .buttons-align-right > div > :nth-child(1) { font-size: var(--heading-font-size-l) !important; } + + .ferrari-img img{ + max-width: 80%; + } } @media (max-width: 1399px) { From 6bf54f2c66b4e86cfa73be172b86a1c01b6d3496 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 23 Dec 2024 16:23:54 +0200 Subject: [PATCH 224/248] lint fix --- _src/styles/styles.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/_src/styles/styles.css b/_src/styles/styles.css index b4ab26bbf..59f2f86f4 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1559,8 +1559,6 @@ main .section.blue a.button.modal::after { text-align: center; } - - .ferrari-img img{ display: block; position: relative; From 6ac82b66f6f13f5737afae357571b14b114b5913 Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Thu, 26 Dec 2024 21:50:59 +0200 Subject: [PATCH 225/248] styling trial modal --- .../template-factories/ab-downloads.css | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/_src/scripts/template-factories/ab-downloads.css b/_src/scripts/template-factories/ab-downloads.css index 816461ea5..f5f314e06 100644 --- a/_src/scripts/template-factories/ab-downloads.css +++ b/_src/scripts/template-factories/ab-downloads.css @@ -540,6 +540,74 @@ color: #161616; } +.ab-downloads .modal-container .modal-content { + padding: 0; + max-width: 787px; + height: 350px; + overflow: hidden; +} + +.ab-downloads .modal-container .column-container { + padding-bottom: 0; +} + +.ab-downloads .modal-container .block > div { + align-items: center; + gap: 0; +} + +.ab-downloads .modal-container .block * { + text-align: center; +} + +.ab-downloads .modal-container .block .columns-img-col img { + height: 100%; +} + +.ab-downloads .modal-container .block h2 { + font-size: 1.5rem; + font-weight: 400; +} + +.ab-downloads .modal-container .block p { + color: #3c3c3c; + font-stretch: normal; + font-style: normal; + font-weight: 500; + letter-spacing: normal; + line-height: 1.5; +} + +.ab-downloads .modal-container .block p u { + text-decoration: none; + color: rgb(81 167 29 / 1); + font-size: 18px; + font-weight: 500; +} + +.ab-downloads .modal-container .block p.button-container a { + background-color: #51a71d; + border: 2px solid #51a71d; + font-size: 16px; + font-weight: 500; + color: white; + padding: 10px 26px 8px 28px; + text-transform: uppercase; +} + +.ab-downloads .modal-container .block p.button-container a::after { + display: none; +} + +.ab-downloads .modal-container .block p.button-container a:hover { + background-color: #469c12; + border: 2px solid #469c12; +} + +.ab-downloads .modal-container .block .columns-text-col { + padding: 1em; +} + @media (min-width: 1600px) { main .hero-container .block { max-width: var(--section-large-desktop-max-width); @@ -569,9 +637,41 @@ display: grid; } + .ab-downloads .modal-container .block .columns-img-col { + order: 2; + margin-bottom: 0; + display: none; + } + + .ab-downloads .modal-container .modal-content { + height: auto; + } + + .ab-downloads .modal-container .modal-content .modal-close { + top: 10px; + right: 10px; + } + + .ab-downloads .modal-container .columns-container { + padding-bottom: 0; + } + + .ab-downloads .modal-container .columns-wrapper { + padding: 0; + } + + .ab-downloads .modal-container .block h2 { + font-size: 21px; + } + + .ab-downloads .modal-container .block p u { + font-size: 17px; + } + .ab-downloads main .main .hero-container { order: 1 } + .ab-downloads main .has-dropdown.columns-container { order: 2; padding-top: 0; From 6bcc1bab90f06f81a97b8989a1a4297f555860ff Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 3 Jan 2025 11:21:57 +0200 Subject: [PATCH 226/248] implemented experiment design --- _src/blocks/four-cards/four-cards.js | 4 + .../product-comparison-table.js | 27 +- _src/scripts/template-factories/dex-19400.css | 497 ++++++++++++++++++ 3 files changed, 524 insertions(+), 4 deletions(-) create mode 100644 _src/scripts/template-factories/dex-19400.css diff --git a/_src/blocks/four-cards/four-cards.js b/_src/blocks/four-cards/four-cards.js index 71922ba0c..897205f78 100644 --- a/_src/blocks/four-cards/four-cards.js +++ b/_src/blocks/four-cards/four-cards.js @@ -1,3 +1,5 @@ +import { matchHeights } from '../../scripts/utils/utils.js'; + export default async function decorate(block, options) { const { // eslint-disable-next-line no-unused-vars @@ -47,4 +49,6 @@ export default async function decorate(block, options) { const { decorateIcons } = await import('../../scripts/utils/utils.js'); decorateIcons(block.closest('.section')); } + + matchHeights(block, 'h3'); } diff --git a/_src/blocks/product-comparison-table/product-comparison-table.js b/_src/blocks/product-comparison-table/product-comparison-table.js index b7e334f36..c614440cb 100644 --- a/_src/blocks/product-comparison-table/product-comparison-table.js +++ b/_src/blocks/product-comparison-table/product-comparison-table.js @@ -9,7 +9,7 @@ createNanoBlock('priceComparison', (code, variant, label, block, productIndex, c const priceRoot = document.createElement('div'); priceRoot.classList.add('product-comparison-price'); - const oldPriceText = block.closest('.section').dataset.old_price_text ?? 'Old Price'; + const oldPriceText = block.closest('.section').dataset.old_price_text ?? ''; const oldPriceElement = document.createElement('p'); priceRoot.appendChild(oldPriceElement); oldPriceElement.innerText = '-'; @@ -20,15 +20,29 @@ createNanoBlock('priceComparison', (code, variant, label, block, productIndex, c priceElement.classList.add('current-price-container'); const priceAppliedOnTime = document.createElement('p'); priceRoot.appendChild(priceAppliedOnTime); + // create a mock buyzone for free products + if (code.includes('free')) { + oldPriceElement.innerHTML = ` +
+
+ `; + priceElement.innerHTML = `
+ ${label} + +
`; + priceAppliedOnTime.innerHTML = '

'; + return priceRoot; + } oldPriceElement.innerHTML = `

${oldPriceText} - Savings + Savings
`; priceElement.innerHTML = `
- + + /year
`; priceAppliedOnTime.innerHTML = label; @@ -175,7 +189,7 @@ function buildTableHeader(block) { paragraphBefore?.classList.add('per-year-statement'); const paragraphAfter = buttonSection.nextElementSibling; paragraphAfter?.classList.add('product-comparison-header-subtitle'); - paragraphAfter?.nextElementSibling.classList.add('product-comparison-header-subtitle'); + paragraphAfter?.nextElementSibling?.classList.add('product-comparison-header-subtitle'); } }); } @@ -281,6 +295,11 @@ export default function decorate(block) { } }); + if (block.classList.contains('green-tag')) { + block.querySelector('.savings').classList.remove('d-none'); + } + matchHeights(block, 'h3'); matchHeights(block, '.old-price-container'); + matchHeights(block, '.product-comparison-price'); } diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css new file mode 100644 index 000000000..e1f7082f3 --- /dev/null +++ b/_src/scripts/template-factories/dex-19400.css @@ -0,0 +1,497 @@ +.dex-19400{ + .section.centered{ + h2{ + font-size: 23px; + justify-self: center; + } + } + + .section.light-gray .default-content-wrapper, .section.light-gray .four-cards-wrapper{ + background-color: #F6F6F6; + } + + .section.light-gray-wide{ + background-color: #F6F6F6; + } + + .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrapper{ + h2{ + font-size: 23px; + margin-bottom: 24px; + width: 100%; + } + p:not(:last-of-type){ + margin-bottom: 24px; + } + + p:last-of-type{ + margin-bottom: 0; + } + } + + .section.blue-title{ + h3{ + color: #006DFF; + font-size: 24px; + } + .columns p{ + font-size: 16px; + } + } + + .benefits{ + svg{ + width: 31px; + height: 31px; + } + span{ + margin: 0; + height: 31px; + } + p:first-of-type{ + margin-bottom: 0; + } + > div > div{ + display: flex; + flex-flow: row; + } + + } + + .hero.block{ + width: 100%; + max-width: 1350px; + justify-self: center; + h3, strong{ + color: #000; + } + + .hero-picture{ + border-radius: 20px; + img{ + border-radius: 20px; + } + &::after{ + background: none; + } + } + + strong a{ + text-decoration: underline; + } + + a.button{ + min-width: auto; + } + } + + .columns{ + text-align: left; + + >div{ + align-items: baseline; + } + } + + .image-columns { + > div{ + align-items: start; + + > .image-columns-txt-col{ + text-align: left; + p{ + padding-left: 0; + font-size: 16px; + margin-bottom: 24px; + } + + h3{ + font-size: 22px; + margin-bottom: 6px; + } + } + + } + } + + .awards-container .block.awards-component{ + h3{ + margin-bottom: 12px; + } + h4{ + margin-bottom: 24px; + } + + >div{ + justify-content: center; + text-align: -webkit-center; + gap: 20px; + } + + > div:nth-child(2){ + min-width: 100%; + >div{ + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + width: 95%; + margin-top: 24px; + } + img{ + height: 62px; + } + } + } + + .product-comparison-table.green-tag{ + .column-fixed-width{ + text-align: left; + padding: 15px; + p{ + text-align: left; + padding: 0; + } + + p:first-of-type{ + flex-grow: 0; + } + + h3{ + margin: 0 1em 1em 0; + width: 50%; + font-weight: 700; + } + + .button{ + width: 100%; + background-color: var(--button-background-color); + border: 2px solid var(--button-background-color); + color: var(--button-link-color); + } + tbody{ + display: grid; + grid-template-rows: repeat(2, minmax(40px, auto)); + } + + td{ + display: flex; + text-align: left; + gap: 5px; + svg, span{ + width: 18px; + height: 18px; + } + } + tr:last-of-type td, tr:last-of-type p{ + font-size: 12px; + color: #000; + font-weight: 600 !important; + } + } + + .product-comparison-header div[role="columnheader"]:not(:first-child).active { + box-shadow: none; + position: unset; + } + div[role='columnheader']:nth-child(1){ + width: 100%; + } + div[role="row"]:not(.product-comparison-header){ + display: flex; + flex-wrap: wrap; + } + + div[role="cell"]:not(:first-child){ + background-color: #fff; + border-right: 1px solid #E4F2FF; + border-bottom: 1px solid #E4F2FF; + } + div[role="cell"]:has(.no-check){ + background-color: #eee; + border-bottom:1px solid #fff; + } + + div[role='cell']:first-child{ + width: 33%; + border-radius: 0; + border-right: 1px solid #E4F2FF; + } + + div[role="cell"].active{ + box-shadow: none; + } + + div[role="columnheader"]:not(:first-child).active::before{ + display: none; + } + + .product-comparison-price{ + gap: 5px; + p{ + color: #161616; + } + + p:last-of-type{ + border: none; + } + + .old-price-container{ + align-content: baseline; + } + + .old-price-box{ + display: flex; + flex-direction: column-reverse; + align-items: flex-start; + justify-self: flex-start; + gap: 10px; + + span{ + position: relative; + text-align: left; + font-weight: 700; + del{ + color: #000; + } + } + + .savings{ + display: inline-block; + background-color: #68BA68; + padding: 5px; + border-radius: 16px; + color: #fff; + font-size: 14px; + span{ + font-size: 14px; + color: #fff; + } + } + } + + .new-price-box{ + margin-top: 5px; + display: inline-flex; + .total-text{ + font-size: 23px; + } + + sup{ + position: relative;; + font-size: 16px; + margin-left: 2px; + } + } + } + } + + .creator-cards { + .four-cards.white-cards{ + h3{ + text-align: left; + font-size: 24px; + line-height: 1.25; + margin-bottom: 0; + } + + li{ + max-width: 428px; + background-color: #fff; + } + + svg{ + width: 50px; + height: 50px; + box-shadow: rgba(0, 0, 0, 0.05); + } + } + + .four-cards.centered{ + li{ + text-align: center; + max-width: 321px; + } + p, strong{ + font-size: 16px; + } + + p:first-of-type{ + margin: 0; + } + + span{ + margin: 0; + height: 31px; + } + + svg{ + height: 31px; + width: 31px; + } + } + } + + .system-requirements-item .requirement > ul{ + display: flex; + flex-flow: column; + gap: 2px; + li{ + margin: 0; + font-size: 12px; + } + li:has(strong) { + margin-top: 7px; + } + } + + @media (max-width: 767px) { + .hero-container.grey-background .hero{ + background-color: #f8f8f8f8; + } + + .hero .hero-content{ + padding-bottom: 0; + } + + .product-comparison-table-wrapper{ + padding: 0; + .product-comparison-table.green-tag{ + .product-comparison-header{ + display: grid; + gap:0; + grid-template-columns:repeat(2, 1fr) + } + + .column-fixed-width{ + width: auto; + display: grid; + grid-template-rows: subgrid; + grid-row: 1/7; + } + + .product-comparison-price{ + display: grid; + grid-auto-flow: dense; + gap: 0px; + grid-template-rows: repeat(1, minmax(40px, auto)); + } + + } + div [role="row"] div[role="cell"]:first-of-type{ + min-width: 100%; + } + } + + .questions-answers-container .questions-answers-item .question h3{ + font-size: 12px; + padding-right: 0; + text-align: left; + } + } + + @media (min-width: 767px) { + .section{ + padding-top: 40px; + padding-bottom: 40px; + } + + .section.centered{ + h2{ + width: 70%; + font-size: 34px; + } + } + + .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrapper{ + padding: 50px; + border-radius: 20px; + + h2{ + font-size: 40px; + } + } + + .columns{ + justify-items: center; + } + + .benefits{ + padding-top: 24px; + >div{ + flex-direction: row; + } + + > div > div{ + flex-flow: column; + align-items: center; + } + } + + .creator-cards{ + .four-cards.centered{ + >ul{ + grid-template-columns: repeat(3, 1fr); + } + } + + .four-cards.white-cards{ + margin-bottom: 40px; + > ul { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-gap: 30px; + } + } + } + + .awards-container .block.awards-component{ + h3{ + font-size: 40px; + } + + h4{ + font-size: 22px; + } + } + + .product-comparison-table.green-tag{ + &div[role="row"]:not(.product-comparison-header) { + div[role="cell"]:first-of-type { + min-width: unset; + } + } + + .column-fixed-width{ + padding: 24px; + tr:last-of-type td, tr:last-of-type p{ + font-size: 16px; + } + } + + .product-comparison-price{ + .old-price-box{ + flex-direction: unset; + span{ + font-size: 16px; + align-self: center; + } + } + + .new-price-box{ + .total-text{ + font-size: 42px; + } + sup{ + top: 10px; + margin-left: 10px; + font-size: 22px; + } + } + } + + div[role='columnheader']:nth-child(1){ + width: 33%; + } + } + } +} \ No newline at end of file From b8e74e1c3f60cf5d429136db90e7a6ab2221dbbf Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Wed, 8 Jan 2025 13:15:58 +0200 Subject: [PATCH 227/248] adjusted mobile styles --- _src/scripts/template-factories/dex-19400.css | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index e1f7082f3..44f59f836 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -32,7 +32,7 @@ .section.blue-title{ h3{ color: #006DFF; - font-size: 24px; + font-size: 18px; } .columns p{ font-size: 16px; @@ -106,7 +106,7 @@ } h3{ - font-size: 22px; + font-size: 18px; margin-bottom: 6px; } } @@ -136,6 +136,7 @@ flex-wrap: wrap; width: 95%; margin-top: 24px; + gap: 20px; } img{ height: 62px; @@ -289,11 +290,20 @@ .four-cards.white-cards{ h3{ text-align: left; - font-size: 24px; + font-size: 17px; line-height: 1.25; margin-bottom: 0; } + p{ + font-size: 12px; + margin-bottom: 0; + } + + a{ + margin-top: 10px; + } + li{ max-width: 428px; background-color: #fff; @@ -345,6 +355,19 @@ } @media (max-width: 767px) { + .section{ + padding-top: 0; + a{ + width: 100%; + justify-content: center; + + } + } + + .section.centered:not(.light-gray-wide){ + text-align: left; + } + .hero-container.grey-background .hero{ background-color: #f8f8f8f8; } @@ -353,6 +376,10 @@ padding-bottom: 0; } + .image-columns > div > .image-columns-img-col img { + display: none; + } + .product-comparison-table-wrapper{ padding: 0; .product-comparison-table.green-tag{ @@ -382,10 +409,15 @@ } } - .questions-answers-container .questions-answers-item .question h3{ - font-size: 12px; - padding-right: 0; - text-align: left; + .questions-answers-container{ + .default-content-wrapper{ + padding-bottom: 0; + } + .questions-answers-item .question h3{ + font-size: 12px !important; + padding-right: 0; + text-align: left; + } } } @@ -436,6 +468,18 @@ .four-cards.white-cards{ margin-bottom: 40px; + h3{ + font-size: 24px; + } + + p{ + font-size: 16px; + } + + a{ + margin-top: 32px; + } + > ul { display: grid; grid-template-columns: repeat(2, 1fr); From 17c69a3c6e2d665e73149425b07a27d46728d2d6 Mon Sep 17 00:00:00 2001 From: ltiseanu Date: Wed, 8 Jan 2025 14:05:32 +0200 Subject: [PATCH 228/248] Correct ui for buttons --- _src/scripts/template-factories/ab-downloads.css | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/_src/scripts/template-factories/ab-downloads.css b/_src/scripts/template-factories/ab-downloads.css index f5f314e06..d26a764e9 100644 --- a/_src/scripts/template-factories/ab-downloads.css +++ b/_src/scripts/template-factories/ab-downloads.css @@ -355,8 +355,19 @@ .ab-downloads main .full-grey-bck.columns-container p.button-container a { background-color: #D70000; font-size: 16px; - font-weight: 700; line-height: 18.4px; + padding: 1em; + height: 45px; + display: inline-flex; + align-items: center; + justify-content: center; + color: white; + font-weight: 500; + margin: 1em 0; +} + +.ab-downloads main .full-grey-bck.columns-container p.button-container a::after { + display: none; } .ab-downloads main .has-dropdown.columns-container { From 1d2823b7fa5921624b16614152bd1e31cb5b2f10 Mon Sep 17 00:00:00 2001 From: "iconstantin@bitdefender.com" Date: Thu, 9 Jan 2025 12:53:00 +0200 Subject: [PATCH 229/248] moved config files in commons folder --- _src/scripts/libs/constants.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/scripts/libs/constants.js b/_src/scripts/libs/constants.js index fa4fa8e26..d4c8c1404 100644 --- a/_src/scripts/libs/constants.js +++ b/_src/scripts/libs/constants.js @@ -88,8 +88,8 @@ export class Constants { */ static async #getVlaicuProductIdsMapping() { try { - const localeForVlaicuConfig = this.ZUROA_LOCALES.includes(Page.locale) ? "nl-nl" : "en-us"; - const response = await fetch(`/${localeForVlaicuConfig}/consumer/vlaicuconfig.json`); + const nameForVlaicuConfig = this.ZUROA_LOCALES.includes(Page.locale) ? "vlaicuconfigzuora" : "vlaicuconfig"; + const response = await fetch(`/common/vlaicuconfig/${nameForVlaicuConfig}.json`); if (!response.ok) { console.error(`Failed to fetch data.`); return; From 2e045871aa96e49e0bbf66143c7873a43008c169 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Thu, 9 Jan 2025 21:02:51 +0200 Subject: [PATCH 230/248] added dynamic content based on user OS to hero banner --- _src/blocks/hero/hero.js | 58 +++++++++++++++++++ _src/scripts/template-factories/dex-19400.css | 18 ++++++ 2 files changed, 76 insertions(+) diff --git a/_src/blocks/hero/hero.js b/_src/blocks/hero/hero.js index 3c1c32727..7ad1ffd5f 100644 --- a/_src/blocks/hero/hero.js +++ b/_src/blocks/hero/hero.js @@ -7,6 +7,33 @@ import { getBrowserName, } from '../../scripts/utils/utils.js'; +import { UserAgent } from '../../scripts/libs/user-agent/user-agent.js'; + +function detectAndRenderOSContent(osLinkMapping, androidTemplate, iosTemplate, block) { + const button = block.querySelector('a.button'); + const dynamicTextElement = button.parentNode.nextElementSibling; + switch (UserAgent.os) { + case 'android': + button.classList.add('android'); + button.href = osLinkMapping.android.googlePlay; + dynamicTextElement.querySelectorAll('a').forEach((anchor, index) => { + anchor.textContent = osLinkMapping[androidTemplate.split(',')[index].trim()].text; + anchor.href = osLinkMapping[androidTemplate.split(',')[index].trim()].link; + }); + break; + case 'ios': + button.classList.add('ios'); + button.href = osLinkMapping.ios.appStore; + dynamicTextElement.querySelectorAll('a').forEach((anchor, index) => { + anchor.textContent = osLinkMapping[iosTemplate.split(',')[index].trim()].text; + anchor.href = osLinkMapping[iosTemplate.split(',')[index].trim()].link; + }); + break; + default: + break; + } +} + /** * Builds hero block and prepends to main in a new section. * @param {Element} element The container element @@ -94,10 +121,41 @@ export default function decorate(block) { percentProduct, firefoxUrl, buttonImage, + iosLink, + androidLink, + windowsLink, + macLink, + androidTemplate, + iosTemplate, + appStoreLink, + googlePlayLink, } = block.closest('.section').dataset; buildHeroBlock(block); renderBubble(block); + if (androidLink && iosLink) { + const osLinkMapping = { + android: { + link: androidLink, + googlePlay: googlePlayLink, + text: 'Android', + }, + ios: { + link: iosLink, + appStore: appStoreLink, + text: 'iOS', + }, + windows: { + link: windowsLink, + text: 'Windows', + }, + mac: { + link: macLink, + text: 'macOS', + }, + }; + detectAndRenderOSContent(osLinkMapping, androidTemplate, iosTemplate, block); + } // Eager load images to improve LCP [...block.querySelectorAll('img')].forEach((el) => el.setAttribute('loading', 'eager')); diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 44f59f836..856253246 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -83,6 +83,24 @@ a.button{ min-width: auto; } + + a.button.android{ + background: #000 no-repeat center url("data:image/svg+xml,%3Csvg width='116' height='28' viewBox='0 0 116 28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M37.5 3.74995C37.5 4.54995 37.3 5.24995 36.8 5.74995C36.2 6.34995 35.5 6.64995 34.6 6.64995C33.7 6.64995 33 6.34995 32.4 5.74995C31.8 5.14995 31.5 4.44995 31.5 3.54995C31.5 2.64995 31.8 1.94995 32.4 1.34995C33 0.749951 33.7 0.449951 34.6 0.449951C35.5 0.449951 35.4 0.449951 35.8 0.749951C36.2 0.949951 36.5 1.14995 36.7 1.44995L36.2 1.94995C35.8 1.44995 35.3 1.24995 34.6 1.24995C33.9 1.24995 33.4 1.44995 33 1.94995C32.5 2.34995 32.3 2.94995 32.3 3.64995C32.3 4.34995 32.5 4.94995 33 5.34995C33.5 5.74995 34 6.04995 34.6 6.04995C35.2 6.04995 35.8 5.84995 36.3 5.34995C36.6 5.04995 36.8 4.64995 36.8 4.14995H34.6V3.44995H37.5C37.5 3.64995 37.5 3.74995 37.5 3.94995V3.74995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M42.1001 1.24995H39.4001V3.14995H41.9001V3.84995H39.4001V5.74995H42.1001V6.44995H38.6001V0.449951H42.1001V1.14995V1.24995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M45.3999 6.55005H44.5999V1.25005H42.8999V0.550049H46.9999V1.25005H45.2999V6.55005H45.3999Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M50 6.55005V0.550049H50.8V6.55005H50Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M54.2002 6.55005H53.4002V1.25005H51.7002V0.550049H55.8002V1.25005H54.1002V6.55005H54.2002Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M63.6999 5.74995C63.0999 6.34995 62.3999 6.64995 61.4999 6.64995C60.5999 6.64995 59.8999 6.34995 59.2999 5.74995C58.6999 5.14995 58.3999 4.44995 58.3999 3.54995C58.3999 2.64995 58.6999 1.94995 59.2999 1.34995C59.8999 0.749951 60.5999 0.449951 61.4999 0.449951C62.3999 0.449951 63.0999 0.749951 63.6999 1.34995C64.2999 1.94995 64.5999 2.64995 64.5999 3.54995C64.5999 4.44995 64.2999 5.14995 63.6999 5.74995ZM59.8999 5.24995C60.2999 5.64995 60.8999 5.94995 61.4999 5.94995C62.0999 5.94995 62.6999 5.74995 63.0999 5.24995C63.4999 4.84995 63.7999 4.24995 63.7999 3.54995C63.7999 2.84995 63.5999 2.24995 63.0999 1.84995C62.6999 1.44995 62.0999 1.14995 61.4999 1.14995C60.8999 1.14995 60.2999 1.34995 59.8999 1.84995C59.4999 2.24995 59.1999 2.84995 59.1999 3.54995C59.1999 4.24995 59.3999 4.84995 59.8999 5.24995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M65.7001 6.55005V0.550049H66.6001L69.5001 5.25005V4.05005V0.550049H70.3001V6.55005H69.5001L66.4001 1.65005V2.85005V6.55005H65.6001H65.7001Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M58.2002 15.3501C55.8002 15.3501 53.9002 17.1501 53.9002 19.6501C53.9002 22.1501 55.8002 23.9501 58.2002 23.9501C60.6002 23.9501 62.5002 22.1501 62.5002 19.6501C62.5002 17.1501 60.6002 15.3501 58.2002 15.3501ZM58.2002 22.1501C56.9002 22.1501 55.8002 21.0501 55.8002 19.5501C55.8002 18.0501 56.9002 16.9501 58.2002 16.9501C59.5002 16.9501 60.6002 17.9501 60.6002 19.5501C60.6002 21.1501 59.5002 22.1501 58.2002 22.1501ZM48.9002 15.3501C46.5002 15.3501 44.6002 17.1501 44.6002 19.6501C44.6002 22.1501 46.5002 23.9501 48.9002 23.9501C51.3002 23.9501 53.2002 22.1501 53.2002 19.6501C53.2002 17.1501 51.3002 15.3501 48.9002 15.3501ZM48.9002 22.1501C47.6002 22.1501 46.5002 21.0501 46.5002 19.5501C46.5002 18.0501 47.6002 16.9501 48.9002 16.9501C50.2002 16.9501 51.3002 17.9501 51.3002 19.5501C51.3002 21.1501 50.2002 22.1501 48.9002 22.1501ZM37.8002 16.6501V18.4501H42.1002C42.0002 19.4501 41.6002 20.2501 41.1002 20.7501C40.6002 21.2501 39.5002 22.0501 37.8002 22.0501C35.1002 22.0501 33.1002 19.9501 33.1002 17.2501C33.1002 14.5501 35.2002 12.4501 37.8002 12.4501C40.4002 12.4501 40.3002 13.0501 41.1002 13.7501L42.4002 12.4501C41.3002 11.4501 39.9002 10.6501 37.9002 10.6501C34.3002 10.6501 31.2002 13.6501 31.2002 17.2501C31.2002 20.8501 34.3002 23.8501 37.9002 23.8501C41.5002 23.8501 41.3002 23.2501 42.5002 21.9501C43.7002 20.7501 44.1002 19.0501 44.1002 17.7501C44.1002 16.4501 44.1002 16.9501 44.1002 16.6501H38.0002H37.8002ZM83.2002 18.0501C82.8002 17.0501 81.8002 15.3501 79.6002 15.3501C77.4002 15.3501 75.6002 17.0501 75.6002 19.6501C75.6002 22.2501 77.4002 23.9501 79.8002 23.9501C82.2002 23.9501 82.9002 22.7501 83.3002 22.0501L81.9002 21.0501C81.4002 21.7501 80.8002 22.2501 79.8002 22.2501C78.8002 22.2501 78.2002 21.8501 77.7002 20.9501L83.4002 18.5501L83.2002 18.0501ZM77.4002 19.4501C77.4002 17.8501 78.7002 16.9501 79.6002 16.9501C80.5002 16.9501 81.0002 17.3501 81.2002 17.8501L77.4002 19.4501ZM72.7002 23.5501H74.6002V11.0501H72.7002V23.5501ZM69.7002 16.2501C69.3002 15.7501 68.5002 15.2501 67.5002 15.2501C65.4002 15.2501 63.4002 17.1501 63.4002 19.5501C63.4002 21.9501 65.3002 23.7501 67.5002 23.7501C69.7002 23.7501 69.3002 23.2501 69.7002 22.7501V23.3501C69.7002 24.9501 68.8002 25.8501 67.4002 25.8501C66.0002 25.8501 65.5002 25.0501 65.3002 24.3501L63.7002 25.0501C64.2002 26.1501 65.4002 27.5501 67.5002 27.5501C69.6002 27.5501 71.5002 26.2501 71.5002 23.1501V15.5501H69.7002V16.2501ZM67.5002 22.1501C66.2002 22.1501 65.1002 21.0501 65.1002 19.5501C65.1002 18.0501 66.2002 16.9501 67.5002 16.9501C68.8002 16.9501 69.8002 18.0501 69.8002 19.5501C69.8002 21.0501 68.8002 22.1501 67.5002 22.1501ZM91.9002 11.0501H87.4002V23.5501H89.3002V18.8501H91.9002C94.0002 18.8501 96.0002 17.3501 96.0002 14.9501C96.0002 12.5501 94.0002 11.0501 91.9002 11.0501ZM92.0002 17.0501H89.3002V12.7501H92.0002C93.4002 12.7501 94.2002 13.9501 94.2002 14.8501C94.2002 15.7501 93.4002 16.9501 92.0002 16.9501V17.0501ZM103.5 15.2501C102.1 15.2501 100.7 15.8501 100.2 17.1501L101.9 17.8501C102.3 17.1501 102.9 16.9501 103.6 16.9501C104.3 16.9501 105.5 17.5501 105.6 18.5501C105.3 18.5501 104.5 18.1501 103.7 18.1501C101.9 18.1501 100.1 19.1501 100.1 20.9501C100.1 22.7501 101.6 23.7501 103.2 23.7501C104.8 23.7501 105.1 23.1501 105.6 22.5501V23.5501H107.4V18.7501C107.4 16.5501 105.7 15.2501 103.6 15.2501H103.5ZM103.3 22.1501C102.7 22.1501 101.8 21.8501 101.8 21.0501C101.8 20.2501 102.9 19.7501 103.8 19.7501C104.7 19.7501 105 19.9501 105.5 20.1501C105.4 21.3501 104.4 22.1501 103.3 22.1501ZM113.8 15.5501L111.7 20.9501L109.5 15.5501H107.5L110.8 23.1501L108.9 27.3501H110.8L115.9 15.5501H113.8ZM97.0002 23.5501H98.9002V11.0501H97.0002V23.5501Z' fill='white'/%3E%3Cpath d='M10.8002 12.95L0.200195 24.25C0.500195 25.45 1.60019 26.35 3.00019 26.35C4.40019 26.35 4.00019 26.25 4.50019 25.95L16.5002 19.05L10.9002 12.95H10.8002Z' fill='%23EA4335'/%3E%3Cpath d='M21.6001 11.05L16.4001 8.05005L10.6001 13.25L16.4001 19.05L21.5001 16.05C22.4001 15.55 23.0001 14.65 23.0001 13.55C23.0001 12.45 22.4001 11.55 21.5001 11.05H21.6001Z' fill='%23FBBC04'/%3E%3Cpath d='M0.200195 2.8501C0.200195 3.0501 0.200195 3.3501 0.200195 3.5501V23.5501C0.200195 23.8501 0.200195 24.0501 0.200195 24.2501L11.2002 13.2501L0.200195 2.8501Z' fill='%234285F4'/%3E%3Cpath d='M10.9001 13.55L16.4001 8.05L4.4001 1.15C4.0001 0.85 3.5001 0.75 2.9001 0.75C1.6001 0.75 0.400098 1.65 0.100098 2.85L10.8001 13.55H10.9001Z' fill='%2334A853'/%3E%3C/svg%3E"); + color: transparent; + border-color: #000; + &::after{ + display: none; + } + } + + a.button.ios{ + background: #000 no-repeat center url("data:image/svg+xml,%3Csvg width='100' height='26' viewBox='0 0 100 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.039 12.3365C15.0498 11.5018 15.2715 10.6834 15.6835 9.95747C16.0955 9.23151 16.6845 8.62158 17.3956 8.1844C16.9438 7.53924 16.3479 7.0083 15.6551 6.63375C14.9622 6.2592 14.1916 6.05135 13.4044 6.02672C11.7252 5.85046 10.0972 7.03155 9.24151 7.03155C8.36924 7.03155 7.05174 6.04422 5.63301 6.07341C4.71534 6.10306 3.82099 6.36991 3.03711 6.84797C2.25324 7.32603 1.60656 7.99899 1.16009 8.80128C-0.773908 12.1497 0.668681 17.0708 2.52129 19.7774C3.44819 21.1027 4.53147 22.5832 5.94892 22.5307C7.33598 22.4731 7.85402 21.6462 9.52832 21.6462C11.1871 21.6462 11.6731 22.5307 13.1193 22.4973C14.6077 22.4731 15.5455 21.166 16.4398 19.8281C17.1058 18.8838 17.6183 17.8401 17.9583 16.7356C17.0935 16.3699 16.3556 15.7577 15.8365 14.9754C15.3174 14.1931 15.04 13.2753 15.039 12.3365Z' fill='white'/%3E%3Cpath d='M12.3076 4.24672C13.1191 3.27252 13.5189 2.02034 13.4221 0.756104C12.1823 0.886324 11.037 1.47888 10.2145 2.41571C9.81239 2.87338 9.50439 3.40582 9.30815 3.98258C9.1119 4.55935 9.03126 5.16915 9.07082 5.7771C9.69096 5.78349 10.3045 5.64908 10.8651 5.38399C11.4258 5.1189 11.919 4.73005 12.3076 4.24672Z' fill='white'/%3E%3Cpath d='M32.5723 19.1756H27.8389L26.7021 22.532H24.6973L29.1807 10.114H31.2637L35.7471 22.532H33.708L32.5723 19.1756ZM28.3291 17.6267H32.0811L30.2315 12.1795H30.1797L28.3291 17.6267Z' fill='white'/%3E%3Cpath d='M45.4297 18.0056C45.4297 20.8191 43.9239 22.6267 41.6514 22.6267C41.0757 22.6568 40.5032 22.5242 39.9995 22.244C39.4957 21.9639 39.0809 21.5476 38.8028 21.0427H38.7598V25.5271H36.9014V13.4782H38.7002V14.9841H38.7344C39.0254 14.4816 39.4471 14.0674 39.9547 13.7856C40.4624 13.5037 41.0369 13.3648 41.6172 13.3835C43.915 13.3835 45.4297 15.1999 45.4297 18.0056ZM43.5196 18.0056C43.5196 16.1726 42.5723 14.9675 41.127 14.9675C39.7071 14.9675 38.752 16.198 38.752 18.0056C38.752 19.8298 39.7071 21.0515 41.127 21.0515C42.5723 21.0515 43.5196 19.8552 43.5196 18.0056Z' fill='white'/%3E%3Cpath d='M55.3946 18.0056C55.3946 20.8191 53.8887 22.6267 51.6162 22.6267C51.0406 22.6568 50.4681 22.5242 49.9643 22.244C49.4605 21.9639 49.0458 21.5476 48.7676 21.0427H48.7246V25.527H46.8662V13.4782H48.665V14.9841H48.6992C48.9902 14.4816 49.4119 14.0674 49.9195 13.7856C50.4272 13.5037 51.0017 13.3648 51.582 13.3835C53.8799 13.3835 55.3946 15.1999 55.3946 18.0056ZM53.4844 18.0056C53.4844 16.1726 52.5371 14.9675 51.0918 14.9675C49.6719 14.9675 48.7168 16.198 48.7168 18.0056C48.7168 19.8298 49.6719 21.0515 51.0918 21.0515C52.5371 21.0515 53.4844 19.8552 53.4844 18.0056Z' fill='white'/%3E%3Cpath d='M61.9805 19.0721C62.1182 20.3035 63.3145 21.1121 64.9492 21.1121C66.5157 21.1121 67.6426 20.3035 67.6426 19.1931C67.6426 18.2293 66.9629 17.6521 65.3535 17.2566L63.7442 16.8689C61.4639 16.3181 60.4053 15.2517 60.4053 13.5212C60.4053 11.3787 62.2725 9.90698 64.9239 9.90698C67.5479 9.90698 69.3467 11.3787 69.4073 13.5212H67.5313C67.419 12.282 66.3945 11.5339 64.8975 11.5339C63.4004 11.5339 62.376 12.2908 62.376 13.3923C62.376 14.2703 63.0303 14.7869 64.6309 15.1823L65.999 15.5183C68.5469 16.1208 69.6055 17.1443 69.6055 18.9607C69.6055 21.2839 67.7549 22.739 64.8115 22.739C62.0576 22.739 60.1982 21.3181 60.0781 19.072L61.9805 19.0721Z' fill='white'/%3E%3Cpath d='M73.6162 11.3357V13.4783H75.3379V14.95H73.6162V19.9412C73.6162 20.7166 73.9609 21.0779 74.7178 21.0779C74.9222 21.0743 75.1262 21.06 75.3291 21.0349V22.4978C74.9888 22.5614 74.643 22.5901 74.2969 22.5837C72.4639 22.5837 71.749 21.8952 71.749 20.1394V14.95H70.4326V13.4783H71.749V11.3357H73.6162Z' fill='white'/%3E%3Cpath d='M76.335 18.0056C76.335 15.157 78.0127 13.3669 80.6289 13.3669C83.2539 13.3669 84.9238 15.1569 84.9238 18.0056C84.9238 20.8621 83.2627 22.6443 80.6289 22.6443C77.996 22.6443 76.335 20.8621 76.335 18.0056ZM83.0303 18.0056C83.0303 16.0515 82.1348 14.8982 80.6289 14.8982C79.123 14.8982 78.2285 16.0603 78.2285 18.0056C78.2285 19.9675 79.123 21.1121 80.6289 21.1121C82.1348 21.1121 83.0303 19.9675 83.0303 18.0056Z' fill='white'/%3E%3Cpath d='M86.4561 13.4784H88.2285V15.0194H88.2715C88.3914 14.5381 88.6734 14.1128 89.07 13.8149C89.4666 13.517 89.9536 13.3647 90.4493 13.3837C90.6634 13.3829 90.877 13.4062 91.086 13.453V15.1913C90.8156 15.1087 90.5336 15.0707 90.251 15.079C89.981 15.068 89.7118 15.1156 89.462 15.2185C89.2122 15.3214 88.9875 15.4771 88.8036 15.675C88.6196 15.8729 88.4806 16.1083 88.3962 16.3649C88.3118 16.6216 88.2839 16.8935 88.3145 17.162V22.5321H86.4561L86.4561 13.4784Z' fill='white'/%3E%3Cpath d='M99.6543 19.8728C99.4043 21.5164 97.8037 22.6443 95.7559 22.6443C93.1221 22.6443 91.4873 20.8796 91.4873 18.0486C91.4873 15.2087 93.1309 13.3669 95.6777 13.3669C98.1826 13.3669 99.7578 15.0876 99.7578 17.8328V18.4695H93.3633V18.5818C93.3338 18.915 93.3755 19.2507 93.4857 19.5665C93.5958 19.8823 93.772 20.1711 94.0023 20.4137C94.2327 20.6562 94.512 20.847 94.8217 20.9733C95.1315 21.0996 95.4646 21.1585 95.7988 21.1462C96.238 21.1874 96.6787 21.0857 97.0554 20.8562C97.4321 20.6268 97.7247 20.2819 97.8897 19.8728L99.6543 19.8728ZM93.3721 17.1707H97.8984C97.9151 16.8711 97.8697 16.5712 97.765 16.29C97.6603 16.0088 97.4987 15.7523 97.2901 15.5365C97.0816 15.3208 96.8308 15.1504 96.5533 15.0362C96.2758 14.922 95.9777 14.8664 95.6777 14.8728C95.3751 14.871 95.0751 14.9291 94.7951 15.0439C94.515 15.1586 94.2605 15.3277 94.0461 15.5413C93.8318 15.755 93.6618 16.0089 93.5461 16.2886C93.4305 16.5682 93.3713 16.868 93.3721 17.1707Z' fill='white'/%3E%3Cpath d='M28.0962 0.766781C28.4858 0.738821 28.8768 0.797681 29.2409 0.939114C29.605 1.08055 29.9332 1.30103 30.2018 1.58465C30.4703 1.86828 30.6726 2.20798 30.794 2.57925C30.9154 2.95052 30.9529 3.34411 30.9038 3.73162C30.9038 5.63787 29.8735 6.73362 28.0962 6.73362H25.9409V0.766781H28.0962ZM26.8677 5.88978H27.9927C28.2711 5.90642 28.5497 5.86077 28.8082 5.75616C29.0668 5.65155 29.2987 5.4906 29.4872 5.28503C29.6757 5.07947 29.816 4.83446 29.8979 4.56784C29.9797 4.30122 30.0011 4.0197 29.9604 3.74378C29.9981 3.46895 29.9746 3.18918 29.8915 2.92451C29.8084 2.65985 29.6677 2.41684 29.4797 2.21291C29.2916 2.00898 29.0608 1.84918 28.8037 1.74494C28.5466 1.6407 28.2697 1.59462 27.9927 1.60999H26.8677V5.88978Z' fill='white'/%3E%3Cpath d='M31.9505 4.48018C31.9222 4.18426 31.956 3.88569 32.0499 3.60362C32.1437 3.32155 32.2955 3.06221 32.4954 2.84223C32.6953 2.62225 32.9391 2.44648 33.2109 2.3262C33.4828 2.20593 33.7767 2.1438 34.074 2.1438C34.3713 2.1438 34.6653 2.20593 34.9371 2.3262C35.209 2.44648 35.4527 2.62225 35.6526 2.84223C35.8526 3.06221 36.0043 3.32155 36.0982 3.60362C36.192 3.88569 36.2259 4.18426 36.1975 4.48018C36.2264 4.7764 36.1929 5.07538 36.0994 5.35791C36.0058 5.64043 35.8541 5.90025 35.6541 6.12066C35.4541 6.34108 35.2102 6.51721 34.9381 6.63775C34.666 6.75828 34.3716 6.82055 34.074 6.82055C33.7764 6.82055 33.4821 6.75828 33.2099 6.63775C32.9378 6.51721 32.6939 6.34108 32.4939 6.12066C32.2939 5.90025 32.1423 5.64043 32.0487 5.35791C31.9551 5.07538 31.9216 4.7764 31.9505 4.48018ZM35.2835 4.48018C35.2835 3.50411 34.845 2.93331 34.0755 2.93331C33.303 2.93331 32.8685 3.50411 32.8685 4.48019C32.8685 5.46408 33.303 6.03048 34.0755 6.03048C34.845 6.03047 35.2835 5.46016 35.2835 4.48018Z' fill='white'/%3E%3Cpath d='M41.8433 6.73364H40.9214L39.9907 3.41723H39.9204L38.9937 6.73364H38.0806L36.8394 2.23071H37.7407L38.5474 5.66671H38.6138L39.5396 2.23071H40.3921L41.3179 5.66671H41.3882L42.1909 2.23071H43.0796L41.8433 6.73364Z' fill='white'/%3E%3Cpath d='M44.1235 2.23076H44.979V2.94609H45.0454C45.1581 2.68917 45.3481 2.47379 45.5889 2.32999C45.8298 2.18618 46.1096 2.12111 46.3892 2.14384C46.6083 2.12736 46.8283 2.1604 47.0329 2.2405C47.2375 2.32059 47.4214 2.4457 47.5711 2.60654C47.7208 2.76738 47.8324 2.95984 47.8976 3.16966C47.9628 3.37948 47.9799 3.60129 47.9478 3.81864V6.73364H47.0591V4.0418C47.0591 3.31817 46.7446 2.9583 46.0874 2.9583C45.9386 2.95137 45.7901 2.97669 45.6521 3.03252C45.514 3.08835 45.3897 3.17337 45.2876 3.28175C45.1854 3.39014 45.108 3.51932 45.0604 3.66045C45.0129 3.80159 44.9964 3.95132 45.0122 4.09941V6.73369H44.1235L44.1235 2.23076Z' fill='white'/%3E%3Cpath d='M49.3638 0.4729H50.2524V6.73364H49.3638V0.4729Z' fill='white'/%3E%3Cpath d='M51.4876 4.48026C51.4593 4.18432 51.4931 3.88574 51.587 3.60366C51.6809 3.32158 51.8327 3.06223 52.0326 2.84224C52.2326 2.62225 52.4763 2.44648 52.7482 2.32621C53.02 2.20593 53.3141 2.1438 53.6113 2.1438C53.9086 2.1438 54.2026 2.20593 54.4745 2.32621C54.7464 2.44648 54.9901 2.62225 55.1901 2.84224C55.39 3.06223 55.5418 3.32158 55.6357 3.60366C55.7295 3.88574 55.7634 4.18432 55.7351 4.48026C55.7639 4.77649 55.7304 5.07548 55.6368 5.358C55.5432 5.64053 55.3915 5.90034 55.1915 6.12075C54.9915 6.34116 54.7476 6.51728 54.4754 6.63781C54.2033 6.75834 53.909 6.82061 53.6113 6.82061C53.3137 6.82061 53.0194 6.75834 52.7472 6.63781C52.4751 6.51728 52.2312 6.34116 52.0312 6.12075C51.8312 5.90034 51.6795 5.64053 51.5859 5.358C51.4922 5.07548 51.4587 4.77649 51.4876 4.48026ZM54.8206 4.48026C54.8206 3.50419 54.3821 2.93339 53.6126 2.93339C52.8401 2.93339 52.4056 3.50419 52.4056 4.48027C52.4056 5.46416 52.8401 6.03056 53.6126 6.03056C54.3821 6.03055 54.8206 5.46024 54.8206 4.48026Z' fill='white'/%3E%3Cpath d='M56.6709 5.4602C56.6709 4.64965 57.2744 4.18237 58.3457 4.11596L59.5654 4.04565V3.65698C59.5654 3.18139 59.251 2.91284 58.6436 2.91284C58.1475 2.91284 57.8037 3.09497 57.7051 3.41333H56.8447C56.9355 2.63989 57.6631 2.1438 58.6846 2.1438C59.8135 2.1438 60.4502 2.7058 60.4502 3.65698V6.73364H59.5947V6.10083H59.5244C59.3817 6.32782 59.1813 6.51287 58.9437 6.63708C58.706 6.76129 58.4397 6.82021 58.1719 6.80783C57.9828 6.82749 57.7918 6.80732 57.611 6.74863C57.4303 6.68993 57.2638 6.594 57.1224 6.46703C56.981 6.34006 56.8677 6.18487 56.79 6.01145C56.7122 5.83804 56.6716 5.65025 56.6709 5.4602ZM59.5654 5.07543V4.69897L58.4658 4.76928C57.8457 4.81078 57.5644 5.02172 57.5644 5.41869C57.5644 5.82396 57.916 6.0598 58.3994 6.0598C58.5411 6.07414 58.6842 6.05984 58.8202 6.01775C58.9562 5.97565 59.0823 5.90664 59.1911 5.81479C59.2999 5.72295 59.3891 5.61017 59.4534 5.48315C59.5177 5.35613 59.5558 5.21747 59.5654 5.07543Z' fill='white'/%3E%3Cpath d='M61.6182 4.48024C61.6182 3.05739 62.3496 2.15602 63.4873 2.15602C63.7687 2.14305 64.048 2.21046 64.2925 2.35035C64.5371 2.49025 64.7367 2.69685 64.8682 2.94602H64.9346V0.4729H65.8232V6.73364H64.9717V6.02221H64.9014C64.7598 6.2697 64.5532 6.47374 64.3039 6.61222C64.0546 6.7507 63.7723 6.81835 63.4873 6.80785C62.3418 6.8079 61.6182 5.90651 61.6182 4.48024ZM62.5362 4.48024C62.5362 5.43532 62.9864 6.01003 63.7393 6.01003C64.4883 6.01003 64.9512 5.42703 64.9512 4.48415C64.9512 3.54567 64.4834 2.95436 63.7393 2.95436C62.9912 2.95436 62.5362 3.53297 62.5362 4.48024Z' fill='white'/%3E%3Cpath d='M69.4998 4.48018C69.4715 4.18426 69.5053 3.88569 69.5992 3.60362C69.693 3.32155 69.8448 3.06221 70.0447 2.84223C70.2447 2.62225 70.4884 2.44648 70.7602 2.3262C71.0321 2.20593 71.3261 2.1438 71.6233 2.1438C71.9206 2.1438 72.2146 2.20593 72.4864 2.3262C72.7583 2.44648 73.002 2.62225 73.2019 2.84223C73.4019 3.06221 73.5536 3.32155 73.6475 3.60362C73.7413 3.88569 73.7752 4.18426 73.7469 4.48018C73.7757 4.7764 73.7423 5.07538 73.6487 5.35791C73.5551 5.64043 73.4034 5.90025 73.2034 6.12066C73.0034 6.34108 72.7595 6.51721 72.4874 6.63775C72.2153 6.75828 71.921 6.82055 71.6233 6.82055C71.3257 6.82055 71.0314 6.75828 70.7592 6.63775C70.4871 6.51721 70.2432 6.34108 70.0432 6.12066C69.8432 5.90025 69.6916 5.64043 69.598 5.35791C69.5044 5.07538 69.4709 4.7764 69.4998 4.48018ZM72.8328 4.48018C72.8328 3.50411 72.3943 2.93331 71.6248 2.93331C70.8523 2.93331 70.4178 3.50411 70.4178 4.48019C70.4178 5.46408 70.8524 6.03048 71.6248 6.03048C72.3943 6.03047 72.8328 5.46016 72.8328 4.48018Z' fill='white'/%3E%3Cpath d='M74.9395 2.23076H75.7949V2.94609H75.8613C75.974 2.68917 76.164 2.47379 76.4049 2.32999C76.6457 2.18618 76.9255 2.12111 77.2051 2.14384C77.4242 2.12736 77.6442 2.1604 77.8488 2.2405C78.0534 2.32059 78.2373 2.4457 78.387 2.60654C78.5367 2.76738 78.6483 2.95984 78.7135 3.16966C78.7787 3.37948 78.7958 3.60129 78.7637 3.81864V6.73364H77.875V4.0418C77.875 3.31817 77.5606 2.9583 76.9033 2.9583C76.7546 2.95137 76.6061 2.97669 76.468 3.03252C76.33 3.08835 76.2056 3.17337 76.1035 3.28175C76.0014 3.39014 75.9239 3.51932 75.8763 3.66045C75.8288 3.80159 75.8124 3.95132 75.8281 4.09941V6.73369H74.9395V2.23076Z' fill='white'/%3E%3Cpath d='M83.7852 1.10962V2.25122H84.7607V2.99976H83.7852V5.31519C83.7852 5.78687 83.9795 5.99341 84.4219 5.99341C84.5351 5.99305 84.6483 5.9862 84.7607 5.9729V6.71313C84.6012 6.74168 84.4395 6.75687 84.2773 6.75854C83.2891 6.75854 82.8955 6.41088 82.8955 5.54272V2.99972H82.1807V2.25118H82.8955V1.10962H83.7852Z' fill='white'/%3E%3Cpath d='M85.9746 0.4729H86.8555V2.95435H86.9258C87.0439 2.69503 87.2391 2.47844 87.4848 2.33409C87.7305 2.18974 88.0147 2.12466 88.2988 2.14771C88.5167 2.13585 88.7346 2.17224 88.9369 2.25428C89.1392 2.33632 89.3209 2.462 89.469 2.62233C89.6171 2.78267 89.728 2.97372 89.7938 3.18186C89.8596 3.38999 89.8786 3.61008 89.8496 3.82642V6.73365H88.96V4.04565C88.96 3.32641 88.625 2.96215 87.9971 2.96215C87.8444 2.94962 87.6907 2.97062 87.547 3.02367C87.4032 3.07673 87.2727 3.16056 87.1647 3.26929C87.0567 3.37803 86.9738 3.50905 86.9218 3.65319C86.8697 3.79733 86.8497 3.9511 86.8633 4.10375V6.73363H85.9746L85.9746 0.4729Z' fill='white'/%3E%3Cpath d='M95.0314 5.51789C94.9107 5.92943 94.6491 6.28542 94.2924 6.52357C93.9357 6.76172 93.5066 6.86687 93.0802 6.82062C92.7836 6.82846 92.4888 6.77163 92.2163 6.65411C91.9438 6.53658 91.7001 6.36116 91.5022 6.14002C91.3043 5.91888 91.1569 5.65732 91.0702 5.3735C90.9835 5.08968 90.9596 4.79039 91.0002 4.49641C90.9607 4.20153 90.985 3.9016 91.0714 3.61692C91.1579 3.33225 91.3046 3.06948 91.5015 2.84641C91.6983 2.62334 91.9408 2.44517 92.2125 2.32396C92.4842 2.20275 92.7788 2.14134 93.0763 2.14387C94.3293 2.14387 95.0851 2.99987 95.0851 4.41387V4.72396H91.9054V4.77376C91.8915 4.93901 91.9123 5.10534 91.9664 5.26209C92.0205 5.41884 92.1068 5.56255 92.2197 5.68401C92.3326 5.80546 92.4697 5.90198 92.6221 5.96738C92.7745 6.03278 92.9388 6.06561 93.1046 6.06376C93.3172 6.08928 93.5326 6.05101 93.7233 5.9538C93.9141 5.85659 94.0716 5.70485 94.1759 5.51786L95.0314 5.51789ZM91.9054 4.06672H94.1798C94.191 3.9156 94.1705 3.7638 94.1195 3.62108C94.0686 3.47836 93.9883 3.34788 93.8839 3.23802C93.7795 3.12817 93.6533 3.04136 93.5134 2.98318C93.3735 2.92501 93.2229 2.89675 93.0714 2.90022C92.9177 2.89829 92.7652 2.92715 92.6228 2.9851C92.4804 3.04304 92.3511 3.1289 92.2425 3.23761C92.1338 3.34633 92.048 3.47569 91.9901 3.61809C91.9322 3.76048 91.9034 3.91303 91.9054 4.06672Z' fill='white'/%3E%3C/svg%3E%0A"); + color: transparent; + border-color: #000; + &::after{ + display: none; + } + } } .columns{ From 0e355667f7f30dd3ad0ed53be008386885f30b4e Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 10 Jan 2025 12:36:19 +0200 Subject: [PATCH 231/248] styling fixes --- _src/scripts/template-factories/dex-19400.css | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 856253246..269c1ec02 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -196,9 +196,11 @@ display: flex; text-align: left; gap: 5px; - svg, span{ + .icon{ width: 18px; height: 18px; + transform: rotate(180deg); + margin-top: 2px; } } tr:last-of-type td, tr:last-of-type p{ @@ -359,6 +361,10 @@ } } + .questions-answers-container .answer{ + text-align: left; + } + .system-requirements-item .requirement > ul{ display: flex; flex-flow: column; From c905c964ff07dfe46cefb85df879c506945fe8d5 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 10 Jan 2025 17:15:54 +0200 Subject: [PATCH 232/248] implemented design feedback --- _src/scripts/template-factories/dex-19400.css | 67 ++++++++++++++++++- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 269c1ec02..eadc72a39 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -119,12 +119,12 @@ text-align: left; p{ padding-left: 0; - font-size: 16px; + font-size: 12px; margin-bottom: 24px; } h3{ - font-size: 18px; + font-size: 14px; margin-bottom: 6px; } } @@ -401,7 +401,7 @@ } .image-columns > div > .image-columns-img-col img { - display: none; + display: none; } .product-comparison-table-wrapper{ @@ -458,6 +458,25 @@ } } + .section.narrow-content{ + .default-content-wrapper{ + >p{ + max-width: 80%; + justify-self: center; + } + + >h2{ + max-width: 70%; + } + } + } + + .section.blue-title{ + h3{ + font-size: 24px; + } + } + .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrapper{ padding: 50px; border-radius: 20px; @@ -467,8 +486,28 @@ } } + .hero-container.grey-background{ + .hero-content{ + h3{ + font-size: 22px; + } + + .button{ + margin-bottom: 24px; + } + } + } + .columns{ justify-items: center; + padding-top: 25px; + h3{ + margin-bottom: 0; + } + + p{ + margin-top: 10px; + } } .benefits{ @@ -522,6 +561,22 @@ } } + .image-columns { + > div{ + > .image-columns-txt-col{ + h3{ + font-size: 22px; + margin-bottom: 6px; + } + + p{ + font-size: 16px; + } + } + + } + } + .product-comparison-table.green-tag{ &div[role="row"]:not(.product-comparison-header) { div[role="cell"]:first-of-type { @@ -562,4 +617,10 @@ } } } +} + +@media (min-width: 820px) { + .hero-container.grey-background .hero-content x>div:first-of-type{ + width: 60%; + } } \ No newline at end of file From c77ffac1af64ac99f298fc9cc9b3dc3287f7792d Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 10 Jan 2025 17:19:43 +0200 Subject: [PATCH 233/248] centered benefits text --- _src/scripts/template-factories/dex-19400.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index eadc72a39..34aea4235 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -511,6 +511,7 @@ } .benefits{ + text-align: center; padding-top: 24px; >div{ flex-direction: row; From d57fd8111b96e9caea0514a862033bc0c925acf5 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 10 Jan 2025 17:31:43 +0200 Subject: [PATCH 234/248] adjusted font-size --- _src/scripts/template-factories/dex-19400.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 34aea4235..83a9f28c0 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -119,12 +119,12 @@ text-align: left; p{ padding-left: 0; - font-size: 12px; + font-size: 16px; margin-bottom: 24px; } h3{ - font-size: 14px; + font-size: 18px; margin-bottom: 6px; } } From de96988f6c650865dafc74b1ff2b1fd8eeaa584a Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Fri, 10 Jan 2025 17:36:18 +0200 Subject: [PATCH 235/248] removed typo --- _src/scripts/template-factories/dex-19400.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 83a9f28c0..a4162bd09 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -621,7 +621,7 @@ } @media (min-width: 820px) { - .hero-container.grey-background .hero-content x>div:first-of-type{ + .hero-container.grey-background .hero-content > div:first-of-type{ width: 60%; } } \ No newline at end of file From 1f454857f0f9085752744258f9958ce260a37e87 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 13 Jan 2025 14:06:05 +0200 Subject: [PATCH 236/248] refactor CSS for improved readability and structure --- _src/scripts/template-factories/dex-19400.css | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index a4162bd09..2f2d480c6 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -166,13 +166,14 @@ .column-fixed-width{ text-align: left; padding: 15px; - p{ + + p { text-align: left; padding: 0; - } - p:first-of-type{ - flex-grow: 0; + &:first-of-type{ + flex-grow: 0; + } } h3{ From 293be40a56b658142fcd888dbf8df1acf9a8fb8f Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 13 Jan 2025 14:14:38 +0200 Subject: [PATCH 237/248] refactor layout for better responsiveness and user experience --- _src/scripts/template-factories/dex-19400.css | 99 +++++++++++++------ 1 file changed, 68 insertions(+), 31 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 2f2d480c6..9b62f2d0a 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -20,6 +20,7 @@ margin-bottom: 24px; width: 100%; } + p:not(:last-of-type){ margin-bottom: 24px; } @@ -34,6 +35,7 @@ color: #006DFF; font-size: 18px; } + .columns p{ font-size: 16px; } @@ -44,13 +46,16 @@ width: 31px; height: 31px; } + span{ margin: 0; height: 31px; } + p:first-of-type{ margin-bottom: 0; } + > div > div{ display: flex; flex-flow: row; @@ -62,15 +67,18 @@ width: 100%; max-width: 1350px; justify-self: center; + h3, strong{ color: #000; } .hero-picture{ border-radius: 20px; + img{ border-radius: 20px; } + &::after{ background: none; } @@ -88,6 +96,7 @@ background: #000 no-repeat center url("data:image/svg+xml,%3Csvg width='116' height='28' viewBox='0 0 116 28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M37.5 3.74995C37.5 4.54995 37.3 5.24995 36.8 5.74995C36.2 6.34995 35.5 6.64995 34.6 6.64995C33.7 6.64995 33 6.34995 32.4 5.74995C31.8 5.14995 31.5 4.44995 31.5 3.54995C31.5 2.64995 31.8 1.94995 32.4 1.34995C33 0.749951 33.7 0.449951 34.6 0.449951C35.5 0.449951 35.4 0.449951 35.8 0.749951C36.2 0.949951 36.5 1.14995 36.7 1.44995L36.2 1.94995C35.8 1.44995 35.3 1.24995 34.6 1.24995C33.9 1.24995 33.4 1.44995 33 1.94995C32.5 2.34995 32.3 2.94995 32.3 3.64995C32.3 4.34995 32.5 4.94995 33 5.34995C33.5 5.74995 34 6.04995 34.6 6.04995C35.2 6.04995 35.8 5.84995 36.3 5.34995C36.6 5.04995 36.8 4.64995 36.8 4.14995H34.6V3.44995H37.5C37.5 3.64995 37.5 3.74995 37.5 3.94995V3.74995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M42.1001 1.24995H39.4001V3.14995H41.9001V3.84995H39.4001V5.74995H42.1001V6.44995H38.6001V0.449951H42.1001V1.14995V1.24995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M45.3999 6.55005H44.5999V1.25005H42.8999V0.550049H46.9999V1.25005H45.2999V6.55005H45.3999Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M50 6.55005V0.550049H50.8V6.55005H50Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M54.2002 6.55005H53.4002V1.25005H51.7002V0.550049H55.8002V1.25005H54.1002V6.55005H54.2002Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M63.6999 5.74995C63.0999 6.34995 62.3999 6.64995 61.4999 6.64995C60.5999 6.64995 59.8999 6.34995 59.2999 5.74995C58.6999 5.14995 58.3999 4.44995 58.3999 3.54995C58.3999 2.64995 58.6999 1.94995 59.2999 1.34995C59.8999 0.749951 60.5999 0.449951 61.4999 0.449951C62.3999 0.449951 63.0999 0.749951 63.6999 1.34995C64.2999 1.94995 64.5999 2.64995 64.5999 3.54995C64.5999 4.44995 64.2999 5.14995 63.6999 5.74995ZM59.8999 5.24995C60.2999 5.64995 60.8999 5.94995 61.4999 5.94995C62.0999 5.94995 62.6999 5.74995 63.0999 5.24995C63.4999 4.84995 63.7999 4.24995 63.7999 3.54995C63.7999 2.84995 63.5999 2.24995 63.0999 1.84995C62.6999 1.44995 62.0999 1.14995 61.4999 1.14995C60.8999 1.14995 60.2999 1.34995 59.8999 1.84995C59.4999 2.24995 59.1999 2.84995 59.1999 3.54995C59.1999 4.24995 59.3999 4.84995 59.8999 5.24995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M65.7001 6.55005V0.550049H66.6001L69.5001 5.25005V4.05005V0.550049H70.3001V6.55005H69.5001L66.4001 1.65005V2.85005V6.55005H65.6001H65.7001Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M58.2002 15.3501C55.8002 15.3501 53.9002 17.1501 53.9002 19.6501C53.9002 22.1501 55.8002 23.9501 58.2002 23.9501C60.6002 23.9501 62.5002 22.1501 62.5002 19.6501C62.5002 17.1501 60.6002 15.3501 58.2002 15.3501ZM58.2002 22.1501C56.9002 22.1501 55.8002 21.0501 55.8002 19.5501C55.8002 18.0501 56.9002 16.9501 58.2002 16.9501C59.5002 16.9501 60.6002 17.9501 60.6002 19.5501C60.6002 21.1501 59.5002 22.1501 58.2002 22.1501ZM48.9002 15.3501C46.5002 15.3501 44.6002 17.1501 44.6002 19.6501C44.6002 22.1501 46.5002 23.9501 48.9002 23.9501C51.3002 23.9501 53.2002 22.1501 53.2002 19.6501C53.2002 17.1501 51.3002 15.3501 48.9002 15.3501ZM48.9002 22.1501C47.6002 22.1501 46.5002 21.0501 46.5002 19.5501C46.5002 18.0501 47.6002 16.9501 48.9002 16.9501C50.2002 16.9501 51.3002 17.9501 51.3002 19.5501C51.3002 21.1501 50.2002 22.1501 48.9002 22.1501ZM37.8002 16.6501V18.4501H42.1002C42.0002 19.4501 41.6002 20.2501 41.1002 20.7501C40.6002 21.2501 39.5002 22.0501 37.8002 22.0501C35.1002 22.0501 33.1002 19.9501 33.1002 17.2501C33.1002 14.5501 35.2002 12.4501 37.8002 12.4501C40.4002 12.4501 40.3002 13.0501 41.1002 13.7501L42.4002 12.4501C41.3002 11.4501 39.9002 10.6501 37.9002 10.6501C34.3002 10.6501 31.2002 13.6501 31.2002 17.2501C31.2002 20.8501 34.3002 23.8501 37.9002 23.8501C41.5002 23.8501 41.3002 23.2501 42.5002 21.9501C43.7002 20.7501 44.1002 19.0501 44.1002 17.7501C44.1002 16.4501 44.1002 16.9501 44.1002 16.6501H38.0002H37.8002ZM83.2002 18.0501C82.8002 17.0501 81.8002 15.3501 79.6002 15.3501C77.4002 15.3501 75.6002 17.0501 75.6002 19.6501C75.6002 22.2501 77.4002 23.9501 79.8002 23.9501C82.2002 23.9501 82.9002 22.7501 83.3002 22.0501L81.9002 21.0501C81.4002 21.7501 80.8002 22.2501 79.8002 22.2501C78.8002 22.2501 78.2002 21.8501 77.7002 20.9501L83.4002 18.5501L83.2002 18.0501ZM77.4002 19.4501C77.4002 17.8501 78.7002 16.9501 79.6002 16.9501C80.5002 16.9501 81.0002 17.3501 81.2002 17.8501L77.4002 19.4501ZM72.7002 23.5501H74.6002V11.0501H72.7002V23.5501ZM69.7002 16.2501C69.3002 15.7501 68.5002 15.2501 67.5002 15.2501C65.4002 15.2501 63.4002 17.1501 63.4002 19.5501C63.4002 21.9501 65.3002 23.7501 67.5002 23.7501C69.7002 23.7501 69.3002 23.2501 69.7002 22.7501V23.3501C69.7002 24.9501 68.8002 25.8501 67.4002 25.8501C66.0002 25.8501 65.5002 25.0501 65.3002 24.3501L63.7002 25.0501C64.2002 26.1501 65.4002 27.5501 67.5002 27.5501C69.6002 27.5501 71.5002 26.2501 71.5002 23.1501V15.5501H69.7002V16.2501ZM67.5002 22.1501C66.2002 22.1501 65.1002 21.0501 65.1002 19.5501C65.1002 18.0501 66.2002 16.9501 67.5002 16.9501C68.8002 16.9501 69.8002 18.0501 69.8002 19.5501C69.8002 21.0501 68.8002 22.1501 67.5002 22.1501ZM91.9002 11.0501H87.4002V23.5501H89.3002V18.8501H91.9002C94.0002 18.8501 96.0002 17.3501 96.0002 14.9501C96.0002 12.5501 94.0002 11.0501 91.9002 11.0501ZM92.0002 17.0501H89.3002V12.7501H92.0002C93.4002 12.7501 94.2002 13.9501 94.2002 14.8501C94.2002 15.7501 93.4002 16.9501 92.0002 16.9501V17.0501ZM103.5 15.2501C102.1 15.2501 100.7 15.8501 100.2 17.1501L101.9 17.8501C102.3 17.1501 102.9 16.9501 103.6 16.9501C104.3 16.9501 105.5 17.5501 105.6 18.5501C105.3 18.5501 104.5 18.1501 103.7 18.1501C101.9 18.1501 100.1 19.1501 100.1 20.9501C100.1 22.7501 101.6 23.7501 103.2 23.7501C104.8 23.7501 105.1 23.1501 105.6 22.5501V23.5501H107.4V18.7501C107.4 16.5501 105.7 15.2501 103.6 15.2501H103.5ZM103.3 22.1501C102.7 22.1501 101.8 21.8501 101.8 21.0501C101.8 20.2501 102.9 19.7501 103.8 19.7501C104.7 19.7501 105 19.9501 105.5 20.1501C105.4 21.3501 104.4 22.1501 103.3 22.1501ZM113.8 15.5501L111.7 20.9501L109.5 15.5501H107.5L110.8 23.1501L108.9 27.3501H110.8L115.9 15.5501H113.8ZM97.0002 23.5501H98.9002V11.0501H97.0002V23.5501Z' fill='white'/%3E%3Cpath d='M10.8002 12.95L0.200195 24.25C0.500195 25.45 1.60019 26.35 3.00019 26.35C4.40019 26.35 4.00019 26.25 4.50019 25.95L16.5002 19.05L10.9002 12.95H10.8002Z' fill='%23EA4335'/%3E%3Cpath d='M21.6001 11.05L16.4001 8.05005L10.6001 13.25L16.4001 19.05L21.5001 16.05C22.4001 15.55 23.0001 14.65 23.0001 13.55C23.0001 12.45 22.4001 11.55 21.5001 11.05H21.6001Z' fill='%23FBBC04'/%3E%3Cpath d='M0.200195 2.8501C0.200195 3.0501 0.200195 3.3501 0.200195 3.5501V23.5501C0.200195 23.8501 0.200195 24.0501 0.200195 24.2501L11.2002 13.2501L0.200195 2.8501Z' fill='%234285F4'/%3E%3Cpath d='M10.9001 13.55L16.4001 8.05L4.4001 1.15C4.0001 0.85 3.5001 0.75 2.9001 0.75C1.6001 0.75 0.400098 1.65 0.100098 2.85L10.8001 13.55H10.9001Z' fill='%2334A853'/%3E%3C/svg%3E"); color: transparent; border-color: #000; + &::after{ display: none; } @@ -97,6 +106,7 @@ background: #000 no-repeat center url("data:image/svg+xml,%3Csvg width='100' height='26' viewBox='0 0 100 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.039 12.3365C15.0498 11.5018 15.2715 10.6834 15.6835 9.95747C16.0955 9.23151 16.6845 8.62158 17.3956 8.1844C16.9438 7.53924 16.3479 7.0083 15.6551 6.63375C14.9622 6.2592 14.1916 6.05135 13.4044 6.02672C11.7252 5.85046 10.0972 7.03155 9.24151 7.03155C8.36924 7.03155 7.05174 6.04422 5.63301 6.07341C4.71534 6.10306 3.82099 6.36991 3.03711 6.84797C2.25324 7.32603 1.60656 7.99899 1.16009 8.80128C-0.773908 12.1497 0.668681 17.0708 2.52129 19.7774C3.44819 21.1027 4.53147 22.5832 5.94892 22.5307C7.33598 22.4731 7.85402 21.6462 9.52832 21.6462C11.1871 21.6462 11.6731 22.5307 13.1193 22.4973C14.6077 22.4731 15.5455 21.166 16.4398 19.8281C17.1058 18.8838 17.6183 17.8401 17.9583 16.7356C17.0935 16.3699 16.3556 15.7577 15.8365 14.9754C15.3174 14.1931 15.04 13.2753 15.039 12.3365Z' fill='white'/%3E%3Cpath d='M12.3076 4.24672C13.1191 3.27252 13.5189 2.02034 13.4221 0.756104C12.1823 0.886324 11.037 1.47888 10.2145 2.41571C9.81239 2.87338 9.50439 3.40582 9.30815 3.98258C9.1119 4.55935 9.03126 5.16915 9.07082 5.7771C9.69096 5.78349 10.3045 5.64908 10.8651 5.38399C11.4258 5.1189 11.919 4.73005 12.3076 4.24672Z' fill='white'/%3E%3Cpath d='M32.5723 19.1756H27.8389L26.7021 22.532H24.6973L29.1807 10.114H31.2637L35.7471 22.532H33.708L32.5723 19.1756ZM28.3291 17.6267H32.0811L30.2315 12.1795H30.1797L28.3291 17.6267Z' fill='white'/%3E%3Cpath d='M45.4297 18.0056C45.4297 20.8191 43.9239 22.6267 41.6514 22.6267C41.0757 22.6568 40.5032 22.5242 39.9995 22.244C39.4957 21.9639 39.0809 21.5476 38.8028 21.0427H38.7598V25.5271H36.9014V13.4782H38.7002V14.9841H38.7344C39.0254 14.4816 39.4471 14.0674 39.9547 13.7856C40.4624 13.5037 41.0369 13.3648 41.6172 13.3835C43.915 13.3835 45.4297 15.1999 45.4297 18.0056ZM43.5196 18.0056C43.5196 16.1726 42.5723 14.9675 41.127 14.9675C39.7071 14.9675 38.752 16.198 38.752 18.0056C38.752 19.8298 39.7071 21.0515 41.127 21.0515C42.5723 21.0515 43.5196 19.8552 43.5196 18.0056Z' fill='white'/%3E%3Cpath d='M55.3946 18.0056C55.3946 20.8191 53.8887 22.6267 51.6162 22.6267C51.0406 22.6568 50.4681 22.5242 49.9643 22.244C49.4605 21.9639 49.0458 21.5476 48.7676 21.0427H48.7246V25.527H46.8662V13.4782H48.665V14.9841H48.6992C48.9902 14.4816 49.4119 14.0674 49.9195 13.7856C50.4272 13.5037 51.0017 13.3648 51.582 13.3835C53.8799 13.3835 55.3946 15.1999 55.3946 18.0056ZM53.4844 18.0056C53.4844 16.1726 52.5371 14.9675 51.0918 14.9675C49.6719 14.9675 48.7168 16.198 48.7168 18.0056C48.7168 19.8298 49.6719 21.0515 51.0918 21.0515C52.5371 21.0515 53.4844 19.8552 53.4844 18.0056Z' fill='white'/%3E%3Cpath d='M61.9805 19.0721C62.1182 20.3035 63.3145 21.1121 64.9492 21.1121C66.5157 21.1121 67.6426 20.3035 67.6426 19.1931C67.6426 18.2293 66.9629 17.6521 65.3535 17.2566L63.7442 16.8689C61.4639 16.3181 60.4053 15.2517 60.4053 13.5212C60.4053 11.3787 62.2725 9.90698 64.9239 9.90698C67.5479 9.90698 69.3467 11.3787 69.4073 13.5212H67.5313C67.419 12.282 66.3945 11.5339 64.8975 11.5339C63.4004 11.5339 62.376 12.2908 62.376 13.3923C62.376 14.2703 63.0303 14.7869 64.6309 15.1823L65.999 15.5183C68.5469 16.1208 69.6055 17.1443 69.6055 18.9607C69.6055 21.2839 67.7549 22.739 64.8115 22.739C62.0576 22.739 60.1982 21.3181 60.0781 19.072L61.9805 19.0721Z' fill='white'/%3E%3Cpath d='M73.6162 11.3357V13.4783H75.3379V14.95H73.6162V19.9412C73.6162 20.7166 73.9609 21.0779 74.7178 21.0779C74.9222 21.0743 75.1262 21.06 75.3291 21.0349V22.4978C74.9888 22.5614 74.643 22.5901 74.2969 22.5837C72.4639 22.5837 71.749 21.8952 71.749 20.1394V14.95H70.4326V13.4783H71.749V11.3357H73.6162Z' fill='white'/%3E%3Cpath d='M76.335 18.0056C76.335 15.157 78.0127 13.3669 80.6289 13.3669C83.2539 13.3669 84.9238 15.1569 84.9238 18.0056C84.9238 20.8621 83.2627 22.6443 80.6289 22.6443C77.996 22.6443 76.335 20.8621 76.335 18.0056ZM83.0303 18.0056C83.0303 16.0515 82.1348 14.8982 80.6289 14.8982C79.123 14.8982 78.2285 16.0603 78.2285 18.0056C78.2285 19.9675 79.123 21.1121 80.6289 21.1121C82.1348 21.1121 83.0303 19.9675 83.0303 18.0056Z' fill='white'/%3E%3Cpath d='M86.4561 13.4784H88.2285V15.0194H88.2715C88.3914 14.5381 88.6734 14.1128 89.07 13.8149C89.4666 13.517 89.9536 13.3647 90.4493 13.3837C90.6634 13.3829 90.877 13.4062 91.086 13.453V15.1913C90.8156 15.1087 90.5336 15.0707 90.251 15.079C89.981 15.068 89.7118 15.1156 89.462 15.2185C89.2122 15.3214 88.9875 15.4771 88.8036 15.675C88.6196 15.8729 88.4806 16.1083 88.3962 16.3649C88.3118 16.6216 88.2839 16.8935 88.3145 17.162V22.5321H86.4561L86.4561 13.4784Z' fill='white'/%3E%3Cpath d='M99.6543 19.8728C99.4043 21.5164 97.8037 22.6443 95.7559 22.6443C93.1221 22.6443 91.4873 20.8796 91.4873 18.0486C91.4873 15.2087 93.1309 13.3669 95.6777 13.3669C98.1826 13.3669 99.7578 15.0876 99.7578 17.8328V18.4695H93.3633V18.5818C93.3338 18.915 93.3755 19.2507 93.4857 19.5665C93.5958 19.8823 93.772 20.1711 94.0023 20.4137C94.2327 20.6562 94.512 20.847 94.8217 20.9733C95.1315 21.0996 95.4646 21.1585 95.7988 21.1462C96.238 21.1874 96.6787 21.0857 97.0554 20.8562C97.4321 20.6268 97.7247 20.2819 97.8897 19.8728L99.6543 19.8728ZM93.3721 17.1707H97.8984C97.9151 16.8711 97.8697 16.5712 97.765 16.29C97.6603 16.0088 97.4987 15.7523 97.2901 15.5365C97.0816 15.3208 96.8308 15.1504 96.5533 15.0362C96.2758 14.922 95.9777 14.8664 95.6777 14.8728C95.3751 14.871 95.0751 14.9291 94.7951 15.0439C94.515 15.1586 94.2605 15.3277 94.0461 15.5413C93.8318 15.755 93.6618 16.0089 93.5461 16.2886C93.4305 16.5682 93.3713 16.868 93.3721 17.1707Z' fill='white'/%3E%3Cpath d='M28.0962 0.766781C28.4858 0.738821 28.8768 0.797681 29.2409 0.939114C29.605 1.08055 29.9332 1.30103 30.2018 1.58465C30.4703 1.86828 30.6726 2.20798 30.794 2.57925C30.9154 2.95052 30.9529 3.34411 30.9038 3.73162C30.9038 5.63787 29.8735 6.73362 28.0962 6.73362H25.9409V0.766781H28.0962ZM26.8677 5.88978H27.9927C28.2711 5.90642 28.5497 5.86077 28.8082 5.75616C29.0668 5.65155 29.2987 5.4906 29.4872 5.28503C29.6757 5.07947 29.816 4.83446 29.8979 4.56784C29.9797 4.30122 30.0011 4.0197 29.9604 3.74378C29.9981 3.46895 29.9746 3.18918 29.8915 2.92451C29.8084 2.65985 29.6677 2.41684 29.4797 2.21291C29.2916 2.00898 29.0608 1.84918 28.8037 1.74494C28.5466 1.6407 28.2697 1.59462 27.9927 1.60999H26.8677V5.88978Z' fill='white'/%3E%3Cpath d='M31.9505 4.48018C31.9222 4.18426 31.956 3.88569 32.0499 3.60362C32.1437 3.32155 32.2955 3.06221 32.4954 2.84223C32.6953 2.62225 32.9391 2.44648 33.2109 2.3262C33.4828 2.20593 33.7767 2.1438 34.074 2.1438C34.3713 2.1438 34.6653 2.20593 34.9371 2.3262C35.209 2.44648 35.4527 2.62225 35.6526 2.84223C35.8526 3.06221 36.0043 3.32155 36.0982 3.60362C36.192 3.88569 36.2259 4.18426 36.1975 4.48018C36.2264 4.7764 36.1929 5.07538 36.0994 5.35791C36.0058 5.64043 35.8541 5.90025 35.6541 6.12066C35.4541 6.34108 35.2102 6.51721 34.9381 6.63775C34.666 6.75828 34.3716 6.82055 34.074 6.82055C33.7764 6.82055 33.4821 6.75828 33.2099 6.63775C32.9378 6.51721 32.6939 6.34108 32.4939 6.12066C32.2939 5.90025 32.1423 5.64043 32.0487 5.35791C31.9551 5.07538 31.9216 4.7764 31.9505 4.48018ZM35.2835 4.48018C35.2835 3.50411 34.845 2.93331 34.0755 2.93331C33.303 2.93331 32.8685 3.50411 32.8685 4.48019C32.8685 5.46408 33.303 6.03048 34.0755 6.03048C34.845 6.03047 35.2835 5.46016 35.2835 4.48018Z' fill='white'/%3E%3Cpath d='M41.8433 6.73364H40.9214L39.9907 3.41723H39.9204L38.9937 6.73364H38.0806L36.8394 2.23071H37.7407L38.5474 5.66671H38.6138L39.5396 2.23071H40.3921L41.3179 5.66671H41.3882L42.1909 2.23071H43.0796L41.8433 6.73364Z' fill='white'/%3E%3Cpath d='M44.1235 2.23076H44.979V2.94609H45.0454C45.1581 2.68917 45.3481 2.47379 45.5889 2.32999C45.8298 2.18618 46.1096 2.12111 46.3892 2.14384C46.6083 2.12736 46.8283 2.1604 47.0329 2.2405C47.2375 2.32059 47.4214 2.4457 47.5711 2.60654C47.7208 2.76738 47.8324 2.95984 47.8976 3.16966C47.9628 3.37948 47.9799 3.60129 47.9478 3.81864V6.73364H47.0591V4.0418C47.0591 3.31817 46.7446 2.9583 46.0874 2.9583C45.9386 2.95137 45.7901 2.97669 45.6521 3.03252C45.514 3.08835 45.3897 3.17337 45.2876 3.28175C45.1854 3.39014 45.108 3.51932 45.0604 3.66045C45.0129 3.80159 44.9964 3.95132 45.0122 4.09941V6.73369H44.1235L44.1235 2.23076Z' fill='white'/%3E%3Cpath d='M49.3638 0.4729H50.2524V6.73364H49.3638V0.4729Z' fill='white'/%3E%3Cpath d='M51.4876 4.48026C51.4593 4.18432 51.4931 3.88574 51.587 3.60366C51.6809 3.32158 51.8327 3.06223 52.0326 2.84224C52.2326 2.62225 52.4763 2.44648 52.7482 2.32621C53.02 2.20593 53.3141 2.1438 53.6113 2.1438C53.9086 2.1438 54.2026 2.20593 54.4745 2.32621C54.7464 2.44648 54.9901 2.62225 55.1901 2.84224C55.39 3.06223 55.5418 3.32158 55.6357 3.60366C55.7295 3.88574 55.7634 4.18432 55.7351 4.48026C55.7639 4.77649 55.7304 5.07548 55.6368 5.358C55.5432 5.64053 55.3915 5.90034 55.1915 6.12075C54.9915 6.34116 54.7476 6.51728 54.4754 6.63781C54.2033 6.75834 53.909 6.82061 53.6113 6.82061C53.3137 6.82061 53.0194 6.75834 52.7472 6.63781C52.4751 6.51728 52.2312 6.34116 52.0312 6.12075C51.8312 5.90034 51.6795 5.64053 51.5859 5.358C51.4922 5.07548 51.4587 4.77649 51.4876 4.48026ZM54.8206 4.48026C54.8206 3.50419 54.3821 2.93339 53.6126 2.93339C52.8401 2.93339 52.4056 3.50419 52.4056 4.48027C52.4056 5.46416 52.8401 6.03056 53.6126 6.03056C54.3821 6.03055 54.8206 5.46024 54.8206 4.48026Z' fill='white'/%3E%3Cpath d='M56.6709 5.4602C56.6709 4.64965 57.2744 4.18237 58.3457 4.11596L59.5654 4.04565V3.65698C59.5654 3.18139 59.251 2.91284 58.6436 2.91284C58.1475 2.91284 57.8037 3.09497 57.7051 3.41333H56.8447C56.9355 2.63989 57.6631 2.1438 58.6846 2.1438C59.8135 2.1438 60.4502 2.7058 60.4502 3.65698V6.73364H59.5947V6.10083H59.5244C59.3817 6.32782 59.1813 6.51287 58.9437 6.63708C58.706 6.76129 58.4397 6.82021 58.1719 6.80783C57.9828 6.82749 57.7918 6.80732 57.611 6.74863C57.4303 6.68993 57.2638 6.594 57.1224 6.46703C56.981 6.34006 56.8677 6.18487 56.79 6.01145C56.7122 5.83804 56.6716 5.65025 56.6709 5.4602ZM59.5654 5.07543V4.69897L58.4658 4.76928C57.8457 4.81078 57.5644 5.02172 57.5644 5.41869C57.5644 5.82396 57.916 6.0598 58.3994 6.0598C58.5411 6.07414 58.6842 6.05984 58.8202 6.01775C58.9562 5.97565 59.0823 5.90664 59.1911 5.81479C59.2999 5.72295 59.3891 5.61017 59.4534 5.48315C59.5177 5.35613 59.5558 5.21747 59.5654 5.07543Z' fill='white'/%3E%3Cpath d='M61.6182 4.48024C61.6182 3.05739 62.3496 2.15602 63.4873 2.15602C63.7687 2.14305 64.048 2.21046 64.2925 2.35035C64.5371 2.49025 64.7367 2.69685 64.8682 2.94602H64.9346V0.4729H65.8232V6.73364H64.9717V6.02221H64.9014C64.7598 6.2697 64.5532 6.47374 64.3039 6.61222C64.0546 6.7507 63.7723 6.81835 63.4873 6.80785C62.3418 6.8079 61.6182 5.90651 61.6182 4.48024ZM62.5362 4.48024C62.5362 5.43532 62.9864 6.01003 63.7393 6.01003C64.4883 6.01003 64.9512 5.42703 64.9512 4.48415C64.9512 3.54567 64.4834 2.95436 63.7393 2.95436C62.9912 2.95436 62.5362 3.53297 62.5362 4.48024Z' fill='white'/%3E%3Cpath d='M69.4998 4.48018C69.4715 4.18426 69.5053 3.88569 69.5992 3.60362C69.693 3.32155 69.8448 3.06221 70.0447 2.84223C70.2447 2.62225 70.4884 2.44648 70.7602 2.3262C71.0321 2.20593 71.3261 2.1438 71.6233 2.1438C71.9206 2.1438 72.2146 2.20593 72.4864 2.3262C72.7583 2.44648 73.002 2.62225 73.2019 2.84223C73.4019 3.06221 73.5536 3.32155 73.6475 3.60362C73.7413 3.88569 73.7752 4.18426 73.7469 4.48018C73.7757 4.7764 73.7423 5.07538 73.6487 5.35791C73.5551 5.64043 73.4034 5.90025 73.2034 6.12066C73.0034 6.34108 72.7595 6.51721 72.4874 6.63775C72.2153 6.75828 71.921 6.82055 71.6233 6.82055C71.3257 6.82055 71.0314 6.75828 70.7592 6.63775C70.4871 6.51721 70.2432 6.34108 70.0432 6.12066C69.8432 5.90025 69.6916 5.64043 69.598 5.35791C69.5044 5.07538 69.4709 4.7764 69.4998 4.48018ZM72.8328 4.48018C72.8328 3.50411 72.3943 2.93331 71.6248 2.93331C70.8523 2.93331 70.4178 3.50411 70.4178 4.48019C70.4178 5.46408 70.8524 6.03048 71.6248 6.03048C72.3943 6.03047 72.8328 5.46016 72.8328 4.48018Z' fill='white'/%3E%3Cpath d='M74.9395 2.23076H75.7949V2.94609H75.8613C75.974 2.68917 76.164 2.47379 76.4049 2.32999C76.6457 2.18618 76.9255 2.12111 77.2051 2.14384C77.4242 2.12736 77.6442 2.1604 77.8488 2.2405C78.0534 2.32059 78.2373 2.4457 78.387 2.60654C78.5367 2.76738 78.6483 2.95984 78.7135 3.16966C78.7787 3.37948 78.7958 3.60129 78.7637 3.81864V6.73364H77.875V4.0418C77.875 3.31817 77.5606 2.9583 76.9033 2.9583C76.7546 2.95137 76.6061 2.97669 76.468 3.03252C76.33 3.08835 76.2056 3.17337 76.1035 3.28175C76.0014 3.39014 75.9239 3.51932 75.8763 3.66045C75.8288 3.80159 75.8124 3.95132 75.8281 4.09941V6.73369H74.9395V2.23076Z' fill='white'/%3E%3Cpath d='M83.7852 1.10962V2.25122H84.7607V2.99976H83.7852V5.31519C83.7852 5.78687 83.9795 5.99341 84.4219 5.99341C84.5351 5.99305 84.6483 5.9862 84.7607 5.9729V6.71313C84.6012 6.74168 84.4395 6.75687 84.2773 6.75854C83.2891 6.75854 82.8955 6.41088 82.8955 5.54272V2.99972H82.1807V2.25118H82.8955V1.10962H83.7852Z' fill='white'/%3E%3Cpath d='M85.9746 0.4729H86.8555V2.95435H86.9258C87.0439 2.69503 87.2391 2.47844 87.4848 2.33409C87.7305 2.18974 88.0147 2.12466 88.2988 2.14771C88.5167 2.13585 88.7346 2.17224 88.9369 2.25428C89.1392 2.33632 89.3209 2.462 89.469 2.62233C89.6171 2.78267 89.728 2.97372 89.7938 3.18186C89.8596 3.38999 89.8786 3.61008 89.8496 3.82642V6.73365H88.96V4.04565C88.96 3.32641 88.625 2.96215 87.9971 2.96215C87.8444 2.94962 87.6907 2.97062 87.547 3.02367C87.4032 3.07673 87.2727 3.16056 87.1647 3.26929C87.0567 3.37803 86.9738 3.50905 86.9218 3.65319C86.8697 3.79733 86.8497 3.9511 86.8633 4.10375V6.73363H85.9746L85.9746 0.4729Z' fill='white'/%3E%3Cpath d='M95.0314 5.51789C94.9107 5.92943 94.6491 6.28542 94.2924 6.52357C93.9357 6.76172 93.5066 6.86687 93.0802 6.82062C92.7836 6.82846 92.4888 6.77163 92.2163 6.65411C91.9438 6.53658 91.7001 6.36116 91.5022 6.14002C91.3043 5.91888 91.1569 5.65732 91.0702 5.3735C90.9835 5.08968 90.9596 4.79039 91.0002 4.49641C90.9607 4.20153 90.985 3.9016 91.0714 3.61692C91.1579 3.33225 91.3046 3.06948 91.5015 2.84641C91.6983 2.62334 91.9408 2.44517 92.2125 2.32396C92.4842 2.20275 92.7788 2.14134 93.0763 2.14387C94.3293 2.14387 95.0851 2.99987 95.0851 4.41387V4.72396H91.9054V4.77376C91.8915 4.93901 91.9123 5.10534 91.9664 5.26209C92.0205 5.41884 92.1068 5.56255 92.2197 5.68401C92.3326 5.80546 92.4697 5.90198 92.6221 5.96738C92.7745 6.03278 92.9388 6.06561 93.1046 6.06376C93.3172 6.08928 93.5326 6.05101 93.7233 5.9538C93.9141 5.85659 94.0716 5.70485 94.1759 5.51786L95.0314 5.51789ZM91.9054 4.06672H94.1798C94.191 3.9156 94.1705 3.7638 94.1195 3.62108C94.0686 3.47836 93.9883 3.34788 93.8839 3.23802C93.7795 3.12817 93.6533 3.04136 93.5134 2.98318C93.3735 2.92501 93.2229 2.89675 93.0714 2.90022C92.9177 2.89829 92.7652 2.92715 92.6228 2.9851C92.4804 3.04304 92.3511 3.1289 92.2425 3.23761C92.1338 3.34633 92.048 3.47569 91.9901 3.61809C91.9322 3.76048 91.9034 3.91303 91.9054 4.06672Z' fill='white'/%3E%3C/svg%3E%0A"); color: transparent; border-color: #000; + &::after{ display: none; } @@ -117,6 +127,7 @@ > .image-columns-txt-col{ text-align: left; + p{ padding-left: 0; font-size: 16px; @@ -136,6 +147,7 @@ h3{ margin-bottom: 12px; } + h4{ margin-bottom: 24px; } @@ -148,6 +160,7 @@ > div:nth-child(2){ min-width: 100%; + >div{ display: flex; justify-content: space-evenly; @@ -156,17 +169,18 @@ margin-top: 24px; gap: 20px; } + img{ height: 62px; } } } - .product-comparison-table.green-tag{ - .column-fixed-width{ + .product-comparison-table.green-tag { + .column-fixed-width { text-align: left; padding: 15px; - + p { text-align: left; padding: 0; @@ -176,27 +190,29 @@ } } - h3{ + h3 { margin: 0 1em 1em 0; width: 50%; font-weight: 700; } - .button{ + .button { width: 100%; background-color: var(--button-background-color); border: 2px solid var(--button-background-color); color: var(--button-link-color); } - tbody{ + + tbody { display: grid; grid-template-rows: repeat(2, minmax(40px, auto)); } - td{ + td { display: flex; text-align: left; gap: 5px; + .icon{ width: 18px; height: 18px; @@ -204,7 +220,8 @@ margin-top: 2px; } } - tr:last-of-type td, tr:last-of-type p{ + + tr:last-of-type td, tr:last-of-type p { font-size: 12px; color: #000; font-weight: 600 !important; @@ -215,86 +232,93 @@ box-shadow: none; position: unset; } - div[role='columnheader']:nth-child(1){ + + div[role='columnheader']:nth-child(1) { width: 100%; } - div[role="row"]:not(.product-comparison-header){ + + div[role="row"]:not(.product-comparison-header) { display: flex; flex-wrap: wrap; } - div[role="cell"]:not(:first-child){ + div[role="cell"]:not(:first-child) { background-color: #fff; border-right: 1px solid #E4F2FF; border-bottom: 1px solid #E4F2FF; } - div[role="cell"]:has(.no-check){ + + div[role="cell"]:has(.no-check) { background-color: #eee; border-bottom:1px solid #fff; } - div[role='cell']:first-child{ + div[role='cell']:first-child { width: 33%; border-radius: 0; border-right: 1px solid #E4F2FF; } - div[role="cell"].active{ + div[role="cell"].active { box-shadow: none; } - div[role="columnheader"]:not(:first-child).active::before{ + div[role="columnheader"]:not(:first-child).active::before { display: none; } - .product-comparison-price{ + .product-comparison-price { gap: 5px; - p{ + + p { color: #161616; } - p:last-of-type{ + p:last-of-type { border: none; } - .old-price-container{ + .old-price-container { align-content: baseline; } - .old-price-box{ + .old-price-box { display: flex; flex-direction: column-reverse; align-items: flex-start; justify-self: flex-start; gap: 10px; - span{ + span { position: relative; text-align: left; font-weight: 700; - del{ + + del { color: #000; } } - .savings{ + .savings { display: inline-block; background-color: #68BA68; padding: 5px; border-radius: 16px; color: #fff; font-size: 14px; - span{ + + span { font-size: 14px; color: #fff; } } } - .new-price-box{ + .new-price-box { margin-top: 5px; display: inline-flex; - .total-text{ + + .total-text { font-size: 23px; } @@ -333,7 +357,7 @@ svg{ width: 50px; height: 50px; - box-shadow: rgba(0, 0, 0, 0.05); + box-shadow: rgb(0 0 0 / 5%); } } @@ -342,6 +366,7 @@ text-align: center; max-width: 321px; } + p, strong{ font-size: 16px; } @@ -370,18 +395,21 @@ display: flex; flex-flow: column; gap: 2px; + li{ margin: 0; font-size: 12px; } + li:has(strong) { margin-top: 7px; } } - @media (max-width: 767px) { + @media (width <= 767px) { .section{ padding-top: 0; + a{ width: 100%; justify-content: center; @@ -407,6 +435,7 @@ .product-comparison-table-wrapper{ padding: 0; + .product-comparison-table.green-tag{ .product-comparison-header{ display: grid; @@ -424,11 +453,12 @@ .product-comparison-price{ display: grid; grid-auto-flow: dense; - gap: 0px; + gap: 0; grid-template-rows: repeat(1, minmax(40px, auto)); } } + div [role="row"] div[role="cell"]:first-of-type{ min-width: 100%; } @@ -438,6 +468,7 @@ .default-content-wrapper{ padding-bottom: 0; } + .questions-answers-item .question h3{ font-size: 12px !important; padding-right: 0; @@ -446,7 +477,7 @@ } } - @media (min-width: 767px) { + @media (width >= 767px) { .section{ padding-top: 40px; padding-bottom: 40px; @@ -502,6 +533,7 @@ .columns{ justify-items: center; padding-top: 25px; + h3{ margin-bottom: 0; } @@ -514,6 +546,7 @@ .benefits{ text-align: center; padding-top: 24px; + >div{ flex-direction: row; } @@ -533,6 +566,7 @@ .four-cards.white-cards{ margin-bottom: 40px; + h3{ font-size: 24px; } @@ -588,6 +622,7 @@ .column-fixed-width{ padding: 24px; + tr:last-of-type td, tr:last-of-type p{ font-size: 16px; } @@ -596,6 +631,7 @@ .product-comparison-price{ .old-price-box{ flex-direction: unset; + span{ font-size: 16px; align-self: center; @@ -606,6 +642,7 @@ .total-text{ font-size: 42px; } + sup{ top: 10px; margin-left: 10px; @@ -621,7 +658,7 @@ } } -@media (min-width: 820px) { +@media (width >= 820px) { .hero-container.grey-background .hero-content > div:first-of-type{ width: 60%; } From f2203d7d7ca151626d9737f6ca8b13748ee6eb62 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 13 Jan 2025 15:11:37 +0200 Subject: [PATCH 238/248] improve layout for enhanced accessibility and visual hierarchy --- _src/scripts/template-factories/dex-19400.css | 228 +++++++++--------- 1 file changed, 116 insertions(+), 112 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 9b62f2d0a..cd818523f 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -1,140 +1,140 @@ -.dex-19400{ - .section.centered{ - h2{ +.dex-19400 { + .section.centered { + h2 { font-size: 23px; justify-self: center; } } - .section.light-gray .default-content-wrapper, .section.light-gray .four-cards-wrapper{ + .section.light-gray .default-content-wrapper, .section.light-gray .four-cards-wrapper { background-color: #F6F6F6; } - .section.light-gray-wide{ + .section.light-gray-wide { background-color: #F6F6F6; } - .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrapper{ - h2{ + .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrappe { + h2 { font-size: 23px; margin-bottom: 24px; width: 100%; } - p:not(:last-of-type){ + p:not(:last-of-type) { margin-bottom: 24px; } - p:last-of-type{ + p:last-of-type { margin-bottom: 0; } } - .section.blue-title{ - h3{ + .section.blue-title { + h3 { color: #006DFF; font-size: 18px; } - .columns p{ + .columns p { font-size: 16px; } } - .benefits{ - svg{ + .benefits { + svg { width: 31px; height: 31px; } - span{ + span { margin: 0; height: 31px; } - p:first-of-type{ + p:first-of-type { margin-bottom: 0; } - > div > div{ + > div > div { display: flex; flex-flow: row; } } - .hero.block{ + .hero.block { width: 100%; max-width: 1350px; justify-self: center; - h3, strong{ + h3, strong { color: #000; } - .hero-picture{ + .hero-picture { border-radius: 20px; - img{ + img { border-radius: 20px; } - &::after{ + &::after { background: none; } } - strong a{ + strong a { text-decoration: underline; } - a.button{ + a.button { min-width: auto; } - a.button.android{ + a.button.android { background: #000 no-repeat center url("data:image/svg+xml,%3Csvg width='116' height='28' viewBox='0 0 116 28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M37.5 3.74995C37.5 4.54995 37.3 5.24995 36.8 5.74995C36.2 6.34995 35.5 6.64995 34.6 6.64995C33.7 6.64995 33 6.34995 32.4 5.74995C31.8 5.14995 31.5 4.44995 31.5 3.54995C31.5 2.64995 31.8 1.94995 32.4 1.34995C33 0.749951 33.7 0.449951 34.6 0.449951C35.5 0.449951 35.4 0.449951 35.8 0.749951C36.2 0.949951 36.5 1.14995 36.7 1.44995L36.2 1.94995C35.8 1.44995 35.3 1.24995 34.6 1.24995C33.9 1.24995 33.4 1.44995 33 1.94995C32.5 2.34995 32.3 2.94995 32.3 3.64995C32.3 4.34995 32.5 4.94995 33 5.34995C33.5 5.74995 34 6.04995 34.6 6.04995C35.2 6.04995 35.8 5.84995 36.3 5.34995C36.6 5.04995 36.8 4.64995 36.8 4.14995H34.6V3.44995H37.5C37.5 3.64995 37.5 3.74995 37.5 3.94995V3.74995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M42.1001 1.24995H39.4001V3.14995H41.9001V3.84995H39.4001V5.74995H42.1001V6.44995H38.6001V0.449951H42.1001V1.14995V1.24995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M45.3999 6.55005H44.5999V1.25005H42.8999V0.550049H46.9999V1.25005H45.2999V6.55005H45.3999Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M50 6.55005V0.550049H50.8V6.55005H50Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M54.2002 6.55005H53.4002V1.25005H51.7002V0.550049H55.8002V1.25005H54.1002V6.55005H54.2002Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M63.6999 5.74995C63.0999 6.34995 62.3999 6.64995 61.4999 6.64995C60.5999 6.64995 59.8999 6.34995 59.2999 5.74995C58.6999 5.14995 58.3999 4.44995 58.3999 3.54995C58.3999 2.64995 58.6999 1.94995 59.2999 1.34995C59.8999 0.749951 60.5999 0.449951 61.4999 0.449951C62.3999 0.449951 63.0999 0.749951 63.6999 1.34995C64.2999 1.94995 64.5999 2.64995 64.5999 3.54995C64.5999 4.44995 64.2999 5.14995 63.6999 5.74995ZM59.8999 5.24995C60.2999 5.64995 60.8999 5.94995 61.4999 5.94995C62.0999 5.94995 62.6999 5.74995 63.0999 5.24995C63.4999 4.84995 63.7999 4.24995 63.7999 3.54995C63.7999 2.84995 63.5999 2.24995 63.0999 1.84995C62.6999 1.44995 62.0999 1.14995 61.4999 1.14995C60.8999 1.14995 60.2999 1.34995 59.8999 1.84995C59.4999 2.24995 59.1999 2.84995 59.1999 3.54995C59.1999 4.24995 59.3999 4.84995 59.8999 5.24995Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M65.7001 6.55005V0.550049H66.6001L69.5001 5.25005V4.05005V0.550049H70.3001V6.55005H69.5001L66.4001 1.65005V2.85005V6.55005H65.6001H65.7001Z' fill='white' stroke='white' stroke-width='0.2' stroke-miterlimit='10'/%3E%3Cpath d='M58.2002 15.3501C55.8002 15.3501 53.9002 17.1501 53.9002 19.6501C53.9002 22.1501 55.8002 23.9501 58.2002 23.9501C60.6002 23.9501 62.5002 22.1501 62.5002 19.6501C62.5002 17.1501 60.6002 15.3501 58.2002 15.3501ZM58.2002 22.1501C56.9002 22.1501 55.8002 21.0501 55.8002 19.5501C55.8002 18.0501 56.9002 16.9501 58.2002 16.9501C59.5002 16.9501 60.6002 17.9501 60.6002 19.5501C60.6002 21.1501 59.5002 22.1501 58.2002 22.1501ZM48.9002 15.3501C46.5002 15.3501 44.6002 17.1501 44.6002 19.6501C44.6002 22.1501 46.5002 23.9501 48.9002 23.9501C51.3002 23.9501 53.2002 22.1501 53.2002 19.6501C53.2002 17.1501 51.3002 15.3501 48.9002 15.3501ZM48.9002 22.1501C47.6002 22.1501 46.5002 21.0501 46.5002 19.5501C46.5002 18.0501 47.6002 16.9501 48.9002 16.9501C50.2002 16.9501 51.3002 17.9501 51.3002 19.5501C51.3002 21.1501 50.2002 22.1501 48.9002 22.1501ZM37.8002 16.6501V18.4501H42.1002C42.0002 19.4501 41.6002 20.2501 41.1002 20.7501C40.6002 21.2501 39.5002 22.0501 37.8002 22.0501C35.1002 22.0501 33.1002 19.9501 33.1002 17.2501C33.1002 14.5501 35.2002 12.4501 37.8002 12.4501C40.4002 12.4501 40.3002 13.0501 41.1002 13.7501L42.4002 12.4501C41.3002 11.4501 39.9002 10.6501 37.9002 10.6501C34.3002 10.6501 31.2002 13.6501 31.2002 17.2501C31.2002 20.8501 34.3002 23.8501 37.9002 23.8501C41.5002 23.8501 41.3002 23.2501 42.5002 21.9501C43.7002 20.7501 44.1002 19.0501 44.1002 17.7501C44.1002 16.4501 44.1002 16.9501 44.1002 16.6501H38.0002H37.8002ZM83.2002 18.0501C82.8002 17.0501 81.8002 15.3501 79.6002 15.3501C77.4002 15.3501 75.6002 17.0501 75.6002 19.6501C75.6002 22.2501 77.4002 23.9501 79.8002 23.9501C82.2002 23.9501 82.9002 22.7501 83.3002 22.0501L81.9002 21.0501C81.4002 21.7501 80.8002 22.2501 79.8002 22.2501C78.8002 22.2501 78.2002 21.8501 77.7002 20.9501L83.4002 18.5501L83.2002 18.0501ZM77.4002 19.4501C77.4002 17.8501 78.7002 16.9501 79.6002 16.9501C80.5002 16.9501 81.0002 17.3501 81.2002 17.8501L77.4002 19.4501ZM72.7002 23.5501H74.6002V11.0501H72.7002V23.5501ZM69.7002 16.2501C69.3002 15.7501 68.5002 15.2501 67.5002 15.2501C65.4002 15.2501 63.4002 17.1501 63.4002 19.5501C63.4002 21.9501 65.3002 23.7501 67.5002 23.7501C69.7002 23.7501 69.3002 23.2501 69.7002 22.7501V23.3501C69.7002 24.9501 68.8002 25.8501 67.4002 25.8501C66.0002 25.8501 65.5002 25.0501 65.3002 24.3501L63.7002 25.0501C64.2002 26.1501 65.4002 27.5501 67.5002 27.5501C69.6002 27.5501 71.5002 26.2501 71.5002 23.1501V15.5501H69.7002V16.2501ZM67.5002 22.1501C66.2002 22.1501 65.1002 21.0501 65.1002 19.5501C65.1002 18.0501 66.2002 16.9501 67.5002 16.9501C68.8002 16.9501 69.8002 18.0501 69.8002 19.5501C69.8002 21.0501 68.8002 22.1501 67.5002 22.1501ZM91.9002 11.0501H87.4002V23.5501H89.3002V18.8501H91.9002C94.0002 18.8501 96.0002 17.3501 96.0002 14.9501C96.0002 12.5501 94.0002 11.0501 91.9002 11.0501ZM92.0002 17.0501H89.3002V12.7501H92.0002C93.4002 12.7501 94.2002 13.9501 94.2002 14.8501C94.2002 15.7501 93.4002 16.9501 92.0002 16.9501V17.0501ZM103.5 15.2501C102.1 15.2501 100.7 15.8501 100.2 17.1501L101.9 17.8501C102.3 17.1501 102.9 16.9501 103.6 16.9501C104.3 16.9501 105.5 17.5501 105.6 18.5501C105.3 18.5501 104.5 18.1501 103.7 18.1501C101.9 18.1501 100.1 19.1501 100.1 20.9501C100.1 22.7501 101.6 23.7501 103.2 23.7501C104.8 23.7501 105.1 23.1501 105.6 22.5501V23.5501H107.4V18.7501C107.4 16.5501 105.7 15.2501 103.6 15.2501H103.5ZM103.3 22.1501C102.7 22.1501 101.8 21.8501 101.8 21.0501C101.8 20.2501 102.9 19.7501 103.8 19.7501C104.7 19.7501 105 19.9501 105.5 20.1501C105.4 21.3501 104.4 22.1501 103.3 22.1501ZM113.8 15.5501L111.7 20.9501L109.5 15.5501H107.5L110.8 23.1501L108.9 27.3501H110.8L115.9 15.5501H113.8ZM97.0002 23.5501H98.9002V11.0501H97.0002V23.5501Z' fill='white'/%3E%3Cpath d='M10.8002 12.95L0.200195 24.25C0.500195 25.45 1.60019 26.35 3.00019 26.35C4.40019 26.35 4.00019 26.25 4.50019 25.95L16.5002 19.05L10.9002 12.95H10.8002Z' fill='%23EA4335'/%3E%3Cpath d='M21.6001 11.05L16.4001 8.05005L10.6001 13.25L16.4001 19.05L21.5001 16.05C22.4001 15.55 23.0001 14.65 23.0001 13.55C23.0001 12.45 22.4001 11.55 21.5001 11.05H21.6001Z' fill='%23FBBC04'/%3E%3Cpath d='M0.200195 2.8501C0.200195 3.0501 0.200195 3.3501 0.200195 3.5501V23.5501C0.200195 23.8501 0.200195 24.0501 0.200195 24.2501L11.2002 13.2501L0.200195 2.8501Z' fill='%234285F4'/%3E%3Cpath d='M10.9001 13.55L16.4001 8.05L4.4001 1.15C4.0001 0.85 3.5001 0.75 2.9001 0.75C1.6001 0.75 0.400098 1.65 0.100098 2.85L10.8001 13.55H10.9001Z' fill='%2334A853'/%3E%3C/svg%3E"); color: transparent; border-color: #000; - &::after{ + &::after { display: none; } } - a.button.ios{ + a.button.ios { background: #000 no-repeat center url("data:image/svg+xml,%3Csvg width='100' height='26' viewBox='0 0 100 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.039 12.3365C15.0498 11.5018 15.2715 10.6834 15.6835 9.95747C16.0955 9.23151 16.6845 8.62158 17.3956 8.1844C16.9438 7.53924 16.3479 7.0083 15.6551 6.63375C14.9622 6.2592 14.1916 6.05135 13.4044 6.02672C11.7252 5.85046 10.0972 7.03155 9.24151 7.03155C8.36924 7.03155 7.05174 6.04422 5.63301 6.07341C4.71534 6.10306 3.82099 6.36991 3.03711 6.84797C2.25324 7.32603 1.60656 7.99899 1.16009 8.80128C-0.773908 12.1497 0.668681 17.0708 2.52129 19.7774C3.44819 21.1027 4.53147 22.5832 5.94892 22.5307C7.33598 22.4731 7.85402 21.6462 9.52832 21.6462C11.1871 21.6462 11.6731 22.5307 13.1193 22.4973C14.6077 22.4731 15.5455 21.166 16.4398 19.8281C17.1058 18.8838 17.6183 17.8401 17.9583 16.7356C17.0935 16.3699 16.3556 15.7577 15.8365 14.9754C15.3174 14.1931 15.04 13.2753 15.039 12.3365Z' fill='white'/%3E%3Cpath d='M12.3076 4.24672C13.1191 3.27252 13.5189 2.02034 13.4221 0.756104C12.1823 0.886324 11.037 1.47888 10.2145 2.41571C9.81239 2.87338 9.50439 3.40582 9.30815 3.98258C9.1119 4.55935 9.03126 5.16915 9.07082 5.7771C9.69096 5.78349 10.3045 5.64908 10.8651 5.38399C11.4258 5.1189 11.919 4.73005 12.3076 4.24672Z' fill='white'/%3E%3Cpath d='M32.5723 19.1756H27.8389L26.7021 22.532H24.6973L29.1807 10.114H31.2637L35.7471 22.532H33.708L32.5723 19.1756ZM28.3291 17.6267H32.0811L30.2315 12.1795H30.1797L28.3291 17.6267Z' fill='white'/%3E%3Cpath d='M45.4297 18.0056C45.4297 20.8191 43.9239 22.6267 41.6514 22.6267C41.0757 22.6568 40.5032 22.5242 39.9995 22.244C39.4957 21.9639 39.0809 21.5476 38.8028 21.0427H38.7598V25.5271H36.9014V13.4782H38.7002V14.9841H38.7344C39.0254 14.4816 39.4471 14.0674 39.9547 13.7856C40.4624 13.5037 41.0369 13.3648 41.6172 13.3835C43.915 13.3835 45.4297 15.1999 45.4297 18.0056ZM43.5196 18.0056C43.5196 16.1726 42.5723 14.9675 41.127 14.9675C39.7071 14.9675 38.752 16.198 38.752 18.0056C38.752 19.8298 39.7071 21.0515 41.127 21.0515C42.5723 21.0515 43.5196 19.8552 43.5196 18.0056Z' fill='white'/%3E%3Cpath d='M55.3946 18.0056C55.3946 20.8191 53.8887 22.6267 51.6162 22.6267C51.0406 22.6568 50.4681 22.5242 49.9643 22.244C49.4605 21.9639 49.0458 21.5476 48.7676 21.0427H48.7246V25.527H46.8662V13.4782H48.665V14.9841H48.6992C48.9902 14.4816 49.4119 14.0674 49.9195 13.7856C50.4272 13.5037 51.0017 13.3648 51.582 13.3835C53.8799 13.3835 55.3946 15.1999 55.3946 18.0056ZM53.4844 18.0056C53.4844 16.1726 52.5371 14.9675 51.0918 14.9675C49.6719 14.9675 48.7168 16.198 48.7168 18.0056C48.7168 19.8298 49.6719 21.0515 51.0918 21.0515C52.5371 21.0515 53.4844 19.8552 53.4844 18.0056Z' fill='white'/%3E%3Cpath d='M61.9805 19.0721C62.1182 20.3035 63.3145 21.1121 64.9492 21.1121C66.5157 21.1121 67.6426 20.3035 67.6426 19.1931C67.6426 18.2293 66.9629 17.6521 65.3535 17.2566L63.7442 16.8689C61.4639 16.3181 60.4053 15.2517 60.4053 13.5212C60.4053 11.3787 62.2725 9.90698 64.9239 9.90698C67.5479 9.90698 69.3467 11.3787 69.4073 13.5212H67.5313C67.419 12.282 66.3945 11.5339 64.8975 11.5339C63.4004 11.5339 62.376 12.2908 62.376 13.3923C62.376 14.2703 63.0303 14.7869 64.6309 15.1823L65.999 15.5183C68.5469 16.1208 69.6055 17.1443 69.6055 18.9607C69.6055 21.2839 67.7549 22.739 64.8115 22.739C62.0576 22.739 60.1982 21.3181 60.0781 19.072L61.9805 19.0721Z' fill='white'/%3E%3Cpath d='M73.6162 11.3357V13.4783H75.3379V14.95H73.6162V19.9412C73.6162 20.7166 73.9609 21.0779 74.7178 21.0779C74.9222 21.0743 75.1262 21.06 75.3291 21.0349V22.4978C74.9888 22.5614 74.643 22.5901 74.2969 22.5837C72.4639 22.5837 71.749 21.8952 71.749 20.1394V14.95H70.4326V13.4783H71.749V11.3357H73.6162Z' fill='white'/%3E%3Cpath d='M76.335 18.0056C76.335 15.157 78.0127 13.3669 80.6289 13.3669C83.2539 13.3669 84.9238 15.1569 84.9238 18.0056C84.9238 20.8621 83.2627 22.6443 80.6289 22.6443C77.996 22.6443 76.335 20.8621 76.335 18.0056ZM83.0303 18.0056C83.0303 16.0515 82.1348 14.8982 80.6289 14.8982C79.123 14.8982 78.2285 16.0603 78.2285 18.0056C78.2285 19.9675 79.123 21.1121 80.6289 21.1121C82.1348 21.1121 83.0303 19.9675 83.0303 18.0056Z' fill='white'/%3E%3Cpath d='M86.4561 13.4784H88.2285V15.0194H88.2715C88.3914 14.5381 88.6734 14.1128 89.07 13.8149C89.4666 13.517 89.9536 13.3647 90.4493 13.3837C90.6634 13.3829 90.877 13.4062 91.086 13.453V15.1913C90.8156 15.1087 90.5336 15.0707 90.251 15.079C89.981 15.068 89.7118 15.1156 89.462 15.2185C89.2122 15.3214 88.9875 15.4771 88.8036 15.675C88.6196 15.8729 88.4806 16.1083 88.3962 16.3649C88.3118 16.6216 88.2839 16.8935 88.3145 17.162V22.5321H86.4561L86.4561 13.4784Z' fill='white'/%3E%3Cpath d='M99.6543 19.8728C99.4043 21.5164 97.8037 22.6443 95.7559 22.6443C93.1221 22.6443 91.4873 20.8796 91.4873 18.0486C91.4873 15.2087 93.1309 13.3669 95.6777 13.3669C98.1826 13.3669 99.7578 15.0876 99.7578 17.8328V18.4695H93.3633V18.5818C93.3338 18.915 93.3755 19.2507 93.4857 19.5665C93.5958 19.8823 93.772 20.1711 94.0023 20.4137C94.2327 20.6562 94.512 20.847 94.8217 20.9733C95.1315 21.0996 95.4646 21.1585 95.7988 21.1462C96.238 21.1874 96.6787 21.0857 97.0554 20.8562C97.4321 20.6268 97.7247 20.2819 97.8897 19.8728L99.6543 19.8728ZM93.3721 17.1707H97.8984C97.9151 16.8711 97.8697 16.5712 97.765 16.29C97.6603 16.0088 97.4987 15.7523 97.2901 15.5365C97.0816 15.3208 96.8308 15.1504 96.5533 15.0362C96.2758 14.922 95.9777 14.8664 95.6777 14.8728C95.3751 14.871 95.0751 14.9291 94.7951 15.0439C94.515 15.1586 94.2605 15.3277 94.0461 15.5413C93.8318 15.755 93.6618 16.0089 93.5461 16.2886C93.4305 16.5682 93.3713 16.868 93.3721 17.1707Z' fill='white'/%3E%3Cpath d='M28.0962 0.766781C28.4858 0.738821 28.8768 0.797681 29.2409 0.939114C29.605 1.08055 29.9332 1.30103 30.2018 1.58465C30.4703 1.86828 30.6726 2.20798 30.794 2.57925C30.9154 2.95052 30.9529 3.34411 30.9038 3.73162C30.9038 5.63787 29.8735 6.73362 28.0962 6.73362H25.9409V0.766781H28.0962ZM26.8677 5.88978H27.9927C28.2711 5.90642 28.5497 5.86077 28.8082 5.75616C29.0668 5.65155 29.2987 5.4906 29.4872 5.28503C29.6757 5.07947 29.816 4.83446 29.8979 4.56784C29.9797 4.30122 30.0011 4.0197 29.9604 3.74378C29.9981 3.46895 29.9746 3.18918 29.8915 2.92451C29.8084 2.65985 29.6677 2.41684 29.4797 2.21291C29.2916 2.00898 29.0608 1.84918 28.8037 1.74494C28.5466 1.6407 28.2697 1.59462 27.9927 1.60999H26.8677V5.88978Z' fill='white'/%3E%3Cpath d='M31.9505 4.48018C31.9222 4.18426 31.956 3.88569 32.0499 3.60362C32.1437 3.32155 32.2955 3.06221 32.4954 2.84223C32.6953 2.62225 32.9391 2.44648 33.2109 2.3262C33.4828 2.20593 33.7767 2.1438 34.074 2.1438C34.3713 2.1438 34.6653 2.20593 34.9371 2.3262C35.209 2.44648 35.4527 2.62225 35.6526 2.84223C35.8526 3.06221 36.0043 3.32155 36.0982 3.60362C36.192 3.88569 36.2259 4.18426 36.1975 4.48018C36.2264 4.7764 36.1929 5.07538 36.0994 5.35791C36.0058 5.64043 35.8541 5.90025 35.6541 6.12066C35.4541 6.34108 35.2102 6.51721 34.9381 6.63775C34.666 6.75828 34.3716 6.82055 34.074 6.82055C33.7764 6.82055 33.4821 6.75828 33.2099 6.63775C32.9378 6.51721 32.6939 6.34108 32.4939 6.12066C32.2939 5.90025 32.1423 5.64043 32.0487 5.35791C31.9551 5.07538 31.9216 4.7764 31.9505 4.48018ZM35.2835 4.48018C35.2835 3.50411 34.845 2.93331 34.0755 2.93331C33.303 2.93331 32.8685 3.50411 32.8685 4.48019C32.8685 5.46408 33.303 6.03048 34.0755 6.03048C34.845 6.03047 35.2835 5.46016 35.2835 4.48018Z' fill='white'/%3E%3Cpath d='M41.8433 6.73364H40.9214L39.9907 3.41723H39.9204L38.9937 6.73364H38.0806L36.8394 2.23071H37.7407L38.5474 5.66671H38.6138L39.5396 2.23071H40.3921L41.3179 5.66671H41.3882L42.1909 2.23071H43.0796L41.8433 6.73364Z' fill='white'/%3E%3Cpath d='M44.1235 2.23076H44.979V2.94609H45.0454C45.1581 2.68917 45.3481 2.47379 45.5889 2.32999C45.8298 2.18618 46.1096 2.12111 46.3892 2.14384C46.6083 2.12736 46.8283 2.1604 47.0329 2.2405C47.2375 2.32059 47.4214 2.4457 47.5711 2.60654C47.7208 2.76738 47.8324 2.95984 47.8976 3.16966C47.9628 3.37948 47.9799 3.60129 47.9478 3.81864V6.73364H47.0591V4.0418C47.0591 3.31817 46.7446 2.9583 46.0874 2.9583C45.9386 2.95137 45.7901 2.97669 45.6521 3.03252C45.514 3.08835 45.3897 3.17337 45.2876 3.28175C45.1854 3.39014 45.108 3.51932 45.0604 3.66045C45.0129 3.80159 44.9964 3.95132 45.0122 4.09941V6.73369H44.1235L44.1235 2.23076Z' fill='white'/%3E%3Cpath d='M49.3638 0.4729H50.2524V6.73364H49.3638V0.4729Z' fill='white'/%3E%3Cpath d='M51.4876 4.48026C51.4593 4.18432 51.4931 3.88574 51.587 3.60366C51.6809 3.32158 51.8327 3.06223 52.0326 2.84224C52.2326 2.62225 52.4763 2.44648 52.7482 2.32621C53.02 2.20593 53.3141 2.1438 53.6113 2.1438C53.9086 2.1438 54.2026 2.20593 54.4745 2.32621C54.7464 2.44648 54.9901 2.62225 55.1901 2.84224C55.39 3.06223 55.5418 3.32158 55.6357 3.60366C55.7295 3.88574 55.7634 4.18432 55.7351 4.48026C55.7639 4.77649 55.7304 5.07548 55.6368 5.358C55.5432 5.64053 55.3915 5.90034 55.1915 6.12075C54.9915 6.34116 54.7476 6.51728 54.4754 6.63781C54.2033 6.75834 53.909 6.82061 53.6113 6.82061C53.3137 6.82061 53.0194 6.75834 52.7472 6.63781C52.4751 6.51728 52.2312 6.34116 52.0312 6.12075C51.8312 5.90034 51.6795 5.64053 51.5859 5.358C51.4922 5.07548 51.4587 4.77649 51.4876 4.48026ZM54.8206 4.48026C54.8206 3.50419 54.3821 2.93339 53.6126 2.93339C52.8401 2.93339 52.4056 3.50419 52.4056 4.48027C52.4056 5.46416 52.8401 6.03056 53.6126 6.03056C54.3821 6.03055 54.8206 5.46024 54.8206 4.48026Z' fill='white'/%3E%3Cpath d='M56.6709 5.4602C56.6709 4.64965 57.2744 4.18237 58.3457 4.11596L59.5654 4.04565V3.65698C59.5654 3.18139 59.251 2.91284 58.6436 2.91284C58.1475 2.91284 57.8037 3.09497 57.7051 3.41333H56.8447C56.9355 2.63989 57.6631 2.1438 58.6846 2.1438C59.8135 2.1438 60.4502 2.7058 60.4502 3.65698V6.73364H59.5947V6.10083H59.5244C59.3817 6.32782 59.1813 6.51287 58.9437 6.63708C58.706 6.76129 58.4397 6.82021 58.1719 6.80783C57.9828 6.82749 57.7918 6.80732 57.611 6.74863C57.4303 6.68993 57.2638 6.594 57.1224 6.46703C56.981 6.34006 56.8677 6.18487 56.79 6.01145C56.7122 5.83804 56.6716 5.65025 56.6709 5.4602ZM59.5654 5.07543V4.69897L58.4658 4.76928C57.8457 4.81078 57.5644 5.02172 57.5644 5.41869C57.5644 5.82396 57.916 6.0598 58.3994 6.0598C58.5411 6.07414 58.6842 6.05984 58.8202 6.01775C58.9562 5.97565 59.0823 5.90664 59.1911 5.81479C59.2999 5.72295 59.3891 5.61017 59.4534 5.48315C59.5177 5.35613 59.5558 5.21747 59.5654 5.07543Z' fill='white'/%3E%3Cpath d='M61.6182 4.48024C61.6182 3.05739 62.3496 2.15602 63.4873 2.15602C63.7687 2.14305 64.048 2.21046 64.2925 2.35035C64.5371 2.49025 64.7367 2.69685 64.8682 2.94602H64.9346V0.4729H65.8232V6.73364H64.9717V6.02221H64.9014C64.7598 6.2697 64.5532 6.47374 64.3039 6.61222C64.0546 6.7507 63.7723 6.81835 63.4873 6.80785C62.3418 6.8079 61.6182 5.90651 61.6182 4.48024ZM62.5362 4.48024C62.5362 5.43532 62.9864 6.01003 63.7393 6.01003C64.4883 6.01003 64.9512 5.42703 64.9512 4.48415C64.9512 3.54567 64.4834 2.95436 63.7393 2.95436C62.9912 2.95436 62.5362 3.53297 62.5362 4.48024Z' fill='white'/%3E%3Cpath d='M69.4998 4.48018C69.4715 4.18426 69.5053 3.88569 69.5992 3.60362C69.693 3.32155 69.8448 3.06221 70.0447 2.84223C70.2447 2.62225 70.4884 2.44648 70.7602 2.3262C71.0321 2.20593 71.3261 2.1438 71.6233 2.1438C71.9206 2.1438 72.2146 2.20593 72.4864 2.3262C72.7583 2.44648 73.002 2.62225 73.2019 2.84223C73.4019 3.06221 73.5536 3.32155 73.6475 3.60362C73.7413 3.88569 73.7752 4.18426 73.7469 4.48018C73.7757 4.7764 73.7423 5.07538 73.6487 5.35791C73.5551 5.64043 73.4034 5.90025 73.2034 6.12066C73.0034 6.34108 72.7595 6.51721 72.4874 6.63775C72.2153 6.75828 71.921 6.82055 71.6233 6.82055C71.3257 6.82055 71.0314 6.75828 70.7592 6.63775C70.4871 6.51721 70.2432 6.34108 70.0432 6.12066C69.8432 5.90025 69.6916 5.64043 69.598 5.35791C69.5044 5.07538 69.4709 4.7764 69.4998 4.48018ZM72.8328 4.48018C72.8328 3.50411 72.3943 2.93331 71.6248 2.93331C70.8523 2.93331 70.4178 3.50411 70.4178 4.48019C70.4178 5.46408 70.8524 6.03048 71.6248 6.03048C72.3943 6.03047 72.8328 5.46016 72.8328 4.48018Z' fill='white'/%3E%3Cpath d='M74.9395 2.23076H75.7949V2.94609H75.8613C75.974 2.68917 76.164 2.47379 76.4049 2.32999C76.6457 2.18618 76.9255 2.12111 77.2051 2.14384C77.4242 2.12736 77.6442 2.1604 77.8488 2.2405C78.0534 2.32059 78.2373 2.4457 78.387 2.60654C78.5367 2.76738 78.6483 2.95984 78.7135 3.16966C78.7787 3.37948 78.7958 3.60129 78.7637 3.81864V6.73364H77.875V4.0418C77.875 3.31817 77.5606 2.9583 76.9033 2.9583C76.7546 2.95137 76.6061 2.97669 76.468 3.03252C76.33 3.08835 76.2056 3.17337 76.1035 3.28175C76.0014 3.39014 75.9239 3.51932 75.8763 3.66045C75.8288 3.80159 75.8124 3.95132 75.8281 4.09941V6.73369H74.9395V2.23076Z' fill='white'/%3E%3Cpath d='M83.7852 1.10962V2.25122H84.7607V2.99976H83.7852V5.31519C83.7852 5.78687 83.9795 5.99341 84.4219 5.99341C84.5351 5.99305 84.6483 5.9862 84.7607 5.9729V6.71313C84.6012 6.74168 84.4395 6.75687 84.2773 6.75854C83.2891 6.75854 82.8955 6.41088 82.8955 5.54272V2.99972H82.1807V2.25118H82.8955V1.10962H83.7852Z' fill='white'/%3E%3Cpath d='M85.9746 0.4729H86.8555V2.95435H86.9258C87.0439 2.69503 87.2391 2.47844 87.4848 2.33409C87.7305 2.18974 88.0147 2.12466 88.2988 2.14771C88.5167 2.13585 88.7346 2.17224 88.9369 2.25428C89.1392 2.33632 89.3209 2.462 89.469 2.62233C89.6171 2.78267 89.728 2.97372 89.7938 3.18186C89.8596 3.38999 89.8786 3.61008 89.8496 3.82642V6.73365H88.96V4.04565C88.96 3.32641 88.625 2.96215 87.9971 2.96215C87.8444 2.94962 87.6907 2.97062 87.547 3.02367C87.4032 3.07673 87.2727 3.16056 87.1647 3.26929C87.0567 3.37803 86.9738 3.50905 86.9218 3.65319C86.8697 3.79733 86.8497 3.9511 86.8633 4.10375V6.73363H85.9746L85.9746 0.4729Z' fill='white'/%3E%3Cpath d='M95.0314 5.51789C94.9107 5.92943 94.6491 6.28542 94.2924 6.52357C93.9357 6.76172 93.5066 6.86687 93.0802 6.82062C92.7836 6.82846 92.4888 6.77163 92.2163 6.65411C91.9438 6.53658 91.7001 6.36116 91.5022 6.14002C91.3043 5.91888 91.1569 5.65732 91.0702 5.3735C90.9835 5.08968 90.9596 4.79039 91.0002 4.49641C90.9607 4.20153 90.985 3.9016 91.0714 3.61692C91.1579 3.33225 91.3046 3.06948 91.5015 2.84641C91.6983 2.62334 91.9408 2.44517 92.2125 2.32396C92.4842 2.20275 92.7788 2.14134 93.0763 2.14387C94.3293 2.14387 95.0851 2.99987 95.0851 4.41387V4.72396H91.9054V4.77376C91.8915 4.93901 91.9123 5.10534 91.9664 5.26209C92.0205 5.41884 92.1068 5.56255 92.2197 5.68401C92.3326 5.80546 92.4697 5.90198 92.6221 5.96738C92.7745 6.03278 92.9388 6.06561 93.1046 6.06376C93.3172 6.08928 93.5326 6.05101 93.7233 5.9538C93.9141 5.85659 94.0716 5.70485 94.1759 5.51786L95.0314 5.51789ZM91.9054 4.06672H94.1798C94.191 3.9156 94.1705 3.7638 94.1195 3.62108C94.0686 3.47836 93.9883 3.34788 93.8839 3.23802C93.7795 3.12817 93.6533 3.04136 93.5134 2.98318C93.3735 2.92501 93.2229 2.89675 93.0714 2.90022C92.9177 2.89829 92.7652 2.92715 92.6228 2.9851C92.4804 3.04304 92.3511 3.1289 92.2425 3.23761C92.1338 3.34633 92.048 3.47569 91.9901 3.61809C91.9322 3.76048 91.9034 3.91303 91.9054 4.06672Z' fill='white'/%3E%3C/svg%3E%0A"); color: transparent; border-color: #000; - &::after{ + &::after { display: none; } } } - .columns{ + .columns { text-align: left; - >div{ + >div { align-items: baseline; } } .image-columns { - > div{ + > div { align-items: start; - > .image-columns-txt-col{ + > .image-columns-txt-col { text-align: left; - p{ + p { padding-left: 0; font-size: 16px; margin-bottom: 24px; } - h3{ + h3 { font-size: 18px; margin-bottom: 6px; } @@ -143,25 +143,26 @@ } } - .awards-container .block.awards-component{ - h3{ + .awards-container .block.awards-component { + + h3 { margin-bottom: 12px; } - h4{ + h4 { margin-bottom: 24px; } - >div{ + >div { justify-content: center; text-align: -webkit-center; gap: 20px; } - > div:nth-child(2){ + > div:nth-child(2) { min-width: 100%; - >div{ + >div { display: flex; justify-content: space-evenly; flex-wrap: wrap; @@ -170,7 +171,7 @@ gap: 20px; } - img{ + img { height: 62px; } } @@ -213,7 +214,7 @@ text-align: left; gap: 5px; - .icon{ + .icon { width: 18px; height: 18px; transform: rotate(180deg); @@ -322,7 +323,7 @@ font-size: 23px; } - sup{ + sup { position: relative;; font-size: 16px; margin-left: 2px; @@ -332,66 +333,66 @@ } .creator-cards { - .four-cards.white-cards{ - h3{ + .four-cards.white-cards { + h3 { text-align: left; font-size: 17px; line-height: 1.25; margin-bottom: 0; } - p{ + p { font-size: 12px; margin-bottom: 0; } - a{ + a { margin-top: 10px; } - li{ + li { max-width: 428px; background-color: #fff; } - svg{ + svg { width: 50px; height: 50px; box-shadow: rgb(0 0 0 / 5%); } } - .four-cards.centered{ - li{ + .four-cards.centered { + li { text-align: center; max-width: 321px; } - p, strong{ + p, strong { font-size: 16px; } - p:first-of-type{ + p:first-of-type { margin: 0; } - span{ + span { margin: 0; height: 31px; } - svg{ + svg { height: 31px; width: 31px; } } } - .questions-answers-container .answer{ + .questions-answers-container .answer { text-align: left; } - .system-requirements-item .requirement > ul{ + .system-requirements-item .requirement > ul { display: flex; flex-flow: column; gap: 2px; @@ -407,25 +408,25 @@ } @media (width <= 767px) { - .section{ + .section { padding-top: 0; - a{ + a { width: 100%; justify-content: center; } } - .section.centered:not(.light-gray-wide){ + .section.centered:not(.light-gray-wide) { text-align: left; } - .hero-container.grey-background .hero{ + .hero-container.grey-background .hero { background-color: #f8f8f8f8; } - .hero .hero-content{ + .hero .hero-content { padding-bottom: 0; } @@ -433,24 +434,24 @@ display: none; } - .product-comparison-table-wrapper{ + .product-comparison-table-wrapper { padding: 0; - .product-comparison-table.green-tag{ - .product-comparison-header{ + .product-comparison-table.green-tag { + .product-comparison-header { display: grid; gap:0; grid-template-columns:repeat(2, 1fr) } - .column-fixed-width{ + .column-fixed-width { width: auto; display: grid; grid-template-rows: subgrid; grid-row: 1/7; } - .product-comparison-price{ + .product-comparison-price { display: grid; grid-auto-flow: dense; gap: 0; @@ -459,17 +460,17 @@ } - div [role="row"] div[role="cell"]:first-of-type{ + div [role="row"] div[role="cell"]:first-of-type { min-width: 100%; } } - .questions-answers-container{ - .default-content-wrapper{ + .questions-answers-container { + .default-content-wrapper { padding-bottom: 0; } - .questions-answers-item .question h3{ + .questions-answers-item .question h3 { font-size: 12px !important; padding-right: 0; text-align: left; @@ -478,80 +479,80 @@ } @media (width >= 767px) { - .section{ + .section { padding-top: 40px; padding-bottom: 40px; } - .section.centered{ - h2{ + .section.centered { + h2 { width: 70%; font-size: 34px; } } - .section.narrow-content{ - .default-content-wrapper{ - >p{ + .section.narrow-content { + .default-content-wrapper { + >p { max-width: 80%; justify-self: center; } - >h2{ + >h2 { max-width: 70%; } } } - .section.blue-title{ - h3{ + .section.blue-title { + h3 { font-size: 24px; } } - .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrapper{ + .section.light-sky-blue .default-content-wrapper, .section.light-gray .default-content-wrapper { padding: 50px; border-radius: 20px; - h2{ + h2 { font-size: 40px; } } - .hero-container.grey-background{ - .hero-content{ - h3{ + .hero-container.grey-background { + .hero-content { + h3 { font-size: 22px; } - .button{ + .button { margin-bottom: 24px; } } } - .columns{ + .columns { justify-items: center; padding-top: 25px; - h3{ + h3 { margin-bottom: 0; } - p{ + p { margin-top: 10px; } } - .benefits{ + .benefits { text-align: center; padding-top: 24px; - >div{ + >div { flex-direction: row; } - > div > div{ + > div > div { flex-flow: column; align-items: center; } @@ -559,7 +560,8 @@ .creator-cards{ .four-cards.centered{ - >ul{ + + >ul { grid-template-columns: repeat(3, 1fr); } } @@ -567,15 +569,15 @@ .four-cards.white-cards{ margin-bottom: 40px; - h3{ + h3 { font-size: 24px; } - p{ + p { font-size: 16px; } - a{ + a { margin-top: 32px; } @@ -587,25 +589,27 @@ } } - .awards-container .block.awards-component{ - h3{ + .awards-container .block.awards-component { + + h3 { font-size: 40px; } - h4{ + h4 { font-size: 22px; } } .image-columns { > div{ - > .image-columns-txt-col{ - h3{ + > .image-columns-txt-col { + + h3 { font-size: 22px; margin-bottom: 6px; } - p{ + p { font-size: 16px; } } @@ -613,14 +617,14 @@ } } - .product-comparison-table.green-tag{ + .product-comparison-table.green-tag { &div[role="row"]:not(.product-comparison-header) { div[role="cell"]:first-of-type { min-width: unset; } } - .column-fixed-width{ + .column-fixed-width { padding: 24px; tr:last-of-type td, tr:last-of-type p{ @@ -628,22 +632,22 @@ } } - .product-comparison-price{ - .old-price-box{ + .product-comparison-price { + .old-price-box { flex-direction: unset; - span{ + span { font-size: 16px; align-self: center; } } - .new-price-box{ - .total-text{ + .new-price-box { + .total-text { font-size: 42px; } - sup{ + sup { top: 10px; margin-left: 10px; font-size: 22px; @@ -651,7 +655,7 @@ } } - div[role='columnheader']:nth-child(1){ + div[role='columnheader']:nth-child(1) { width: 33%; } } @@ -659,7 +663,7 @@ } @media (width >= 820px) { - .hero-container.grey-background .hero-content > div:first-of-type{ + .hero-container.grey-background .hero-content > div:first-of-type { width: 60%; } } \ No newline at end of file From a91f357d45c1aeb5a1f8867e1a6ce11d19b3f765 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Mon, 13 Jan 2025 15:12:06 +0200 Subject: [PATCH 239/248] refactor CSS for improved media query handling and layout consistency --- _src/scripts/template-factories/dex-19400.css | 169 +++++++++--------- 1 file changed, 80 insertions(+), 89 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index cd818523f..351952190 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -1,4 +1,5 @@ .dex-19400 { + .section.centered { h2 { font-size: 23px; @@ -221,12 +222,6 @@ margin-top: 2px; } } - - tr:last-of-type td, tr:last-of-type p { - font-size: 12px; - color: #000; - font-weight: 600 !important; - } } .product-comparison-header div[role="columnheader"]:not(:first-child).active { @@ -407,78 +402,7 @@ } } - @media (width <= 767px) { - .section { - padding-top: 0; - - a { - width: 100%; - justify-content: center; - - } - } - - .section.centered:not(.light-gray-wide) { - text-align: left; - } - - .hero-container.grey-background .hero { - background-color: #f8f8f8f8; - } - - .hero .hero-content { - padding-bottom: 0; - } - - .image-columns > div > .image-columns-img-col img { - display: none; - } - - .product-comparison-table-wrapper { - padding: 0; - - .product-comparison-table.green-tag { - .product-comparison-header { - display: grid; - gap:0; - grid-template-columns:repeat(2, 1fr) - } - - .column-fixed-width { - width: auto; - display: grid; - grid-template-rows: subgrid; - grid-row: 1/7; - } - - .product-comparison-price { - display: grid; - grid-auto-flow: dense; - gap: 0; - grid-template-rows: repeat(1, minmax(40px, auto)); - } - - } - - div [role="row"] div[role="cell"]:first-of-type { - min-width: 100%; - } - } - - .questions-answers-container { - .default-content-wrapper { - padding-bottom: 0; - } - - .questions-answers-item .question h3 { - font-size: 12px !important; - padding-right: 0; - text-align: left; - } - } - } - - @media (width >= 767px) { + @media (min-width: 767px) { .section { padding-top: 40px; padding-bottom: 40px; @@ -491,17 +415,15 @@ } } - .section.narrow-content { - .default-content-wrapper { - >p { + .section.narrow-content .default-content-wrapper { + > p { max-width: 80%; - justify-self: center; + /* justify-self: center; */ } - >h2 { + > h2 { max-width: 70%; } - } } .section.blue-title { @@ -520,7 +442,9 @@ } .hero-container.grey-background { + .hero-content { + h3 { font-size: 22px; } @@ -618,7 +542,7 @@ } .product-comparison-table.green-tag { - &div[role="row"]:not(.product-comparison-header) { + div[role="row"]:not(.product-comparison-header) { div[role="cell"]:first-of-type { min-width: unset; } @@ -626,10 +550,6 @@ .column-fixed-width { padding: 24px; - - tr:last-of-type td, tr:last-of-type p{ - font-size: 16px; - } } .product-comparison-price { @@ -660,6 +580,77 @@ } } } + + @media (width <= 767px) { + .section { + padding-top: 0; + + a { + width: 100%; + justify-content: center; + + } + } + + .section.centered:not(.light-gray-wide) { + text-align: left; + } + + .hero-container.grey-background .hero { + background-color: #f8f8f8f8; + } + + .hero .hero-content { + padding-bottom: 0; + } + + .image-columns > div > .image-columns-img-col img { + display: none; + } + + .product-comparison-table-wrapper { + padding: 0; + + .product-comparison-table.green-tag { + .product-comparison-header { + display: grid; + gap:0; + grid-template-columns:repeat(2, 1fr) + } + + .column-fixed-width { + width: auto; + display: grid; + grid-template-rows: subgrid; + grid-row: 1/7; + } + + .product-comparison-price { + display: grid; + grid-auto-flow: dense; + gap: 0; + grid-template-rows: repeat(1, minmax(40px, auto)); + } + + } + + div [role="row"] div[role="cell"]:first-of-type { + min-width: 100%; + } + } + + .questions-answers-container { + .default-content-wrapper { + padding-bottom: 0; + } + + .questions-answers-item .question h3 { + font-size: 12px !important; + padding-right: 0; + text-align: left; + } + } + } } @media (width >= 820px) { From b92071c39687796b18fa0f5f156d91a03560938a Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 13 Jan 2025 15:16:38 +0200 Subject: [PATCH 240/248] refactor css for safari exceptions --- _src/scripts/template-factories/dex-19400.css | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 351952190..fb55c6937 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -42,6 +42,12 @@ } } + .default-content-wrapper{ + display: flex; + flex-flow: column; + align-items: center; + } + .benefits { svg { width: 31px; @@ -64,10 +70,14 @@ } + .hero-wrapper{ + display: flex; + justify-content: center; + } + .hero.block { width: 100%; max-width: 1350px; - justify-self: center; h3, strong { color: #000; From 2b9f4272e188f299d279cf5dbb53499d73c7d9ac Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 13 Jan 2025 15:24:49 +0200 Subject: [PATCH 241/248] fix mobile button --- _src/scripts/template-factories/dex-19400.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index fb55c6937..8f34afccb 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -208,7 +208,7 @@ font-weight: 700; } - .button { + .button-container { width: 100%; background-color: var(--button-background-color); border: 2px solid var(--button-background-color); From 0e6629eddebfb0e7a0c1eb6abee48a039cf1f1c2 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 13 Jan 2025 15:31:59 +0200 Subject: [PATCH 242/248] mobile button adjustment --- _src/scripts/template-factories/dex-19400.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 8f34afccb..418b565ee 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -208,7 +208,7 @@ font-weight: 700; } - .button-container { + .button { width: 100%; background-color: var(--button-background-color); border: 2px solid var(--button-background-color); @@ -595,7 +595,7 @@ .section { padding-top: 0; - a { + .button-container, a{ width: 100%; justify-content: center; From a82b93d96d0d52f2d8465ee1bc6bb4ee3eb4a747 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Mon, 13 Jan 2025 16:08:42 +0200 Subject: [PATCH 243/248] aligned info button --- _src/scripts/template-factories/dex-19400.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index 418b565ee..acb3b8f25 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -397,6 +397,10 @@ text-align: left; } + .system-requirements .info-button-container{ + align-self: baseline; + } + .system-requirements-item .requirement > ul { display: flex; flex-flow: column; From d59b6a3d2261842438a341d73f8326f40a9862c4 Mon Sep 17 00:00:00 2001 From: Alexandru-Butuza Date: Tue, 14 Jan 2025 10:48:04 +0200 Subject: [PATCH 244/248] adjusted prduct table font size --- _src/scripts/template-factories/dex-19400.css | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/_src/scripts/template-factories/dex-19400.css b/_src/scripts/template-factories/dex-19400.css index acb3b8f25..257424f1a 100644 --- a/_src/scripts/template-factories/dex-19400.css +++ b/_src/scripts/template-factories/dex-19400.css @@ -335,6 +335,13 @@ } } } + + tr:last-of-type { + td, p { + font-weight: 700; + font-size: 12px; + } + } } .creator-cards { @@ -592,6 +599,12 @@ div[role='columnheader']:nth-child(1) { width: 33%; } + + tr:last-of-type { + td, p { + font-size: 16px; + } + } } } From 336c97754dd3e756cbc0d2e0314f973fac7f659e Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 14 Jan 2025 14:38:13 +0200 Subject: [PATCH 245/248] Add full-width styling to mbox-canvas component --- _src/blocks/mbox-canvas/mbox-canvas.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.css b/_src/blocks/mbox-canvas/mbox-canvas.css index 96c21494f..370174cf0 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.css +++ b/_src/blocks/mbox-canvas/mbox-canvas.css @@ -8,5 +8,9 @@ display: flex; justify-content: center; align-items: center; + + .mbox-canvas { + width: 100%; + } } } \ No newline at end of file From fd806eb7e5269b26572d02717623af9772579672 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 14 Jan 2025 15:07:45 +0200 Subject: [PATCH 246/248] Enhance mbox-canvas functionality and apply dark theme for webview --- _src/blocks/mbox-canvas/mbox-canvas.js | 3 +++ _src/scripts/scripts.js | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index 0fe859879..aeadd7fe6 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -50,4 +50,7 @@ export default async function decorate(block) { const decoratedOfferHtml = decorateHTMLOffer(offerHtml); block.querySelector('.canvas-content').innerHTML = decoratedOfferHtml.innerHTML; await loadBlocks(block.querySelector('.canvas-content')); + + // make all the links from the canvas open in a new browser window + block.querySelectorAll('a').forEach((link) => link.setAttribute('_target', 'blank')); } diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 015a2eacd..17ea6c723 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -505,6 +505,13 @@ function loadDelayed() { async function loadPage() { await window.hlx.plugins.load('eager'); + + // specific for webview + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.get('theme') === 'dark' && window.location.href.includes('canvas')) { + document.body.style = 'background-color: #141517'; + } + await loadEager(document); await window.hlx.plugins.load('lazy'); await Constants.PRODUCT_ID_MAPPINGS_CALL; From 67b632dbad25cc311de363ef5f3e9359f5bdb195 Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 14 Jan 2025 15:13:26 +0200 Subject: [PATCH 247/248] Fix target attribute for links in mbox-canvas to open in new browser window --- _src/blocks/mbox-canvas/mbox-canvas.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index aeadd7fe6..eb9c658c9 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -52,5 +52,7 @@ export default async function decorate(block) { await loadBlocks(block.querySelector('.canvas-content')); // make all the links from the canvas open in a new browser window - block.querySelectorAll('a').forEach((link) => link.setAttribute('_target', 'blank')); + block.querySelectorAll('a').forEach((link) => { + link.setAttribute('target', '_blank'); + }); } From d1a4761846f9eef134cc6cfc1c1281052deab99f Mon Sep 17 00:00:00 2001 From: Matei Iordache Date: Tue, 14 Jan 2025 17:12:04 +0200 Subject: [PATCH 248/248] Rename loader class to loader-circle and update related styles and scripts --- _src/blocks/mbox-canvas/mbox-canvas.js | 2 +- _src/scripts/scripts.js | 7 ++++--- _src/styles/styles.css | 16 ---------------- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/_src/blocks/mbox-canvas/mbox-canvas.js b/_src/blocks/mbox-canvas/mbox-canvas.js index eb9c658c9..bdef838ff 100644 --- a/_src/blocks/mbox-canvas/mbox-canvas.js +++ b/_src/blocks/mbox-canvas/mbox-canvas.js @@ -40,7 +40,7 @@ export default async function decorate(block) {
`; - block.classList.add('loader'); + block.classList.add('loader-circle'); const offer = await Target.getOffers([{ name: mboxName, parameters, diff --git a/_src/scripts/scripts.js b/_src/scripts/scripts.js index 17ea6c723..0c0762ec8 100644 --- a/_src/scripts/scripts.js +++ b/_src/scripts/scripts.js @@ -525,9 +525,10 @@ async function loadPage() { element.classList.remove('await-loader'); }); - const awaitLoader = document.querySelectorAll('.loader'); - awaitLoader.forEach((element) => { - element.classList.remove('loader'); + // loader circle used in mbox-canvas + const loaderCircle = document.querySelectorAll('.loader-circle'); + loaderCircle.forEach((element) => { + element.classList.remove('loader-circle'); }); adobeMcAppendVisitorId('main'); diff --git a/_src/styles/styles.css b/_src/styles/styles.css index 33fc04636..00f654abd 100644 --- a/_src/styles/styles.css +++ b/_src/styles/styles.css @@ -1626,17 +1626,6 @@ main .section.blue a.button.modal::after { visibility: hidden; } -.loader { - width: 48px; - height: 48px; - border: 5px solid #006EFF;; - border-bottom-color: transparent; - border-radius: 50%; - display: inline-block; - box-sizing: border-box; - animation: rotation 1s linear infinite; -} - .loader-circle { width: 48px !important; height: 48px !important; @@ -1663,11 +1652,6 @@ main .section.blue a.button.modal::after { } } -.loader * { - visibility: hidden; - display: none; -} - @media (min-width: 768px) { .buttons-align-right > div { flex-direction: row;