From ae370b4313f2bcf8a52db5460040c6a1c4b3f1f0 Mon Sep 17 00:00:00 2001 From: poyrazavsever Date: Fri, 17 Jul 2026 21:56:29 +0300 Subject: [PATCH] fix(branding): render theme assets and dynamic metadata --- app/(dashboard)/analytics/page.tsx | 2 +- app/(dashboard)/layout.tsx | 2 +- app/(dashboard)/page.tsx | 2 +- app/favicon.ico | Bin 11370 -> 0 bytes app/globals.css | 2 ++ app/invite/[token]/page.tsx | 2 +- app/layout.tsx | 7 ++++++- app/login/page.tsx | 2 +- app/manifest.ts | 7 ++----- app/portal/layout.tsx | 2 +- app/register/page.tsx | 2 +- components/auth/auth-page-shell.tsx | 13 +++++++++++-- 12 files changed, 28 insertions(+), 15 deletions(-) delete mode 100644 app/favicon.ico diff --git a/app/(dashboard)/analytics/page.tsx b/app/(dashboard)/analytics/page.tsx index af6dddf..26b63b6 100644 --- a/app/(dashboard)/analytics/page.tsx +++ b/app/(dashboard)/analytics/page.tsx @@ -2,7 +2,7 @@ import { AnalyticsClient, type AnalyticsData } from "./analytics-client"; import { parseDashboardRange, resolveDashboardRange } from "@/server/services/analytics-range"; import { requireFreelancerBackend } from "@/server/web/freelancer"; -export const metadata = { title: "Analizler - Neta" }; +export const metadata = { title: "Analizler" }; export default async function AnalyticsPage({ searchParams, diff --git a/app/(dashboard)/layout.tsx b/app/(dashboard)/layout.tsx index 085598d..59b7cd6 100644 --- a/app/(dashboard)/layout.tsx +++ b/app/(dashboard)/layout.tsx @@ -27,7 +27,7 @@ export default async function DashboardLayout({ return ( O?tC-z0RTAI^S=WJzydJj2LPzC{RCZYRZ=24B5arR zrJ9odf203hV0>(2=~MOkzdKJKZ9|-i(!g8*fS>H8l7eB-;-MAc2g8|$e(}8|mGGCZ zB*Jxc%^sOOGU+9?giz_?2tUBnQ~1QK$7WXwWwm1^q9f%@ENxaQg>pBSvNk^ey|q0L zU%B`ga#j=?;v5okj1K>H-C5tE_t>W8#<)P*DDrluJPE==0R{nK|DWc7j8%OQJBLjE zoei?6fpKg$&O-=2w5V+>V|9Pg;I4`|Wb1~ocp*2KD+;d3kdNFg<{Re|=hbgNC)Zj= zj@jOP@W4S|x!-drV4up~xF<)Sxw|bS@!cvuqxfiO{qNHz<~k8waG{rq_j z3k${k#NWt5_JIpkJT%q)A{4@cnEmT5-22u5@Kkp*vosmnj}5<(S6s5>IkP(}>Tw>No)!dF_e=gt2@dj|8Cc z+&%j&R(pn)FAu*NBE3p{E|A^tnHU`AiW_?MkY)-8A=WO}^5wb$yx$FW9!a~_)RLa*tV&k64I?Js z;sG-l?jgtr?#KPpvx>s?dwn!Ko>S~>V`+YiaUyrV!IWJ3ZjO%4kz@+1Y{*verAr7Q z2&fR2O1?jE{+aVvFX-1C-~C_m;qM0`>iY|#5d#+^0HO-5Pv_Uy&XJ%|YJOW8g(xV5 zBJbor{qQMr^aG5i4%v>GM1moHiUqM7}yAV4T2Umn^j|Is5<^RTU71#Z=v{V(!DW^t)C z(1&5gNj5}xv(fRjZtUFN6ArA2c}G~W;6~Ry4Vmz)?Ds%dInVN|AFs%NPpz-H|88Qb zAfT-L8U&?AetZZ3y$Zxc&qvVjSCdP>>6-|a@@>n+_J=RK2(seuGy zXRVjMzjxuZ_CUo&Xb{hM%tOALSY@?^Mj(Dz*S|8nyWH4Yk$k}YW|xUP=Y!^mjpF>{16ar!VW>mSV$Pkf74{5{g#|9Du_ zCU^|iFpET<-#LE5Bc%=|EeV2kL3M!TsiHXW|0;b|q99$B7Ya&KwVUskkS{oTt&L$ zObeU(xE@12#Hido#w;@`Ji2BfElsl24*XtfhP_ z=sq{FZ(eBJei8i6zChBc7GzyR|KGN+T;&BE=(@ILOLs)#3)ui>I!;oJ#?y`lrMx3x zT=|`MUnaP3){_p`Fn8k6FXN@9tw*JaPK710^_|*|PrTmNpK)OgM`@dxy7pu){PKxo zL1c&j#jV=yuVl<=K}aX64Zu&N^^oZ#Au|4iIG-ADm*b&jINlld ztel)-hktu6mP~nUv1!QbF7hfyzV`}G+xL!bA-i?yYDN=MBxiVY)cRWH{&o94L_ZR? zk$gcol8}o!0);e~%f^+#U$GdneV|l`x(bd?zDRaU8Ne*K&_%P^oWWRbVz= zG#-G&j#evo5{B4tw4HQbmYx(?>)_=|(F62gdg~ZqB|bFc)9#sK?VR__9mQ_s+Tpi6 z|LbV`=jQp=tA^Y6%3}8IXL%9}Iln0f+@T3{P*dE9um3C1$cmV)`a;6VLHDTHJ6p{^ z?-28`vPj#XIo#p(TK!LXTncbL6`(HhYc~CeFmZ)u1I;)2W%&KOCx*9Md5PbhMG76! z)<9_2%kdSfB*WOk?fTmC^qb>vDm5z(+Y{2q&lM@V!nU~tQvdN`EsCrBPDgqD!sMw% z#h^&4f5h0;1g)sbj8J;KKGFdDdF4L@^ed^~?n}NgRH7ZAzU?~QU$QW|$rBaLkUb;N zLp`V_1K@c4iqTwU+?G!iIPjiN&vE+vJ3wfJoDP~bAzxo7%mX-jl*2y#zSL_yTcZ81$B9Mv(S@O1_Ssopnk))?I{O=*F zM}SEa17pRE@Y#CFK{@T#i<5~w|D*4T)$_(y1+EK%C_wCoO|d8WOp4~wP5oUDk!cGe zUKSdw+i#|oICWVo_dhEDp&A8|)=1SJCVLK!OiAz36aC1$;09logfF-65o4q&Y*AKyjpd(@cSA%0*&2^6aUr_nk&e~vT=TinFWJA& zufV{3^C+%SR=eNzOr?>DLj0-;gtMPNt4SPs{ppWM*l~Mm-L?H#;O%x%jhp5}|GOyL z%DTol|4fR?+rQUG?S-|82XTG5qO7SdupZ`;1+1@WkM+o|J1qr#HH_@5j_9ldZq&_N z)A*2)T(%x1ux}Q45A&o}-q>kA+io1GT8*Vg`QwkM89)d8Zv>nH;D6umXwbXY6Nf0; z7%RP9H&1m6wT=zu&x{dK5mL)@l>zOXxnEVC71!qZ=Dwm#=3h4!ROnQ`n--K3NP0c) zcb8dIbb3)&XGMy?y7LotxfD3$_wMi!9AaYevv9!;>2d@%wBdk?VY$S(DUBrDn;f=)^D4 zd^{(~HDATaF5YjmjqhB&{9!&$55eoc5y?r*mD6DsfWQ~3`Vsb|0MB+uBw*0v?yY>M zF_SSgGB;}uz@pvBjCpZd0`Noy2q#Y;jI<|0aI#@v$O&7@1gQ}$0mS8Rl!hKtpS znYU7C!!Y#zKF|I2e#+OMeKIERB1joC#I)uPAo$#FlMb}oAI)YD4Mg?Gj@83~>W=yca zH(Gkk_3qXaZuUjxrG@w#w2Hvnx57H@w(Ej7KZvcu?@g%Ietyb=zkf;coeSgK=-gCT zo%GH7(S>gQ=go3 z;JR2<#FzI4|?`RC8GX;{#UZ~xZqYjjL(idYeF73abElR?hze4K!xh#NP z&yMBQ5C>MFe|e8i#F#oehyQMm8GN)H*tW+};Eg8Fo>FDfqb*J73YfV+_XGU#jUdta zoX9)l`KCg;W7-}=om!MR4WUU#;1NujuAQ&K#Ir?RGx<=F4@Nb!?<#`y!$%lba*lkB ziv^n8IAl=8+RYYERczfMy%wpW)F2xa-#mPyDg3kPB1}z6c3gC0D1*a>R~jB{BJV65NWhnueeCDr% zeeaiPpR*5N9cCM!L>mbC!|9%o4pU;iX6P$C$RAqq#J%N6Yf`cDLUnz)futf*hUZNwGJBxU_ERP(@hthK!};abx{?=gP|WTC1dt%;@RT|3 zK@|Gk6ERuZ! zTVB?d=#C4an-U$51f%n8k8j=P=q?m1DcmmCUN`~NMGN|4ugV%Mr~yx9;7e7w>?02- zdVfCXZgw|hrGNQ!5ze~8R}X5hGfOsmrExz&9(Xa}#}pgHFrzVG1l6H=Zd0HQali>+ z1OJ^MUKCRjF{BW>K~0Q`X@`TnlXSu{Bz?YHrdGd+@tk!7PV@ouCgia(ppYr`ilOR_ zFL(u&IU`J=quC22QGhMRD95LNm(OIh!#k<-97k2|o(rvgw5vXGh8a4Pa>c?huh>Bk zJ4pkt?H7j|qQ#%6IR6|&Y>q?jf`w!gLPLI(yWbtCZ;dyNRi}}ZJ(J0ECqg7s@9iTh zr|#cN|NFjwdclW)%|BG*>?W+?9u3%c_5ut_9e(WvLfmTTn1=I&y3NBuE7cPVaVa|C zXHtj~^3bxmkb7OoN9KQ4)t|+fSicnX4)D#{cZ9lt*w>!K`~jolfF00PZ zW>jlxJ3!PaUrZQ8bEv2CuWVjbP5kk%0xg4unTxKd-Dx8|qO40KoVR=>w*K;d(SN^c zCsk&Y`4_CXKmGwKz4Mz-a9nb;RU;r`Z1P#W(KOjQ_fCKVHX3QF$15^RV}chDj;Ye) zhR^EEKSe2fP3T30 zd>13*$TS~{dy?P`&c3jV0kTJfhN$&%X?rU|4dNlr;}b)(r($>u|W7v$vc!W z__6pay~lt3KpMJ0mFR0g=~me&~$RPuZXyr<2{-VLwEu98pAZbSZay{rn!? zXE`W!dUg7%4(hVE?cOLxSL52mmiah0;<7Q8hBsGMD>|jblsTMg-dr_ zD@k|d^R;bKZ-gU7>tQW? z;!xi_yxNN%lFElyeS}Ka%)Umi^h}##uzyY33i0s(wSRnU zg&b2`J9WqYYh0T&4{VaeKKevnc$$Wz~2Eq+e}sZv*q+84_mq&M$_hc)Z)5x~0Hb<#P8_ zLaVCSRSNlsb26)@Ej>aKes;ghCaBq}af_CMOGUaO zw3vMek~RX#0M4QAq;nlTA6zVx<>WRsX!v*hNV|~KhD{uR_>;<2)V+*_jyGl!XBD)B zdl2BC|*KFZ}*;d~g+ecA@jOMc8(sqQji5U{u816b_P^VfoUp@!`IqT#{#W2Fh zyvfg5a7~*L2Ka#NA`pOvmh&N(HVM4M8D}r5;CdZXg4>l)A_DNon{QCm>fs@4quz>N z^uFo__fOTJoAv4dZ(McGk5^nA7Fo+0tW;xdQlug>aRB=L@=EKO_OjGOuy@ycHXpAR zb#0kQzLMa=hNNc}DG7Y~cGH#;sC{qp%IldU0hhvPY&g<6GlN0|i)IO0!I66};`I|E zuP@3Xzx_8NcfcXpLR~V_RgdKyZ`9Z(GA91$7$F4<=smtgu$(;>vt@lkp`5Jx; zSFCK;KU~H~W?ayh97_R%=*20rL1;jAZR%Sl|_3IL43gH ziw<(lrRHt!yj)b5_HBih;mJ9AkFNz>a4oVwyP% zmX)railMC+s1akY^M(T2<$gbXEt6E+*>QcBNMf|2_?({G`B*lR;!cgun|_WU-fVF9 zxDEi&`&sc-tTi$8>pq=A^cJ3BgRL5#K+^H)@BJDF_wOwl1WDc@LT|tpf&z&rq9TS+ zaz88GKcP55-Ug@b!@tu?tOymVx*t8ewQ_pg{$`D25)Xo?nloAVIVApQ{+OUigdg~^ z2Dk6Kxy**p00F3zneIoNNv||Dg9{XV1{irO)|XBXdh=a*s4EyGAe}de3IUSuj;=Xd zC3(GK0biDQn_N#N2NGGh3D@yecaGGC29^(!WLfVh={_D)$pL=Eb@*IlN3V=ySDFe2 z;m8Zk8+z^~x?zroE3{r<{_1K0>=!8Pal{`h2~kCq5HIAvFKL08TH_BR9tONcRLgSw z82z9aq(j3@?(0KwiHByp#_Kb|)YKX!Doov6kjYTMY;sAzK|iC2oIx?b zoI*-1&ESsWxD`rnL0DJeVB{i?D$$n;Eq*Oq0vtC9AzQM3s4=~MIuF%f#mw0?VDqQuk4)N`zbH|e_k zgx(nG{N6v$zqi+}y%7W=iZ661^p4fHQNh={!koanXg~egWnFp`DCRP#%J8H8b?qCN zQYsDyhx%WWI-s5Qk)Iz3|1Q$m!sfjI(Z^Jf#nR)6sq(9Y}C7HB)wnkA&>k-xVA#ZKwl$FCCMFIyto)yvr_DSWL004Xu_ zo+Q#l$8iL|qz%Pb7h$YT`<|;1LZICdrP|?ioU5ce_~LRyGIAHb`=Yb@N7m1Au;Jb9 zapu#F?!PAAH*XP@XFCd5WE3k9x9k4hdNrnmz7e4LGE1q34NxuI)M3uFQ^l|{x6yCX zbT?{}nSL=LF$eucNLk95JUl}gTX~)IQA!qIL+9#^nvP0Ic?c@CeDLaD7p~#`f)o5K zrrxGwZO-Ru=P%Qlt$nAF(AQ(PMLH1&p6-i}M722cJaS(zwXlNo9}}CYML`@A&hkf| zenP_G#pc8;6{zsb5+ZySgx_hyX1m5+or;6CY^eV1pEbj~Udn!U2Mn%~D5EM3871h= zobU8c0vLxzaxV0FTLBPqbop1oarS)6@>}(ErTf|sSr`Q9s-Mpk_sDp`KA0@CP8i|v z!xE=%oTh~XfUz`@v7e&;9CGFONtydOtexrkuN$|OP(kTe((>_IGJ){Iukc4|5G_pR zcKu_w3EF4+j^<6r9W~h{N(z{SN6gME-pUk@nbLY6Q){toW>LBy$31{GVCy?@v!=w{ zFJIW?!afA`uygi%ae$R{aF)x-nZH(l8JErZSE+5Z8@|L<#4X{LE>4nr7DZ_Sg5EAL zC94{OrcHz9e;Q=P1$xfXE>lX0BPC`&ztXDhTeElXnX~4*YiUb+q8->)*&fQrX^l-U z8$J(3J``0bc{GDLzYb9sp8dkOmW^DkUyw`I&@8LdPH}l{?K4zJuEn(6F10I%SD08? zSh^)dWytS%=1%cPeyKIU=+MA21+^;|+&D!AQ7!i#ATx5-dSTAYmnf#%B~H?Pa`xOW z?3rGObk=BrTQcR11jS2=`5X3)I66^ksqZheD#hIwUVQ9{{VoH(EI8oJ8i*H^k*U)$ z^)SH<$n(B+O|IPVi?hqpQdU)M<^dEpdB-uu#Oqi!H)YXvT)wa(Mg`asg1W`8LeBIp z{nT9W6gP##Ecq`c0HxrNB=XAHsT8(*5ib><3ucKu` zMS7Jc{OkeHg7@)V&XYrlQ~J?_13cCQ0@*r=R(BRjvbm(0m|dL$2GA$?{Bk~uze^|G zE$8@j*3ZoFR|DHalV|){c!3>W*M7VoMdOBP1S{Ysuk>!%SARPPmY&5%A;um-$3U1* z^xs{~Tp$$9`RNT&nl)s$GzxvwItFXUk@dVQYBV!+zV&!OF9L0OD@XMLZYKu*Xnepu zN=DaWLZ|!NM(;VEY1tNr=~G8>e&`ra@ySnQc9RmU${1t88yT` zI|ar)BO%lzi?nee<5$rj9Cyub^-Zgxuz`|!cr)CDV{w*`9LKr>~0 z!Pm?a(vcLY&@}$j;Kt?Pcj`oMT86^=AQ7^<)h;~zR2Pkc!wa)Jb}MVYIbFOmq5;l5 zBZCxbLX02I@Xh*+%mAI#YB2G*6-_q8Rw}u~EGyEsWot$`U*3mBD*2Ea$v^Fe6DEnD z(C1+W2s+)liFVxn1AAPFi=ig5YkSepi@4{I@5W-}`9_$6yXS`jQs@q_1-@Sg#1^{y zT`H?zeorjdsQ#Phc_4jp#96#(UR+<7_Fi}_@Hsjy>iNX_Z*NdkkAIF$UiE0w=19s_ z5DgYpSAGf&^q=ARAZ?`QuaH9h;baF<-q7B2j_8;sM@{T@te*~z;D@(?>1)(5*7hKxd^7haSX)&aG@GLgjKj;SJ8{~cc8xPpFb~|LF zUC#9@?dnM8n0uR*;`E@pS5VkQ&>%>mfKe93c)dudhpsu>jVRly@p};WO_c=#pNTts zg%sq0b+g95;3W;OpNuK-mG@%FlEWYt`G4!7_Cjyw-0Ra7Ufv6!DMXMLOswNa$!<6Y zChjJP+E0%q9{T&?<>qCH7DKmqu7o1mZB&rIw^|l{?w?kt8vk+?asFnrVg)CESES+- z;2pFL!c{t&+Xz+{I)Z~=yqY4JEM*1*$tFN7G=}vF5;EcoTZAI#hYHXw_FH!bI=C9w z_)#H5D7n;9Z+RE^;bV1-V4H+UvL@h1u0$cD^9&i;16sAw$eJ(ho4Gd8l;Qc>D``^< z554`;@L{;8iVv8h?MJA~rS_{?y6VMo|Jho6Gha}xpF0%)HFDo`&V(jz8I!Oo`dx`& ztkF5?Q9N7d`^f=5og~)_GhEY=H@f~;NCd>XVQlREK{@=)Ecz*O?f3Zf^VF2WC7 zg6@$HtuPNU^iVDY*C?Nj)o7`22yd+pILA3f3l;ImMoaF3gupe{;WNnqM7D61=TiWD>b>tn8e*tAcFdX+* zN+KY07{qM5V0(`RP<{OC?*`i&x>OufzzMyp=kb)W1s{1?*HjIFNG&Dd`52rN`lC26 zGbW5a_U5!CivEo*+FR?*$e4?!2KrkQ9IkPO_8d{?em{0Aj^# zK^+nCO2(RDX1>s^kGFJ4kBm4yn=7N$ha$Edw2z}XPPVGGq*H5&y#QT8x>LKsV`DD< z%#pvotc?hA5L1{kfrONUxIQAH0cdZ;8~&5eU-D@|QlUK7En;|>_F3d?dOH2zySZ8` zKJrgp|M&rC(9Vx%VfM_j@NLEwO}EFkCoD3e1c;VFSU<|OnuJL9A4xH&4`!h{7s z#zTUEowlKKVq|U#F!P?;vi^ch(w(u6d8SPHU=bs1^*B4kPGkz@1_{5tNU;t-tEo8d z%puUT$%6>#l4pK6c_%5MKbGgIf8IwUBSQaYDDDX#ciW+aGU1z{5renSDeG|h7}(>! zQqzp!awCj50m$6y#2yMdfsSparVw;>6HXuL&XNV*mvjPV!@2wzC1o_)?J7|?u^#vj zK;%vXVqw*H@EO(+zrXu7wX(0)RG?1v&+0*4XCd4=QdVvZdVbE?VXW!w>GED1+Lc`Z za~mZC!X@4n)xSRYk4T}`P%upY#}P05T6Z~y@GpLpOw5fS!i{2H(o6w*+^KF|jD=>3 zzSvjQ#l@Ql5%MnWW=ZY{{Xm+|-+=1QHW-hl& zO8tl2i#dGY-9kg+=hrj55w;#bJMeUO3QFH9V8yx5F-py87DDDBh}S9lY${DwM#}~B z;?Rm!p315-dtnePM7DgvC<@w@ssJGRQdFTd-O^FGC+ShTzVL-q;Dsi=v;ZH3;;~3? zGg)sec@uRp2nTi;1px7ylxt&JvT{X5s{Vc7=05(`S&rrBNC(_Jd-9muv4pQa*@=*+ zv9|jm2oyj9RCNj7d#(P&OSbC%K$JIp=ZP|}{ulfJa(s-httOp$qW5sTe+GaBVNY>M zh{koF$#(DK<|%2>k<;sD!DfS_4T^OvW$9`}0DDpm(H(&Tu z#->hzI<{(!wtYKYX|PbLYc~C^{`JpZx;PIqSEjK%p{U+y9F_D) z?SB0XTKAEK4u={Cx2BI9+g}81WU#~?7By`MM38aHe7;T8%n5wFXJ?m!r%+<`O)>{j z@S>5<s-20%e5Plc=@Ub1DXJa}*?cPILLTlaal)WXtt~9eXUzK38C{W : null} { export function generateMetadata(): Metadata { const branding = getPublicBranding(); + const faviconUrl = branding.iconUrl ?? "/logo/iconLogo.png"; return { title: { default: branding.applicationName, template: `%s ยท ${branding.applicationName}` }, description: "Self-hosted freelancer operating dashboard", manifest: "/manifest.webmanifest", - icons: branding.iconUrl ? { icon: branding.iconUrl, apple: branding.iconUrl } : undefined, + icons: { + icon: [{ url: faviconUrl, type: "image/png" }], + shortcut: [{ url: faviconUrl, type: "image/png" }], + apple: [{ url: faviconUrl, type: "image/png" }], + }, appleWebApp: { capable: true, statusBarStyle: "default", diff --git a/app/login/page.tsx b/app/login/page.tsx index 78514df..4ae2019 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -23,7 +23,7 @@ export default async function LoginPage({ {error && message && } }
{`${branding.applicationName} + {`${branding.applicationName}