From d056399b3b90fb87a5adf1ebab769304e2c0a357 Mon Sep 17 00:00:00 2001 From: Kirill Date: Thu, 21 May 2026 14:32:45 +0500 Subject: [PATCH] test commit --- client/src/app/layout/MainLayout.tsx | 4 +++ .../pages/admin-layout/ui/AdminLayoutPage.tsx | 4 +++ client/src/pages/me/ui/MeLayoutPage.tsx | 4 +++ client/src/shared/lib/avatar-styles.ts | 2 +- client/src/shared/ui/ScrollOnNavigate.tsx | 12 +++++++ client/src/shared/ui/ScrollToTop.tsx | 31 ++++++++++++++++++ server/prisma/prisma/dev.db | Bin 364544 -> 364544 bytes 7 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 client/src/shared/ui/ScrollOnNavigate.tsx create mode 100644 client/src/shared/ui/ScrollToTop.tsx diff --git a/client/src/app/layout/MainLayout.tsx b/client/src/app/layout/MainLayout.tsx index 04900e2..00208a0 100644 --- a/client/src/app/layout/MainLayout.tsx +++ b/client/src/app/layout/MainLayout.tsx @@ -10,12 +10,16 @@ import Typography from '@mui/material/Typography' import { Link as RouterLink } from 'react-router-dom' import { AppHeader } from '@/app/layout/AppHeader' import { STORE_EMAIL, STORE_NAME, STORE_PHONE, VK_URL } from '@/shared/config' +import { ScrollOnNavigate } from '@/shared/ui/ScrollOnNavigate' +import { ScrollToTop } from '@/shared/ui/ScrollToTop' export function MainLayout({ children }: PropsWithChildren) { const year = new Date().getFullYear() return ( + + diff --git a/client/src/pages/admin-layout/ui/AdminLayoutPage.tsx b/client/src/pages/admin-layout/ui/AdminLayoutPage.tsx index 90c5cb1..29c1ff5 100644 --- a/client/src/pages/admin-layout/ui/AdminLayoutPage.tsx +++ b/client/src/pages/admin-layout/ui/AdminLayoutPage.tsx @@ -25,6 +25,8 @@ import { AdminProductsPage } from '@/pages/admin-products' import { AdminReviewsPage } from '@/pages/admin-reviews' import { AdminUsersPage } from '@/pages/admin-users' import { $user } from '@/shared/model/auth' +import { ScrollOnNavigate } from '@/shared/ui/ScrollOnNavigate' +import { ScrollToTop } from '@/shared/ui/ScrollToTop' import { AdminNotificationsPage } from './AdminNotificationsPage' type NavItem = { @@ -124,6 +126,8 @@ export function AdminLayoutPage() { return ( + + {isMobile ? ( <> diff --git a/client/src/pages/me/ui/MeLayoutPage.tsx b/client/src/pages/me/ui/MeLayoutPage.tsx index 385a927..9cff739 100644 --- a/client/src/pages/me/ui/MeLayoutPage.tsx +++ b/client/src/pages/me/ui/MeLayoutPage.tsx @@ -26,6 +26,8 @@ import { OrderDetailPage } from '@/pages/me/ui/sections/OrderDetailPage' import { OrdersPage } from '@/pages/me/ui/sections/OrdersPage' import { SettingsPage } from '@/pages/me/ui/sections/SettingsPage' import { $user } from '@/shared/model/auth' +import { ScrollOnNavigate } from '@/shared/ui/ScrollOnNavigate' +import { ScrollToTop } from '@/shared/ui/ScrollToTop' type NavItem = { to: string @@ -128,6 +130,8 @@ export function MeLayoutPage() { return ( + + {isMobile ? ( <> diff --git a/client/src/shared/lib/avatar-styles.ts b/client/src/shared/lib/avatar-styles.ts index a3e3bec..ddd0290 100644 --- a/client/src/shared/lib/avatar-styles.ts +++ b/client/src/shared/lib/avatar-styles.ts @@ -81,7 +81,7 @@ export const AVATAR_STYLES: StyleDef[] = [ }, ] -export const DEFAULT_STYLE_ID = 'bottts' +export const DEFAULT_STYLE_ID = 'avataaars' export function getStyleById(id: string | null | undefined): StyleDef { return AVATAR_STYLES.find((s) => s.id === id) ?? AVATAR_STYLES[0] diff --git a/client/src/shared/ui/ScrollOnNavigate.tsx b/client/src/shared/ui/ScrollOnNavigate.tsx new file mode 100644 index 0000000..3925696 --- /dev/null +++ b/client/src/shared/ui/ScrollOnNavigate.tsx @@ -0,0 +1,12 @@ +import { useEffect } from 'react' +import { useLocation } from 'react-router-dom' + +export function ScrollOnNavigate() { + const { pathname } = useLocation() + + useEffect(() => { + window.scrollTo(0, 0) + }, [pathname]) + + return null +} diff --git a/client/src/shared/ui/ScrollToTop.tsx b/client/src/shared/ui/ScrollToTop.tsx new file mode 100644 index 0000000..4d521fc --- /dev/null +++ b/client/src/shared/ui/ScrollToTop.tsx @@ -0,0 +1,31 @@ +import Fab from '@mui/material/Fab' +import useScrollTrigger from '@mui/material/useScrollTrigger' +import Zoom from '@mui/material/Zoom' +import { ArrowUp } from 'lucide-react' + +export function ScrollToTop() { + const trigger = useScrollTrigger({ threshold: 400, disableHysteresis: true }) + + const handleClick = () => { + window.scrollTo({ top: 0, behavior: 'smooth' }) + } + + return ( + + + + + + ) +} diff --git a/server/prisma/prisma/dev.db b/server/prisma/prisma/dev.db index 01bce42cf6c134bcfbb8aa874ddefdab047c0dc2..10de6af9e72246757d55f061e46b93998eae7136 100644 GIT binary patch delta 11273 zcmbuFS*TstdB=5i&+!!7S1Oj|F&-L`q-O8#c}PhmRVGyui#QLF8$F~tI=b?ebR=1p zxh8q&b|^GY4i0MAFKwzq9||oruCRnnit}PZX)$skRcT1&*m-Hy!KPpeE~LNzf9-Q5 zw{ik5;_SWl8ou=n|8H39>e;hfpFO+v`Fn1AXTydKU*`7(ez$(>6ZO(NFC6%jzqo1R z?Qd>aId%J+=QbyQe|z`!TQ}aaBmMeq+s5PZhUxJq4^NJ*J@ZtOB-3eepPhW-$cd%zZ2Ig!zj$=%JD+{y&Byh8?$6JhdgaWy z(ayhKx%;||Y`k}Q$IWMc=aswu^5SUIjT={fuwmt=D;G9@fBF2a=MFq@!}5Lij?!&Q z|Ce2FxADwR|Kow1Hm+RRu=4K8m2;clzP$30Tb9R5>Yn~b-RQ0}&!4#K{Mn@|D_gER^Za+0Mw{5<)eS4JuDo?_^J6cq zJapgkjwP$MICQ#(bn>-2Kbjn^+v7>`j3qMV^B0${ob0dcSibARXy?Y)R{G1`Xp6S{ zy~j45e{6ZY>E_XB!^+E}(aL*gzWBf=E>s7WUt8XM;o*(9??`uV|Kyf`{ml*I@%{Ih zRzE$t{Q3UR4lEzLscn+&S<*HaJ~~I=3O#2T3bEx#M;x_^GCL4 zS=;nijxG27;~yK}cVj9xqN+c2eEIIKXez$4yqcDEq-AMZ>e=W~wmi#f0@pOcQ;YRW z`PI1^Z8DAYRruLNg*vlYlt%e_l;@Mo6vK1AI*HOci?XB(yKBoV*YoOxtoAl#4s|h> z*HJ3cbrWe(n(A2vo*|{KAc32FS`N+Om!B4~Jn#u?no~fy6U98rYFyN^<#e z4Le>^PR*3snv-d{RAt_+v!IgsSgy}p+6fxf>cXGiBJ23prrDrD5w4>2v_?f+ziMU$ z=E?On$&A{|@@W>VMvpC*X`@zKX4U}>^>~unjC9^Xy&|EhD1&E#j?CsHGxy=Cas5&( zQAbraT|mV;&?ah>;@b0qU9#L3%ZteKvAsz*QQAuWteT{))`sWRO)51D+27hp%~=-Z zGYp*;(-d=x*Q|^(tGSHwX40zZ$DEKkf!%Tz6;a+s=o%Jy*3+mf{Q+sZ@+eQQvp$X5 ziV?^*i^rTcoV8JzPDPLjC{NpiB&nc{j8VkTHv#84(s#iAi7Lq|`61F}YQmWV9Ywtz!4#2p@Dhbar9kk#@26u~s& zkk(|g6t9_vC>kP|*piR2xA?{L)2Ni&F|$qB+JbcU$qe++kQA0fi3DLQf*>(P=?zlM zfl77S`HlRk-6xG$_T#FeTE(F$v)Rd7LJ-@Rh{J63Edkj8_@jRXBSUoX4&}LKMtmZ| z1v>`6jS9Ag3ls!#D6md?<0Y~gdtnrUh^&otDS11$%lNtAPjhP)mHGbdS^w>~M|bou z?HsT4XD^O!?~d1wV`WI1Om#@$ZLH~|D5rX5q9-mKyVP*BRxdy>WP?j8QP4?@2urHS zD{6v%ZLs(`aMzJq8o6*$g_uQ*2o$X{RLYmhsdvtTy+^C;{C;@4TkXsq(oTm+=guK< zm@`xXC{Q9m=`fCPf&D?HaE&n-t0K~dEpA_8Ok~s-D1i^{D7^9#Rsb6iMJ3qEs?1@KGLrbYr;dCD5fP9sNl)QJOd^N8#)#O z8hNJF1D|qJ1sUu)#VI=myeScs)!IW;#Eah6jmE7T?L`Pue?Ui;Q?>93e$`v}gFvNu zrxjkbYYDj7v}8|E1S_6tD?|>l=$EL-&#KcVpkCvEOd_iEX-+%r@s)w3dO8&Hz)fAy z-M_bRq$_G7lNn&Z1#SSpq$|X$wimK2UcfY86iSi+tMPW>NLhO0>byc#ieTykcsvvNxmc;p z6&xs{T1CN285HBFIGvd$fnK!WTU2=IOE}O!1d7sM6^pd=LI+NAIa-hg;Y8}kSM>_j zUjMC2qiy}$-x%N6A2>eV)>R=Ox|k0N3~=K3qDAm%J(JSB1C@J-RKlOfjqbpos$BZu zifoCbLFPa&z!TA#ARX|6Yr_Xw_zGGR+-Bs`ECC_bDjb+E1+W5Uf!yu5t}&OdBIi@V!gTL5b67UBy{6G4LlzDPY6R6>_#{OjqmEkD;KA}sc_VLn zjAjyy_KN!FFOBY8xZBolZ{b^wEK4VaBUpG|tNcd$w?QhaT>DxCHQHGKSUxp=HR0;X z!=T4YtTslRySaN&Q)^Wa>LaK|n`*sgYuMH?1Sk-#ZLib<3FBd}Cd}|nwW^We`dk2N zb3YcsM3wp)QVg0Q*k)0e)|8Fv4bS;h0N@LeAsuo24k)7DWG?YcRxO(Kv<7~n8RB9% ziAnE4Q9~Fc#_OB7=fhq}rEU3&^)3&fUT7o)EPD#zRYJhBGBWFdq@Q4N1~AEy)IGqo zmAk2W1JOEV@~FfgtMmfc))Li2P*bQa7`6TZd0}qokodT#osjdp4@QEJ6q|E|mhdGN zc{$;ZO>_O6E6sRR)~WaJ%^b$dG7GRUVLhxD>02xnJ`m7Qhem8tZ^nn1(vSUl2Gyb% z4Z|vNM7c_W(?mA4QHE4foesx+G_rqhooTD80>Qj3DQ^hzESG1go%`ecrym~Q(tr1N z$M@Z2s6|!Mzi@f&){PM>lR7e}q%* zZ}qpnG5Yw@;}?oIMi;vdHO2O)`FpM;DuD1gYf&-r1%@AssnO84-mW3@ zdenZvB<4Y3o%9{&?L<5JqVI#Y2L5ck%gSE(*nHE}CQUPuD<;>OBQ&OI+~oV(jJ>2q zn}mjGL;$4h|9Izk%MFv&@=(_H4?Z-$w+qRnN#ZJ9Zzg3KyG)(G=ez6e@~T9VX%qWm zPn~H6%TXHpste<5d_DSLLcI}(5j4XEkuEHyiLs^&v0>ft!yXu2nm(=VA5WL+n765v1Y*2L-UP2t=Ye~)!YxgoI9J}zcku>!)HEIR7Is@?%h|RdEqCo zk2WoJ;S`ol!pUIn3f6MSfM!Mga}+IPaDq%=Qs~V-9Eq_skVs{B^xuDP^wG}FNAMKQ zd1wsWETZkTLvwwG!To!kIY0FBps=Wap&M_r|6cgs4@Zw~?B9ERw6m)S9Cid8INjY4 zPMwGFPW86n!v0*v;*S^x^k@)1s%h{`@k;aomP7#BMMJcU2n4&+x`}G-HzwSVkO~dK|KZ<_ZtJ6m#w(pK*itU)qL|AHa-bbQCp2&jz=gynB%Idkm}}iOL@m6Q14-=q zyQFxq=tPguLyq*{3h_nRE<_k(D1)#>VyQ%9fA*z8rf_Zu{BR`_8~Ng$Eqw`<6ROOj z)LN8rmhH+~!fBQ`byFw??pZ8e*|oQIitBSm!TM z*WW!9ydmqyoY62($OJLxL5cudN2V?85{jU3fHlbUFvLMo;U24S?2GGWcQI&EaI+GV zErGKNNE^&{r=ox7aSD(+E7Ck)1dNCJXD*LU+#IU8e~2dizh540-83lt7ncIz4|X{l z=SuKtw^xxD)nG(#cgmEd8z|&^^>;E;nv%@(`+`7rQ=2D?d zMMPJn>Op8w2vVyIv^XshNEA!R`{BI5;an`uQKhySC!Ucr z)9oLH-TyrSlZr{zM$U~F{`B?H=a$0%fXMz|xsg0An=kM}8zH46F?j8e;iO>?%Afjg zUm6|gNr}JQRho$cxEhq|DH~NyVN%_kC{K_T6@JhrXJE;J^%f>xv<_||^M>0GI0Ii2 zj07TPyEh%}}hOjzSllAcB@C>>_T=kq^F|=Z5#f=yEYx zRQZo%H4=K76gcRQ!9jzx7CNLo*CNfi9)0w`MwQkiieKJ zc>G0*Gbpc7-4NCLkNw)X?tk!~)G`z_cl7`E76r{~mqwpbskW=*r0n37OQZH`IcCEp zcFh0Jz)!jB5ma@Ku>Iun=u?JtcGta0jELNJN<BiNdXgA+J6EFtU>RMAPTIc!Jrr=}8C=kKea(Q40Xr%LIZGqi{h16>Xt zSP=7+4wvM2I>QxFM+}l|!Iv<+q|payR5}n4kp`wzf3{de7xqJUt>6{@rx(cAWkaap zhWAzG$i)Fb{GS#%w!BF(oj;?nkGDWaIXDy3oOXx*V_-?3W-dreWCD&+nh&S!ZP0Se zsp7yyA5D)|krjn;^yQltM;4|6z@=IDqG{G5+bIhW7D z3ps-7$m@s|>%a0S?CDQggDRCN!_6L=245zXQ3Hm+MzjrG^e}|I0TYcB{1LH2m-d&* z2uvB}gl&YfoMq`Is)1asqKE~@gH7b54)99HKEi6b7+g#Z{~rfHQ)03l@w6j>gjdJg z(sH2@02}@bQiw9)P{WXzfp@*oh+eoS&mq-Q134&>T#P2_VDltsFbkg?f_}i7Qvm8` zNA!=*nFFw>&cpv%8EU7&BH@qk^RQRwPDasP;fWBfmjXT{bXgIua`6TrFu(!V26O~D qT`A5&dh$2(tKQ;5YdGFQ3KYO`b zF=kW7?8!cB%2=E|v)I(q+6TtsBWL~yx#<(LWmY&=w5FBk_CNTd_|rt!@Z!_c{Yw`>y8mi&ORp$e zdX-|ln=;-t{s2~fZ7d#rVzqdCqN`u;+NADWEzUi!3@$AzmnzLm!>W=-eLp#MkHWthcXabu|dvFBHty4LNa+04xY@0;RM zqzdSO>Q7nWyAF^MYWdtr9uyS2EA zFW8sEQe3FlXKJ@>-@Za_d-zaT53A(J%oI@Ywst6KQ>oRH34otcur)j=K8nSgz8oC`ziH1MrNF4 zd@B=-w{|WU)S+)4KYpC7l)o7)OwL2ok?!bzmFcEph_4 ze$jJ5`-XB?)4rfBH`el!Nj%^533bJ;1%2bsCmzu?@%ZnwwPJih_rptyO#;->?%R&Wo^fJfeDW;yh%G%2BY;C) z=xyRT(D@{R!y}W+0OrK;O^5g>11LGXbDC+uMtJdvlc3~?hY=U0;20M6uFN_(IrU7! z0$ed+ixjkcn350(qoGd%1lH7zK`i&!9vc4rF=vA%71f?3y>}M#BbC2@gd5h*$vIbqEC?aoI|cSU?D4 zCZI6kU|3MRERcve(T<&<1QKxMBqN~SiHMW1;v&8_D&PuDx?rgRz4UwN5S&Ze4jTYQ zdXKnSP%htXR|X6)LnSj(af=Guk6Q7B8i1?-${LXnp)^5cLWo%Gfux+u+AE$tudNcd zEa+>S|NN0|DBrRfR>}+?&+u$itVX36G(~esDQ0jy^nEnn8YjbQGP1>+A8YIPL6Fs>K`yNmwf5O5xZc=89}g3H>2fY_))k_qZ$ z8BVk`z`KcOIH~~t{g(eIPA7rj5g)@nsSjXQF7PDRlAucx9>WxMgG#qV&|?sL5JfaX zXCpI-F%Jrabhk~`VaW+#S_T{wAKkBS5D%Z#MjB-Y4vecDPJ+?_=rSP|+)(0&nRa+3 z=V4eyXaspJw*eSgsyrxJt-2N+5{31{M|^V$t!;jFfyQJD#&V!aibva%s{ zxgfVy- zey)29+VA!Rh0p(RzaHIU!k@ML1h7|p0?0q66`vd%hsts!Zvt2^eJF{yS$E1w@#J}J gpxX^{EcWmNWCU}1bNXYwlhQT(*lT{?(3SMR0W2c