From f534c101dd2431352dfab638603828c4f53b272a Mon Sep 17 00:00:00 2001 From: speakeloudest Date: Sun, 27 Jul 2025 00:18:31 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=A6=96=E9=A1=B5=E5=87=BA=E7=89=88?= =?UTF-8?q?=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user/app/(main)/page.tsx | 9 - .../auth/EmailAuthDialog/EmailAuthDialog.tsx | 40 ++++ .../user/app/auth/{page.tsx => auth-page.tsx} | 0 apps/user/app/auth/email/login-form.tsx | 73 ++++-- apps/user/app/auth/email/register-form.tsx | 222 ++++++++++-------- apps/user/app/auth/email/reset-form.tsx | 166 +++++++------ apps/user/app/auth/send-code.tsx | 9 +- .../app/bind/[platform]/certification.tsx | 2 +- .../app/oauth/[platform]/certification.tsx | 2 +- .../components/CustomIcon/icons/close.svg | 3 + apps/user/components/Header/NewHeader.tsx | 66 +++--- apps/user/components/Header/header.tsx | 2 +- apps/user/components/Header/image.png | Bin 6544 -> 4018 bytes apps/user/components/main/FooterCopyright.tsx | 29 ++- apps/user/components/main/HomeContent.tsx | 23 +- .../components/main/OfferDialog/index.tsx | 39 +++ apps/user/components/main/hero.tsx | 2 +- apps/user/locales/zh-CN/auth.json | 2 +- apps/user/utils/common.ts | 2 +- packages/ui/src/components/dialog.tsx | 11 +- 20 files changed, 444 insertions(+), 258 deletions(-) create mode 100644 apps/user/app/auth/EmailAuthDialog/EmailAuthDialog.tsx rename apps/user/app/auth/{page.tsx => auth-page.tsx} (100%) create mode 100644 apps/user/components/CustomIcon/icons/close.svg create mode 100644 apps/user/components/main/OfferDialog/index.tsx diff --git a/apps/user/app/(main)/page.tsx b/apps/user/app/(main)/page.tsx index 45ee755..dbee382 100644 --- a/apps/user/app/(main)/page.tsx +++ b/apps/user/app/(main)/page.tsx @@ -10,7 +10,6 @@ import { redirect } from 'next/navigation'; import FooterCopyright from '@/components/main/FooterCopyright'; import FullScreenVideoBackground from '@/components/main/FullScreenVideoBackground'; import HomeContent from '@/components/main/HomeContent'; -import Image from 'next/image'; export default async function Home() { const Authorization = (await cookies()).get('Authorization')?.value; @@ -39,14 +38,6 @@ export default async function Home() { - logo ); } diff --git a/apps/user/app/auth/EmailAuthDialog/EmailAuthDialog.tsx b/apps/user/app/auth/EmailAuthDialog/EmailAuthDialog.tsx new file mode 100644 index 0000000..3f9e5f0 --- /dev/null +++ b/apps/user/app/auth/EmailAuthDialog/EmailAuthDialog.tsx @@ -0,0 +1,40 @@ +import EmailAuthForm from '@/app/auth/email/auth-form'; +import CloseSvg from '@/components/CustomIcon/icons/close.svg'; +import { Dialog, DialogContent, DialogTitle } from '@workspace/ui/components/dialog'; +import Image from 'next/image'; +import { forwardRef, useImperativeHandle, useState } from 'react'; + +export interface EmailAuthDialogRef { + show: () => void; + hide: () => void; +} + +const EmailAuthDialog = forwardRef((props, ref) => { + const [open, setOpen] = useState(false); + + useImperativeHandle(ref, () => ({ + show: () => setOpen(true), + hide: () => setOpen(false), + })); + + return ( + + } + closeClassName={ + 'right-[40px] top-[30px] font-bold text-black opacity-100 focus:ring-0 focus:ring-offset-0' + } + > + title +
+ +
+
+
+ ); +}); + +export default EmailAuthDialog; diff --git a/apps/user/app/auth/page.tsx b/apps/user/app/auth/auth-page.tsx similarity index 100% rename from apps/user/app/auth/page.tsx rename to apps/user/app/auth/auth-page.tsx diff --git a/apps/user/app/auth/email/login-form.tsx b/apps/user/app/auth/email/login-form.tsx index ece2a19..4bda980 100644 --- a/apps/user/app/auth/email/login-form.tsx +++ b/apps/user/app/auth/email/login-form.tsx @@ -49,15 +49,21 @@ export default function LoginForm({ return ( <> +
账户验证
- + ( - + - + @@ -67,9 +73,14 @@ export default function LoginForm({ control={form.control} name='password' render={({ field }) => ( - + - + @@ -80,7 +91,7 @@ export default function LoginForm({ control={form.control} name='cf_token' render={({ field }) => ( - + @@ -89,27 +100,39 @@ export default function LoginForm({ )} /> )} - +
+ + +
+ +
+ +
-
- - -
); } diff --git a/apps/user/app/auth/email/register-form.tsx b/apps/user/app/auth/email/register-form.tsx index fba20ce..14bf83a 100644 --- a/apps/user/app/auth/email/register-form.tsx +++ b/apps/user/app/auth/email/register-form.tsx @@ -87,132 +87,156 @@ export default function RegisterForm({ return ( <> +
注册账户
+ {auth.register.stop_register ? ( {t('message')} ) : (
- - ( - - - - - - - )} - /> - ( - - - - - - - )} - /> - ( - - - - - - - )} - /> - {auth.email.enable_verify && ( + +
( -
- - -
+
)} /> - )} - ( - - - - - - - )} - /> - {verify.enable_register_verify && ( ( - + )} /> - )} - + ( + + + + + + + )} + /> + {auth.email.enable_verify && ( + ( + + +
+ + +
+
+ +
+ )} + /> + )} + ( + + + + + + + )} + /> + {verify.enable_register_verify && ( + ( + + + + + + + )} + /> + )} +
+ +
+ {t('existingAccount')}  + +
+
+ +
)} -
- {t('existingAccount')}  - -
); } diff --git a/apps/user/app/auth/email/reset-form.tsx b/apps/user/app/auth/email/reset-form.tsx index c5bc9c2..887c563 100644 --- a/apps/user/app/auth/email/reset-form.tsx +++ b/apps/user/app/auth/email/reset-form.tsx @@ -54,92 +54,112 @@ export default function ResetForm({ return ( <> +
找回账户
- - ( - - - - - - - )} - /> - ( - - -
- - -
-
- -
- )} - /> - ( - - - - - - - )} - /> - {verify.enable_reset_password_verify && ( + +
( - + )} /> - )} - + ( + + +
+ + +
+
+ +
+ )} + /> + ( + + + + + + + )} + /> + {verify.enable_reset_password_verify && ( + ( + + + + + + + )} + /> + )} +
+
+ {t('existingAccount')}  + +
+
+ +
-
- {t('existingAccount')}  - -
); } diff --git a/apps/user/app/auth/send-code.tsx b/apps/user/app/auth/send-code.tsx index a9e426d..fcdf987 100644 --- a/apps/user/app/auth/send-code.tsx +++ b/apps/user/app/auth/send-code.tsx @@ -81,7 +81,14 @@ export default function SendCode({ type, params }: SendCodeProps) { (type === 'email' ? !params.email : !params.telephone || !params.telephone_area_code); return ( - ); diff --git a/apps/user/app/bind/[platform]/certification.tsx b/apps/user/app/bind/[platform]/certification.tsx index 7c43d8f..f572d2d 100644 --- a/apps/user/app/bind/[platform]/certification.tsx +++ b/apps/user/app/bind/[platform]/certification.tsx @@ -25,7 +25,7 @@ export default function Certification({ platform, children }: CertificationProps router.refresh(); }) .catch((error) => { - router.replace('/auth'); + router.replace('/'); }); }, [pathname]); diff --git a/apps/user/app/oauth/[platform]/certification.tsx b/apps/user/app/oauth/[platform]/certification.tsx index 5bc0748..b3366ff 100644 --- a/apps/user/app/oauth/[platform]/certification.tsx +++ b/apps/user/app/oauth/[platform]/certification.tsx @@ -30,7 +30,7 @@ export default function Certification({ platform, children }: CertificationProps router.refresh(); }) .catch((error) => { - router.replace('/auth'); + router.replace('/'); }); }, [pathname]); diff --git a/apps/user/components/CustomIcon/icons/close.svg b/apps/user/components/CustomIcon/icons/close.svg new file mode 100644 index 0000000..4bea31a --- /dev/null +++ b/apps/user/components/CustomIcon/icons/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/user/components/Header/NewHeader.tsx b/apps/user/components/Header/NewHeader.tsx index 1f8a8fc..4a2569d 100644 --- a/apps/user/components/Header/NewHeader.tsx +++ b/apps/user/components/Header/NewHeader.tsx @@ -8,44 +8,56 @@ import Image from 'next/legacy/image'; import Link from 'next/link'; import LanguageSwitch from '../language-switch'; // import ThemeSwitch from '../theme-switch'; +import EmailAuthDialog, { EmailAuthDialogRef } from '@/app/auth/EmailAuthDialog/EmailAuthDialog'; +import { useRef } from 'react'; import { UserNav } from '../user-nav'; import ImageLogo from './image.png'; -export default function Header() { +export default function Header(props) { const t = useTranslations('common'); const { user } = useGlobalStore(); const Logo = ( - - logo + + logo ); + + const dialogRef = useRef(null); + return ( -
-
- -
- - {/**/} - - {!user && ( - +
+
+
+ +
+ + {/**/} + + {!user && ( + dialogRef.current?.show()} + className={cn( + buttonVariants({ + size: 'lg', + variant: 'outline', + }), + 'h-full rounded-[50px] border-0 border-[#0F2C53] bg-[#0F2C53] px-5 text-xl font-bold text-white transition hover:bg-[#225BA9] hover:text-white md:px-14 md:text-2xl', + )} + > + {t('login')} + )} - > - {t('login')} - - )} +
+
-
-
+ + {/* 登录注册弹窗 */} + + ); } diff --git a/apps/user/components/Header/header.tsx b/apps/user/components/Header/header.tsx index 19ab244..658df64 100644 --- a/apps/user/components/Header/header.tsx +++ b/apps/user/components/Header/header.tsx @@ -34,7 +34,7 @@ export default function Header() { {!user && ( ^=}e-B4V zL_t(|0qvblZyU!M$Df%cWyMNmDvpg7IfOz1BdMfXIZO+gmaI0hPo_VColjuu z6WIC$R!*|hD3XDmdI&lA0z!VH!<}z>cl86FIWT-O2L|cPUaY6gfNlM$Hdc zlOmTZdAR?1US{SQ0E59`Fc=I5e}lnbFc=I5gTY`h7z_r3!C){L33CA6z6kY9Q9c)J)!z6^W#4ti|5TDsn5fum z%c~hM82SWI!9Z5UM$h6pSsD3?V|lI`R9jCp zf-x9a(^bnsEmI`XpeI%!f3YyZK5RYJ2*zL_C}RecEE5;O;WHS!f-xwu@^CY^{R2#L=3W$x z6+nnQ0E)!j_4C;Q4!>|+`TDCZfV=BYZN^wx2=N(by!_tSNCgs3GcGC(1yp5>FS;B)yz=fy6%t6OL4WR@%Xt{6&$x~_kBvKtzby}Y%=95p zPg7-_eFhFIAGA*4xFg#(yHmh0^gP~lg@f7_6A{zRY)=5lf102`ium+89(jm{MPc#z zqzOm6U?|Jvf_ni?ZIPxIfDRZ`X_^A%#&z5PX@x}MW_GT2+qOCcv$XMDku}zp0 zXk!L)!7#92!KaguY%q1rR_<+V#^R#&Jkmcrap@Lku-Ij`D>AS*Eu9*l`!qL+*`t(# zqQ5Dp<-{Ns=D0K+DCuHpB7|E)(cFZH=~^)4CeRHT)J+H(?44_=6AiWP@Wk955`E@rq+TfVkt8ZXg#eMWT_*Ve1xlL<(+TK+-H0pQuH1q+mR;MD8X8 zA|;~n#R4(8LMRrBS@Mu_NHllXpGM;ObQFyILenM|pA?8DPO;ou-@FAWidnkg)<+wU zL;wGD6by>xPAbLX(-h52(#8{H@&sbKVQKVUe}J3hSX2pDSSyqohY&ebFqE;u8?JM0 z+B6{3&ejSf2x{B7k|#255se}beMo+1%MCT2IdB{%H!(LOM56+rZWt9t6TE_hV>bTq zsPQVzTIO%#V;9yw$(B)DJPw>=@)Cu*Lo3)v@U&+LhcrH zPp^lO0B8^T{Q}GZAgh8m__STo=lYOvp06)YHw&!=KtN2rtcJG5#$9EWGo>;Ee;KVy z&l5^hPHy|9qdjTW6pRk*(kL|)%&K%kS{u$jfFPht6t$Jn)3&hid~JDFrEO_hG4$7% zOII+#wZ*_byA~#34;WQlF8lM3Z!;#YK>&nc+8eSXf!h`qs3QVJXbnCbOGJSx*?>l* zVC0B?fF4lRp^dPJ9W5FQ=$;k!e{H4{A|luvyh;$UcoZOHvYf%0p^QA}d1A=uUE9;h zl2LhoRWJzUmJ`fPQh)?{YJBbjDBldST1go~My_v>C5RMgERLIn05se&H{ZiYU?|Js zkLTLs<(ezt>lZt)@%TsBs=00NP5t~NoI5?(_S!n0xAEl1=FcRg-{*%re_nI!%xf@y z_BH6ly^Uwk3yiS~pb^g{vo3-n*q3||S7{_nE|6=c^t;h2D*vB*g7!&N{U|NL4!DvO z-LXKi%j2!OJjhIr=1#!$=rClhT?;aXH#mu<<_LJW`3k;40T6WKpL=7l<2A_=wO*41 zM8ctiuIJ;wwpXa#AqqOPe`V6b2;mk$0dmEjYg(480%gyz2VYPcr=j5goy&RqKYErn zAO33;Eg)JK9rX$@J9a@Z<+@?;Y4wGCB&#!x7Gh|COCk8ygKl`@U*B%wAKVbjxzi`m z>I_NIeD!R*?Rs?6w_fuPzZ{m2XHRC~tEb!YAbg8N=l}JqVEys-e-Cx)G|Hd>?)mac z3OsB}fJn*IX}XJAi)Nhyga~EFR0k@_x_|~yELyT-bmRIr|Hz;vA9MIfH#=DaUo6B! z?>SiwdcV^(zy7`^pOZks0!RL}We7Qbp=uYS9xwql!pI%O1}TFAuIp;`Z};I?>TRpR zx~x2qu1Fp<;k!v$e~WvM4cBbP75mQf-6yh0o!HuGoHr0|qToDef}_pOg90oG)}@K7 z^tZ@roM9rE()EQV_n|g$d`9*=!}6dBF4WamhNNIQWl$pzVWQX>VV`^-G~l?&pOrk| zSt+%EzFQQtlm~#{4O42=B$aG!xMl78sdq`JHx!O-y$ve3f4mAh;7%Sia?*=OYL32} z`>o*t`Dky~Aw;x&&s<4;YBy)daHY9xvZ!}xD0W5(EWS>``{+m`Blh+8JD>{1DtXMT z(ec~2hU9fAj`_w5{zF1*TDj+oVf<2s#Nj@Ngu$4|^}G{A!a5^AmF#D`=;m(Ci1i93 z3Vw$|@u9Joe}DY%dq@jrLnT8;&U)!yiZQD8EBNxeZ3qHo(7yD>TFwq-<@JB_*6Z-M z|0b@#I}jrnLq~d@igFZ`g7ybJ>G9G#IXSLF!jUry5{}ZQumVKit_e3pi$8FAGHXGI zR6!G5DZ9jym#$RKNcAxmScyv>#DuoFj%wSE(>$!?f7SXrb_=AA!r}UElyoB=fhM?W zI#yP8NeFVzRv(uRQpMYNC>GHSsCC65p)ae;LAZ+Q6WZ5HE93A27!IQfA@S0i2SzF9 z)+zsupBswV+;$*t7#C&G1kEK=vM@NjkeFq!kuNz;69PVikf2nv?FnN1%xiLe3ms$L zA~4E&f3>b_=|rbl%|T(ps)8msSZ*2A$VIu#_s~D0;f@u+a3F$xxXDf5%%j`TAC^-E}+cd7Z-U9I}JvksWq^ zuVDP5W#+d}!*LXB5fl-O-Hc-o7Fp?ryNRmGpIr3bG%2F0d$(mN7;mb+YWguJ>a~@q zf5&A~zjsZ9oT%|dfMYo(QwGg6Qxgo>0;n??caZNll?aP#-ea$)nYI!L(I@_%VEScDcSZs zu^cxm6NYsm+DD6mTN!VQyxIeu1;1tWf5^0Kd!As9kChP%VOSTUO)%2RaHd0K4Mo*1%95EAfU>vQ0YH<~WP!Zh7N3X#6Bf_F?Bmn%BRHRH^oT><(io?&GaO9?{e z&?%xC_Fyq2nD@rcR{AKO!MKG5f7%wLTRP6EmRsa8NKi>wgH9-(!H2Yqriv-#>Dked zNUY_NixBL!<)RTy|8jZ!^lkF}A)QFEgq1=*h^|)cNYTLYn_6*P@O=NYS(?bjLUg^% zjrLhIF-`yCS(<5pB$ff*3oD-(;!{zJh3IKrXv?8>b23@j3zLysgebZB6ZverOE>|PV;0u zm0f_lwEcDgTZZ=2%t2$Lp?vFSnnlqCm9BLk0mnvkSlM1r-fmpS9WR}`=pC@M_M{-U z_NLk8jCymGCAVqQ_f_nr$571*hjuT1@-3Mt_yV~N@${C`5500000 LNkvXXu0mjf6^n$~ literal 6544 zcmV;B8E@u^P)@)P<5r|a0kt0r7h2|_d9VReqGi}l3a$EPr>H5QX!8(& zBpRRr`d|rY?YD|Tn%ap?i!S1#PvshLU)%!Rm{jBBg`2nv0=b5Ul4)IbXHLHF%*<+e z*`3>&%g&x3u-et~aCW&n^FQDDZij(Fp-2p4Vs?{rs6Yf5uqkunojME=#?jN0pz|tl zIAYt}Uw71zlfK76(qqp)VS5EqHr&o>+dc>R5WW6g?ql=5Y{f$Iq-S+g^%ICC%b=6 zmbv$HZo^U{BI}7Ox7Zv5VXcOxGearCRVa$X$oMSk0xW>zXO#>3zR@ziI5KhSn5Nr{ zkygaE-ax%s6ptA{f)havXr&G8LXY2=A-&u2T8y9R);tE1F(yw>a?8F95uN=$D8W?> z6e{p_kCE|H^Y}L{KpHS;GQB(%M<-m1bd`>^wZ1&I=lRY{u|@oz7R1jSD}B@Z8GiRm z8c0OUQf+%JA%P{x!oA4btxdFWSIMViOroz>p-|+SR0WnGtJZ3*Cae!+y_zVvuaY$@ zp0RY-jUZx80%;=ae28!!(nATZLNNfOF0dXQp`DTMnjl!mjbK2lRHN5HFF{pU(VSiK zhDi}wvS2g$5bvP`SE0xubS-A84J5P}WP_xjOapou#;3v3W*omT)OQSlm^eO&R4rIP zRM1SJ$N@qdtp1VueIX0ch857+k1;%dFQCNPB>wOiF3+nFjv3?VsX6n?yV7+E171zi z86e#OdVgrS>g7dfw`<;**dog z*QKy#Jn`I|aw#Yj$si)|PWqESWVv#74kPq|vMI=VG}o7FtYnRK2blccl5MrZTh#$@ z-?Ol|wJu+*M`V#DCof|#2ZMm0d$kv=~i|v7b{@4zRUm9=y~Z-8oi*3rUfT8hfef&ugbr7r*TJVRf(Wuj@Bv39 zQVJIeZ0aU=ZV<`Fd=A>JIa%%16kWm!94BxdrKwOas%~E8JX%;yN)%V$*-pBIb(*(n zQgc82DBppl`@7fBQ1MICiV9U=`3K#^`H-5(hW5#d95s;FqHK^6?bXnKJ2G+VwZuyI z3J!@YRq0W~4HVb8ewI^gaDu$|oy}ex_KXrbXQ||sTlyx&B0$Drva~8Fc7V%|IXqFoMkl{v97Uhx~E+3d%V z6zIqH9h2llz7L_@1w-vB=!dA0Zmk(dPfw}fSZ_qHVN09mZ95k^)~?vrP;?ep$&Rw8f1wk;lW?xo5+MPHZ@$J=ImtlLWk%?0^C=hPMf0f)?kOwFoEJ1kA z&asd_S$!H5{y6Q`E`vfqfkDx0I7ik+9}G%QB%dV|0B7|enmDCXRKsaQR3B`f*m)4h zxM6Zu2SEuevZ5g^w`V{Rl&Uc?JM^Cy1(tGSL4|Vbi8EP^vQ zk=$+t+&?hS`4*%|2zLQH0g7;-1yMBrUQh;IU_Iz>Aa@505M;q>43;1Zf}~Kn+qHmX zgzq^}I-uxVn;L;d7H36e$wpupQ{IFRwg3X_LGF%0aUHlqlbQAH_FAa>jpJI^=7W;3 z+uE66u8|yytm|7;(eh|ihbhxQY??QKK3G4CTMN+E1G!h+ERIUp?r2Vd3k2@HfPc%SEV{4x z_LIdK=^`&s5F-BqfLc+4)3Aqn|Kk6f__sAX z?~TDEZ%1>9;G}UDGNNzbODwyFVX3Q#jK~9)caAieUOt{g*Lt)F7ea0!?MF4%)-sY1 zR=OlQ+j2`Rl@#ps`15TtrS;SYyg1xaKg z>mtXC=n{(HRFXb3cMEB{=%u9a$h3^3AZ>!9)k8^3W^$v?9N0<72xoWNcNQQ+`iiV_ z707`BE2PNEy2wdj&GqG48WDSO(U+tNZKl?&lnGAaw%olSE0Qsu`f^>IS1E7*y&pYA zmU14It3Vb!xlZsIBB`3KK>`aYB9^fvv=UqgSy{8vCb)zJ)`NWG6vzWeXH_RG*p$z! zUi7wP+jb2Ua$wm9NMs{ruQ%HHw^Yt#DH+ROxRc3jD*EEL9Th&?^X$RUi-g;`3G=Bm>TPtVvj0i0`akRx2NU2<Ux?ex6YlBIwKi+%y6#bb{=3{OAx zM=y4LSx@ z+BQTYt&~T`E72Db#jHHcJ3I1Z^S0^V%inkwe)P|au?4o9m!_+D%msMtQF+JQmvU(Z zib*VsE#Fb$Ruf{7M&%c}Gmb!1XjchE>U2a_N|~fYXnFtle_MkjAkj`(XdA_K6_le3 zNs{H15{Nwk+&-8=d2I+Z-ULPJ+_PkJr1La4j}6?O+@B_OshGAece-~ z)NX=8p$LqVT@bh7gd`{^6(-2Fb#q&!WKrS4){QU4bB{gpkPyyizWP+)<4|hY8{dCl zO5p-4XjXv~a^7^vO<`0hq~fMr?WsM;KI z9RSrBn6?GxixY?IkTIpW9hGG9()3iIaX|#O8>;dWmg+a2={t_bJTvuVtcoz6>uM&M zP`+ivsxNNmxA~C9PEaDMVlQv5U#~L8=kILWRr-J4=OX$V8NSK4Ha;hVV1?`2;){QH zxCt4cp)yn<2aq4t4-(8U0^9w2WYPM*hd&;NI1Eek4ZPSQR}SI1pW8N?oI3)d*vSvB zT%TvmUWHg)$})p2?i#b~)i-}~y#g7a;YpuP_n)IO^&Z z8R04zlI9zBtQvSD%N<^OAvPw2d@q5sfCLsNp9L6vDp?7wh9-3dGKMk&{Ge`HL9EeU zP$w?`_Yu7?VR&2xKod$VzjIbQy!L~0?Nw0hfCQ-^0_%Z7%P&I8XgmjLH9^FUL^cj& z&8~ma^c@#fXosp#r_s}!74<0-S$A5e0wSN7!1*^>) zopHu}I()S<()V~%V`SQ*)3p zBjcy$)y~X&xx99r{L_`7<4G(xuH6!1xP8}#F|<^>1(mE;@Bcsj{I(cN;|?Fx_XsaR zKij;12d>_@+d1CTzx#mrnR&|+B1*TG<>dF9x4WP7%@9d74n;oMCS=Uk%`bh&OgvtJ zxP)!^9Tc3YhOf%2++Kp1g$bOod9i6;Mi>*bGYr@QDE4ssV7MTld8-XqKDz}UUELOz zBtgPh)>-E<@iP?I23n*vcE52R+btVD`sFr!_~{p&aSx+V)3^^my(ylf+x6Ry$gcfr zyX!d%@&x&0n~*U<0$Q|}R~)GEj0~aP2h&_%E^6=Co{-CcF|7{qFt}!4HYQ)FK+1>` zT7cApAj1F&r0ELX{Uv9yeE6W_nY?=QZr^dejz>4Yae0MY%9(dd4-$}~JlZ&I34@f^ zMu9UJI)UxL`2~mzF4ei!T1``Eg}_?+D&)LsX^^?=F4@Z^$3pci)mEGL9oGwT83Y-Z zM{rtTnTrHjvR;Fienf3cNaCE7$PT5ez{SlAu0vc>6k22Q^dt)Gn)1VD!(Ds$D(W-| z={QmdlE)gQEg@~f`27oiBXtX#9q3jah8Xl|E`kh5Xxptdwg78MVVGDS+Aqxv#Tt{w4Gsw(yKgClo5n_bfk>#22BX8=bIfQTrYC=E(0ny2wHGJ zLQCS=tKR{ME4c?g{*Tua6Ig-9hu0t51uI!+LE>r%C$Ab>wVQFpmI@vWJch7dbF_b5 z5jlW9S4z`*lH5fSnuYXoO{5{yh+ z9#TKoA3Ygt^+^ItW67UOfwNB2?nfUISp-R?YwbX{mB@m~G-w)6Jh#Yg{u)Tc726t~ zn{}qK_rQh*xwm?)9>fkG?b4(T_6c-jR5>*?QBAc{;n9%;;^skC=SNq+fT&QQ?BTA8 zF!JTzwFdLc?EDpIjhy3c(e^Mie-&A>@BimVp>{POUu$Ci);{1xTpxB?5 zoQ7m9#wrSURXl3zFgh`7f|GjaeEv@V4THDo+~xG$fFfPUEkK0>#Fx0F|37@(iV@@@ zE7;4A9e?;fIQr0i!b0|*8zeeOXJn0_wIC;m5rbF0{ZFwP!K4PWho@ITK!n>Mjp7z3 za79H7RdJ(C0Ts;36t5V8ZdCQvl9)w66=DRr5C)MQnZ0CD|v;I+FdY*5%!K4ESw&oP#5wgENfe)ccsb1Srtt01TQ zRAmh9)XNw@3kroouy2i;xxQSJmj4(L652mK{nz<)9Vk~pU(EG)m$E*86pFmivk=(a zcxORaBpEi4A%Uemz2fYM}6 z18>(^Z|B*lkWkC8ij}J%I7(<09@n;8;=Vi0i;5OVbV-2w^?&W=fL1V(B`BC7+y^CV zOo(kpmMw|o6JL8p_-ca+CZ&W??(LC3Ipc`*)z2U{e0X~mM8R1R0R_WUy4w)bH1CLe zYHLVE22^11wcj5V&;88J9w;h-cSazw#k(3k7F&lfUc&{ziL@JSbXSH^!2uN>Pys?W z>p%Iq({yInP6#BpkNsQ!{lvDu@Yy|~Tv7!HA)!`~#^g-H?R-@MMeaFx8_YXp|8aM1 zr_|LiWsCA?sSoV&-#XMOG9U|<1a{-ITb*%UCV|(CyYu_E$kHtdOSbz8-ELWU%Xj<3 z*tU0;f|~)2t&Qd5pooN1k)zwCj)}Qa4iU z?#NU~3zui#NT&$6=gAngH58i|W_5lrFd6W3Xe2CwVh@~Ki;QViC>G5ZCmyOpiX`UD zD4c~$JJMcxJCT`vSfT6{aekznDv0M}gK6v>)2%Uj51`l=5+e@0P&wgT*QOw4QrQx` z2o^3=Sp|vV3f)rIxiKxh7XewVoKg|lN*KT7uye4b&)q5WBLHrLo&kp2*4Y=wA8bO( zq$0B246fiRS3%P3IX9dD&k4@>WLVJ^yD)RD0UG~+S|pn5N?4xsQ3(L!iuRto*-9&x=2%H_l^r*uUMRvshyz# zOfyhC9pTl$L^B1&fSF)xO(?gTQQJ_)DxNrad+%%7>;ejYG^@N+YVLjtT`QMx^7sIv zu+Q;=g06!Fyj%Fe$NxWLGnUyl?qR^s-PD*>fBxvhnY#IMSw3MLJ&hNWUCWE$;`>;- zvA(RDo+uQG(B!^GEf0blHos7zP$)bGst`C6!9`aAMZiI!P$(iWu={kRCAi8}pin5{ zP>9WtFep+1yEKD=kTV>(RHwXh6(|&nI21x;yOAuo=GMmYVNfU(iii|WWV?wgxXM+a zP$=S3Xp!wEir`WoRBF=)3WY)uk)aXUZn^|_n)fajRIUPrLJ^yx6xnWs;96Q0xOS#n zaH&^;d1ZM96bgkR2175h-E<2s?MSOSG$|B{xcnMIg8b96u81=L0000 -
- {site.site_name} © All rights reserved. -
- - {t('tos')} - - - {t('privacyPolicy')} - +
+ logo +
+ {site.site_name} © All rights reserved. +
+ + {t('tos')} + + + {t('privacyPolicy')} + +
diff --git a/apps/user/components/main/HomeContent.tsx b/apps/user/components/main/HomeContent.tsx index fe0ad8b..6ccca2d 100644 --- a/apps/user/components/main/HomeContent.tsx +++ b/apps/user/components/main/HomeContent.tsx @@ -1,10 +1,16 @@ +'use client'; + import { Button } from '@workspace/ui/components/button'; +import { useRef } from 'react'; +import OfferDialog, { OfferDialogRef } from './OfferDialog/index'; export default function HomeContent() { + const dialogRef = useRef(null); + return (
{/* 大标题 */} -

+

连接
任何时间 @@ -12,19 +18,24 @@ export default function HomeContent() { 任何地点

{/* 副标题 */} -
-

- +

+

+ AiroPort 提供极稳,极简,极速的网络服务

-

获取订阅地址,开始顶级的私密网络体验

+

获取订阅地址,开始顶级的私密网络体验

{/* 按钮 */} - + +
); } diff --git a/apps/user/components/main/OfferDialog/index.tsx b/apps/user/components/main/OfferDialog/index.tsx new file mode 100644 index 0000000..bbba377 --- /dev/null +++ b/apps/user/components/main/OfferDialog/index.tsx @@ -0,0 +1,39 @@ +import CloseSvg from '@/components/CustomIcon/icons/close.svg'; +import { Dialog, DialogContent, DialogTitle } from '@workspace/ui/components/dialog'; +import Image from 'next/image'; +import { forwardRef, useImperativeHandle, useState } from 'react'; + +export interface OfferDialogRef { + show: () => void; + hide: () => void; +} + +const OfferDialog = forwardRef((props, ref) => { + const [open, setOpen] = useState(false); + + useImperativeHandle(ref, () => ({ + show: () => setOpen(true), + hide: () => setOpen(false), + })); + + return ( + + } + closeClassName={ + 'right-[40px] top-[30px] font-bold text-black opacity-100 focus:ring-0 focus:ring-offset-0' + } + > + + 选择套餐 + +
套餐内容
+
+
+ ); +}); + +export default OfferDialog; diff --git a/apps/user/components/main/hero.tsx b/apps/user/components/main/hero.tsx index e4ebdf7..7ab7bf4 100644 --- a/apps/user/components/main/hero.tsx +++ b/apps/user/components/main/hero.tsx @@ -38,7 +38,7 @@ export function Hero() { className='*:text-muted-foreground mb-8 max-w-xl' /> )} - + , React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( +>(({ className, closeClassName, closeIcon, children, ...props }, ref) => ( {children} - - + + {closeIcon || } Close