From 0c30646a2d4397344838be2dfa71f2dd5e2b1645 Mon Sep 17 00:00:00 2001 From: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com> Date: Tue, 16 Sep 2025 21:16:55 -0700 Subject: [PATCH] improvement: branding; auth; chat-deploy (#1351) * improvement: branding; auth; chat-deploy * improvement: docs favicon --- apps/docs/public/favicon/apple-touch-icon.png | Bin 5459 -> 7494 bytes apps/docs/public/favicon/favicon-16x16.png | Bin 443 -> 521 bytes apps/docs/public/favicon/favicon-32x32.png | Bin 897 -> 1027 bytes apps/docs/public/favicon/favicon-96x96.png | Bin 0 -> 3683 bytes apps/docs/public/favicon/favicon.ico | Bin 15406 -> 15086 bytes apps/docs/public/favicon/favicon.svg | 3 + apps/docs/public/favicon/site.webmanifest | 14 +- .../favicon/web-app-manifest-192x192.png | Bin 0 -> 7934 bytes .../favicon/web-app-manifest-512x512.png | Bin 0 -> 23947 bytes apps/sim/app/(auth)/login/login-form.tsx | 4 +- apps/sim/app/(auth)/signup/signup-form.tsx | 6 +- apps/sim/app/chat/[subdomain]/chat.css | 101 +--- .../chat/components/auth/email/email-auth.tsx | 439 +++++++++++------- .../auth/password/password-auth.tsx | 240 +++++----- .../components/error-state/error-state.tsx | 114 +++-- .../sim/app/chat/components/header/header.tsx | 128 +++-- .../loading-state/loading-state.tsx | 26 +- apps/sim/app/globals.css | 12 +- .../create-chunk-modal/create-chunk-modal.tsx | 2 +- .../knowledge/[id]/[documentId]/document.tsx | 2 +- apps/sim/blocks/blocks/agent.ts | 2 +- apps/sim/components/ui/loading-agent.tsx | 6 +- apps/sim/lib/branding/branding.ts | 4 - apps/sim/lib/branding/inject-theme.ts | 4 - apps/sim/lib/branding/metadata.ts | 2 +- apps/sim/lib/env.ts | 2 - .../public/favicon/android-chrome-192x192.png | Bin 5993 -> 0 bytes .../public/favicon/android-chrome-512x512.png | Bin 12611 -> 0 bytes apps/sim/public/favicon/apple-touch-icon.png | Bin 5459 -> 0 bytes apps/sim/public/favicon/favicon-16x16.png | Bin 443 -> 0 bytes apps/sim/public/favicon/favicon-32x32.png | Bin 897 -> 0 bytes apps/sim/public/favicon/favicon.ico | Bin 15406 -> 0 bytes apps/sim/public/favicon/site.webmanifest | 19 - 33 files changed, 602 insertions(+), 528 deletions(-) create mode 100644 apps/docs/public/favicon/favicon-96x96.png create mode 100644 apps/docs/public/favicon/favicon.svg create mode 100644 apps/docs/public/favicon/web-app-manifest-192x192.png create mode 100644 apps/docs/public/favicon/web-app-manifest-512x512.png delete mode 100644 apps/sim/public/favicon/android-chrome-192x192.png delete mode 100644 apps/sim/public/favicon/android-chrome-512x512.png delete mode 100644 apps/sim/public/favicon/apple-touch-icon.png delete mode 100644 apps/sim/public/favicon/favicon-16x16.png delete mode 100644 apps/sim/public/favicon/favicon-32x32.png delete mode 100644 apps/sim/public/favicon/favicon.ico delete mode 100644 apps/sim/public/favicon/site.webmanifest diff --git a/apps/docs/public/favicon/apple-touch-icon.png b/apps/docs/public/favicon/apple-touch-icon.png index df95b36c705ab332c2d6a03c7403d9c1c1440d72..373fdb092c6f9fe7cd3554002fb5bc477c943f1d 100644 GIT binary patch literal 7494 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 LQ=txQ75;w!kG(YT literal 5459 zcmZ8lXEqD8(h*NJ^| zuVeYT192E)vE@UxrElSX(RnjD+4QMmzPt4M@@Q3?V!q9~+0gT5!gsn|has(IbrhOi z(V)a$m)R#$)*gcSeaGD=ISFBq=N<{Zte>WzZ&OS8p+6E&dxVyC-0_hE*gah9y5q

n^sQiDEV@^+lT@cM`{ zC=$$|v8x7z)r>J?g#B1bG_tjCMVh3#V7nKR)IhoWN+hTHCA6&(=0HH82v z7QMc&B5v^Y0qeXS1UR^%H%{~vDYu}u9kut z8)!fv0FFV}Hia*bo7aFCAJG=+`ol#5A}5GMo!v8xk8f6MY4QYHLKe9*RsC224N5?< z)^%%9bv%l~tvt&}rr_2r`!euuL zQwMCR{ym_FLtes!(8M`^)^^p}>(B?*#tkxTW~4cH?u?%__893ojYFC7R5}-qRXG`MW8&d`~dg zpJb>Te&Nb@-K zMD-GA&^NSm*Fgij(R^Bvm+v0n5l$*o~Q)68Jy z(NHmsaXpkRZ+-XU84rNsz_;r0%FZa>d#kb0_T2oB)p}2^a}x)jFRj6x-nxV_-gnk@ zC5DbH;XVjc(vzFd+yLu1qm3Lce#o3NwU8;dE7tF?!IBmRKi^-OESF)-EUiQuN^CJC z#VkC{q+1(la?%y^z_kRiwpjm6B`?i!Ke(!UCV}%3FViV@#peT*VR9pj-LG~zooi+6 zzmXNWnbPl^*~vSM8_3wHwj)}*>`8BMxy&pp#)sVl!{K>OQS(~j-yD$ewvl+!yR_D4 z`K?qlq2BLvGZl2V0ViS4sB&Jk+?Lm@kM`UfgOfM#@ICJG@XPLmktl~cVe+44>24GJ zD+%SxbrJk>Lz$A&zzT%#)_bdVp1cO}bGltLYJadw?O*gmr#iJ;@z#UqIY-Docr>!L zLitJjA^ojT(&mkz?WoTK{-m<}1A*61GbV~L*j8wET`|xgo8fY-v-jt~&n))^R-0v4 zuR^5d|9qKK9#NWCUzgjTQ>r;2rSp`#1T8u|R^DXbBsTd2g5c1X&-t)?)N(p!(WSX_o zfUY_J^xj!MQT|JO6~_IA(D8w?<7ID2`=Guee!1K7zjVh(H`2CD(>>BFTHKV*EB<4u z{W+Ir&M5tN?|wT}S}0aa1?1U9RUQF9iH8WgKfH5WxK`OpkmKKv)OglUa@^ZdMw8c= zNL%MLO5xSH?A0yr1OrJ+6OgCenQ1jMQ2NYDMot**i50?n zo*_`I9p)|(dMvXi*V5)w0l}%*##ap6Bf5(iYBr1B(wC1$JFaP55|NxtB!{1h5av++ zyS={tiwMcolyDAH<>B#xM$(0R+4u2jy%Wkq(Vr{ATS~^C7->Y=gP?A>meSCh^kfy_|-m&(bUr^!!#wu@O_?R&uDGBKZ(_=m5YVG?2`4bWrD^we$ka*ap5< z3|I$=7B`Evldda*(|l-A6$bJ42?3t%gJ2ssCn;C*&URbn^Pb|P$f}Xp!l~H><}YN1 z$vpLMNvbfBk<04UVDog(iO!;D_q^vfkD3PeaUH$0QfKJERCERr&z(SeQV zxc)oRw(#8`t2|WJmDq~nC3i@Xq#(&;d{^9rFexD7sfMRz#O5^Z6 z8-S%~^heq58UJ$6fhojeps1Fg=|j5|1B)NgU8HMmt<#?ZW0nuKX>4js!mpmzZB2qz z`5Huz8+*iURfmaR4faL2n5(5_+2_P-XU5q>y^U=@@gsVu84pGIva~vtlK|*FsaUV1 zh!7e+?&JRR9zpxLIcW#2t2U|3=eL}MrPULwhzDemF0g`>Rm57XyKUl8zg=B*GlC}c zbd4K~>UG20pmHSyAiVn&}~u z#q8^<2EOpAU&Wnsqq1g_;Pp-9!*|S~daJ(}JL@=ywZywRwYCwV=YyHHsrSKNY}6L+ z*$eb;i8pj2p_5Buz<4ZB6w!!KYUJ#>I9V-s-`}6=;fUPjSDWD9&tG{cIfBsSrT`^i z&&FfiIht5&b9j}*?~6>P)CF|mrqZ{5&Ql{dVf$3Me2c5IvG^ zb31nG}wvJUU+NU*C9T)3ON+g<+^|m=*2>}>9T^h zCXRVMg&aC4*DkZ%D(z7~ZS5Y<$pQ~vzv_{ti%sE0f2Bui+f8{$>!b|gimYxf;|dBm zC&`&j#?|NpXi}6fW9JdL@@QvoGor%92l$igRJ&~U>-VRcw5`ucw^PZ9Qp>-GCo+L6 zQo;c1<0^@V9%9{+aahq$y?w+glAjDTK%Q~tZl^p0b)KAl%lLEdp&)u}D3#2B7k;;F zmn@fTxOk=%+zP;>S8kXClyb*Xz%;U~CLi*IoV|+KqEc&8Wil=Q#Or;=sUN0gJk1CN+~2DU`2kbgjSQ2OQZFYxdGB z8D6+PNR+cewi7sQD3tdh+p_mFaLG8^|_sRygf?=lOWnzd%KnaeIik| ztZ+9|-Fb)g*LP7!=BDcFwg*_xBJ07DRLUSv=FxD$Gg}BRoB|XYjA;HDuG+(A@c2SZ z+>fs;l^eH*-5`|PCpyUrOIZ|~n<-Z+w1N)2!9stG9OB7awlPj6_sRzFR*@SQLhQ28 zbn{iw9v5RC2Uc)FrcWZn%nG0k2pjEN2_YhU!oE3zvc8QeiCv<+@KK6)Uu}viKf8+m%!4;noks1u`A1(7E zJJRZd?S<^i?G76mu(6YQ7k&=~d+uAPUy z6ZdWxhqJ@b&W%vLmP+LZtHlrIhI{v&%m|WNW|fG86B;}h5kq(ea2_DTsJop(YXf## zppL4;)MvWPb9*&!8^qKB`J;b#E zu>ZulX=M1py^!nn<~!=>n0>IV&U_lrF2+9np{zCKe_^wzR7jkIU>{`V)_A>s1WGPW zRjFA2ifDsN=zLdv81R>9gy{vS_Uk+NE3iU8G96=uAv7JhOg&loTw-4w!O7SYc+w_o zFY`fLG(q=W^qNt$!qXSkKWCJw!~Ov9td!FzDoyX}RagsHVH0U63R~NPfvS*+obK^E zAHg#ccID4t-y0Gv)P;)v~X~S+?l4v+pmQ)+$nP`E{ zGDT_$DGVi-ls~3NU$;e_%`j(3f2B8^CI=ISN(m5VbpWfX9Z7~vgdI#vTL;#Beq?UC z+-`u5w74Y={9F>G7chgd4~Dc#>P;GTYZwBI_pr=sj6nqm|N34{BP7`@789A1 z{0*1KGGG(BjR7aZ=(XGc=h3p#WD*u-@6b-gTQ0jw^NH4kuFKbGSWfd)RbC2tygg;X zb3G>X2kh5@bSt$h!hm+z(d{=kbRO33PfO?j(xQS=#CrFCHhCXI-8O=i7Qrm&4b{BA z_x59iN&0X6#YJjDv==c9(_-o>yA}>ONY1xWDmtA2<~hNPthoSDHCJSMqWulUl)_@; z$gf$da%!sDLyMuhns$9bb(N@6dtAQHFJKy0w6&Y}KPCkyG^nh<1iY9SwUu+q@khcjAl6R#mP&_G6yq|87=> z1&MaS!Z@W4wn=+JWl}VbR{`RkhP4XjqckWhw+&Bqc}>NcI}2?Bhi?xej7qW^vW2R& zXmvB8^Vdao=FgojZ}H^+`)2#n@C1b%wkZ|3sk!&Vi$0^h<1>-tUCs2Wf52;m64j3soy(K7_qg zfrK-O{CUTOr00Fjh9+UdY46|wY__tx#?KtiwH%Kqf^ZY4CPkZO^%N|T$uwQT9Q%$@ zN=I9?Tt$crveGjw?%3aJk6RJYTL-~_dFxzxv*d=C4L6l@0!HfQSB?JcA(!4khxs+n zpO_Yf^;5b=)8qPkE~yNXs!AEgzV2L*l5Vpv>2fQL}kFW41^&wuA-E!Nk=Cz zeD<2ap^Y%V?N+u`Z+iaZ;>(qJJQ0qMLWewYH8!rT@bW7&6_%^fjVtxu+K<;3d4|j6 zO~mp>!xgB)@wb8N)e=iu4HXdkm)BpsaB3=`eQMc;I05|Sn4 z*PV4KeKq|5tqCJVGPAHZ2{Q ze0RUd78ZQz?x*~xRv8~Wcxw9*na;T>eiw;h(AZQ{BBSOo#WY<9(Qjio<348oN}2!iz>%$Z$M2U6 z_iFl@qx$+O_XxU)V<*iVqmHmcByQSqEZj(~`6$YS5xif?Y0bCqP)8i=*&MEa<>@5j zCZEWpOPI*OMkkVChOUUm>|8&X1iyyN;JDc5?oTRld-tp^+z?~RZ;>S4MTMd)G_Km@WfKO diff --git a/apps/docs/public/favicon/favicon-16x16.png b/apps/docs/public/favicon/favicon-16x16.png index c6351b188176545d4d95cd02e59c1d67fd44b6d2..f7db82fa3da3e0262a42bc11ca69aa69bcf6115b 100644 GIT binary patch delta 495 zcmVPx#1ZP1_ zK>z@;j|==^1poj6o=HSORCocclD|upQ5eTR&$;(~uc1&xR`hFhi=c>HY;cI8rnZKH zim)c>FKB3q+Yk{=ZCNz5=pcx?2s$Y^2!i0?Z}9p9z1OS0KY#9dJnwr&L|lCJI~>m8 z@co?U`94QJJXrtj7n)w8oLFJF)g_$|BSkZ~6A75i=0utRPN`!7CI`#2NoYf1kEi0!Nx8Mi?bj8NBLL&pIDjvG9v#ITR^_a8hnk#mb^`>6)aF(t>jNrlg(&Kvtc>PZYAt l^<%=I{D&-Z4~IdeYY)61ou{=EmGb}q002ovPDHLkV1n@R?)Crx delta 417 zcmV;S0bc%z1iJ%}B!2;OQb$4nuFf3k0004XNkl`cPLNrpgP5#$$(#g2cXu#@CK}pKNKoSrimK#JA#adPx#1ZP1_ zK>z@;j|==^1poj8m`OxIRCodHS4n6TO%(pBrl)6;`2R`%UlT!0T#1NiB8VOo<92ZY zg(!#$ZWlEuqPTA-MZtrJhzlYjDtdGQ1u-DF1@#a#A&Qt0jem)n#LO6zo}Mb->l$a$ zE}#&`gL%x*^{T7h``+4BqI}S;@c82L$DJxZ0vV*R4A$Lms45eiC+pe{)m0)P1R#(h z()80|Y1dn9xrEfnEU~e|=uS=i8It(J)C-^&z;6MN0pLTUMy$<@GY%lys$g}Idi z(H8Uw{S<(v)_;_60i_JD62L&}m&3~>X0EXCsa<<(z7oIZe~Ls}hF0+U>@NXe*S5UX z-gC%kf&4m@;Cp_^vJ;W$9$Aq$Z@3V+3X7ndS7PHuHkvED*nfiaP- zT{X_Z;_U%UUzFDP?2*Er3Ks=M!dvr04|H_^(-%um`SC3-78W_!FxByd@4956`3(@t z60m}_QJL_p+-ITozQ&F@ah%@mLXgD6cWjg|2w>k5UcEF0-i5-O}dXnF3_J$!QT0ceU)GMx|L zXtj;@RLE5L3A3$J2@y}5Okl1>8fPk#E0 z%K%dQ{`I%)?*L?)dJiPM0RCnGrubx71nZK$EQ95!S()M+vTTY}mGLbV8NDA;^AdJF bU(de)w9#$M#3z*n00000NkvXXu0mjfPoUkW delta 874 zcmV-w1C{)P2!RKXB!2;OQb$4nuFf3k0009!NklE3LG(T(XRr%hDeWq3BKh z>~w1N>Mif@)#dzk-uHK&^ZlIXJm)#jQ2>(NRWCD0QNah8B!B)J#imoBvKtbQ)hjhh zkGMj)sxo;LMF&l-DE#bJS*;v%S4&m!8%yy%Ed|PyqwZ>lscyHn2eXOrt=VLJod8g^ znoqHTpcHWSmX=Koa617$f6zJ;m;|u>BFyuKuT4^Lh7+{Bh0GvOyR<=Q2C%Y)_)@vr z%&k&vUjf+8hJUOGXnH=%08<^{z=Qr3_W zGo<@NSLYZ22zQ5^1&8@kto0M*#Y58zZQ^3I<{0RcnBxIa+49%TSZFNME^ZWnIOoE} z=6~hMnJ%zCL5h}U!23FVfG(ZfqTeFR4AX}7fM*D-+J6I9Hm0qvqYbLA!lSIAkLQp8 zYxaXrRKKvU9kiq@3#)$HXN6F3*zh6@0?b+n(bqvyp#Cltr@@aFZCDm z#6V;D;5iHetUCza;n4gFE`@;FtxbI3=+Ja&pkATQ2HfUxu6;tLfyP?Bc4xUlpL zh7E^gK!08gHWDE65;%K7`2~1*LEmUu5ZKO@-*j#An>Z;VSUZ0~g*ci6t~dA1u;us& z0a)2VT(OLedncgwmIPSf1K}C6pB1j3kVX_>x)a0{N};0DP@OCLZhjDQM)t4lhIh67 zUK>$>X^s$EBqzUr3Tkf1zUyiTJuCY;QTj<~M1KKL!2bx?&x3+Qc>#%LVGY|-Wense z=wC=C0YqfN{N*x(mG$neekdCM%Og-iYdQs+lVNE9ynYP1`-~SeG}1pAJObcN6D(Ei2n4F4=hM8rFLf+)qcw2tra zt`0sm3~%*c4-+jwLyXmp|I=*TAE&}K>w AzyJUM diff --git a/apps/docs/public/favicon/favicon-96x96.png b/apps/docs/public/favicon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8b8b09a4f86b79739426694e14258047bbbf8f GIT binary patch literal 3683 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/favicon/favicon.ico b/apps/docs/public/favicon/favicon.ico index 97684441541479ef79c0b87defe2caf5dd85f8cd..9aa82bcf046763fb94ffcb3235ad88f6c2bb3626 100644 GIT binary patch literal 15086 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 O542?u=KHo)N&N>ImdASl literal 15406 zcmeHOSCbV*6duD5zz3gv*(ZxPRuDwc0zsruOUp;e*m z5|k(zi4qFXttBZEM1rtOX36_`zT3B%zW2_|opiaoC8w%)=1zB?^L09X&govuy2HB5 zs#njFXMy$h-ImqFvaEsv^}GH(mQ^a>3Ja6@_gmJ+do8QJl#wb@Lw%QrBjJIfj%d)Q zN)iI5st9$ptW>$rj|LX~4s1Q(oR(Ao9lzCeQ=csc0jDnlGdBahesoTgHvktd15bRN zT9?gvNcG+}iP^1w&$+<1gErqcN`Zz&K%wC2R%Uh@Yl%5Uycm1D0 z%fW8#cm7V@yk@U0@yKcCeUJN!TjD;WY3C7uI>S%9S?2xex~9@|#N)TFS&n-rbvvoQ zjG>w5^*(pIsO0gl*$C)+{DGvFxH8c%eY|HO4Lw^OhziM23#wnlsy{5sk z2WvSW&eUHs_tZG$(`M89pm?Dz|J`Y}eD3cWSKRFPCRJpqA69ubQhPRw%np ze-A5v-5;twrR!`NCeI-6)ZL^Y^KaTFRcEiPnFqvH4I(eS?AoLrU9rnQpAOrNrAA%ypbbtR#c$Gb`CL>UOt!{XB4bB8H7pS;br}5( z%`@nebDL|bTUlzN{?RmQWojPFzB&$~T!sb2xm6AvMhVzO^+d3Tcuzda2drbBK(%)68y=*hz zNuASlzh9m~%We8g$)jD!MAH2clvkMYv}ZRZZ4}C;eaSf)hF27yk9t|hKSIk+_&{N? zN35s(P~_47yy*ky$^Z6>3;ZAQ7$=bst<^3)XDSbR1IU>|9^Q3IS8ACf+39O-Pe9gn08`uIGX;+RM6d&a3N4O=-gtfp4V|;m@_TKd9_;s9A<7eC~?)k|+<{a%R{ZTFP3{Be)Mf26^k7yr^ zJb6|ebv(1xAGTcPPqG0VkM`rj%jDVWzh`xCNc>&KIh*{b`7ex7F(pdnx?s#dEKkOK ztBg3&i^4lBFTeGk9Ij#x#D7k7QIr@A=c9?AdzBlGx26KicL9uz>a%;ZEcZR?;MIG8 zp0bAAbW1zIuYLDhg`e?j-i6Ra{cU3B`=>wHu}_}azcwke49n#MKks;$#50d{{5-QU zsdzzVnS9}A9MdGHGb!qKlLjojjX!;i(|`M2zr5c=n?lp#^31*+vP9>qr<-2P$NXoz zM@p>w@F}3;ALp1GZDXFBvdsJ)?&l|Q;%6+}um0qD4&!!B`)BsO9#`53Z6wai*uVak z{-pkA+?y0te|C_)+q9{=Pj;7^jw9@E`bD&D9g%j29_wo`MHev$p0Hc-^FKeu+gEaPq3i#*S0UJ@QZ<grfxWb ze&?Dgng<-JwEK#0y?%;E27Mv=6X`_zuu9q!DH-;m=Fht!ODp2R&c5Ur(x%~AX|9QP z8F@dbmFTjdTT5@eYGiS$^YP8tNIZeZdJ!uD;Rl)OU3_Mm!7UzLhI^ar3Rq_^DTUrmJLzt1Oj%I5wsPwaZqsf)myQ|x)dcYY&nJpk~o zLcZ~)%WovM{j^^b5EE;6_;NK*7$@PoUe7CKedKa~O2-xC_eT=Dr_Vv6y~O`TVA8e| z+c0!#?rrcOn9Z`y#7^QJJAKDZwZ#5Q9a`J>G5WbBizRMq#KJiy6W7ISbKCtE{0z*l z>%I=zj!qKSdVNwZ^^H1{_k*WameKbKME})Fd|7bmyAXBx{y-hSzj5;p%FVkFwf0Qj Q@%{|)-=^C=5Vi;Y1J{m++yDRo diff --git a/apps/docs/public/favicon/favicon.svg b/apps/docs/public/favicon/favicon.svg new file mode 100644 index 0000000000..9d6298768f --- /dev/null +++ b/apps/docs/public/favicon/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/apps/docs/public/favicon/site.webmanifest b/apps/docs/public/favicon/site.webmanifest index cddc551158..981d97f156 100644 --- a/apps/docs/public/favicon/site.webmanifest +++ b/apps/docs/public/favicon/site.webmanifest @@ -1,16 +1,18 @@ { - "name": "Sim", - "short_name": "Sim", + "name": "MyWebSite", + "short_name": "MySite", "icons": [ { - "src": "/favicon/android-chrome-192x192.png", + "src": "/web-app-manifest-192x192.png", "sizes": "192x192", - "type": "image/png" + "type": "image/png", + "purpose": "maskable" }, { - "src": "/favicon/android-chrome-512x512.png", + "src": "/web-app-manifest-512x512.png", "sizes": "512x512", - "type": "image/png" + "type": "image/png", + "purpose": "maskable" } ], "theme_color": "#ffffff", diff --git a/apps/docs/public/favicon/web-app-manifest-192x192.png b/apps/docs/public/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..21fd84c96e45f66392a24c390521f3ae049d7b01 GIT binary patch literal 7934 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/favicon/web-app-manifest-512x512.png b/apps/docs/public/favicon/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c92b264f4e97af239cf120c4aaea7b85843d30 GIT binary patch literal 23947 zcmYIQcOcaN|K|{r6ybwJS=kktS&{7sS?7?wC7i4~qewz_LiWhsdlj-WI{VCutUG%i z=YH=i{l5P+yx*_aq-o_{Qws=p^UhEet*I(88guEs|p{o>csX$8nn6xw4 z@=*Xi`ZjxT;O(re40d+DjN9yw-hhxP0s($*$;pQg8U%#a1s&qPS;LPx>o`U129G~l zf3zEnCw1HweEbvcWkGwR&JgMG4ZO<@x9;YGTyOI@&iLhRe2M}7cs@YcB+znl1WkP4 zb1I}^ccX0``RMGi?9+){N}5YAXtr)F$h7;h3vUufK+h@)X#4#&r89+Vp&rd$Qf#{d z2gaAGjqLA!x3r4rs4$5q;v8i5*>m+Ul!P0)JRcGHF8le^W_kamOx>%@rZKW@u0b+3 zk3kG?zTwHdlXSj2nE5wbX8p}TA`k`pI}QTG-D2AQR0t%X!bRJzVz9fpy<0XSh=EFw z+r;?+s#`T8VTYw}Rs4wq4^gC%?pE`rdSn<R)`A%an2Pq-SW7f;HwAz^n~(IkL^ zAHANl3dq~-m*0K__KkKME-756BTa7fGiE}e*62ECL> z>!tgW#Husy(%=4*aZ0k8?)p(4r(U|}!G>;I6iF*N{Stai?oE0{o`{(A%6~@fFqWhD z$^N~T1zoxkpBNwk5B4R$w2O>m)kkOpv+L9v!IQ=;7iL@7RO3x=EzADqulk5M`t}vS z_)mB8%@xVeu%G!8U_Z5WR%wY>&QmJr_m z11~VoSkHa$Ti9h3QN!S|F1*p^A(l$y|Dx$Q&NpNyKP}iCTM^F6wSN?bANe0%chb_mWoaUYh;!q0TK@i^K+^oRM9&)2$`o^npm~mGDg@KWXOMvgEz7zr zBDxsjaG~`@t_}FK!mp(5gX`(yPpiLTmg7wY8hC$(p3~uS<(ZxU14L8SH^qm}Q48d# zN<{1Z4Qx{5cT^q{%YNLN`n4vrMu3(uH86i7)sd0&-6_keu9eK#z@@6GO+LE7RzbXO zIXW%V!+eLTe8GJ8S%}~}@_+JcwRiutPVKUd_+ImtR6l{}dd2SEV~)_s7ZK*|hW=ZJ z9hY{foK2Q^Db5kr7`N_9CR^M^S=Mx+&mw%6sua12^3jR$$_*9LJVIx!G-uAoZOCZ+ zUsvb}4&);KC13#gRy!%9pBt)4lqYQ581Av%08c?Q3x5-C{~rg&bk7)y1Z^Q`vxevV zcsYBJ1tT*>N4wjxbku>laTNaQALr`H2~4r9n6^B!7-P9ZT&_V4qh6N;3;EzI$hMfz zwX)W1?{D)GN#=S>GlD? zgn0g!TcV(5%A@P@(?*(Qod*ey_&1~r*SHjh$C|>~#3VjzPhi+){^}sl-Ugagi%qqt zn6*58Gw|XO=#E`?gB9-1=jk+$qLc7R>>pAGzo>-M~lIa8s?xoZJVq@icP>sM>NU`}` zP7-Zkr|?y# zUt;AmtVjt{)xCF%EaW88U>I2UdUJTFed&MJ9VQ0x-+%hP%Qxcq!2jKCcbUhVN<4L8 zGM`D#eMw5M-Lj?2KLYo;j7EPU%bsLj|D@0yA0d5C2x_}GoHSS3307n8;MH;uC2c^w#i%y2@|uyZ*?^Q*@BPlp{qvIpd`)A}?2 zCa@w6b$vZ8`s{gJ=*M@w|9+}RDsVs^PCJO-jK7h4KBc`qC<0eYWwAFLcaQ8`E6=Dv z7SF+$B2QHnj>BmK zQO)m}|4ROk3p zKA{=k58{YK`Fc+OQog7YNXj0TrkwES?KeWhF95Zf#dAo{)#d@zZW7A=a;~<$GVu6A zrYh6^mr=h9za0G0`~f!Dnl zo;*62e3ziu0}b_ufAtn8=)KCv_l964KyTYxz%0oh;$Qu>8W?bg=g7zUbmvwZAQ;s{ zhL`%>=72jaW~CHxp4}N9T+HlY5%-(*MQQ1o*aY^eec2j*WB#L^G+3 zKljv7fbV-VlKOun1^8aANhf8OfvEpsP@cUC&^sB!%=f1-0(y&11Nk~n$mS1&?C%}} zR(lJ(H1@|z0N;&(QB^0Bkmr2o05<1tdZqqnDRvFYjsYmi5!5{X%a}ER?~t^I3FmJ9 z4h|5C6t|^3e+&j5dq5w)I)6O;1{huaFxlpuvAYCpFN!gRbH97r<=x zbPpo_g^3?QZ!<*V--0L)0rWJnL~bN|J{r*5o1aW1(vAr7Wi$Q^_JGOhvWZPGXJ<)1qx z0N~cSJO$^AF2QR6_)W2hf4&L>toAOgHG}&c9LOITHlqT6R$M?J7!&*@(Kn>=9Q+mm zT%qc}f8a#~@HHC8kaKWAbCWOM9{vNbA%K^t6r3kzL4xMQ_agrJ%K-trMK)9UFL;g+ z5aLpIss24?AcR?$Stj`Wu>kP+-kq-Vyvd#dgjtVmn+`ug7-CXgdUj&fgrt9jzZ)Z9 z*Vq*>{)N?1 zs{~}jr+aEp2tZrkO3|hTni@{ z2}mDkpqj9s1SnDeO%V2tz~d1$-hYJq5D35F8!lC=#V(-M@++5@MPnNCWAE!BDQcZ0 z=s-eXc+kxo^@2Q~vPeUwgKN2ykhXdvfmvJ|-@K_+ZwDQ3Jx1C}OS5{J6vV+zk>Pep zdmo1qsyE3MTb9ao+;H**B-#S2@7?0}K2d34CmXmhyPq>+FOfbia_oD4MV>tcbX-7B zDKCo+H>s6xKi2Me{T-Ru)Sxae_miK?r8yvD&K;~E(f+#y(dhSn#L-E*yx@dbeoI;xQ<9%u^yr*iXFY1;>gLe`7D((6P;p}A7~5#x^T>MlyN*`oP`F15??zvIMb{vxWtbg5!gV;@ib9imNVM%+N z1z^*@2w)R(Z2Ur+6ofCGf5wteU3=N2@sVuS#OgvE$jd8&1w`SQBj3tQzgW~b$`JIG z%vV{}O;%L@Q_*&%qu|p>>eTVMnK3Dr5kk0V0oBo7ikHk5YO&*sEYw5k_22PC;W9D= zd&2;x_ko}e};X_EY5DR{4@Ich&-{@`}+ctB@LO{ z4^LYtyB?Dgq96&-59<6a-jJBZcXQ3b4TBMQSwWY3$JtHBND4$Ds?8qF6+^UGF;U<# z3$ikBe?B-SgV3|xi(tFk$6LJJANt4X?X!Ss=3Yy2z>{22%JrBUv-aFIYqs^CzrH?l9=D)s~uE*oL^63VAGo$)Ms6Z6fVD=&U zTf{vcn~x70NpGCkWi^OQSCM_>40mng9!GY0JxNO@oog5SQ~HB(ecQ>B!@@SyHyx@LX+-;1Eom{!rpBy|j4-p_}#7b4pA~iOR^LSTtha zd;+9qKN?+pBWYhhCsmI(PI5f<(dq>o>8-7)Zdz!7Yt9a`v9Mp0kWNPcr9XhxgM6+U ziE1~V{WOZ6kF%eO^^7H=IvdI3#$u9VY#$^sGOYpmQ;}*BagjFg^zf!&fnNIoerUT1 z1m7=FJ)HZm|KR(Cv3^_CRK*412gxgyn~!|g&T>lfZyZ1rJ}MCfJp`73*BVb8nxTrn-wtMRBP23@TK;vk*KxAVtXDve3Z7|w zHH=o~@P+PFCE{nR5x$jc+#G?S3msCz9(=cf9<&(2OoO;6wTfvU5vcr^4`6Qsxj-X% zeQsks*yB&`Hu?)_?Rc+om42y{&dNaRx*3hO0`{OzppGR;k&;9p59ynvS=zy zhJAQ_?y5d~vpRhQ<|pN{@0(9u=Vjudn7VOl0tY<|jNRxp(t9P_n!O^&7IOlJ1UgC+$C zI!Cw8%*?I0HgUuk;@bqpUUFgG-jV8H*<6`mvTf=r1+TZE9FUFRU)(@#&iVL5_sXTl z>L}leIA+DVr2=sm8~Y&m*!?tgNc|8w2`esAhvzgSCmLUnqkUGNqm9eaKgO>Bg|}5W z-m^!It7W${b`I`efQzQ$Z<{}^h@IR26nj}ZH-}IW!{r24N8qj6AI*{7gMzC^B8sfo zSMp_kb_<5}XNt0Bd|pcwZwh}Kvpc zh76U+ggj@?mNWVMLqu?o2r>+UJ+L=9hDl{kTXo z-(L%Q(Pi~&!UenW6x{O5rKr~dqebGfo2Ns5l=CB7wn5_9j%!N&XNEQ@uuO88ag2?W zn!HzB3RH#?5IEt`{_xK6VJROa=7;&^eFyy6Sv-v@gT2{dl+L;veNQdeuUiuT(c_{< z={@r+2Lt#whn`zVkF%O##07NKo#$_Nvn|hLTGTQybF^z$(vRR@c*tr~t^9{8Us}}E zJehh^<0JJ0hi(qxLUVK%&~6<*_;MTwEi9G>pFT~RgPW?A%?S?2N0PX0`rljh58mWk zPbG#1Bn!7O6yC#a#el60y*@O59Jv4?N8uK966Gfwzl`g3`-_Z5!S!u-u*fa56qU+G z-if-wLjPgofnGPK)HwCo*Z_M&L_#$Vk~VkPRbFX>Kzl1{K?e7s{bcMi1+ifGT)=+Sr*am0(m)j9Wrd-p57ZXb4m5)m*B5Nu6I7r#{nyy@yoF^0A?dM{7R#dU|QpB8!XnLL7e=xG+=Y)K1&(@x@M!i5<4_9S+DY4z}MP0&nWica@qe6i zNBTmh-tZLo-#IvWR-om*#ot*0R=DiTy$8_+mQAP~ub{c(?>e>gbtgB2xJ$W=EuLI< z&Hmc!miyATTZP1>wki(OR!wp8-&JFjqJoYu@ zUh68j)=9GxcH63M<0*2{D>p#yzZDX5eupxemnPo3@`=ON6|F+=XpRQUc0rf`>y`EE zj%?|dz*9XupzL@xE3cygZ?&+xJ5~c#G-(SMpjV@`(-qx7zE1l$9aHQG1s+B{FjcyeUPW#>QzCanF5| zp~$tBLm$zxQL&VM;(DMb21{66E7yDI@`F|RB=c#JTgR(>qrm+*R_&_H`A1tqZ4vFX zL53|~pVU_CnL3X>3ghaHMb|aUZ7EdeupUzLH?1@_771lx=o0;*hQ=MyzSzd;g7!I; z3kg**=&I3!K5C<&LBE?T&D=J1k2;hK?^W9eeT}l5Yp2PM-hrIdei?8raVj#dn@2RQ zU6bPscs;b$#%wUi`JaqJrA6-Bxzw^GvfLjngJni(&i&ZHUm8+hCgv|+^V?ijY{7H{ z&8@_xq|N`X?wG6n`P>&56m;<5)^HHpuFJk+O1FPe&SAjK(Hmi}Oc4F;o3!q0OgD|? zw6f}{3rL$hSZx5}|7*9dCd@+j^50Ni+C78JweYGvtZ6b?Whs(p+&be=lm=yEy=p2j zBF4`u0zAo6udL{>v5OsaoObx-g5h!Ahdpiyz&G%geAr1qEUYD{xwxRX4K074%B1Mn z+ID2(0&0o|GX3o2jE%Rqc1=)WaycY(?x=K_W|!Q=P6XmE8Cj4TezPGMUir;6ZGe;N zy&K#-UCj&&C7D5cIEFW}k~%5$l`0M|&Cio)engGLjT_iZbWTT6$FZl}kmMpepeuaS=62_JVQm)w6_;Ap^IsK;L5A#2O>uwAwqrhgj5MuU@Giv0@SV?zZy zPLod$GR^I?W=0(w6sWDMGKhw;FD|80NZ?y<$e79AxgfPruTzUR72-)KtNG9h?NE_y zlfGSy##Ri~*R+jW7ADWhiUTXR6E?;boi-N7JyM=!)B9Dw;UAuIq#a=8KRtgN&oqs# zZi!s`mU|NIYA05lR4m`F6rMZuXOg zBN9@p=i_LfL}Lk4NS@eWvB%Sdt+6hr7d$=4(sJzRBy0q*%(L2${x|Pi|KK5f19sYh zN|9jQ>(z;ypuYC93oXAqk>TWgrKc3t@HG^yP!Q_MaEb|h+GP7hs&)+0E{H!P>ehxy z9nl4-5p|R8@#xQcoM9mIZ@<+92bv#F$qqwlD5|?NgF+9nJO(e4p;jki)5=RaShST|9 zD*6WIa<>=D+b+~6Z@+(%cKN~G(a>p$si1li%@1Ej(jeBu4O&jnerKxj;I_05NAj|2 z*Ir5UST5phpnUVZOViV~O~;*8FVyDEBWvilUyh{-*oUVG$d}Z@GDxCms!=9|r)A7; zzj!prk4t9M;7VPw#msh_N4*1+u|!SQyS@;KbapTQI6XIZO8JmZhU!{`lTO2e)({2T zcV>aIXH|apSnf{kV}feuMXvC-I=7La`(Bd=+#2rWjan!(oD0^ebeo($e6N#j=(FUc zh!b~y$!AADnLu}Z=~A(cTKkb27|2DAKT)wx3Z#1E^9xQH9+-=87MJDf9)8AVjtaW88Ezr3o`z`gP6=IW(wVGv zqdavb5kKl|##RQlkWI|67x-7@aODZN4e!ZGHMM6{r6ifHe?4ON+RA@uJgn}<+r>Y1 zz~8ppsUySDDaZkMfpd;i5{`teoI-cZGa}L+<8H)0t?NZnY$N!3YBj`XZ;6Cvz=y=KQYvWR(63u+_$|rJKndQ3Ed^wH*Uj?{QyIkI(44Pn5{16U~ zm8Qkv-Y6vn2#+79^PcSZ-*PuFKAdNEn){}dXfJBEjneq9>CH&WJd5LG4{F&aiktE% z8|qYMlvLXrw0!KPk_l()N51*sz1n-RNmGTu3O}GA{wuF1gK5HheBh z`x5)%#rkO$pumcipNC6*+Q?ejjpW&Lvnyj?4Uxd53OY_0l?MY8U3;)lXNu72P@%kY%Gm z+qQn^`_ETuONY96gg!Wal2ou*J3FGXs(fy5PX3pHQ+1Bzz$S-r1@nxmlb}-_)wt)r zsII!pE~@pI@hom-Vm`{Vm2JEY_aUe9i5my;C+D=2$Dup-96p;mtSN?7iZm&HDqB)?aW0iv^nmHb_OsnYVlkV=*4!rC# zT|hYgk$IHoe)O$bA85{Uy5^~}a@K7}%yOIVF(1MxSjxRbKE;`>hgRVJ4}+JtREY}F zOYNIORZbq-@2^)oJM~oV`nkUK`b}9IJtx~)B4acp20{~k&S%@^0GUVZ^_Qu9kjwYt zCl*PsjERF<&B`u3fzij^S7<-LwH@S^;JL3I$~~HVjm+|adyj=wls?EW-n`DbT78({ zwU%jj@AyUQ1_Yzj>`v zDoQY0l$!XZ; z+x>pGME;;9ziwqQSxbXyZGk)WTR_SY+uVT;b?1*M@cGDj=cX4BNmNM>c zKj}DnPuGnL1ICvDJ+)`}aeX}I^AgRbl08RrDOU4#YO_n@dP$kTD@KIO_nGs*st|{o z=-M@dK{}7*P%(J1>ry_@B6!5&(StPkkR7D5xU)VGMT~y=+?ZOC5bFe!3Lw zA9$e9yXorq^&X$i5qtgcW@Dw`WJD|NY8adFdRdZkS=`_1IYCK z8U}_Vy9Y@tWo;W&r;G@}@oaA%6VbNg-sqBa24NkW`1V2e%CqJZ>?F^BCB|%*$R=ig z?XAs{OkJ4P8QE!60_k)$Wi+Xv7VZNbj^p<9apI!Ar&Hmj4eaBrh`z7ng>7G(C7xiX z3~{ZWd1#Gwhv!8H{7b!q_tqw)r-FihCN>7Tl)z5t9Twuslo@O(vsmSQPuOmyiz;IW z4lQMlH*( zsaECZ;~h5Fo}(Ff!9UgTuc?|*Q2^$pw6 ztb?qo%&xuZh-;|rgg6CMPx)$+5O{AfpyJ!%+ODNBOSWxP-stc%mR$d%s2trSNa-8? z^_MVilMZDG7pzIX0lKs#h&L|oLUQqwP(B-oVhf$Wa>GZB8iT|Exn0$thhf;KKuwn! zdv!na*>q#dnm5VmQc^{tfTkqn)*h^H^r*L#mw$*`H2v0vE9EyWS-KjxD~%Z8cMH*o z+M8B>@IYgeooXo8Zj3Y?^o4qk-`RNZp|g6)Jr(JwpPPoAjVpMpf0BTv!_)iMoc2FR z>tQ>hth-*|?dgrAecbK00re@mJ{Q#Y*U}zzc$JaLhjULLbH~FNPfGLIitI+X{vs=~koVBJZD&)htS+ zCNaqE2@g5+_Q)W#JU_9qR%=A%x0wA`pbINp>f{9%3tymJ^ZQ7eG4!-O9d@}IN<9Fl zk$4;;Jo#pIs+&&6-8{C0W={vR!*9hErL3nxXB~cgY^txH0=(z-a zFiUNS-1Ot5;Z3m_tX5EP`9UtD!)4mQo4(VawzP#c6{*VPuKR*qrY3`TFXnA(npC60iN{FeaPpq;cUIqr&(57mbj1 z`5DlouF5<)!(ZQAKF)*|m7P5<4%>V!BC}(wGCrM%@9;kIQu4EOn3dVzQw$e6R?d0l zq6$(z+V84Yt1)OX8i^yigq*J(b7Ra{y&>D9MBQo)(GdBVVB0onq2Q7_D|F}HzJkM# zQ_l&oOe-6=rmK~r@g6^!zc*yZw~OYM46Yo}i{C{2UUQwGu1BB5*roLC#Zz%{JHCc$Ar?$u@!i_~NV}T~$=DH4KM|k1ch@ ztKjuSPm9U4o0Prz2P0kUD?_eXkRzsQrbe!JQGD4O`ubl^cyo1ZU_j7Yj0$3fEgT)t zjO=eX_8#9wmbLw=)71l8IFa4elkPbfFZ!t&t#fHi2*PuUK^jG$_4C~QuA?V@xF1oDqZAf=N8HQSi#fV7_(ZQy6@L^m@F47|%Pje!iKsWdMXDc>-w3f%gMpnb$^ zcSL7!$SmSMA@y%Bpw;|Td&7mce8HMS76`VY9U1x(XnsD@vFUXbbmU9x3U>n8s8Ipt z5Wg#YYidJbx77XMo0e-f5pYI2>m4^wUtaI!_8!=Py^Sxpoby6224H=e!7lWWZ!BVH zl0k*X`e>)lSXecY;z&-fiH2=ybS%we`JVGs8iY+REQXfl`-`Qj0o+hBe?|oh#t(YtsB-|K8$17 z0E6x*CFM(=x<%BAP=6Ud>%(_|f}scZ2NEX}m^9uJ<)}TdpJL#2YvGG!l@MQfDH-rx z$a%j9>OKwbt-1Oc|KQ!qluDfGjeR-&y6KhgG6)UpK}D_U;t7nXD`ZHls2R)`Mr!eT zu9{}?N}TB4^M#PMv@(>=O{V0jQX*T!kg9c1&VD&*2#v>y)XYK5ybtu&^am$%K_sM- zte^>>T8;U6zjhN}mh`pn*Q3vc7<%dT-d6BTY_H?8gLUI~I?kq#{R=kNcE>W_50sXU z)y8W074#iEj!a)1rBoOgBrT^(JYBHrk01YaIuviy`^ZbCM}Od2`A~=4*`$x+2tV`G zXGfUSda;;kQb!_gh7LI6Z}y-Qs4{C*^<9ZFI*5!pK%k-@TctII=C;K9Cu#%sYI|~T z`DIl1VWgdU+U)`Y8%C(+3B0UxtR24n38_DX<=?~-`iJ2y${B;#D&Dwal)x;YWAyVA<=Vbi`Xo= zu{Tq9iAK`3tg~;74eD)r%5da@C)*3_a3KSXmkunyo9}L$!(O$D)=9XmAkc+iJ+Xr( z;+4p(wxxU1@M&|WdF=axyLXL=%3mTvX~1GXzxQD$;oD%D`sX$((iTU_VRX3xvsWOl zS0t!eHqb-FH@X5oyc02+Ke^O?;4~ei5TZ4{;>4jW?Q-&4{-A{8bm%hKNG;W#UWDGJK*B-)dIM~co*yaw=32I*lA_Z zo!4nCYM27klZR0X+)hWi!}D8``% zt=}x6zV}X>$T>~VEp1n9epkCz=m!&8Ah5aNepTzsl$)X$b<>f&y!70IC=a0DNWSG) zSiu!xj$zB7PLE0SE^J4R9i2O#=ANrs}zy)#-2RTu8*Bt$eICO=<%r&z;_EjwOhB$_^{*@N9?_*h^DR-hJ z26T39-{ctn&9lJV8n5FHl=N=H5jsULm^iXXY^uoQ++T8AV-frZi$gdta zkbl^Mnbd)i@v|_gx;ezZZ65}~T5HKVGV{^JybJ?z=-v4@2DoK-x_h;y0uv-OV9A}o zaFLuC3)TFd&Pn{=PgVMiiC%S$=>A0wU_dd zAefIG3uTde?TmJ-_0wC^^zUGbXd?M0tOcsS*Ydc^?6&RCxP(@qi6D!|S!1CBah#yg z@FqM(G#uLCI4cNZJ?PSr-ej{MmGJ6Z3hom02En%3SV{+=T`a}rP?8*aOzryH$wz_A z#jZkj=@a8_55933>+x%Wbjb2qi!GOng;J+c&SPL2QyZ=PmM99(qoju}6%lcmTLoEt zn!)lTq`!yME_z*Pe=b4wt)yNz4SKEnaEwar=XV zAcl*$K)1j4!pBqZEXMq=j$?10W)zZTj_?(oKuN;Fq<$2~5)KJwX|}UTA&q^>B(N!s zrma_8)FcU?cPaEaEH=HQ=?CG4A~GYRLKbR?GLGqSl530>V4zLv&MQ7Pk30=TLuWKd zz!g(LMDk>a416F1T6bZx-{jE1wog0^SefQxJ*tpzx^cxG=*{?A!cD#TWJwc58yv*x z17|0uIwj2y^8B#t-zC9P6#rZFweE9{D~ow~Oa%qhBQm~*x1>3M6Aq>VWd9S2Q=!1C zE#SBb4-_mK=n|wifYD#~GEv*a6-Qp#<0368z8SfafF|llvinT~^rB?QgG6hzf#%nt z%(ZkFs?SRbJ^LdAn3Dg*wBH{Qu@k;Y%ypEf%TZWd|x~RLL z+`~KS7yUuo$l}w#t+jzbXIf;MGvti$4SZN-Bz8;Z7uqFx=Gd&(tpnKauSTK3EUt7b zTAP&o93(1;mYhR`?aI+CGJ7l2PG zuc1hc9D6xRs!Rg9;5SPf9AhQ0Anj7_l`(ty(tfFSg69kqSHMx8cgy+~NmV_U6$-ox0R=0 zO;d1S;mW+iFMVU7D?i5^E;Bwtv%LI1&^N`IgA9iHkprCe%dn5e&ce^oz_xsa$d+I0Olp&b`_HDi>XESMhuV-rP&1}O|Zh+Q$9f3x2iP?0D&fENmK zr2i5-vO*a^PT#tpyMD!gp@<9E)6U>!IpiXF`U!=6fB8=vZvvo})^KeVF;F&mi09w# z4YhTeR2E36wLh1gCcESKHV*2)LcMvBpOH%nt&v$f-~VJ#pqzxVE19gn;RrCY%N2{5 zGN5PfMXt&$eoD2yIzN{m@!$I4a`y-6>=(c^52n}HeyLnAt9g=vlSO;e`&7-4>Oc` zTzvS4i7WP%fIe{wDbQ4?w#AfgFKw`c9_PgK2Unb0 zwJClUh$vGyd&_UW$ghL5kFKptPvHk@a~}Za@h3KsC?}$9Zx@>i=<0qUEo5=#yt*2e z3+(iMKa2v77c?k8Zw?Br&m*EwqHY?!>!GEX?s`{8LM6BooxWH-A4U?%oHVPr7dfnF_ z9}z<3a)iJ{rom>!uh?Ax8qO(3Iomr!fS%b)d2zoc1a7_;*Z6?d$!fz3jk~q78AfqP z9OhKQ-AxwbUaCgVusUH!!ha6|RZycc<;vdMXQ&OqAfRm#eesGofi+1Wbqu(FgYm+X zf}rlh$`l`c^sy7>bZyh@S|X7^x^Td01`{wf9qhb=!}2*3&1;JeB$Qad4&3>BF3L#GLoq zkB8}(CWBsMLMb$W)_*b+FZCv;FFS-T^+Dj)#mZZ_a{)c#rfzSq7CA5@ZH9tt&s9e9-V+Bsx|)%uNLen%s$LLSHqCTF zgHgl7PE~tm*_-i{b3B=6k5zhW=2r#EtMKU+2^Zju{%SVWB(EqFp^N>m*GQL0Xk0*x zevur>kuKBn#D;O;POA%^iz!$tk_)JHRrgHLj4wiwaEVoCJ`>TXcn zKeUxiJYsV4>JiMQ{c4K=70{XB1#MNOlzioaSen^zv3a7kPnck@TFzt85!E*v&x1hpCL=N-i4F&!iJ&H%n{}3 z`*oV?fbfG?Gq}b8C(>W;)DNK$Fy@r;SIJ5#dtKw~Kov@S`W0`ILR#5RN~0@i_Ggjs zpHd*H#g*%3g=X!oC0m<@UwscM_UMS%@b`V2^$yF|*1O|@R{3khDB}`&9n4G3uy!4g zhgrO9eGb_K)Y-5dI???^b83b8kQ0?P>8$sfM_}oVd@nJKDYo>6gMJ_5YIvgB zu3he=+L>TGKJwCqeIi}rf40;BXm)jHWAQNsr_lRa#VuyTiwFCNAM%W z>Q8+}g&zbzS0R-A(H1e#9UK$e87?3<=>v8%$1Ck?F>>^lh~8vlinJGv_O>Ybyg1cw zPT($qW|H1jQWRhNmvuUdwUiQ%v8suDPqC0%xHhte%mHLK1@5?mOU zr+`C#*!6b#5m9Wj*Ffrw`#_+pN)~N1wR3p$d`d5!vS$+kMpZuyv>D}J=+J4Yf^GO$nW>XvRzWm5EdDx@RpJ|o2$~v`>OB?gc*IfuaT(VXJ-cC%^I# zN)@t+YFQo8G8zr)4AC6zOcJ2{Z#85U=0_^Ew$9~J84?FI$`6mQuP@lR;m|)J$+{mI zTRY34zmy?2@vK6T!Gh7g@i5N__U89HIuT;vw~NRJa*OfF1A99eY1Gf~f)&4y1&4s$ z9jpda2JGaz;5o^gIfq};p_@oV%GSFUC<86MPA+JFOWL*Jp|B6lu1;}r4I^~3{*MGs zXfra``qlxH5w4K{qFTlueg6&Aq&Dbp5^bM%lzK0El}QNg4bJ)UJgHB16vT(I5J_s5 zsiaGj>%0QBx;Y7~N8X{4vTw~E5pE`Q`%90iw6Zydl#mz)TaFYws@u7@`mwF+!*Oao z);!{y@gS)aW*DKHGl(3fL6Ibxw44oPzIGPL<@P@CAqv%1h>++;gdy1~F(YJ4B>R@M*mJM7!VD>0CS@r~ zG$TTm!q}G?rOBT4DxztzW=r;M=6B94_xtCSxoAeYPTy2&f zd6yTNpL@U)1z-tj<=$lz^|i)q<@(+e{x6)97VuN@ZuZw3nQg-f1G_i z)aW^z$yv9qnxV5G5&AH&Q+91>?tx=_^qQmON{Xs-TFSUG`QAF|c~$sEYkmV*)im8k zJo1PJ!^@sn4ZdHU5;6Oi__dS>vG$hf?-C=wWu_f^HBma@y=A%t&ky^VY>QNrl@uqSQ#CG8tla&s~9{!)kJd|{%_@ZAN}cuv{o>bj(3_v9B*uU6+R zg>!l6%=gtT|J)h~BjRW$7arIxQxlucw)zAF*};?lo#((r%{q9jRuK zfo}8Owbf(MJGhq|uJ8ko5o;wq&G@&~{RS8%oH@Mu_JNUEUIHnlP0tDh-*X68d=+?O zZIgdV_Nk_7m-X1Yn{$W%*qHouHv1yb$p&03w&J^YEdwiEO&crz{*Oerdgs4t6Wx>; zOh|B+;fzUbfEn?q3OJ)wi`eOt3|twPxP%N0)?b^(8a@29`Ro5c}`zI1+s&$ej3SHb)+D5s3q^`Uf)W=rKb?;1B`AU6ms=RIx z01G0Y0$8-6KX%|{oP(|ve8xz68;if*-H8?)(8-r@I__RAxrCDKj>EKq5v$xbh7Sx_ zSGjZTRKZv-)>(?Qt+D!5CPJzH_OaMUq3@YDq3Kk+*ZNA1nc2dmpJDZU^*h;fcf54s z;L+;=P#8L;$lM!MJuk@4Vw16w`l*|4e}=w#mms~uy8 zp`L@30tTw7@Rmyq{otsAU#dWOXmNC$;pwu3P$jJAL6U z|IEmh?m^KQ+FYaE81@i67ne#at*kVcT~zheMMMsQQdvsaJ{?#gl4BD5_45tcl%SF0 z;Wb-@+n05V^^|U2syQxCoqQ+B#u0;ILDFyT4Kc`Q;dI5c(P%{!vvbi28uy+(K9)$~H2ntJOhr+~#1Zqe^#$B;Mt z6qjb>?(fR4+im=CX6)6hb^&SVb(!t!A7kM3qMpd-*wE4WZZJF6@i={gPE1hJ*6vRK zNO^?xSbuw9HDf`;%D2g2z@$qlYUBI)n3-A)uz*x-jb6pl%8Wvs@mA4m$S%zhgZ@|2ywcl;ZK*dW97V&A_}C21Ti)k>kdJvx z3vD2+c5_~IaZ0uCs8UVJ`_i!FQn37Yvu5kf(XM;1ES|>L8`?`Ff(Yu~!dgbx-Z+6> z1AXvOlG(!3S%VW`2?`Dx+S{g!G?(X%o$;O>M+?a~sG+*kBhkFC7mAn~d~4$Z{MDr6rGlc`DEz z_Q5Yh_y~vHsG;wElEU2VdZ1+R0Y&jH&woR8Ok0cNcti0oRx6j^>k}`uS>_YZiwH#Q zShy3u;%nuaVZJpRbr2pB)N~Sp|{t3L$#Jc3+$p!ut1>5PG3C&`k7aj-q;zn09 z)X6eliyeqd&elcMpXatG*JiC59f%n4IFlE&)IhW$iT-=%Gl#1Ey5rn9BCk5tb+#}g z-1>M#Wx|Bd@gVD>26r&ab=~$^ysox)R@_mlU!6N!=i>jQ3QFtkmZHqSc%v3{m@$EW zfU2OD9tG>N_?I(;qj1*S#qEL32bIM^rX2taz`whi;(?~oC!+G8l?Eb&%|h_j!6RMW zl(E!COQ}NP6MXWJi~@D5umr*%4Jbk)5VyjaB)}Bpg6u$0>)Ge}x3U#+fQsBCs<9L~ z02GP2MiBT<5#SXECWzvHP(?Aj5Sx$MNCQ}hTpoqjz zMFutp5vc(SZq*jX1cl*+{XqCqCDDp0oH6LxV1!{n7-pD)-p;=jMSvMVbqx@|(%pCi zxYmSDn1)WkYnw7jHUwWNJJbCQTXQX-`M}GL5-`Gn{vJs{^QT|!A?AW1+69VUBL=cW z{|N>%;b37%SYe0;!6yu9*TY>V*gFdJ7Vor&d>=+{4D7wkq0aahO&9^Pk+SZQY}vvf zd?lURdpVez3q!m2rcvPI0X6Rj+g44dQ5M^o!X4mXZ+T4^0y&^?cLR`l3fj8bOs9Kf z0O8wqd;I5*h7yOLvpk8!5-|$H2Ke3z*Z&9O$a#A68*vm+>234)`64zXAgRT zc^2%!KG@Ihy&qiuyVJCHH?#L4AWKd3;dh`2Lv|SCLuKM~Wtg(fK%w%Gm%YQzha0Xl?h>;wqlPxK{Ww%K%O z_N<-*L+=Q5J7}sWscd1HO@&@c@5Gg|9&j;mGcT@7{;b|)RdBZxnUbE|;CgTebtwBC zPL~GhVO(eI$b3q2 zVX-%nI|TRlpx3lu)g-PZ^)Vh2DGSI&vp#c%oh>1$pq;ZQH_fUZd>~@-@sGJ!5t}^; z+8-v*JHYFuBI@ITp?U%;V84P{_+p^ppYlt2nQlA4bxS`s`f+p$BZ7R2=pHTedN*<$ zLUFP-yX#Nj51`eqz51^91by7rClO3oARiL_L(8(h5rg84Z<}s<-zCSs5H0mY{8*L! zmfDschVk4Ygw^!JuEi*$hbO5|+B2=0E|KcQM^G@Ix&Ojqm4CCrXCBxwKI!FcCMFd@ z*S2_yGF{KJ@gU;CrtUsNez~r<^cxAX42>8HSk*TIMxt&%GFcHOVt z5IQEqr?iY!USbgo?+6p-B;<=eL87Dg1y|IE%G0Jv{(%<~#}BOIS>!98z~l(ZO4hzF z?kZFV8)L-qUCv}B=U-_7Gq#Dx_I5HEsj>3t8ZAqLj|yg@+rFc@F>Lj-DQ`sJO!|+} zgf|j$MQv`OGVj;H zb>Rxqi0;RZr#q4d{gR|_*jRr5|4>eyEXOk;<}q z*O-9YNKW3)-ur@fUMfRwHI$V-j?1xJ^)APLl+Vozg=~KDqfsa5%Vh9jBP#{sH6!0` zo6|yO+q$irl+p2AX#eKtl$$4wzxQmU;TSIn(F7?@HDVH%Vzi@T#bYJO&t=_(c)*0^ z`Kwh}T3d7FVpPxOf==WwR28#6MW9`{1R&qEqpoK$)D=tSjVPPB^>nEA3N9rrpB*i`x6YsFy%o1KplpLU>D8gs`o<#b$3vIpoVnTd~wt1%ZBxSg!R4Cm&zzUxFJ1j-zKhlzRIto)}zV}CByvZ62n~l zRrLkF@-l!x=?BrK{z%t1*l3Ce?q6YIzNeWrZ^Uq7!0c4|x%)Lri`!S8)A0!i=F3nt zn8FEfxZC@b@AWNq(7Bo)>-dN_;?Z!TB+a=eS;=8T!C;OTgNl;jSmNY|4{fB=c8k?P zKIzme3_Pxfwdlr(pSm;x<8`6vipc!npn^cv@;}5aJMOS@)pwUswu55%W1nJsozwZz zj&b1jQ;FNJxdeS#v7D&REvS1`DZW9B!7{n&*DWJpfZOI{*TJ6k^kPz6tN~hoTz&3>5-5@GiN%_ za|%^Xb|l1f28Y2@$kIr5ec+KgQdIw)^mu~gq0-B|McxlIYNx-qKWAq}7I@TVzZ|_f zYOlGI91cz%x>L^i8x?%*)UUSl@7ZWLD$aTdo`Y!p5FIhE(q%^6E4psysnWw{RQKe% z%k$P_6})VB?L&>VIaW({=l*J;eEa_3z5H~t{!BV16~Ee;^iwOep5DxOU5ALg#j`*m z$%cDluL8z*CI#@fg;hK10yg$F%b3h1`*Rl6j$%I6t6yub(!BSKwkf_?ujGB(mXcY0 z-$?-3e;_vT - {isLoading ? 'Signing in...' : 'Sign In'} + {isLoading ? 'Signing in...' : 'Sign in'} @@ -529,7 +529,7 @@ export default function LoginPage({

By signing in, you agree to our{' '}
- +
- {isLoading ? 'Creating account...' : 'Create Account'} + {isLoading ? 'Creating account...' : 'Create account'} @@ -544,7 +544,7 @@ function SignupFormContent({
By creating an account, you agree to our{' '} { + const errors: string[] = [] + + if (!emailValue || !emailValue.trim()) { + errors.push('Email is required.') + return errors + } + + const validation = quickValidateEmail(emailValue.trim().toLowerCase()) + if (!validation.isValid) { + errors.push(validation.reason || 'Please enter a valid email address.') + } + + return errors +} + export default function EmailAuth({ subdomain, onAuthSuccess, @@ -25,10 +49,55 @@ export default function EmailAuth({ const [authError, setAuthError] = useState(null) const [isSendingOtp, setIsSendingOtp] = useState(false) const [isVerifyingOtp, setIsVerifyingOtp] = useState(false) + const [emailErrors, setEmailErrors] = useState([]) + const [showEmailValidationError, setShowEmailValidationError] = useState(false) + const [buttonClass, setButtonClass] = useState('auth-button-gradient') // OTP verification state const [showOtpVerification, setShowOtpVerification] = useState(false) const [otpValue, setOtpValue] = useState('') + const [countdown, setCountdown] = useState(0) + const [isResendDisabled, setIsResendDisabled] = useState(false) + + useEffect(() => { + // Check if CSS variable has been customized + const checkCustomBrand = () => { + const computedStyle = getComputedStyle(document.documentElement) + const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim() + + // Check if the CSS variable exists and is different from the default + if (brandAccent && brandAccent !== '#6f3dfa') { + setButtonClass('auth-button-custom') + } else { + setButtonClass('auth-button-gradient') + } + } + + checkCustomBrand() + + // Also check on window resize or theme changes + window.addEventListener('resize', checkCustomBrand) + const observer = new MutationObserver(checkCustomBrand) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['style', 'class'], + }) + + return () => { + window.removeEventListener('resize', checkCustomBrand) + observer.disconnect() + } + }, []) + + useEffect(() => { + if (countdown > 0) { + const timer = setTimeout(() => setCountdown(countdown - 1), 1000) + return () => clearTimeout(timer) + } + if (countdown === 0 && isResendDisabled) { + setIsResendDisabled(false) + } + }, [countdown, isResendDisabled]) // Handle email input key down const handleEmailKeyDown = (e: KeyboardEvent) => { @@ -38,8 +107,28 @@ export default function EmailAuth({ } } + const handleEmailChange = (e: React.ChangeEvent) => { + const newEmail = e.target.value + setEmail(newEmail) + + // Silently validate but don't show errors until submit + const errors = validateEmailField(newEmail) + setEmailErrors(errors) + setShowEmailValidationError(false) + } + // Handle sending OTP const handleSendOtp = async () => { + // Validate email on submit + const emailValidationErrors = validateEmailField(email) + setEmailErrors(emailValidationErrors) + setShowEmailValidationError(emailValidationErrors.length > 0) + + // If there are validation errors, stop submission + if (emailValidationErrors.length > 0) { + return + } + setAuthError(null) setIsSendingOtp(true) @@ -55,14 +144,16 @@ export default function EmailAuth({ if (!response.ok) { const errorData = await response.json() - setAuthError(errorData.error || 'Failed to send verification code') + setEmailErrors([errorData.error || 'Failed to send verification code']) + setShowEmailValidationError(true) return } setShowOtpVerification(true) } catch (error) { - console.error('Error sending OTP:', error) - setAuthError('An error occurred while sending the verification code') + logger.error('Error sending OTP:', error) + setEmailErrors(['An error occurred while sending the verification code']) + setShowEmailValidationError(true) } finally { setIsSendingOtp(false) } @@ -96,7 +187,7 @@ export default function EmailAuth({ onAuthSuccess() } catch (error) { - console.error('Error verifying OTP:', error) + logger.error('Error verifying OTP:', error) setAuthError('An error occurred during verification') } finally { setIsVerifyingOtp(false) @@ -106,6 +197,8 @@ export default function EmailAuth({ const handleResendOtp = async () => { setAuthError(null) setIsSendingOtp(true) + setIsResendDisabled(true) + setCountdown(30) try { const response = await fetch(`/api/chat/${subdomain}/otp`, { @@ -120,175 +213,195 @@ export default function EmailAuth({ if (!response.ok) { const errorData = await response.json() setAuthError(errorData.error || 'Failed to resend verification code') + setIsResendDisabled(false) + setCountdown(0) return } - setAuthError('Verification code sent. Please check your email.') + // Don't show success message in error state, just reset OTP + setOtpValue('') } catch (error) { - console.error('Error resending OTP:', error) + logger.error('Error resending OTP:', error) setAuthError('An error occurred while resending the verification code') + setIsResendDisabled(false) + setCountdown(0) } finally { setIsSendingOtp(false) } } return ( - {}}> - - -
- - + +
+
+
+ {/* Header */} + - {title} - - -
- {!showOtpVerification ? ( - <> -
-

- This chat requires email verification. Please enter your email to continue. -

-
- - {authError && ( -
- {authError} -
- )} - -
{ - e.preventDefault() - handleSendOtp() - }} - className='space-y-4' - > -
- setEmail(e.target.value)} - onKeyDown={handleEmailKeyDown} - disabled={isSendingOtp} - className='w-full' - autoFocus - autoComplete='off' - /> -
- - -
- - ) : ( -
-
-

- Enter the verification code sent to -

-

{email}

-
- - {authError && ( -
- {authError} -
- )} - - { - setOtpValue(value) - handleVerifyOtp(value) - }} - isLoading={isVerifyingOtp} - error={null} - /> - -
- - • - -
+ {showOtpVerification ? 'Verify Your Email' : 'Email Verification'} + +

+ {showOtpVerification + ? `A verification code has been sent to ${email}` + : 'This chat requires email verification'} +

- )} + + {/* Form */} +
+ {!showOtpVerification ? ( +
{ + e.preventDefault() + handleSendOtp() + }} + className='space-y-8' + > +
+
+
+ +
+ 0 && + 'border-red-500 focus:border-red-500 focus:ring-red-100 focus-visible:ring-red-500' + )} + autoFocus + /> + {showEmailValidationError && emailErrors.length > 0 && ( +
+ {emailErrors.map((error, index) => ( +

{error}

+ ))} +
+ )} +
+
+ + +
+ ) : ( +
+
+

+ Enter the 6-digit code to verify your account. If you don't see it in your + inbox, check your spam folder. +

+ +
+ { + setOtpValue(value) + if (value.length === 6) { + handleVerifyOtp(value) + } + }} + disabled={isVerifyingOtp} + className={cn('gap-2', authError && 'otp-error')} + > + + {[0, 1, 2, 3, 4, 5].map((index) => ( + + ))} + + +
+ + {/* Error message */} + {authError && ( +
+

{authError}

+
+ )} +
+ + + +
+

+ Didn't receive a code?{' '} + {countdown > 0 ? ( + + Resend in{' '} + {countdown}s + + ) : ( + + )} +

+
+ +
+ +
+
+ )} +
+
- -
+
+
) } diff --git a/apps/sim/app/chat/components/auth/password/password-auth.tsx b/apps/sim/app/chat/components/auth/password/password-auth.tsx index 6b65972eae..cf0c2f8dc3 100644 --- a/apps/sim/app/chat/components/auth/password/password-auth.tsx +++ b/apps/sim/app/chat/components/auth/password/password-auth.tsx @@ -1,10 +1,17 @@ 'use client' -import { type KeyboardEvent, useState } from 'react' -import { Loader2 } from 'lucide-react' +import { type KeyboardEvent, useEffect, useState } from 'react' +import { Eye, EyeOff } from 'lucide-react' import { Button } from '@/components/ui/button' -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { createLogger } from '@/lib/logs/console/logger' +import { cn } from '@/lib/utils' +import Nav from '@/app/(landing)/components/nav/nav' +import { inter } from '@/app/fonts/inter' +import { soehne } from '@/app/fonts/soehne/soehne' + +const logger = createLogger('PasswordAuth') interface PasswordAuthProps { subdomain: string @@ -23,6 +30,40 @@ export default function PasswordAuth({ const [password, setPassword] = useState('') const [authError, setAuthError] = useState(null) const [isAuthenticating, setIsAuthenticating] = useState(false) + const [showPassword, setShowPassword] = useState(false) + const [showValidationError, setShowValidationError] = useState(false) + const [passwordErrors, setPasswordErrors] = useState([]) + const [buttonClass, setButtonClass] = useState('auth-button-gradient') + + useEffect(() => { + // Check if CSS variable has been customized + const checkCustomBrand = () => { + const computedStyle = getComputedStyle(document.documentElement) + const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim() + + // Check if the CSS variable exists and is different from the default + if (brandAccent && brandAccent !== '#6f3dfa') { + setButtonClass('auth-button-custom') + } else { + setButtonClass('auth-button-gradient') + } + } + + checkCustomBrand() + + // Also check on window resize or theme changes + window.addEventListener('resize', checkCustomBrand) + const observer = new MutationObserver(checkCustomBrand) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['style', 'class'], + }) + + return () => { + window.removeEventListener('resize', checkCustomBrand) + observer.disconnect() + } + }, []) // Handle keyboard input for auth forms const handleKeyDown = (e: KeyboardEvent) => { @@ -32,10 +73,18 @@ export default function PasswordAuth({ } } + const handlePasswordChange = (e: React.ChangeEvent) => { + const newPassword = e.target.value + setPassword(newPassword) + setShowValidationError(false) + setPasswordErrors([]) + } + // Handle authentication const handleAuthenticate = async () => { if (!password.trim()) { - setAuthError('Password is required') + setPasswordErrors(['Password is required']) + setShowValidationError(true) return } @@ -57,7 +106,8 @@ export default function PasswordAuth({ if (!response.ok) { const errorData = await response.json() - setAuthError(errorData.error || 'Authentication failed') + setPasswordErrors([errorData.error || 'Invalid password. Please try again.']) + setShowValidationError(true) return } @@ -67,118 +117,96 @@ export default function PasswordAuth({ // Reset auth state setPassword('') } catch (error) { - console.error('Authentication error:', error) - setAuthError('An error occurred during authentication') + logger.error('Authentication error:', error) + setPasswordErrors(['An error occurred during authentication']) + setShowValidationError(true) } finally { setIsAuthenticating(false) } } return ( - {}}> - - -
- - + +
+
+
+ {/* Header */} + - {title} - - -
-
-

- This chat is password-protected. Please enter the password to continue. -

-
- - {authError && ( -
- {authError} -
- )} - -
{ - e.preventDefault() - handleAuthenticate() - }} - className='space-y-4' - > -
- setPassword(e.target.value)} - onKeyDown={handleKeyDown} - placeholder='Enter password' - disabled={isAuthenticating} - autoComplete='new-password' - className='w-full' - autoFocus - /> + Password Required + +

+ This chat is password-protected +

- +
+ {showValidationError && passwordErrors.length > 0 && ( +
+ {passwordErrors.map((error, index) => ( +

{error}

+ ))} +
+ )}
- ) : ( - 'Continue' - )} - - +
+ + + +
-
-
+ + ) } diff --git a/apps/sim/app/chat/components/error-state/error-state.tsx b/apps/sim/app/chat/components/error-state/error-state.tsx index b5e1b1795f..f6bba593f6 100644 --- a/apps/sim/app/chat/components/error-state/error-state.tsx +++ b/apps/sim/app/chat/components/error-state/error-state.tsx @@ -1,6 +1,11 @@ 'use client' -import { ChatHeader } from '../' +import { useEffect, useState } from 'react' +import { useRouter } from 'next/navigation' +import { Button } from '@/components/ui/button' +import Nav from '@/app/(landing)/components/nav/nav' +import { inter } from '@/app/fonts/inter' +import { soehne } from '@/app/fonts/soehne/soehne' interface ChatErrorStateProps { error: string @@ -8,54 +13,69 @@ interface ChatErrorStateProps { } export function ChatErrorState({ error, starCount }: ChatErrorStateProps) { + const router = useRouter() + const [buttonClass, setButtonClass] = useState('auth-button-gradient') + + useEffect(() => { + // Check if CSS variable has been customized + const checkCustomBrand = () => { + const computedStyle = getComputedStyle(document.documentElement) + const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim() + + // Check if the CSS variable exists and is different from the default + if (brandAccent && brandAccent !== '#6f3dfa') { + setButtonClass('auth-button-custom') + } else { + setButtonClass('auth-button-gradient') + } + } + + checkCustomBrand() + + // Also check on window resize or theme changes + window.addEventListener('resize', checkCustomBrand) + const observer = new MutationObserver(checkCustomBrand) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['style', 'class'], + }) + + return () => { + window.removeEventListener('resize', checkCustomBrand) + observer.disconnect() + } + }, []) + return ( -
-
-
- - - - - - - - - - - +
+
) diff --git a/apps/sim/app/chat/components/header/header.tsx b/apps/sim/app/chat/components/header/header.tsx index d99f57f9ee..7c7e8b414f 100644 --- a/apps/sim/app/chat/components/header/header.tsx +++ b/apps/sim/app/chat/components/header/header.tsx @@ -1,6 +1,10 @@ 'use client' +import Image from 'next/image' +import Link from 'next/link' import { GithubIcon } from '@/components/icons' +import { useBrandConfig } from '@/lib/branding/branding' +import { inter } from '@/app/fonts/inter' interface ChatHeaderProps { chatConfig: { @@ -16,79 +20,67 @@ interface ChatHeaderProps { } export function ChatHeader({ chatConfig, starCount }: ChatHeaderProps) { + const brand = useBrandConfig() const primaryColor = chatConfig?.customizations?.primaryColor || 'var(--brand-primary-hex)' const customImage = chatConfig?.customizations?.imageUrl || chatConfig?.customizations?.logoUrl return ( -
-
- {customImage && ( - {`${chatConfig?.title - )} -

- {chatConfig?.customizations?.headerText || chatConfig?.title || 'Chat'} -

+
+
+ )} + ) } diff --git a/apps/sim/app/chat/components/loading-state/loading-state.tsx b/apps/sim/app/chat/components/loading-state/loading-state.tsx index 7d99d84814..cc292a7f6b 100644 --- a/apps/sim/app/chat/components/loading-state/loading-state.tsx +++ b/apps/sim/app/chat/components/loading-state/loading-state.tsx @@ -1,11 +1,29 @@ 'use client' +import { Skeleton } from '@/components/ui/skeleton' + export function ChatLoadingState() { return ( -
-
-
-
+
+
+
+
+ {/* Title skeleton */} +
+ + +
+ + {/* Form skeleton */} +
+
+ + +
+ +
+
+
) diff --git a/apps/sim/app/globals.css b/apps/sim/app/globals.css index bef5339c3b..e857c8bce8 100644 --- a/apps/sim/app/globals.css +++ b/apps/sim/app/globals.css @@ -120,11 +120,10 @@ --gradient-secondary: 336 95% 65%; /* More vibrant pink */ /* Brand Colors (Default Sim Theme) */ - --brand-primary-hex: #8357ff; /* Primary brand purple - matches Get Started gradient start */ - --brand-primary-hover-hex: #9266ff; /* Primary brand purple hover - matches Get Started hover */ - --brand-secondary-hex: #6f3dfa; /* Secondary brand purple - matches Get Started gradient end */ + --brand-primary-hex: #6f3dfa; /* Primary brand purple - matches Get Started gradient start */ + --brand-primary-hover-hex: #6338d9; /* Primary brand purple hover - matches Get Started hover */ --brand-accent-hex: #6f3dfa; /* Accent purple for links - matches sign in button */ - --brand-accent-hover-hex: #8357ff; /* Accent purple hover - matches sign in gradient start */ + --brand-accent-hover-hex: #6f3dfa; /* Accent purple hover - matches sign in gradient start */ --brand-background-hex: #ffffff; /* Primary light background */ /* UI Surface Colors */ @@ -193,7 +192,6 @@ /* Brand Colors (Keep dark background for actual dark mode) */ --brand-primary-hex: #701ffc; /* Primary brand purple */ --brand-primary-hover-hex: #802fff; /* Primary brand purple hover */ - --brand-secondary-hex: #6518e6; /* Secondary brand purple */ --brand-accent-hex: #9d54ff; /* Accent purple for links */ --brand-accent-hover-hex: #a66fff; /* Accent purple hover */ --brand-background-hex: #0c0c0c; /* Primary dark background */ @@ -399,10 +397,6 @@ input[type="search"]::-ms-clear { background-color: var(--brand-primary-hover-hex); } - .hover\:bg-brand-secondary:hover { - background-color: var(--brand-secondary-hex); - } - .hover\:text-brand-accent-hover:hover { color: var(--brand-accent-hover-hex); } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/create-chunk-modal/create-chunk-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/create-chunk-modal/create-chunk-modal.tsx index 50d1100c9c..9e8a49bca8 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/create-chunk-modal/create-chunk-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/create-chunk-modal/create-chunk-modal.tsx @@ -192,7 +192,7 @@ export function CreateChunkModal({