From 55bf4360fb5bad85e908d463aae724a3184c43ba Mon Sep 17 00:00:00 2001 From: smartcalsystems-sketch Date: Tue, 13 Oct 2026 23:58:16 +0530 Subject: [PATCH] fix: correct manifest splash colors and add required icon sizes (closes #695) manifest.ts had background_color: "#0a0a0f" (dark) paired with theme_color: "#fbfbfd" (light) -- the light-mode value from layout.tsx's media-queried viewport.themeColor (#224), which doesn't apply here since a manifest only holds one static pair. The mismatch made the PWA install splash flash a dark screen into a near-white status bar. Set theme_color to match background_color (both dark, consistent with the app's dark-mode-first design). Also added the 192x192 icon and a properly safe-zoned maskable 512x512 icon Chrome's install criteria require -- the existing icon's circle spans ~98% of the canvas, which would get clipped under the W3C maskable safe-zone (inner 80%), so the maskable variant scales the icon content down to 80% and centers it on a canvas filled with the same background color sampled from the source icon's corners. --- src/app/icon-192.png | Bin 0 -> 4859 bytes src/app/icon-maskable-512.png | Bin 0 -> 15055 bytes src/app/manifest.test.ts | 29 +++++++++++++++++++++++++++-- src/app/manifest.ts | 20 +++++++++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/app/icon-192.png create mode 100644 src/app/icon-maskable-512.png diff --git a/src/app/icon-192.png b/src/app/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..35d27da12bb62a0fe37db430b940646b60c7640b GIT binary patch literal 4859 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 literal 0 HcmV?d00001 diff --git a/src/app/icon-maskable-512.png b/src/app/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..a1637b2a1a571edf966345806723d638159c39aa GIT binary patch literal 15055 zcmd^Gg9{%KX&`P@0-$=RK=Yf-!#Z_jM3C_ps&;^gwify(rI>YroxK=euW3<{-y3qji* z+?U|IdDNufjo5;kOR#f2`J6Hie?oqPrQjRHl|C4I%%wzL^cJ3*kX_KcvX_#8neNwDq;#Eh0H@ zG!C>~lXD&$IvdZuPldFRl$|1dnItm(>E;l^dD%2X$P`wK|!pBK5wpA-~H*d1uYhgGDy7s*|ZQ zy#fA{)0sW0V+;O!3)#^LDPJm|KGMjKa29pB=wzS%ImP?k!QPseM*$AD%O zF)qnw-pNos}Dp6|RRzlNJii+rFA#BA2fRcj9(<$}M=g6I0fCwvd>`7pNwT zTSgbHl@J=KD@bY&w}co%Ao;aA&bX!i)o#^9lfbwO!zhjyl$>h!6>_K|#NdJ~hh4)k zJje`^Sd!9AHbM0>W;=|A=DeLf6ps_CpGVklU$riMaDu5pYq&6^Th7^0j1%qLkTvwa zT(woEl>0FkF)3T*GX4kw%Z4<^C5yrfQb-)L*iSLa`q1K`8@JM=LrHT;|FD$>bDtRxYG&OViFzin z*RAF+03#;KD;-NLRc(P4>N+D~O8eldvl1BS-XkKbCUZQKj=$MWI+-CNpN6Xua8-GUP{Rc}d#4Y*uq8g__#KH(>~JCH)Yy_h$;+A5;98@(*|i|@lrf8jad=>`3XXZ!m23@%kTVII+3eUO z^_Kgt*wXy+IBFyq+9s2F7o(bG91d)%`p0*IXlCWdH0iN|`W|Y%$9j$pjHdh`8$Fgc;CzFZ48v;os=ACt zsG8XSzL!0X@8V(JS-Dr_R#Z*P{8>2`7se43&L_y!)RadR5xwDEsq`kD+g1b*`Rk+H zz_HDgNzbw3UP7wk1uYhg0dqANN>|y8eW=47WzxSD9<1UyD6TnazJ8@j`liY;Z@nZq zItZffD(>QYDyuC$VOKnti15UYz{|kGup+Jc#GM!s_=^g2e^y(fkZexNPws9!CThCXm;n{-E*p z0WNC-453;O4F4dn;zkPj_u^b$kICxZ@fU@tq#9~WcsK5Rs_-^4C50GzgJn11LtiG} z(FO{TOemD=`}iG5S7E#hhV0($Jr9;kh6)oo)TFflELLIIAuZsL&)Zm6%@Y6gd6GhA z)kOpD8PU|x5F_5a+jz*=3>L2RI_vl=EWFQO)Q&uRG{zssokxg=r0lT^-=5dXXHRZc z`F-}7RDT#^kcXlk79Y#*y!FOG46RxNxW?eS`mCpr9PPov7-YLK|0#H90HC<2I1N zC7Lg@9o;!EO&}tcN7&Zgcfo`hU;utR#k9#P-&Lt0( zU2eyp;I5M%U?#t+G9u;0n8Agu%eoS{1|s=fBq@_?@#Mu6peBubv&;2}Z=0;z$yUc7w^PrlxVO5zIhxQE29b{M%Ue`{XXy1FFd8akF_ns3sjQwwY_ zY{zUs6rZpkVrr}K^tkrmnh{7Ne-2(OY?EkXv3n?ddD}>Y*Zw^9@}q5_k3WoH=eApi zyCcW97|r=IkLzW@4VZk|r1os*pghDUJePaUilp2^NW^;JV7Tav%velRyvn%;@!AARoj?uUXafL!T+2xcC z5_X=%#MZ_~HU-Ai9kY2@7GdFt4!CbA%K@R4;#-U5CMVKi z`hD*Pg*AtJ%;3GT$kLF z!0ZGZ%AMKGbcuij+?8L9RmS7^kzvip=#Mz-OqvFt;0j2-Q5Tv|0>71YLa8h`#?*fO z#$~fFsq2aZul=D4ndedGOg4ik2MLvec$4`NgLtaz}e6#`|=?lZFCli*3^x>IynExw2sN$)HcA~&t4s2LL58Q$o`S@}E?ZR2S_TI!Z zp5u6RJS)Q=;m`aZfBJ&~uSPA2--Y8@Sx)lDu}sxV8}mVA#GT|=74AxJs(crt2QU(> z$rV3c!zz-`JMk;TNUckuPaJC8!MvUjZ2JLQ>duLBL(uy&d-q{I!M-pIQ>KEld&h+kTqTK@_9TY?{iH>o`9y^ zCL&NWunCd53YO#X4I=Mc{93kUOW`k}jfhMM%4@I0w?|d%2#3urHI?c19W{UZ_U)_Z zp2gSKJC^7ZOY~`do2qR4WOClXr!U++M;PO^>l{{ZA%v>MVJKu2Yvf(1Uu%+`n~VP1 zcJ-CN^?Z>DwZMd03q;|{wc8{jG!s*|d`_`2Wu_hkxn1K%UWmsD3kX!y*PkuL%Q-nZ zN(Wpw=oTYrPMgvDm6!6-@9w|64Hc3V7Kq=ybe4K`n#TUb$ERt+@z$+d7Ht9kFJJC_ z-D^FP*5X{blBKm`cco{KRGzR>$AbGWRH6U}T`L^&OGN1D=}AdRdG5_VRx|(l`lYAm z+5Ehfl@;8dyDAWO8=+bGT)N^8iO=d-^){6*)7+VVp+0q3Nl8g~c(|C;G-)*YkD;Y# z=D@_n1RT$#w1yUorXmUPBNdxDM-%@>y^ zTkKjnJf(zoB6v{F9Rn7eUoW6JSmN60}q2d_R+k+v(38!TU)v&NI0|SH26Q97qK#CUb z^Q6mMwZaj{dzLLeq9P)QAUIaLroMw@ACtsB&pBQts*W`jop|+9gmx%LrsR)9(L)9C zIM!^KYT|TTAo@>TH)dO!4kMsX=xssXV;LFD%oQn%*7PRn-_+9Oj!yP%Hw6`ARcBG7L3%? z=lb2{cpdBO>t}O;ZB0#FpW$;n>)-QL68poF&qw(yp})F4*tV>d428e@`}?=X%ZrMN zKQ^O4%SZKn(&qvn2L@VVNZBS| z*tR|!nVV~CZfUNz~B&v&x)XWlEOldkVs)?h^!mXTir4N5{J|H&trL=UW z*;{xI`%2$Pj{oNRbjmsKa-*oYxOiG({Xz?BIws@9YX3q)RL^ku?5d}y2NclerUNNf zZtRA7&!;~Q<{)pu>&X*^%O9O2>pNPINdlr!Mmtp-656sH)FR}Is_}WGrM0)aJKN~? zFb;dIe3OQbZfbTm;PSZG4rfLFbwQu0j;<_BMUD$6&?Jrm^|SKkbO$8U)Y8VAtm+Q^t$#tgHPP$!@d+aw0)ojs4IfJC3L!u5BP(ENCSy@>(Fq+}w z@h3w`xN60w^-iUwr33x_4Q1Tf9pW&`f~w}H7Z^Va$&lNfhKF6m=R8mIRs_#4x6145 z>)Wn&rRL7qA_AF@c<(5I%zXIpAt_W@eGdZpWHd6yfa%GVzaY8HANn93uE$pEhlu(q}a z_2lm_vv=LpAE>SSEoV)}=lIhvyO@|56$#P_s~2K8QqLoW)0Xj5DJ<=+X(Z*Jik2Fb zl$SfZx>j10|NK34D=IJ`{`!Ew?fUR!Yn+>#yMO~Lm`ADbTi9VbZMo7|?o!*I<(Exo zdvj@@2S!KXd>59fT)GqN)wQ*v;8t=ahM_5KHd;{w99V_5FMAfd0eRTM$jHdi+7Ljn zLbD>%All0Ff5l~D;&3l>yxcOaxBw67&tXinmmY8UPL*MW)OsC?+y_J#e^e}U;NZa3 zetM_CgVMA-+2?$JVXEGFZ@O`mmjqK|8_z9E=nZ}IE3B0Y)V(As^mK#k5{S?9=PQSe zb91a=vT;i$rFE5+f^u^FdWv#Q#zZ`yaAVc2UdK>DcjZhqEee;!2dAf}!Nsw&vrBPb z%aI&X#m2?$?(XvO@%7;dR(+#PL{RPWj+2&Cj7s#8#)RDJVHHqK)X>xfzcV;E*hfEH zqB68v_Mp~e=I>vxi^G-ncBq5dk>M@ zI?uJX)YaXSlH%5cgskX3Q)EEZ*m<3qKJ(QP-%^Co2L}fyCnw$UOlx{_eD<)r*(FH=)p>}e1c6PK#t3zO0LCxUfn=V)Bd-q=Z z`CT7xjE;KaRfHo1TRHo!VDsnB65hn9?d@$6xoZJ2F?LsU2_GV55hF zCCK($HhC$12aB2q`Z(v)K%~3M)O|2KtleS}c(|-uYx1(zM27AcYY|GVu&T8cb-41= zq_oQgk5F|)1o`cKkj5RP?%-%$K4>P9YHfg@1uu0l25LYJUKd!pqI=Xsf&})uIA}&NT$yb4Gf7JgT+$R)FQVEU}A5XHT~X z9oqOtRbvzmq9Xo|Bj)j$a|m0B+V`hBE6~i z-&_MY<@x%xjjip`xF#+uw+H9|9)N(X{7eINSVZ5$m7I|QbzsR4B0qLb&A*B@^j_Qf z_3PLE{{DtN={p4bqIj$K(dy*nFwoO$XlSgH<_9x|eS9{$-S(Cl{-w=)d2NeM%&CWw zPv$=Nh5HDAe1G)K8NlU4U>NZ*t3FD49ltU`eQNjWv_3&PN=QcLW_2KQW5Yi3YRksx z2g7Zx6_B?tUc4YDCtoZk#jC=4{w`=_>y9K{B>IKdaR_7Q7%mPDNQ_)rf6!C;9~g+i zNUiT1lVX9a0t;VS5h|pP>FyUQTOUdTtH6sqee>k6oycKvu4IxJByQOD>&JuQnXnj`9vGavLA zkQQpj@Y^}!aV38?zkmO}xw#3JT;t~Vbj)f9^1;K0@o{nQ z20oq(YT$B7^))br<`^G{erc0g&bBNn3ZN7}Dhhd(2e^`*$h~{_4trAWzI@^GoTK_M z`7S=vc;Ze2Vq}FbY~k?m5TwBHa6;!}4Z*yL7_UG7qZL(EER8P;0{_DNm&4w0WtSuA9BtHsb-s#&!K_8~h zh?+`WXrzad{+IwtDlRQ;W@<_pEHC+)ND@n>Q!c6i&bno6pWIc7dwsv%M1f4V>z(S-yPo6S)%BXOShdcobl0YW1 zZs-Y~dG1b6%+9s~?w=zi`pYhgNxNA8wWlZgFs;ZOd#X78irUhF zh|yI$4Sl4knTX5B&lQb9V^t-6--!($Il}TlyY&_ciCiGc52SAHXG>agPFJ*e9Cu3J zQg^(eq2Y_#cN;gv`<#>Z>NBG9fiQutjNqT7$~u;obJy2?Ef!4l^vQRo*o32tir%ya z+yF7O>ibb@I~-eN*{DU1M|end#|dK3qMn z2YG&t>X=x_`i?Lv<-6>Adwc3uALv8Tw#lMrXJ_ME9vNg@bhr90k0v99I$btU{f%Wb z`63Pdk>W%hpht?)#)5v?O!XyMvwh~vG(?M094<<2kXmkv~3Vcx?s?^{4$3)AYL(D0to;$+Y`bW zZ>@Hhb8k^IFw9I$cwZjd%kI$%h)udkc;u5_=TWnSp10cuRo z$Y??hc z?!Y7j4K=lqiHQ%O0+yD!6sRf6%bsv}?{C%#U#*wr4jUh60k&{2 z6EJOng{inQoqLf>=ifqb0T~2EEoc)1r8|E+K7*oK@z%MXZasYPz@pW!v9*=Y$7*T< zEwTtxxyr1$A0HEwK+K1$=1chTg8bvxfbYs%vZke}8aMybX9=Mjl$2;cpSzP z^yt1Ynk~m4$9JHcALNn|9&er)m5=Aj1Y&kr&VWb;pVpi*6u z2VZM!d1^gdc%xZY;G1&>K=Z--10d3SJu93f7Ku0u8Ku4Ufh3ah+*Nsv6(mAiSbux; zdSb*xIzQx*5dar(wf8h`wj1a_8I-(y`Ep=rDEx_0-+;ccIBSMMpGYJrDv(x5ZE8-18{lZ41fPyahR zo0E}o;BT1Q=IY&IXXP9FTIVF?>HlUS%$QPWd1cA9Cb1>6tF(4Jc=PibuvsBQs5 z%m|virlwkFOmbvC2UZ?t6+Ea_?AD;%iJP6B9pD>iItU=fO+uq z@ZT0Mye?+5hfW@cV3gfoHa zujEs;<97*MhHh7B0Re5WShD^mr3R*@l$--@EdSUkuoM7<961VLSkbFJ)BAW-@~L(U zYpvJ@$Z~Kn;KT?`L8EgM$-|)hKv*qsg>}53?Di!mk*8ZAlK|oSWhcUwLV){skkS@M z0lqUT#FktKk$1zu`O6{eb>F3V$I&^5S`b*!IO=O^L_|a=Z0BL_t17WEG4xCTo`^4a zSL7e$)5rcg3;k_;Z-J<@kGpUeWTLyfh^S}^`@QH^k&cASR0Jp|%jyXrNRm}((?du8 zCU0;^&|m##?BD3-Z1 zCRx7*uyVkK`NzIQs$Of%iu$8bH}%eQvtK>qGwo^ne%~b&a%a}uLY;5es#RVMCOG-mw<3{1YMlsEEs;NxsKQOHB?Nxm}_4=SoGVW+4&2o2p zn}>%-#R=K|j+x`3p_g!e=KVRq68*1E$HvC``-#+vzeY3|0GerQyEZ?MY$aGHkd`05 zk>~=_8~_3Z%G3X|ZXyB%AFPI(o0|~-r*(DAY6WP%Dk3sXV-Fx6I1mUdd!r?A!k0Z? zy?%WPd;;$`v9I9kVB*=7RG2)y2e{7SVnHW&RBIU-%h?6sht9Lj#p7FK7>ZBxpOHfA zCTruM1;xvuy!K{g>M|^`7d2~5c*i|#ZEOJ9(!h@`h>(?9C$i94S1fTzL||fK{`~oq zkdP1*n+}D}jdx-1DI5=|aS{@e-rDx(^LIkknTvb=Q$MX=zjEtEFKi}6wCQdxbbzD@ z2TW9B5~)i7k<`EjQuc0&TpfM}=wR$8j+EU+R^ySTZNwQ*gr={pXm zLV|Yxtas+CXR*qL>%Yzl?%UMVwASPi>h?=dlSRp)+nJW(sg zC1Lz0UqB&__CkNt9=S+i0fLv>e|efs-)$-PRqdJw`e|JVnS1Q3t|jE(`;jW_UsujjzHK)LLR|Y zn9N$DjokyDnGgIJU5!Mm0b8p$JDZ{RhU}V?;6nVnz%;O-PB#C{&*#-d9vIt&lvFc} z8bV&dC(Fmbhtl{h)z+v&(LYi#f4KT>jg{8c)=o?q&z%*LXKE>to5jlEffBHtsJW0x z?Ld{9)&rr{cCnfX$6FL1YyR7K+%u4ylLMeX>)pGjB=I&4ab@dQ5mtKc_gQ{cWx6;! zYq1RK#`Lg1hI?=9{QdhEP>_+4#D2m8ehoVQ0S_=dfN@-s%`fHlgy53Q0+&uy)Whcv z5rwb5L#;{c-rQHu@?Um6NO%TapRc|MAEP|GHAz{k*x=-1F5o40BB`mV)|>37%H$u| z;Y1xa)!x9s6%taENVwZT8;EsDfL!gfzf-n_qmY33C&)!;0hT3RJzpsgOOmj$u>q#^ z?sVgQ`o|<@**l;G4l{aTW3y5!wZ_H7Z13&;d}*%n7(t=Ht3tIy74EdYeV!or{+7(VV3gBq5h?tf0p`MHF))U`cd53@ZB3E=b|w}Uv(wY`G&FA;NZ&RUxSX_ZNfIJ=7wz$% z$|5e&hb!tdm+_EYG{Ocbroi(KCcEDp6o#NNl|wzOKkt`xL<;@K^U8tS+2o-oL>Hu-uF(9E{@g!#ZS@c$YOi+1ZX)RM(piXKYMZFZVHy2QfeHD z8GGLFc*;a-&}3$1fxJsq36Amail7#$c7E|<3lO=GkdPvC$@M#BtCSiqV8edNb;KSk zPpH8d0YqE)WVDkrU#-|r&8}5BQLDnXp{(d)V9W$Ukbh}>lj^&;coUFre`R1&+E_0oG4jPw=U zWr^#Rl@&Oi2-73IyJqCO)kSDwvtv=Ca3kWv-vIi6bIpIW;`Rc=2H%@Pxpi-7a1eMi zfV8T!JUp80d=-i`d-&{l2(})8s~)!11cn!?LLg!_H8l+lf5*q!^D(j7r#bT#NJVI4 zLqae&mfrK`;WltCLwvBYw(cH5%gX>@gzoM-l^O{D$Ow&Rxs67s{_AmGUL1OgNAx6S zoD;t9Yh(XhE>2qc6GYGg=^&E%NRTOu^3fTzD1Q2%&of}-=IE%==Y3&RPCX;sj)Mn1 zW|z57fNNT603-*%5g<9JsUw6rP=eWhYU>LNPg*R}90inH4CU}l&ZbJfLL4j4sfw@s zd0>qxfye7058i&cvz%arfmq}(!2n5qdRliJs`}RMm!YA7S@(g^QK4wgZLU7S!Za!D zt&_`Y+aaKFwMW*x4^Tpq8JZ08IS)rPE?zo1}k{ zP|xw7I|*Q^qJlJx*)+QxPcN=C=XSoxElxwV*%e>Vv8nhifMwF-+_>{x@k=w-jq`Lv zWlPHq(3ZW#3Cnwu6JMXnAC4f!qZMaA@YP3~I{~!#WH~U(}$9qCYD6^SPfG3^@`ATzM2ZZ+pZqodd_p!qPI0 zGap#L0}wScv^uTPksxNddOh9j?FI%*pf_}4scBhU{!dQ7=U`bJSFSSbj(JuBWAgs0 z{SB!u8tu2@48}?TbB&A=igT4Msg4W&aXzpnpxyhl@Eyq|T<^Y}eZsn1WE)p3H1G6I zIbhKjG)9n>pf77`g&?a~Zq=T9gKz?$Eh#C91^;}~oLLxUGyOo=!eaz7e~5z(@>E>B zp{lB?rsntf_}P?m+iijhE{LP$+tt<8$eC?l<74y~+jzp1U0(@b$m2(iCNsV97hvcC z#1?3i|BSDN?~|PQ0J6Xtl+aCYjJSj?*oNRCq28NK5OB^x0hgDRg+1wU7a){Dazq8g zy^hy)swbLVm%_dT&zo0w8)Yy<#yX|WQJ>x&t{QTs0JsFj2xNudrtL37+?Eaxa~eWP zX=y(fmx{W&)LhJ{R*|JCUi$knDGL0}f=@&T-j17cp6oAlfXMjW$EzQ|htTJ}3IzEI z*bnese^EV`F4MtRANq3Rplqp3li=A3JbMq1lZk5E`}gk)o#MhOyfN2nUySF-`u~p? z0!sP`yTUp?-`3>sWV%$zQR+S%j}b6KFm|{)eR*+<5m~z&7U1Nx+szdCf%g1WdNL%S z3Qdv}3VsuPDTPedwG6me0gDB?ninRHO!=@!=h#CX5fJSEU^HC|pZ9VkrsG7qL)w0* z;gajUQ~3ihrV*AkAI}DkE%9y3}54kH@IoQX5EIK(m^Yigtwhk#J#7RO#nZ^lY zPKtHGES_lgdA{7F)XB*S$d4X+t3g!4!=Pn9m!s7I;P^;M(P6># zzDaFD0==K!xtA8elr4k3dkA?lWi`VTCZ-zIx^AnB|7a)9LmHyg0rQ;d{ZdGEWD z#>$oXKrvA=5e?pR_u3rO9qrOf?Y*NkGA5{4ZSC5P}{N%$KI6zK#Mx@F}HBWk!zPIdQ(Y8k5nU5HFNiqe&^4dw>te97OSP7X~{dib9zf7)r~_)zhH(fr&=d zZuyvNC7Ge-S0zu20vH(?SM}sLQ9*8X*!o<+s7l${dAUKm@cV>QnqNSlA-3602)3rg zc_(ZE+z>FNh;Gh=qgwffvzuS%wY8zaobALXdon0d8I8>{S#YfjL7`@PP1sZgs1SHk5-oF#&u#2 zN<8j1)IeHPdJQmobrmRr6@^Ra{nurU8@MogyXcF33ldTi^DgP>7GF;wRU90+NKoll z>52<_ieh47U~J9ik2nrpu^z1ZwqTdkrO+0?B_6a^xYDa^8EMgzTrWTb+9R+$ffc>n z^D%kRLIGDvXSr$D(9-{p<3036F8TswcU*zWAxuBnyO@;L?D1`CrwzaENFx$>4564auP|h5{)q^(YC9qce9nL?&s3j3Be| zlN)zAjYO+)-Q{#JzyV?kKr0xOa;KuH^RkK$YVn8fN*_}P=!uV4H6`ntI62cpjcS27>Sz0bpJyE&Z#IS)o! zH(;a=DhhobkFJ=mb{~*K(eXpN2k8j=$mnNcy4UZM34-%p-FVXMY^SfmIbyacBq3`sY10RAv zmqmex{%Am-M4KKEA2ai_odcvnUA3XFj?WmlUDbcZZJwTyNOt8uLh(lha9=9cm}bD8 zKi2NCyJt`TU8%*nCujb|h`8hPMyZO8FSMgy!PK3jD-PpK#I0+V#++Ak)zipE>v6%v zQ}E$;u5&mj{qJa-92&SqXKz=~zqbpn5?R7lB^xDmnZ*C+kJT6jj=b`p`+YIQMgggI zf92E3^E5(7VVK=RmA< z!*95~*b-Or=x_5v!<0jWF^p(qO_=x{Y_1_KEa8{S6as~OnqerCFBX%LPB$&ZtySu}nL#K)H3 zRG@hSLFS!jH~&V+M$m|4DG#}JT|5CqFmtmgRrvl5hIZT|87S}1szQB?ZQm;s)v9mM z@QltgO&ZQMt(B&nz3@W!2`F!EMwuDIYWaIzK{*E0-=!XpF04hcQ9?8%-R^K`owR)W z4x2@zo|poumxaBYG}HigT1c$?;J%q3tHRlXK#X|>;LlML>9??;v=YQ|mhO^qMN85v z@ZAsR-JDW6#G=iu@#GLhWx_}HcUavz)HqoNwvxF7gA8qN7zitrpb=}$#_9`bxMe-i zF0!#=F}z<07K4Y499p`f#3qt1;c6O&z&2mG8O|3veZ$qCi}`=zm@;oe!}iB=E?>T} zzLy#1+~0xw}2%$3bcHK#uf_)^7995hG%ol zD7$S#E$twrhZj*)y#-|Eim}~~hW;{K9~9%%m_R}ZI>%qfB+!72FBFBnj>W*OAT}mY+-DD`JBZ^Eu=~lU4RM2XseQ+bWIW}w_G%|AIsCeC^%xDqYp3}dGz=jVHT;;5(K@6^ zEw*Sbh51n$$V%La^jtxHX07{MyMLW9at)__y_0_o{cnq1ES(Ry>!5~-o^XPTW?^|q zwgh%Z5)+DHtwufmf}TjAmdJGXtk=LzoYCnuo|`-axBgE>=2U^EEtN`|iQUtkFp%{{rlF$&Xyiviij*!lfw@7q#?h z{RIrEHQ<{Ui^hOMRPARWJak_Y5qx0F=R7O%HPK-c>GT)E1ssKSajqzO5lEhH`il|k zqifw$H|8FgS#r&NaYCV2TTo5A$Be+2s^u2Uil^BrG%9atJW1rk!^#CRXCqG91kx)8 zGco;`0?FmWN2x~xB;U}t7rw)+D#%OK{k;AYR&gux%C>q|yyrEZSecvj5Xt>(2&pJ8 zaV7kDOUPx9FVgXrJSOB5`TM$J@t}$nqsjfmcoJcz)2B-IQ~@%K+iJ>Tw+*CidI%9Sa?jhZ&)Fk&wHa8&nBLGAadBpk^>&>$Ft?cyiFZ1AJ@BzX#@i+wiGE+(Ybs`vkEaH^OZ_WRhA_tVl=&tL>OK}# zaE7%M4#JE1|HhuwZ?MzF!x zDG<5T;5z-ZNVEAE`%{bhX#NM(b!jrH3F$gyJ6)Nm#3PQe&sG529 z%>Da)^#Y{Gr>-)42wr;Sx4Lga+7n6b-W{^7TZ-c$@9u@9rQk?>z{;EU%HbcC**F@3 zVadPO6dY2&L4MJTaUo5vCXy^UIj%&#Lqc|M!q?%5`XHg@;i7) z3+wRrvg40NzpH*9#^b<@Ir~M4B|o*`>Xg{vNI{d8oyg^~<`sP|by z^XaGNG*4un0i6`&9sl>p} zduPBb2+J92dSv3CFyNu0?k{k&0>L;QEA^aVM&kYAgUp>(9J~F%yD%6B$wYKUJt3Cr zt3_f8e{(AV<3E+1e%Fp4NXFXq;m``}qharyTttABM3(h)MTiPsdZ1bwxM?8N+4co| z%r{(SGbU&A6*7xBpdMlhcx^~MAU*lZ$`}CS;nG02_DkpPeB2e@f`H00KSGPu~%eo@l@6z z2r@da!&U3$BWO#Cv&C_RqXf88S$ z+MIFAa=+c8%Rai|f*14oJdwWq%{l&YM>jD0-+x%Z=sxh9Q%%C0Fv{N!L_~>ppEM^K z!^yVNUbh#N6Nq5Lkisg&4{emVjDKiHiDS8Hlo@f46w6#Zu{@Ma4>;$+gZwD*89yjk z52=r0#*u$@ddDGqhgOj&D(d(HTlUU%Ed7PxrHchA)Bx$KE{YeEsjPe=%2ZF}P$z|B z%J43yJ$X67{z~Ygc%2Zl13aljUKL_Hsrf~J@k$}_jj1%7W(9&`Op3s#qhqn>RB4;38*TBVesql44Ee^_}f_& z6Lrs|?Y-E`cQ`Kzz7c@&$L*r+cWd74)nN$D-#JnU3G0i8g(D%SBmpDOvxzMe)fju% zSIKEBu7&{!tjn;g!3_>-sJ&(*scV*$_f`^!?ZtaM%5L;*iVyX|P?+yYw5jpHV{k~0 z`$R3*CWpAi6GQ6iM?Bv-UwWP4`uZ*GY{|Xc(o#H~FvQ;zpD?^w^$jG=b0LL>qdaqh ztZxY+9uI3$G_ylY5elfiWtvrz_o}w>HNI#Sl!fPGo6+ZQtG2x3boXLVoVj<=OK%Rp zL8Oqtv-XLH=x-Z&!&i-OejC-J?Hy{5KEA0&7hG>~hM)#J+nBl}E?AAc1*otfqE+|B z-)Ed@SPj(8!Vm=V8-k3$16Gg~CmsYL3*q4Z|DWCze|?Dl!A_N9D%SJwu~0}=SyQP@ I(JJ`=0EEYr>Hq)$ literal 0 HcmV?d00001 diff --git a/src/app/manifest.test.ts b/src/app/manifest.test.ts index e68eaee..e5b4d93 100644 --- a/src/app/manifest.test.ts +++ b/src/app/manifest.test.ts @@ -8,11 +8,36 @@ describe("web app manifest", () => { start_url: "/", display: "standalone", background_color: "#0a0a0f", - theme_color: "#fbfbfd", + theme_color: "#0a0a0f", icons: expect.arrayContaining([ - expect.objectContaining({ src: "/icon.png", sizes: "512x512" }), + expect.objectContaining({ src: "/icon-192.png", sizes: "192x192", purpose: "any" }), + expect.objectContaining({ src: "/icon.png", sizes: "512x512", purpose: "any" }), + expect.objectContaining({ + src: "/icon-maskable-512.png", + sizes: "512x512", + purpose: "maskable", + }), expect.objectContaining({ src: "/apple-icon.png", sizes: "180x180" }), ]), }); }); + + it("does not flash a mismatched status bar color on install (#695)", () => { + // background_color and theme_color render on the same splash screen, so + // they must agree with each other -- unlike layout.tsx's dark/light + // themeColor pair, which only ever applies one at a time via a media + // query. + expect(manifest().background_color).toBe(manifest().theme_color); + }); + + it("includes a maskable icon within Chrome's install safe-zone requirements", () => { + const maskable = manifest().icons?.find((icon) => icon.purpose === "maskable"); + expect(maskable).toBeDefined(); + expect(maskable?.sizes).toBe("512x512"); + }); + + it("includes the 192px icon size Chrome's install criteria require", () => { + const has192 = manifest().icons?.some((icon) => icon.sizes === "192x192"); + expect(has192).toBe(true); + }); }); diff --git a/src/app/manifest.ts b/src/app/manifest.ts index 616bbbc..1704539 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -8,15 +8,33 @@ export default function manifest(): MetadataRoute.Manifest { "Fund open source work and track contributor rewards through MergeFi.", start_url: "/", display: "standalone", + // A manifest can only hold one static pair, unlike layout.tsx's + // `viewport.themeColor`, which picks light vs. dark via a media query + // (#224). "#fbfbfd" is that light-mode value; using it here paired with + // a dark background_color made the install splash flash a dark screen + // into a near-white status bar. Both values now match the dark-mode- + // first design background_color already used (#695). background_color: "#0a0a0f", - theme_color: "#fbfbfd", + theme_color: "#0a0a0f", icons: [ + { + src: "/icon-192.png", + sizes: "192x192", + type: "image/png", + purpose: "any", + }, { src: "/icon.png", sizes: "512x512", type: "image/png", purpose: "any", }, + { + src: "/icon-maskable-512.png", + sizes: "512x512", + type: "image/png", + purpose: "maskable", + }, { src: "/apple-icon.png", sizes: "180x180",