src/app/ai-scene/page.tsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/app/globals.css | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/app/page.tsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/layout/ClientLayoutContent.tsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/layout/Navbar.tsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/app/ai-scene/page.tsx
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,77 @@ "use client"; import { useState } from 'react'; import Sidebar from '@/components/layout/Sidebar'; import Card from '@/components/Card'; import ChatDialog from '@/components/ChatDialog'; const services = [ { title: 'è¡¥æ', description: 'æºè½å¨æåæäº§çº¿ï¼å·¥ä½çç¼ºææ åµï¼éä½å线é£é©', imageUrl: '/images/kanban.jpg', chatbotId: 'JELkWpPLHQfRNhEH' }, { title: 'æå', description: 'æºè½è¯ä¼°éæ±æå对产è½ï¼åææåäº¤ä»æå¡çå½±åï¼æåå®¢æ·æ»¡æåº¦', imageUrl: '/images/xuqiu.jpg', chatbotId: 'DfH4cIzujVGvn5iR' }, { title: 'ç§æ²æ¯é宿¨èå°å©æ', description: 'æºè½åäº§åæ¨èæåå¯¼è´æç', imageUrl: '/images/robot.jpg', chatbotId: 'sUAviPXvcEIw3oQC' }, { title: 'åºå管çç¥è¯åºé®ç', description: 'åºåç¥è¯ï¼æä¾ä¸ä¸çä¾åºé¾åºåç¥è¯é®ç', imageUrl: '/images/know.jpg', chatbotId: 'pDDfkU9HyBl2gzXx' }, ]; export default function AIScenePage() { const [isChatOpen, setIsChatOpen] = useState(false); const [currentChatbot, setCurrentChatbot] = useState(''); const handleCardClick = (title: string, chatbotId?: string) => { if (chatbotId) { setCurrentChatbot(chatbotId); setIsChatOpen(true); } }; return ( <div className="flex"> <Sidebar /> <div className="flex-1 p-6 md:p-8 bg-gradient-to-b from-[var(--ai-surface)] to-white"> <div className="max-w-7xl mx-auto"> <div className="mb-8"> <h1 className="text-3xl font-bold text-[var(--ai-primary)] mb-2"> AIåºæ¯æ¨¡æ <span className="ml-2 inline-block w-2 h-2 rounded-full bg-[var(--ai-secondary)] animate-pulse"></span> </h1> <p className="text-gray-600">鿩以ä¸åºæ¯ï¼ä½éªäººå·¥æºè½å¦ä½è§£å³å®é ä¸å¡é®é¢</p> <div className="h-1 w-24 bg-gradient-to-r from-[var(--ai-secondary)] to-[var(--ai-accent)] mt-4"></div> </div> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> {services.map((service, index) => ( <Card key={index} {...service} onClick={() => handleCardClick(service.title, service.chatbotId)} /> ))} </div> </div> </div> <ChatDialog isOpen={isChatOpen} onClose={() => setIsChatOpen(false)} chatbotId={currentChatbot} /> </div> ); } src/app/globals.css
@@ -55,6 +55,20 @@ animation-delay: 0.5s; } /* 页é¢å å®¹æ·¡å ¥å¨ç» */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .animate-fadeIn { animation: fadeIn 0.6s ease-out; } /* Logoåç¯èå²å¨ç» */ @keyframes logo-ring-pulse { 0% { @@ -236,36 +250,29 @@ /* AIæ°æ®æµææå¨ç» */ @keyframes dataflowY { 0% { background-position: 0 -200px; from { transform: translateY(-100%); } 100% { background-position: 0 200px; to { transform: translateY(100%); } } @keyframes dataflowX { 0% { from { transform: translateX(-100%); opacity: 0; } 50% { opacity: 1; } 100% { to { transform: translateX(100%); opacity: 0; } } .animate-dataflowY { background-image: linear-gradient(to bottom, transparent 0%, rgba(106, 219, 255, 0.4) 50%, transparent 100%); background-size: 100% 200px; animation: dataflowY 8s linear infinite; animation: dataflowY 3s linear infinite; } .animate-dataflowX { animation: dataflowX 4s infinite; animation: dataflowX 5s linear infinite; } /* æé®å¾æå¨ç» */ @@ -296,7 +303,7 @@ } .animate-scanline { animation: scanline 8s linear infinite; animation: scanline 3s ease-in-out infinite; } /* åºç¡æ¸åå¨ç» */ @@ -439,11 +446,11 @@ } @keyframes dataflowY { 0% { background-position: 0 -200px; from { transform: translateY(-100%); } 100% { background-position: 0 200px; to { transform: translateY(100%); } } @@ -483,7 +490,7 @@ } .animate-data-blink { animation: data-blink 3s ease-in-out infinite; animation: data-blink 2s ease-in-out infinite; } .animate-data-blink-slow { @@ -491,27 +498,16 @@ } .animate-dataflowY { background-image: linear-gradient(to bottom, transparent 0%, rgba(106, 219, 255, 0.4) 50%, transparent 100%); background-size: 100% 200px; animation: dataflowY 8s linear infinite; animation: dataflowY 3s linear infinite; } .animate-scanline { animation: scanline 8s linear infinite; animation: scanline 3s ease-in-out infinite; } .animate-fade-in { animation: fadeIn 1.5s ease-in-out forwards; animation: fade-in 1.5s ease-out forwards; animation-delay: 0.5s; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* æ¬åææå¢å¼º */ @@ -736,3 +732,14 @@ .quantum-button:hover .quantum-pulse { animation: quantum-pulse 2s ease-in-out infinite; } /* 主页éªå æé®ææ */ @keyframes shine { 100% { left: 125%; } } .animate-shine { animation: shine 1.5s ease-in-out; } src/app/page.tsx
@@ -1,77 +1,210 @@ "use client"; import { useState } from 'react'; import Sidebar from '@/components/layout/Sidebar'; import Card from '@/components/Card'; import ChatDialog from '@/components/ChatDialog'; const services = [ { title: 'è¡¥æ', description: 'æºè½å¨æåæäº§çº¿ï¼å·¥ä½çç¼ºææ åµï¼éä½å线é£é©', imageUrl: '/images/kanban.jpg', chatbotId: 'JELkWpPLHQfRNhEH' }, { title: 'æå', description: 'æºè½è¯ä¼°éæ±æå对产è½ï¼åææåäº¤ä»æå¡çå½±åï¼æåå®¢æ·æ»¡æåº¦', imageUrl: '/images/xuqiu.jpg', chatbotId: 'DfH4cIzujVGvn5iR' }, { title: 'ç§æ²æ¯é宿¨èå°å©æ', description: 'æºè½åäº§åæ¨èæåå¯¼è´æç', imageUrl: '/images/robot.jpg', chatbotId: 'sUAviPXvcEIw3oQC' }, { title: 'åºå管çç¥è¯åºé®ç', description: 'åºåç¥è¯ï¼æä¾ä¸ä¸çä¾åºé¾åºåç¥è¯é®ç', imageUrl: '/images/know.jpg', chatbotId: 'pDDfkU9HyBl2gzXx' }, ]; import Link from 'next/link'; import { motion } from 'framer-motion'; import { useEffect, useState } from 'react'; export default function Home() { const [isChatOpen, setIsChatOpen] = useState(false); const [currentChatbot, setCurrentChatbot] = useState(''); const [mounted, setMounted] = useState(false); const [isClient, setIsClient] = useState(false); const handleCardClick = (title: string, chatbotId?: string) => { if (chatbotId) { setCurrentChatbot(chatbotId); setIsChatOpen(true); } useEffect(() => { setMounted(true); setIsClient(true); }, []); // å®ä¹å¨ç»åä½ const fadeInUp = { hidden: { opacity: 0, y: 50 }, visible: { opacity: 1, y: 0, transition: { duration: 0.8, ease: "easeOut" } } }; const fadeInLeft = { hidden: { opacity: 0, x: -50 }, visible: { opacity: 1, x: 0, transition: { duration: 0.7, ease: "easeOut" } } }; const fadeInRight = { hidden: { opacity: 0, x: 50 }, visible: { opacity: 1, x: 0, transition: { duration: 0.7, ease: "easeOut" } } }; const fadeInScale = { hidden: { opacity: 0, scale: 0.95 }, visible: { opacity: 1, scale: 1, transition: { duration: 0.8, ease: "easeOut" } } }; return ( <div className="flex"> <Sidebar /> <div className="flex-1 p-6 md:p-8 bg-gradient-to-b from-[var(--ai-surface)] to-white"> <div className="max-w-7xl mx-auto"> <div className="mb-8"> <h1 className="text-3xl font-bold text-[var(--ai-primary)] mb-2"> AIåºæ¯æ¨¡æ <span className="ml-2 inline-block w-2 h-2 rounded-full bg-[var(--ai-secondary)] animate-pulse"></span> </h1> <p className="text-gray-600">鿩以ä¸åºæ¯ï¼ä½éªäººå·¥æºè½å¦ä½è§£å³å®é ä¸å¡é®é¢</p> <div className="h-1 w-24 bg-gradient-to-r from-[var(--ai-secondary)] to-[var(--ai-accent)] mt-4"></div> <main className="relative w-full min-h-screen bg-[#0A1033] text-white overflow-hidden px-4 -mt-[1px]"> {/* é¡¶é¨å¯¼èªèæ¯å»¶ä¼¸å± */} <div className="absolute top-0 left-0 right-0 h-1 bg-gradient-to-r from-[#1E2B63] to-[#0A1033] z-0"></div> <div className="max-w-7xl mx-auto py-0"> {/* 页é¢å 容 */} {/* 主è¦å 容é¨å */} <div className="relative z-10 min-h-screen pt-32 pb-24"> {/* ææ¯ä¼å¿é¨å */} <section className="w-full py-6 relative"> {/* æ é¢ */} <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInUp} className="text-center mb-16" > <h2 className="text-3xl md:text-4xl font-bold text-white mb-6"> <span className="text-transparent bg-clip-text bg-gradient-to-r from-[#6ADBFF] to-[#5E72EB]"> AIèµè½APS </span> æ ¸å¿ææ¯ä¼å¿ </h2> <div className="h-1 w-24 mx-auto bg-gradient-to-r from-[#6ADBFF] to-[#FF6A88]"></div> </motion.div> {/* ææ¯å¡ç */} <div className="grid grid-cols-1 md:grid-cols-2 gap-12"> {/* 左侧ï¼éåå¯åç®æ³ */} <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInLeft} className="relative" > <div className="absolute -left-3 top-0 h-full w-1 bg-gradient-to-b from-[#6ADBFF] via-[#5E72EB] to-transparent"></div> <div className="backdrop-blur-sm bg-white/5 rounded-xl p-8 border border-[#6ADBFF]/20 h-full"> <h3 className="text-2xl font-semibold text-white mb-4">éåå¯åç®æ³</h3> <p className="text-gray-300 leading-relaxed mb-6"> åºäºéå计ç®åç设计çä¼åç®æ³ï¼è½å¤å¨ææ°çº§å¤æåº¦çæç¨é®é¢ä¸å¿«é寻æ¾è¿ä¼¼æä¼è§£ã </p> </div> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> {services.map((service, index) => ( <Card key={index} {...service} onClick={() => handleCardClick(service.title, service.chatbotId)} /> ))} </motion.div> {/* å³ä¾§ï¼æ·±åº¦å¦ä¹ 颿µ */} <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInRight} className="relative" > <div className="absolute -left-3 top-0 h-full w-1 bg-gradient-to-b from-[#FF6A88] via-[#5E72EB] to-transparent"></div> <div className="backdrop-blur-sm bg-white/5 rounded-xl p-8 border border-[#FF6A88]/20 h-full"> <h3 className="text-2xl font-semibold text-white mb-4">深度å¦ä¹ 颿µ</h3> <p className="text-gray-300 leading-relaxed mb-6"> éç¨èªç çæ¶é´åºå深度å¦ä¹ æ¶æï¼å¯¹ç产ç¯å¢ä¸çå ³é®ææ è¿è¡ç²¾å颿µã </p> </div> </motion.div> </div> {/* æ°åææ åºå */} <motion.div initial={{ opacity: 0, y: 20 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: false, margin: "-100px" }} transition={{ duration: 0.8, ease: "easeOut" }} className="mt-20 w-full grid grid-cols-2 md:grid-cols-4 gap-8 mb-20" > <div className="text-center"> <div className="text-4xl font-bold text-[#6ADBFF] mb-2">98%</div> <p className="text-gray-300">计ååç¡®ç</p> </div> <div className="text-center"> <div className="text-4xl font-bold text-[#5E72EB] mb-2">45%</div> <p className="text-gray-300">æçæå</p> </div> <div className="text-center"> <div className="text-4xl font-bold text-[#FF6A88] mb-2">30%</div> <p className="text-gray-300">ææ¬éä½</p> </div> <div className="text-center"> <div className="text-4xl font-bold text-white mb-2">500+</div> <p className="text-gray-300">ä¼ä¸æ¡ä¾</p> </div> </motion.div> </section> {/* åºç¨åºæ¯åºå */} <section className="w-full py-10 relative"> <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInUp} className="text-center mb-16" > <h2 className="text-3xl md:text-4xl font-bold text-white mb-6"> <span className="text-transparent bg-clip-text bg-gradient-to-r from-[#FF6A88] to-[#6ADBFF]"> åºç¨åºæ¯ </span> </h2> <div className="h-1 w-24 mx-auto bg-gradient-to-r from-[#FF6A88] to-[#6ADBFF]"></div> </motion.div> {/* åºç¨åºæ¯å¡ç */} <div className="grid grid-cols-1 md:grid-cols-3 gap-8 mb-12"> {/* åºç¨åºæ¯å¡çå 容 */} <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInUp} transition={{ delay: 0.1 }} className="bg-[#131C41]/70 p-6 rounded-xl border border-[#6ADBFF]/20" > <h3 className="text-xl font-semibold text-white mb-4">离æ£å¶é </h3> <p className="text-gray-300"> å¨é¶é¨ä»¶å¤ãå·¥èºå¤æç离æ£å¶é ç¯å¢ä¸ï¼æä»¬çè§£å³æ¹æ¡è½å¤åæ¶èè设å¤å©ç¨çã交æãå¨å¶ååºåçå¤ç»´ç®æ ï¼çææä¼æç¨æ¹æ¡ã </p> </motion.div> <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInUp} transition={{ delay: 0.2 }} className="bg-[#131C41]/70 p-6 rounded-xl border border-[#6ADBFF]/20" > <h3 className="text-xl font-semibold text-white mb-4">æµç¨å·¥ä¸</h3> <p className="text-gray-300"> é对è¿ç»çäº§ç¹æ§ï¼æä»¬çè§£å³æ¹æ¡å®ç°äºåæéè´ãç产计å䏿ç¨çä¸ä½åä¼åï¼æå°å忢æèåè½æºæ¶èï¼æé«äº§çº¿å©ç¨çã </p> </motion.div> <motion.div initial="hidden" whileInView="visible" viewport={{ once: false, margin: "-100px" }} variants={fadeInUp} transition={{ delay: 0.3 }} className="bg-[#131C41]/70 p-6 rounded-xl border border-[#6ADBFF]/20" > <h3 className="text-xl font-semibold text-white mb-4">ç©æµä»å¨</h3> <p className="text-gray-300"> ä¼åä»å¨å¸å±ä¸æ£éè·¯å¾ï¼ç»åæºå¨äººè°åº¦ç³»ç»ï¼å®ç°é«æçãä½å·®éçæºè½ç©æµç®¡çï¼æåä»å¨ä¸å¿æ´ä½è¿è¥æçã </p> </motion.div> </div> </section> </div> {/* å¨ææ³¢å½¢å¾ - æ¾å¨é¡µé¢åºé¨ */} <div className="relative w-full h-20 opacity-20 mt-auto"> <svg className="w-full h-full" viewBox="0 0 1200 120" preserveAspectRatio="none"> <path d="M0,36c200,0,200,84,400,84c200,0,200-84,400-84c200,0,200,84,400,84c200,0,200-84,400-84v84H0V36z" fill="url(#blueGradient)"></path> <defs> <linearGradient id="blueGradient" x1="0%" y1="0%" x2="100%" y2="0%"> <stop offset="0%" stopColor="#6ADBFF" stopOpacity="0.5" /> <stop offset="50%" stopColor="#5E72EB" stopOpacity="0.5" /> <stop offset="100%" stopColor="#6ADBFF" stopOpacity="0.5" /> </linearGradient> </defs> </svg> </div> </div> </div> <ChatDialog isOpen={isChatOpen} onClose={() => setIsChatOpen(false)} chatbotId={currentChatbot} /> </div> </main> ); } src/components/layout/ClientLayoutContent.tsx
@@ -1,76 +1,202 @@ "use client"; import { ReactNode, useState, useEffect } from 'react'; import { usePathname } from 'next/navigation'; import Navbar from './Navbar'; import Image from 'next/image'; export default function ClientLayoutContent({ children }: { children: React.ReactNode }) { // 使ç¨å®¢æ·ç«¯é©åæ£æ¥è·¯å¾ const pathname = usePathname(); const isLoginPage = pathname === '/login'; if (isLoginPage) { return <>{children}</>; interface ClientLayoutContentProps { children: ReactNode; } export default function ClientLayoutContent({ children }: ClientLayoutContentProps) { const [isClient, setIsClient] = useState(false); const [hasError, setHasError] = useState(false); const pathname = usePathname(); const isLoginPage = pathname === '/login'; const isHomePage = pathname === '/'; useEffect(() => { setIsClient(true); }, []); // æ·»å é误æè· useEffect(() => { if (hasError) { console.error("渲æé误被æè·ï¼å¯è½æ¯JSXç»æä¸æ£ç¡®å¯¼è´çæ°´åé误"); } }, [hasError]); // é误å¤ç彿° const handleError = () => { setHasError(true); return ( <> <div className="min-h-screen bg-[#0A1033] text-white p-8"> <div className="max-w-lg mx-auto mt-20 bg-red-900/30 p-6 rounded-lg border border-red-500"> <h2 className="text-xl font-bold text-red-400 mb-4">页颿¸²æé误</h2> <p className="text-white mb-4">页é¢ä»£ç ä¸å¯è½åå¨JSXç»æé误ï¼è¯·æ£æ¥æ ç¾é忝妿£ç¡®ã</p> <p className="text-gray-300 text-sm">å ·ä½é误: å¯è½æ¯motion.divæ ç¾æªæ£ç¡®éåæåµå¥å±çº§æé®é¢</p> </div> </div> ); }; // æ¤å½æ°å¯å¨ç¹æ®æ åµä¸ç¨äºå¤çè¿æ¸¡ const renderContent = () => { if (!isClient) { // æå¡å¨ç«¯æå®¢æ·ç«¯åå§æ¸²ææ¶æ¾ç¤ºéæå 容 return ( <div className="min-h-screen bg-[#0A1033] text-white"> <div className="opacity-50"> {/* éæå å®¹çæ¬ï¼æ å¨ç» */} {children} </div> </div> ); } // 客æ·ç«¯æ¸²æåæ¾ç¤ºå®æ´å 容 try { return ( <div className="animate-fadeIn"> <div className="flex flex-col min-h-screen"> <Navbar /> <main className="min-h-screen bg-gradient-to-b from-[var(--ai-surface)] to-white pt-16"> <main className={`flex-1 ${isHomePage ? '' : 'bg-gradient-to-b from-[var(--ai-surface)] to-white'} pt-0 mt-0`}> {children} </main> <footer className="bg-gradient-to-br from-[var(--ai-primary)] to-[var(--ai-dark)] text-white py-10"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="mb-8 flex justify-center flex-col items-center"> <div className="relative w-16 h-16 mb-3"> <Image src="/images/logo.jpg" alt="帷å¹åæLogo" width={64} height={64} className="object-contain" priority /> <footer className="relative z-20 bg-gradient-to-br from-[#0A1033] via-[#1E2B63] to-[#131C41] text-white py-10 overflow-hidden"> {/* ç§ææå¨æèæ¯å ç´ */} <div className="absolute inset-0 overflow-hidden pointer-events-none"> {/* ç½æ ¼åºçº¹ */} <div className="absolute inset-0 opacity-5" style={{ backgroundImage: 'radial-gradient(circle, rgba(106, 219, 255, 0.3) 1px, transparent 1px)', backgroundSize: '20px 20px' }}> </div> <div className="text-xl font-bold">帷å¹åæ</div> <div className="text-sm text-gray-300 mt-1">æºè½ç©æµè§£å³æ¹æ¡</div> {/* æ°´å¹³å 线 */} <div className="absolute top-1/2 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#6ADBFF]/40 to-transparent transform -translate-y-1/2"></div> {/* åç´å 线 */} <div className="absolute left-1/4 top-0 bottom-0 w-[1px] bg-gradient-to-b from-transparent via-[#5E72EB]/30 to-transparent"></div> <div className="absolute left-3/4 top-0 bottom-0 w-[1px] bg-gradient-to-b from-transparent via-[#FF6A88]/30 to-transparent"></div> {/* éåç²åç¹ - ä½¿ç¨æ¡ä»¶æ¸²æ */} {isClient && ( <> <div className="absolute top-[20%] left-[10%] w-1 h-1 rounded-full bg-[#6ADBFF]/60 animate-pulse"></div> <div className="absolute top-[70%] left-[90%] w-1.5 h-1.5 rounded-full bg-[#FF6A88]/60 animate-pulse" style={{animationDelay: '1.5s'}}></div> <div className="absolute top-[40%] left-[60%] w-1 h-1 rounded-full bg-[#5E72EB]/60 animate-pulse" style={{animationDelay: '0.8s'}}></div> </> )} {/* åºé¨æ³¢æµªçº¿ */} <div className="absolute bottom-0 w-full h-8 opacity-10"> <svg className="w-full h-full" viewBox="0 0 1200 30" preserveAspectRatio="none"> <path d="M0,10 Q150,20 300,10 T600,10 T900,10 T1200,10 V30 H0 Z" fill="url(#footerGradient)"></path> <defs> <linearGradient id="footerGradient" x1="0%" y1="0%" x2="100%" y2="0%"> <stop offset="0%" stopColor="#6ADBFF" /> <stop offset="50%" stopColor="#5E72EB" /> <stop offset="100%" stopColor="#6ADBFF" /> </linearGradient> </defs> </svg> </div> </div> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10"> <div className="grid grid-cols-1 md:grid-cols-3 gap-8"> <div> <h3 className="text-lg font-semibold mb-4 text-[#F5A800]">å ³äºæä»¬</h3> <ul className="space-y-2"> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">å ¬å¸ä»ç»</li> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">èç³»æ¹å¼</li> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">å å ¥æä»¬</li> <div className="backdrop-blur-sm bg-white/5 rounded-lg p-6 border border-[#6ADBFF]/10 transition-transform hover:scale-[1.02] hover:shadow-[0_0_15px_rgba(106,219,255,0.2)]"> <h3 className="text-lg font-semibold mb-4 text-transparent bg-clip-text bg-gradient-to-r from-[#6ADBFF] to-[#F5A800]">å ³äºæä»¬</h3> <ul className="space-y-3"> <li className="hover:text-[#6ADBFF] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#6ADBFF] rounded-full mr-2 opacity-70"></span> å ¬å¸ä»ç» </li> <li className="hover:text-[#6ADBFF] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#6ADBFF] rounded-full mr-2 opacity-70"></span> èç³»æ¹å¼ </li> <li className="hover:text-[#6ADBFF] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#6ADBFF] rounded-full mr-2 opacity-70"></span> å å ¥æä»¬ </li> </ul> </div> <div> <h3 className="text-lg font-semibold mb-4 text-[#F5A800]">产åæå¡</h3> <ul className="space-y-2"> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">æ°ååå·¥</li> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">æºè½å®¢æ</li> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">ç©æµè§£å³æ¹æ¡</li> <div className="backdrop-blur-sm bg-white/5 rounded-lg p-6 border border-[#5E72EB]/10 transition-transform hover:scale-[1.02] hover:shadow-[0_0_15px_rgba(94,114,235,0.2)]"> <h3 className="text-lg font-semibold mb-4 text-transparent bg-clip-text bg-gradient-to-r from-[#5E72EB] to-[#F5A800]">产åæå¡</h3> <ul className="space-y-3"> <li className="hover:text-[#5E72EB] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#5E72EB] rounded-full mr-2 opacity-70"></span> æ°ååå·¥ </li> <li className="hover:text-[#5E72EB] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#5E72EB] rounded-full mr-2 opacity-70"></span> æºè½å®¢æ </li> <li className="hover:text-[#5E72EB] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#5E72EB] rounded-full mr-2 opacity-70"></span> APSè§£å³æ¹æ¡ </li> </ul> </div> <div> <h3 className="text-lg font-semibold mb-4 text-[#F5A800]">帮å©ä¸å¿</h3> <ul className="space-y-2"> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">ä½¿ç¨æå</li> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">常è§é®é¢</li> <li className="hover:text-[#F5A800] transition-colors cursor-pointer">ææ¯æ¯æ</li> <div className="backdrop-blur-sm bg-white/5 rounded-lg p-6 border border-[#FF6A88]/10 transition-transform hover:scale-[1.02] hover:shadow-[0_0_15px_rgba(255,106,136,0.2)]"> <h3 className="text-lg font-semibold mb-4 text-transparent bg-clip-text bg-gradient-to-r from-[#FF6A88] to-[#F5A800]">帮å©ä¸å¿</h3> <ul className="space-y-3"> <li className="hover:text-[#FF6A88] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#FF6A88] rounded-full mr-2 opacity-70"></span> ä½¿ç¨æå </li> <li className="hover:text-[#FF6A88] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#FF6A88] rounded-full mr-2 opacity-70"></span> 常è§é®é¢ </li> <li className="hover:text-[#FF6A88] transition-colors cursor-pointer flex items-center"> <span className="inline-block w-1.5 h-1.5 bg-[#FF6A88] rounded-full mr-2 opacity-70"></span> ææ¯æ¯æ </li> </ul> </div> </div> <div className="mt-8 pt-8 border-t border-opacity-20 border-[#F5A800] text-center"> <div className="mt-10 pt-6 border-t border-[#6ADBFF]/10 text-center relative"> {/* éåè¿æ¥ç¹æ */} <div className="absolute top-0 left-1/3 right-1/3 h-[1px]"> <div className="relative w-full h-full"> <div className="absolute inset-0 bg-gradient-to-r from-transparent via-[#6ADBFF] to-transparent"></div> <div className="absolute top-0 left-1/2 h-6 w-[1px] -translate-x-1/2 -translate-y-1/2 bg-gradient-to-b from-[#6ADBFF] to-transparent opacity-70"></div> </div> </div> {/* åºé¨èå²æç¤ºå¨ - ä½¿ç¨æ¡ä»¶æ¸²æ */} {isClient ? ( <div className="flex items-center justify-center mb-4"> <span className="inline-block w-2 h-2 bg-[#00A0E9] rounded-full mr-2 animate-pulse"></span> <span className="inline-block w-2 h-2 bg-[#5D54A4] rounded-full mx-2 animate-pulse delay-300"></span> <span className="inline-block w-2 h-2 bg-[#F5A800] rounded-full ml-2 animate-pulse delay-500"></span> <span className="inline-block w-2 h-2 bg-[#6ADBFF] rounded-full mr-3 animate-pulse"></span> <span className="inline-block w-2 h-2 bg-[#5E72EB] rounded-full mx-3 animate-pulse" style={{animationDelay: '0.3s'}}></span> <span className="inline-block w-2 h-2 bg-[#FF6A88] rounded-full ml-3 animate-pulse" style={{animationDelay: '0.6s'}}></span> </div> <p>© 2024 帷å¹åæ. All rights reserved.</p> ) : ( <div className="h-4 mb-4"></div> )} <p className="text-gray-300 text-sm">© 2024 帷å¹åæ. All rights reserved.</p> </div> </div> </footer> </div> </div> ); } catch (error) { console.error("渲æé误:", error); return handleError(); } }; return ( <> {hasError ? handleError() : renderContent()} </> ); } src/components/layout/Navbar.tsx
@@ -154,14 +154,14 @@ {/* 导èªèå - å¢å z-indexç¡®ä¿å¨å¨æä¹ä¸ */} <div className="hidden md:flex items-center space-x-8 relative z-20"> <Link href="/platform" href="/ai-scene" className="relative px-3 py-2 text-sm font-medium" onMouseEnter={() => setActiveMenu('platform')} onMouseEnter={() => setActiveMenu('ai-scene')} onMouseLeave={() => setActiveMenu('')} > <span className={`relative z-10 transition-colors duration-300 ${activeMenu === 'platform' ? 'text-[#6ADBFF]' : 'text-gray-100'}`}>æ°åå工平å°</span> <span className={`relative z-10 transition-colors duration-300 ${activeMenu === 'ai-scene' ? 'text-[#6ADBFF]' : 'text-gray-100'}`}>AIåºæ¯æ¨¡æ</span> <span className={`absolute bottom-0 left-0 h-[2px] bg-gradient-to-r from-[#6ADBFF] to-transparent transition-all duration-300 ${activeMenu === 'platform' ? 'w-full' : 'w-0'}`}></span> transition-all duration-300 ${activeMenu === 'ai-scene' ? 'w-full' : 'w-0'}`}></span> </Link> <Link @@ -242,11 +242,11 @@ <div className="p-3 space-y-1 bg-gradient-to-b from-[#1E2B63] to-[#0A1033] border-t border-[#6ADBFF]/10"> <Link href="/platform" href="/ai-scene" className="block px-4 py-3 text-white border-l-2 border-transparent hover:border-[#6ADBFF] hover:bg-[#3B4888]/20 rounded-r-md transition-all duration-200" > æ°ååå·¥å¹³å° AIåºæ¯æ¨¡æ </Link> <Link