¶Ô±ÈÐÂÎļþ |
| | |
| | | "use client"; |
| | | |
| | | import { useState, useEffect } from 'react'; |
| | | import Image from 'next/image'; |
| | | import { motion } from 'framer-motion'; |
| | | import Link from 'next/link'; |
| | | |
| | | export default function LoginPage() { |
| | | const [email, setEmail] = useState(''); |
| | | const [password, setPassword] = useState(''); |
| | | const [phone, setPhone] = useState(''); |
| | | const [verifyCode, setVerifyCode] = useState(''); |
| | | const [isLoading, setIsLoading] = useState(false); |
| | | const [mounted, setMounted] = useState(false); |
| | | const [loginMethod, setLoginMethod] = useState<'password' | 'sms'>('password'); |
| | | |
| | | // ç¡®ä¿ç»ä»¶æè½½ååæ¾ç¤ºå¨ç»ææ |
| | | useEffect(() => { |
| | | setMounted(true); |
| | | }, []); |
| | | |
| | | const handleSubmit = (e: React.FormEvent) => { |
| | | e.preventDefault(); |
| | | setIsLoading(true); |
| | | |
| | | // 模æç»å½è¯·æ± |
| | | setTimeout(() => { |
| | | setIsLoading(false); |
| | | // è¿éåºè¯¥æ·»å å®é
ç»å½é»è¾ |
| | | }, 2000); |
| | | }; |
| | | |
| | | return ( |
| | | <div className="h-screen w-full flex items-center justify-center relative overflow-hidden"> |
| | | {/* èæ¯ææ */} |
| | | <div className="fixed inset-0 bg-gradient-to-br from-[#0A1033] via-[#1E2B63] to-[#131C41] z-0"></div> |
| | | |
| | | {/* ç¥ç»ç½ç»çº¿æ¡èæ¯ */} |
| | | <div className="fixed inset-0 z-0 opacity-30"> |
| | | <div className="absolute top-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/70 to-transparent"></div> |
| | | <div className="absolute bottom-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/70 to-transparent"></div> |
| | | <div className="absolute top-0 bottom-0 left-0 w-[1px] bg-gradient-to-b from-transparent via-[#6ADBFF]/70 to-transparent"></div> |
| | | <div className="absolute top-0 bottom-0 right-0 w-[1px] bg-gradient-to-b from-transparent via-[#6ADBFF]/70 to-transparent"></div> |
| | | |
| | | {/* ç¥ç»ç½ç»è¿æ¥ç¹ - åå°æ°é */} |
| | | <div className="absolute top-[20%] left-[15%] w-1.5 h-1.5 rounded-full bg-[#6ADBFF]/80 animate-pulse"></div> |
| | | <div className="absolute top-[60%] left-[75%] w-1.5 h-1.5 rounded-full bg-[#6ADBFF]/80 animate-pulse" style={{ animationDelay: '1.5s' }}></div> |
| | | |
| | | {/* è¿æ¥çº¿ - åå°æ°é */} |
| | | <div className="absolute top-[20%] left-[15%] w-[70%] h-[1px] bg-gradient-to-r from-[#6ADBFF]/80 to-transparent animate-pulse"></div> |
| | | |
| | | {/* æ°æ®ç¹èæ¯ */} |
| | | <div className="absolute inset-0" style={{ |
| | | backgroundImage: 'radial-gradient(circle, rgba(106, 219, 255, 0.15) 1px, transparent 1px)', |
| | | backgroundSize: '20px 20px' |
| | | }}></div> |
| | | |
| | | {/* æ«æçº¿ */} |
| | | <div className="absolute inset-0"> |
| | | <div className="absolute top-0 left-0 w-full h-full bg-gradient-to-b from-transparent via-[#6ADBFF]/5 to-transparent animate-scanline" style={{ animationDuration: '12s' }}></div> |
| | | </div> |
| | | </div> |
| | | |
| | | {/* ç»å½å¡ç - å·¦å³ç»æ */} |
| | | <motion.div |
| | | initial={{ opacity: 0, y: 20 }} |
| | | animate={{ opacity: mounted ? 1 : 0, y: mounted ? 0 : 20 }} |
| | | transition={{ duration: 0.8, ease: "easeOut" }} |
| | | className="relative z-10 w-full max-w-3xl flex rounded-2xl backdrop-blur-lg bg-[#1E2B63]/40 border border-[#6ADBFF]/20 shadow-xl overflow-hidden" |
| | | > |
| | | {/* å¡çå
é¨è£
饰 */} |
| | | <div className="absolute top-0 left-0 w-full h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/50 to-transparent"></div> |
| | | <div className="absolute top-0 bottom-0 right-0 w-[1px] bg-gradient-to-b from-transparent via-[#6ADBFF]/50 to-transparent"></div> |
| | | <div className="absolute bottom-0 left-0 w-full h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/50 to-transparent"></div> |
| | | <div className="absolute top-0 bottom-0 left-0 w-[1px] bg-gradient-to-b from-transparent via-[#6ADBFF]/50 to-transparent"></div> |
| | | |
| | | {/* 左侧Logoåå
¬å¸å - æ°´å¹³æå */} |
| | | <div className="w-2/5 bg-[#131C41]/60 p-8 flex flex-col items-center justify-between"> |
| | | {/* Logoåå
¬å¸åé¨å - 缩çä¸äºç»´ç çè·ç¦» */} |
| | | <div className="w-full flex flex-col items-center justify-start"> |
| | | <div className="mb-4 relative overflow-visible"> |
| | | <Link href="/" className="group flex items-center relative"> |
| | | <div className="relative w-16 h-16 transition-all duration-500 overflow-visible" style={{ isolation: 'isolate' }}> |
| | | {/* åºç¡èæ¯å */} |
| | | <div className="absolute inset-0 rounded-full bg-[#131C41] z-10"></div> |
| | | |
| | | {/* Logoèæ¯å
ç¯ - éå¶èå´ */} |
| | | <div className="absolute inset-0 rounded-full border-2 border-[#6ADBFF]/70 animate-logo-pulse z-10"></div> |
| | | |
| | | {/* åºå±å
æææ */} |
| | | <div className="absolute -inset-2 rounded-full bg-[#6ADBFF]/10 blur-lg animate-pulse z-0"></div> |
| | | |
| | | {/* Logo - æé«å±çº§ */} |
| | | <Image |
| | | src="/images/logo.jpg" |
| | | alt="帷å¹åæLogo" |
| | | width={64} |
| | | height={64} |
| | | className="rounded-full object-cover relative z-30" |
| | | style={{ display: 'block', objectFit: 'cover', width: '100%', height: '100%' }} |
| | | priority |
| | | /> |
| | | |
| | | {/* æ¬åç¹æå®¹å¨ - å¨Logoä¸å± */} |
| | | <div className="absolute inset-0 rounded-full z-20 overflow-hidden pointer-events-none"> |
| | | {/* æ¬åæ¶çæ«æçº¿ - ç§ææ */} |
| | | <div className="absolute inset-0 rounded-full overflow-hidden opacity-0 group-hover:opacity-100 transition-opacity duration-500"> |
| | | <div className="absolute top-0 -left-[100%] right-0 h-[2px] group-hover:left-full w-full bg-gradient-to-r from-transparent via-[#6ADBFF] to-transparent transition-all duration-1500 ease-in-out"></div> |
| | | <div className="absolute bottom-0 left-full right-0 h-[2px] group-hover:left-[-100%] w-full bg-gradient-to-r from-transparent via-[#6ADBFF] to-transparent transition-all duration-1500 ease-in-out delay-200"></div> |
| | | </div> |
| | | |
| | | {/* æ¬åæ¶çéåæ°æ®æµææ */} |
| | | <div className="absolute inset-0 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-500"> |
| | | <div className="w-[1px] h-0 group-hover:h-full bg-gradient-to-b from-transparent via-[#6ADBFF]/70 to-transparent transition-all duration-700 delay-300"></div> |
| | | <div className="h-[1px] w-0 group-hover:w-full bg-gradient-to-r from-transparent via-[#6ADBFF]/70 to-transparent transition-all duration-700 delay-400"></div> |
| | | </div> |
| | | </div> |
| | | |
| | | {/* æ¬åæ¶åºç°å¨èæ¯çæ©æ£ææ - éå¶å¨Logo */} |
| | | <div className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-700 z-0"> |
| | | <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-0 h-0 group-hover:w-[120%] group-hover:h-[120%] rounded-full bg-gradient-to-r from-[#6ADBFF]/0 via-[#6ADBFF]/5 to-[#6ADBFF]/0 transition-all duration-1000 blur-md"></div> |
| | | </div> |
| | | |
| | | {/* é¢å¤é´å½±ææå¢å¼ºè§è§å离 */} |
| | | <div className="absolute -inset-1 rounded-full opacity-0 group-hover:opacity-100 shadow-[0_0_15px_rgba(106,219,255,0.3)] transition-opacity duration-500 z-5"></div> |
| | | </div> |
| | | |
| | | <div className="ml-4 relative z-0 transition-transform duration-500"> |
| | | <h1 className="text-2xl font-bold text-white mb-1 relative inline-block group-hover:text-[#6ADBFF] transition-colors duration-500"> |
| | | 帷å¹åæ |
| | | <span className="absolute -bottom-1 left-0 w-full h-[2px] bg-gradient-to-r from-[#FF6A88] to-[#6ADBFF] group-hover:animate-pulse"></span> |
| | | |
| | | {/* æ¬åæ¶çåä½å
æ */} |
| | | <span className="absolute inset-0 bg-gradient-to-r from-transparent via-[#6ADBFF]/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-700 blur-sm"></span> |
| | | </h1> |
| | | |
| | | <p className="text-[#6ADBFF]/80 text-xs group-hover:text-[#6ADBFF] transition-colors duration-500">æ°ååå·¥å¹³å° Â· æºæ
§èµè½æªæ¥</p> |
| | | |
| | | {/* æ¬åæ¶åºç°çå¾®ç²å - åååå¸å¨å¨å´ */} |
| | | <div className="absolute -right-2 top-1/2 w-1 h-1 rounded-full bg-[#6ADBFF] opacity-0 group-hover:opacity-100 transition-all duration-700 delay-300 group-hover:animate-float"></div> |
| | | <div className="absolute right-0 bottom-0 w-[3px] h-[3px] rounded-full bg-[#FF6A88] opacity-0 group-hover:opacity-100 transition-all duration-700 delay-500 group-hover:animate-float"></div> |
| | | <div className="absolute -left-1 top-0 w-[2px] h-[2px] rounded-full bg-[#6ADBFF] opacity-0 group-hover:opacity-100 transition-all duration-700 delay-400 group-hover:animate-float"></div> |
| | | <div className="absolute left-1/2 -top-2 w-[1.5px] h-[1.5px] rounded-full bg-[#6ADBFF]/80 opacity-0 group-hover:opacity-100 transition-all duration-700 delay-200 group-hover:animate-float"></div> |
| | | <div className="absolute right-1/4 -bottom-1 w-[1px] h-[1px] rounded-full bg-[#FF6A88]/80 opacity-0 group-hover:opacity-100 transition-all duration-700 delay-350 group-hover:animate-float"></div> |
| | | </div> |
| | | </Link> |
| | | </div> |
| | | |
| | | {/* åé线 - åå°ä¸ä¸è¾¹è· */} |
| | | <div className="w-full border-t border-[#6ADBFF]/20 my-3"></div> |
| | | </div> |
| | | |
| | | {/* äºç»´ç ç»å½çé¢ - ç§»å¨ä¸ç§»ï¼ä¸Logoæ´å æ¥è¿ */} |
| | | <div className="w-full" style={{ position: 'relative', isolation: 'isolate' }}> |
| | | <div className="relative" style={{ zIndex: 30 }}> |
| | | <p className="text-center text-[#6ADBFF]/90 text-xs mb-3">æ«ç ç»å½</p> |
| | | <div className="border-4 border-[#6ADBFF]/30 rounded-md p-1 bg-white mx-auto" style={{ width: '140px', height: '140px', position: 'relative' }}> |
| | | <div className="bg-white h-full w-full relative flex items-center justify-center"> |
| | | <div className="text-xs absolute top-0 right-0 left-0 bottom-0 flex items-center justify-center text-center text-black/60"> |
| | | è¿éå°æ¾ç¤ºäºç»´ç <br/>请ç¨APPæ«æç»å½ |
| | | </div> |
| | | {/* æ«æçº¿å¨ç» */} |
| | | <div className="absolute left-0 right-0 top-1/2 h-[2px] bg-[#6ADBFF]/70 rounded animate-scanline"></div> |
| | | </div> |
| | | </div> |
| | | <p className="text-xs text-white/70 text-center mt-3"> |
| | | 请使ç¨å¸·å¹åæAPP<br/>æ«æäºç»´ç ç»å½ |
| | | </p> |
| | | </div> |
| | | </div> |
| | | |
| | | {/* 左侧è£
é¥°ç¹ */} |
| | | <div className="absolute bottom-4 left-4"> |
| | | <div className="relative w-2 h-2"> |
| | | <div className="absolute inset-0 rounded-full bg-[#6ADBFF]/30 animate-pulse"></div> |
| | | <div className="absolute inset-[2px] rounded-full bg-[#6ADBFF]/50"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | {/* å³ä¾§ç»å½è¡¨å */} |
| | | <div className="w-3/5 p-8"> |
| | | <div className="mb-6"> |
| | | <div className="flex space-x-1 overflow-hidden bg-[#131C41]/40 p-1 rounded-full w-fit"> |
| | | <button |
| | | className={`text-xs px-5 py-1.5 rounded-full relative transition-all duration-300 ${ |
| | | loginMethod === 'password' |
| | | ? 'text-white' |
| | | : 'text-[#6ADBFF]/60 hover:text-[#6ADBFF]/80' |
| | | }`} |
| | | onClick={() => setLoginMethod('password')} |
| | | > |
| | | å¯ç ç»å½ |
| | | {loginMethod === 'password' && ( |
| | | <motion.div |
| | | layoutId="loginTab" |
| | | className="absolute inset-0 bg-gradient-to-r from-[#131C41] to-[#1E2B63] rounded-full border border-[#6ADBFF]/30 -z-10" |
| | | initial={false} |
| | | transition={{ type: "spring", duration: 0.5 }} |
| | | > |
| | | <div className="absolute inset-0 overflow-hidden rounded-full"> |
| | | {/* ç§»é¤æ¨ªçº¿ç©¿è¿ææï¼æ·»å è¾¹ç¼æµå¨çè¾å
ææ */} |
| | | <div className="absolute inset-0 bg-[#6ADBFF]/5"></div> |
| | | <div className="absolute -inset-0.5 rounded-full opacity-60 blur-sm bg-gradient-to-r from-[#6ADBFF]/0 via-[#6ADBFF]/30 to-[#6ADBFF]/0 animate-pulse"></div> |
| | | <div className="absolute top-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/40 to-transparent"></div> |
| | | <div className="absolute bottom-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/40 to-transparent"></div> |
| | | </div> |
| | | </motion.div> |
| | | )} |
| | | </button> |
| | | <button |
| | | className={`text-xs px-5 py-1.5 rounded-full relative transition-all duration-300 ${ |
| | | loginMethod === 'sms' |
| | | ? 'text-white' |
| | | : 'text-[#6ADBFF]/60 hover:text-[#6ADBFF]/80' |
| | | }`} |
| | | onClick={() => setLoginMethod('sms')} |
| | | > |
| | | çä¿¡ç»å½ |
| | | {loginMethod === 'sms' && ( |
| | | <motion.div |
| | | layoutId="loginTab" |
| | | className="absolute inset-0 bg-gradient-to-r from-[#131C41] to-[#1E2B63] rounded-full border border-[#6ADBFF]/30 -z-10" |
| | | initial={false} |
| | | transition={{ type: "spring", duration: 0.5 }} |
| | | > |
| | | <div className="absolute inset-0 overflow-hidden rounded-full"> |
| | | {/* ç§»é¤æ¨ªçº¿ç©¿è¿ææï¼æ·»å è¾¹ç¼æµå¨çè¾å
ææ */} |
| | | <div className="absolute inset-0 bg-[#6ADBFF]/5"></div> |
| | | <div className="absolute -inset-0.5 rounded-full opacity-60 blur-sm bg-gradient-to-r from-[#6ADBFF]/0 via-[#6ADBFF]/30 to-[#6ADBFF]/0 animate-pulse"></div> |
| | | <div className="absolute top-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/40 to-transparent"></div> |
| | | <div className="absolute bottom-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/40 to-transparent"></div> |
| | | </div> |
| | | </motion.div> |
| | | )} |
| | | </button> |
| | | </div> |
| | | </div> |
| | | |
| | | {/* è´¦å·ç»å½è¡¨å */} |
| | | <form onSubmit={handleSubmit} className="space-y-4"> |
| | | <div className="space-y-3"> |
| | | {loginMethod === 'password' ? ( |
| | | <> |
| | | <motion.div |
| | | className="relative group" |
| | | initial={{ opacity: 0, x: -20 }} |
| | | animate={{ opacity: 1, x: 0 }} |
| | | exit={{ opacity: 0, x: 20 }} |
| | | transition={{ duration: 0.3 }} |
| | | > |
| | | <input |
| | | id="email" |
| | | name="email" |
| | | type="text" |
| | | autoComplete="email" |
| | | required |
| | | value={email} |
| | | onChange={(e) => setEmail(e.target.value)} |
| | | className="block w-full px-4 py-2 bg-[#131C41]/80 border border-[#6ADBFF]/30 rounded-md focus:outline-none focus:ring-1 focus:ring-[#6ADBFF]/60 focus:border-[#6ADBFF]/60 text-white text-xs placeholder-[#6ADBFF]/50 transition-all duration-300" |
| | | placeholder="è´¦å·å/ææºå·/é®ç®±" |
| | | /> |
| | | |
| | | {/* è¾å
¥èç¦ææ */} |
| | | <div className="absolute bottom-0 left-0 w-full h-[1px] bg-gradient-to-r from-[#6ADBFF] to-transparent scale-x-0 origin-left transition-transform duration-300 ease-out group-focus-within:scale-x-100"></div> |
| | | </motion.div> |
| | | |
| | | <motion.div |
| | | className="relative group" |
| | | initial={{ opacity: 0, x: -20 }} |
| | | animate={{ opacity: 1, x: 0 }} |
| | | exit={{ opacity: 0, x: 20 }} |
| | | transition={{ duration: 0.3, delay: 0.1 }} |
| | | > |
| | | <input |
| | | id="password" |
| | | name="password" |
| | | type="password" |
| | | autoComplete="current-password" |
| | | required |
| | | value={password} |
| | | onChange={(e) => setPassword(e.target.value)} |
| | | className="block w-full px-4 py-2 bg-[#131C41]/80 border border-[#6ADBFF]/30 rounded-md focus:outline-none focus:ring-1 focus:ring-[#6ADBFF]/60 focus:border-[#6ADBFF]/60 text-white text-xs placeholder-[#6ADBFF]/50 transition-all duration-300" |
| | | placeholder="å¯ç " |
| | | /> |
| | | |
| | | {/* è¾å
¥èç¦ææ */} |
| | | <div className="absolute bottom-0 left-0 w-full h-[1px] bg-gradient-to-r from-[#6ADBFF] to-transparent scale-x-0 origin-left transition-transform duration-300 ease-out group-focus-within:scale-x-100"></div> |
| | | </motion.div> |
| | | </> |
| | | ) : ( |
| | | <> |
| | | <motion.div |
| | | className="relative group" |
| | | initial={{ opacity: 0, x: 20 }} |
| | | animate={{ opacity: 1, x: 0 }} |
| | | exit={{ opacity: 0, x: -20 }} |
| | | transition={{ duration: 0.3 }} |
| | | > |
| | | <input |
| | | id="phone" |
| | | name="phone" |
| | | type="text" |
| | | required |
| | | value={phone} |
| | | onChange={(e) => setPhone(e.target.value)} |
| | | className="block w-full px-4 py-2 bg-[#131C41]/80 border border-[#6ADBFF]/30 rounded-md focus:outline-none focus:ring-1 focus:ring-[#6ADBFF]/60 focus:border-[#6ADBFF]/60 text-white text-xs placeholder-[#6ADBFF]/50 transition-all duration-300" |
| | | placeholder="ææºå·" |
| | | /> |
| | | |
| | | {/* è¾å
¥èç¦ææ */} |
| | | <div className="absolute bottom-0 left-0 w-full h-[1px] bg-gradient-to-r from-[#6ADBFF] to-transparent scale-x-0 origin-left transition-transform duration-300 ease-out group-focus-within:scale-x-100"></div> |
| | | </motion.div> |
| | | |
| | | <motion.div |
| | | className="relative group flex" |
| | | initial={{ opacity: 0, x: 20 }} |
| | | animate={{ opacity: 1, x: 0 }} |
| | | exit={{ opacity: 0, x: -20 }} |
| | | transition={{ duration: 0.3, delay: 0.1 }} |
| | | > |
| | | <input |
| | | id="verifyCode" |
| | | name="verifyCode" |
| | | type="text" |
| | | required |
| | | value={verifyCode} |
| | | onChange={(e) => setVerifyCode(e.target.value)} |
| | | className="block w-full px-4 py-2 bg-[#131C41]/80 border border-[#6ADBFF]/30 rounded-md focus:outline-none focus:ring-1 focus:ring-[#6ADBFF]/60 focus:border-[#6ADBFF]/60 text-white text-xs placeholder-[#6ADBFF]/50 transition-all duration-300" |
| | | placeholder="éªè¯ç " |
| | | /> |
| | | |
| | | <button |
| | | type="button" |
| | | className="ml-2 px-3 py-2 text-xs text-[#6ADBFF] bg-[#131C41]/80 border border-[#6ADBFF]/30 rounded-md hover:bg-[#131C41] hover:border-[#6ADBFF]/60 transition-all duration-300 whitespace-nowrap" |
| | | > |
| | | è·åéªè¯ç |
| | | </button> |
| | | |
| | | {/* è¾å
¥èç¦ææ */} |
| | | <div className="absolute bottom-0 left-0 w-[calc(100%-4rem)] h-[1px] bg-gradient-to-r from-[#6ADBFF] to-transparent scale-x-0 origin-left transition-transform duration-300 ease-out group-focus-within:scale-x-100"></div> |
| | | </motion.div> |
| | | </> |
| | | )} |
| | | </div> |
| | | |
| | | <div className="flex items-center justify-between text-xs"> |
| | | <div className="flex items-center"> |
| | | <div className="relative"> |
| | | <input |
| | | id="remember-me" |
| | | name="remember-me" |
| | | type="checkbox" |
| | | className="h-3 w-3 bg-[#131C41] border-[#6ADBFF]/50 rounded focus:ring-[#6ADBFF]/30 transition-all duration-200 cursor-pointer" |
| | | /> |
| | | <div className="absolute inset-0 bg-[#6ADBFF]/10 rounded pointer-events-none opacity-0 peer-checked:opacity-100 transition-opacity duration-200"></div> |
| | | </div> |
| | | <label htmlFor="remember-me" className="ml-2 block text-xs text-white/80 cursor-pointer select-none"> |
| | | è®°ä½æ |
| | | </label> |
| | | </div> |
| | | <div className="text-xs"> |
| | | <a href="#" className="text-[#6ADBFF] hover:text-[#6ADBFF]/80 transition-colors duration-200"> |
| | | å¿è®°å¯ç ? |
| | | </a> |
| | | </div> |
| | | </div> |
| | | |
| | | <div> |
| | | <button |
| | | type="submit" |
| | | disabled={isLoading} |
| | | className="relative w-full py-2 px-4 rounded-full overflow-hidden border border-[#6ADBFF]/40 bg-gradient-to-r from-[#131C41] to-[#1E2B63] hover:border-[#6ADBFF]/70 transition-all duration-300 group quantum-button" |
| | | > |
| | | {/* ç»å½æé®å
é¨ç»æ */} |
| | | <div className="relative z-10 flex items-center justify-center quantum-pulse"> |
| | | {isLoading ? ( |
| | | <> |
| | | <div className="w-3 h-3 border-2 border-white/80 border-t-transparent rounded-full animate-spin"></div> |
| | | <span className="ml-2 text-xs text-white">ç»å½ä¸...</span> |
| | | </> |
| | | ) : ( |
| | | <span className="text-xs text-white group-hover:text-[#6ADBFF] transition-colors duration-300">ç»å½</span> |
| | | )} |
| | | </div> |
| | | |
| | | {/* éåå
çº¿ææ */} |
| | | <div className="absolute inset-0 overflow-hidden"> |
| | | {/* åºå±è¾å
ææ */} |
| | | <div className="absolute inset-0 opacity-0 group-hover:opacity-30 transition-opacity duration-500 bg-gradient-to-r from-[#6ADBFF]/20 to-[#6ADBFF]/40"></div> |
| | | |
| | | {/* éåæ«æçº¿ */} |
| | | <div className="absolute top-[45%] -left-10 h-[1px] w-[120%] bg-gradient-to-r from-transparent via-[#6ADBFF] to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300 quantum-scan-line"></div> |
| | | |
| | | {/* éåæ°æ®æµ - ç®å */} |
| | | <div className="absolute top-0 h-full w-full"> |
| | | <div className="absolute left-[50%] top-0 bottom-0 w-[1px] bg-gradient-to-b from-transparent via-[#6ADBFF]/30 to-transparent transform scale-y-0 group-hover:scale-y-100 transition-transform duration-700 ease-out"></div> |
| | | </div> |
| | | |
| | | {/* éåè¾¹ç¼ææ */} |
| | | <div className="absolute bottom-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF] to-transparent transform scale-x-0 group-hover:scale-x-100 transition-transform duration-700 ease-out"></div> |
| | | </div> |
| | | </button> |
| | | </div> |
| | | </form> |
| | | |
| | | {/* åå²çº¿ */} |
| | | <div className="mt-6 relative"> |
| | | <div className="absolute inset-0 flex items-center"> |
| | | <div className="w-full border-t border-[#6ADBFF]/20"></div> |
| | | </div> |
| | | <div className="relative flex justify-center text-xs"> |
| | | <span className="px-3 bg-[#1E2B63]/40 text-[#6ADBFF]/70">å
¶ä»æ¹å¼</span> |
| | | </div> |
| | | </div> |
| | | |
| | | {/* 社交ç»å½ - ç®å */} |
| | | <div className="mt-4 flex justify-center space-x-6"> |
| | | <button className="inline-flex justify-center items-center w-8 h-8 border border-[#6ADBFF]/30 rounded-full bg-[#131C41]/60 hover:bg-[#131C41] hover:border-[#6ADBFF]/60 hover:text-[#6ADBFF] transition-all duration-300 group"> |
| | | <svg className="w-4 h-4 text-[#6ADBFF]/70 group-hover:text-[#6ADBFF] transition-colors duration-300" fill="currentColor" viewBox="0 0 24 24"> |
| | | <path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" /> |
| | | </svg> |
| | | </button> |
| | | <button className="inline-flex justify-center items-center w-8 h-8 border border-[#6ADBFF]/30 rounded-full bg-[#131C41]/60 hover:bg-[#131C41] hover:border-[#6ADBFF]/60 hover:text-[#6ADBFF] transition-all duration-300 group"> |
| | | <svg className="w-4 h-4 text-[#6ADBFF]/70 group-hover:text-[#6ADBFF] transition-colors duration-300" fill="currentColor" viewBox="0 0 24 24"> |
| | | <path d="M12 0C5.373 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.6.11.819-.26.819-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.387-1.332-1.756-1.332-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.418-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.468-2.38 1.235-3.22-.123-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.3 1.23A11.51 11.51 0 0112 5.803c1.02.005 2.046.138 3.005.404 2.29-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.91 1.235 3.22 0 4.61-2.805 5.625-5.475 5.92.43.372.824 1.102.824 2.222 0 1.605-.015 2.896-.015 3.286 0 .32.217.694.825.577C20.565 21.795 24 17.298 24 12c0-6.627-5.373-12-12-12z" /> |
| | | </svg> |
| | | </button> |
| | | <button className="inline-flex justify-center items-center w-8 h-8 border border-[#6ADBFF]/30 rounded-full bg-[#131C41]/60 hover:bg-[#131C41] hover:border-[#6ADBFF]/60 hover:text-[#6ADBFF] transition-all duration-300 group"> |
| | | <svg className="w-4 h-4 text-[#6ADBFF]/70 group-hover:text-[#6ADBFF] transition-colors duration-300" fill="currentColor" viewBox="0 0 24 24"> |
| | | <path d="M12 2C6.48 2 2 6.48 2 12C2 16.42 4.87 20.17 8.84 21.5C9.34 21.58 9.5 21.27 9.5 21C9.5 20.77 9.5 20.14 9.5 19.31C6.73 19.91 6.14 17.97 6.14 17.97C5.68 16.81 5.03 16.5 5.03 16.5C4.12 15.88 5.1 15.9 5.1 15.9C6.1 15.97 6.63 16.93 6.63 16.93C7.5 18.45 8.97 18 9.54 17.76C9.63 17.11 9.89 16.67 10.17 16.42C7.95 16.17 5.62 15.31 5.62 11.5C5.62 10.39 6 9.5 6.65 8.79C6.55 8.54 6.2 7.5 6.75 6.15C6.75 6.15 7.59 5.88 9.5 7.17C10.29 6.95 11.15 6.84 12 6.84C12.85 6.84 13.71 6.95 14.5 7.17C16.41 5.88 17.25 6.15 17.25 6.15C17.8 7.5 17.45 8.54 17.35 8.79C18 9.5 18.38 10.39 18.38 11.5C18.38 15.32 16.04 16.16 13.81 16.41C14.17 16.72 14.5 17.33 14.5 18.26C14.5 19.6 14.5 20.68 14.5 21C14.5 21.27 14.66 21.59 15.17 21.5C19.14 20.16 22 16.42 22 12C22 6.48 17.52 2 12 2Z" /> |
| | | </svg> |
| | | </button> |
| | | </div> |
| | | |
| | | {/* 注å龿¥ */} |
| | | <div className="mt-4 text-center"> |
| | | <p className="text-xs text-white/70"> |
| | | è¿æ²¡æå¸å·? |
| | | <motion.a |
| | | href="#" |
| | | className="ml-1 text-[#6ADBFF] hover:text-[#6ADBFF] transition-colors duration-200 relative group" |
| | | whileHover={{ scale: 1.03 }} |
| | | whileTap={{ scale: 0.97 }} |
| | | > |
| | | ç«å³æ³¨å |
| | | <span className="absolute -bottom-0.5 left-0 w-0 h-[1px] bg-[#6ADBFF] group-hover:w-full transition-all duration-300 ease-out"></span> |
| | | </motion.a> |
| | | </p> |
| | | </div> |
| | | </div> |
| | | </motion.div> |
| | | |
| | | {/* éåæ³¢å¨å± - é«åº¦æ§å¶ */} |
| | | <div className="fixed inset-x-0 bottom-0 h-10 z-0 overflow-hidden"> |
| | | <svg className="absolute w-full h-20 animate-quantum-wave" viewBox="0 0 800 40" xmlns="http://www.w3.org/2000/svg"> |
| | | <path d="M0,20 Q100,40 200,20 T400,20 T600,20 T800,20" fill="none" stroke="url(#gradient1)" strokeWidth="1" opacity="0.2" /> |
| | | <path d="M0,20 Q100,0 200,20 T400,20 T600,20 T800,20" fill="none" stroke="url(#gradient2)" strokeWidth="1" opacity="0.2" /> |
| | | <defs> |
| | | <linearGradient id="gradient1" x1="0%" y1="0%" x2="100%" y2="0%"> |
| | | <stop offset="0%" stopColor="#6ADBFF" stopOpacity="0" /> |
| | | <stop offset="50%" stopColor="#6ADBFF" stopOpacity="1" /> |
| | | <stop offset="100%" stopColor="#6ADBFF" stopOpacity="0" /> |
| | | </linearGradient> |
| | | <linearGradient id="gradient2" x1="0%" y1="0%" x2="100%" y2="0%"> |
| | | <stop offset="0%" stopColor="#FF6A88" stopOpacity="0" /> |
| | | <stop offset="50%" stopColor="#FF6A88" stopOpacity="1" /> |
| | | <stop offset="100%" stopColor="#FF6A88" stopOpacity="0" /> |
| | | </linearGradient> |
| | | </defs> |
| | | </svg> |
| | | </div> |
| | | </div> |
| | | ); |
| | | } |