From 603944bff3fa6a0541235ed0ab39ef9ba986e648 Mon Sep 17 00:00:00 2001 From: hongjli <3117313295@qq.com> Date: 星期一, 07 四月 2025 16:38:01 +0800 Subject: [PATCH] 场景页面优化 --- package-lock.json | 212 ++++++++++++++++++++++++++++++ src/components/SceneIntroDialog.tsx | 124 +++++++++++++++++ package.json | 1 src/app/ai-scene/page.tsx | 43 ++++- 4 files changed, 370 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32ee5cf..98d5d85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "weiwojunchen", "version": "0.1.0", "dependencies": { + "@headlessui/react": "^2.2.1", "@types/styled-components": "^5.1.34", "axios": "^1.8.4", "framer-motion": "^12.6.0", @@ -231,6 +232,78 @@ }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@headlessui/react": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.1.tgz", + "integrity": "sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.17.1", + "@react-aria/interactions": "^3.21.3", + "@tanstack/react-virtual": "^3.11.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "node_modules/@humanfs/core": { @@ -865,6 +938,103 @@ "node": ">=12.4.0" } }, + "node_modules/@react-aria/focus": { + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.1.tgz", + "integrity": "sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.24.1", + "@react-aria/utils": "^3.28.1", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.24.1.tgz", + "integrity": "sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.7", + "@react-aria/utils": "^3.28.1", + "@react-stately/flags": "^3.1.0", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", + "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.1.tgz", + "integrity": "sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.7", + "@react-stately/flags": "^3.1.0", + "@react-stately/utils": "^3.10.5", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-stately/flags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.0.tgz", + "integrity": "sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.10.5", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz", + "integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.28.0.tgz", + "integrity": "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1129,6 +1299,33 @@ "lightningcss": "1.29.2", "postcss": "^8.4.41", "tailwindcss": "4.0.16" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.6.tgz", + "integrity": "sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.6.tgz", + "integrity": "sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tybys/wasm-util": { @@ -2065,6 +2262,15 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/color": { "version": "4.2.3", @@ -5612,6 +5818,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, "node_modules/tailwindcss": { "version": "4.0.16", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.16.tgz", diff --git a/package.json b/package.json index f61e761..31ad966 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@headlessui/react": "^2.2.1", "@types/styled-components": "^5.1.34", "axios": "^1.8.4", "framer-motion": "^12.6.0", diff --git a/src/app/ai-scene/page.tsx b/src/app/ai-scene/page.tsx index eded6af..c65dcbd 100644 --- a/src/app/ai-scene/page.tsx +++ b/src/app/ai-scene/page.tsx @@ -3,6 +3,7 @@ import { useState } from 'react'; import Card from '@/components/Card'; import ChatDialog from '@/components/ChatDialog'; +import SceneIntroDialog from '@/components/SceneIntroDialog'; import Navbar from '@/components/layout/Navbar'; const services = [ @@ -10,37 +11,51 @@ title: '琛ユ枡', description: '鏅鸿兘鍔ㄦ�佸垎鏋愪骇绾匡紝宸ヤ綅鐨勭己鏂欐儏鍐碉紝闄嶄綆鍋滅嚎椋庨櫓', imageUrl: '/images/kanban.jpg', - chatbotId: 'JELkWpPLHQfRNhEH' + chatbotId: 'JELkWpPLHQfRNhEH', + background: '鍦ㄧ敓浜х嚎杩愯杩囩▼涓紝鍙婃椂鍙戠幇骞惰В鍐崇己鏂欓棶棰樻槸淇濊瘉鐢熶骇鏁堢巼鐨勫叧閿�侫I绯荤粺閫氳繃瀹炴椂鐩戞帶鍜屽垎鏋愶紝甯姪鎮ㄦ彁鍓嶉璀﹀彲鑳界殑缂烘枡椋庨櫓锛屼紭鍖栬ˉ鏂欒鍒掋��', + instructions: '鎮ㄥ彲浠ユ弿杩板叿浣撶殑鐢熶骇绾挎儏鍐靛拰缂烘枡闂锛孉I鍔╂墜灏嗗熀浜庡巻鍙叉暟鎹拰瀹炴椂鐘舵�侊紝涓烘偍鎻愪緵鏈�浼樼殑琛ユ枡鏂规鍜屽缓璁��' }, { title: '鎻掑崟', description: '鏅鸿兘璇勪及闇�姹傛彃鍗曞浜ц兘锛屽師鏉愭枡鍜屼氦浠樻湇鍔$殑褰卞搷锛屾彁鍗囧鎴锋弧鎰忓害', imageUrl: '/images/xuqiu.jpg', - chatbotId: 'DfH4cIzujVGvn5iR' + chatbotId: 'DfH4cIzujVGvn5iR', + background: '鍦ㄧ敓浜ц鍒掓墽琛岃繃绋嬩腑锛屽父甯镐細閬囧埌绱ф�ヨ鍗曢渶瑕佹彃鍗曠殑鎯呭喌銆侫I绯荤粺鍙互蹇�熻瘎浼版彃鍗曞鐜版湁鐢熶骇璁″垝鐨勫奖鍝嶏紝骞舵彁渚涙渶浼樼殑鎻掑崟鏂规銆�', + instructions: '璇锋彁渚涢渶瑕佹彃鍗曠殑璁㈠崟淇℃伅锛屽寘鎷骇鍝佺被鍨嬨�佹暟閲忓拰鏈熸湜浜や粯鏃堕棿锛孉I鍔╂墜灏嗕负鎮ㄥ垎鏋愬彲琛屾�у苟缁欏嚭鍏蜂綋鐨勬彃鍗曞缓璁��' }, { title: '绉戞矁鏂攢鍞帹鑽愬皬鍔╂墜', description: '鏅鸿兘鍖栦骇鍝佹帹鑽愭彁鍗囧璐晥鐜�', imageUrl: '/images/robot.jpg', - chatbotId: 'sUAviPXvcEIw3oQC' + chatbotId: 'sUAviPXvcEIw3oQC', + background: '闈㈠涓嶅悓瀹㈡埛鐨勪釜鎬у寲闇�姹傦紝濡備綍鍑嗙‘鎺ㄨ崘鍚堥�傜殑浜у搧鏄彁鍗囬攢鍞晥鐜囩殑鍏抽敭銆侫I鍔╂墜鍩轰簬娣卞害瀛︿範绠楁硶锛岃兘澶熺簿鍑嗗垎鏋愬鎴烽渶姹傦紝鎻愪緵涓�у寲鐨勪骇鍝佹帹鑽愩��', + instructions: '鎮ㄥ彲浠ユ弿杩板鎴风殑鍏蜂綋闇�姹傚拰鍋忓ソ锛孉I鍔╂墜灏嗘牴鎹繖浜涗俊鎭紝涓烘偍鎺ㄨ崘鏈�閫傚悎鐨勭娌冩柉浜у搧锛屽苟鎻愪緵涓撲笟鐨勪骇鍝佷粙缁嶅拰閿�鍞缓璁��' }, { title: '搴撳瓨绠$悊鐭ヨ瘑搴撻棶绛�', description: '搴撳瓨鐭ヨ瘑锛屾彁渚涗笓涓氱殑渚涘簲閾惧簱瀛樼煡璇嗛棶绛�', imageUrl: '/images/know.jpg', - chatbotId: 'pDDfkU9HyBl2gzXx' + chatbotId: 'pDDfkU9HyBl2gzXx', + background: '楂樻晥鐨勫簱瀛樼鐞嗛渶瑕佷赴瀵岀殑涓撲笟鐭ヨ瘑鍜岀粡楠屻�侫I鐭ヨ瘑搴撴暣鍚堜簡澶ч噺渚涘簲閾惧拰搴撳瓨绠$悊鐨勪笓涓氱煡璇嗭紝鍙互蹇�熻В绛斿悇绫诲簱瀛樼鐞嗛棶棰樸��', + instructions: '鎮ㄥ彲浠ヨ闂换浣曚笌搴撳瓨绠$悊鐩稿叧鐨勯棶棰橈紝鍖呮嫭搴撳瓨绛栫暐銆佹垚鏈帶鍒躲�佸懆杞巼浼樺寲绛夛紝AI鍔╂墜灏嗕负鎮ㄦ彁渚涗笓涓氱殑瑙g瓟鍜屽缓璁��' }, ]; export default function AIScenePage() { const [isChatOpen, setIsChatOpen] = useState(false); + const [isIntroOpen, setIsIntroOpen] = useState(false); const [currentChatbot, setCurrentChatbot] = useState(''); + const [selectedScene, setSelectedScene] = useState(services[0]); - const handleCardClick = (title: string, chatbotId?: string) => { - if (chatbotId) { - setCurrentChatbot(chatbotId); - setIsChatOpen(true); - } + const handleCardClick = (service: typeof services[0]) => { + setSelectedScene(service); + setIsIntroOpen(true); + }; + + const handleStartChat = () => { + setIsIntroOpen(false); + setCurrentChatbot(selectedScene.chatbotId); + setIsChatOpen(true); }; return ( @@ -62,12 +77,20 @@ <Card key={index} {...service} - onClick={() => handleCardClick(service.title, service.chatbotId)} + onClick={() => handleCardClick(service)} /> ))} </div> </div> </div> + + <SceneIntroDialog + isOpen={isIntroOpen} + onClose={() => setIsIntroOpen(false)} + onStartChat={handleStartChat} + scene={selectedScene} + /> + <ChatDialog isOpen={isChatOpen} onClose={() => setIsChatOpen(false)} diff --git a/src/components/SceneIntroDialog.tsx b/src/components/SceneIntroDialog.tsx new file mode 100644 index 0000000..3217c52 --- /dev/null +++ b/src/components/SceneIntroDialog.tsx @@ -0,0 +1,124 @@ +"use client"; + +import { Dialog, Transition } from '@headlessui/react'; +import { Fragment } from 'react'; + +interface SceneIntroDialogProps { + isOpen: boolean; + onClose: () => void; + onStartChat: () => void; + scene: { + title: string; + description: string; + imageUrl: string; + background?: string; + instructions?: string; + }; +} + +export default function SceneIntroDialog({ + isOpen, + onClose, + onStartChat, + scene +}: SceneIntroDialogProps) { + return ( + <Transition appear show={isOpen} as={Fragment}> + <Dialog as="div" className="relative z-50" onClose={onClose}> + <Transition.Child + as={Fragment} + enter="ease-out duration-300" + enterFrom="opacity-0" + enterTo="opacity-100" + leave="ease-out duration-200" + leaveFrom="opacity-100" + leaveTo="opacity-0" + > + <div className="fixed inset-0 bg-black/70" /> + </Transition.Child> + + <div className="fixed inset-0 overflow-y-auto"> + <div className="flex min-h-full items-center justify-center p-4"> + <Transition.Child + as={Fragment} + enter="ease-out duration-300" + enterFrom="opacity-0 scale-95" + enterTo="opacity-100 scale-100" + leave="ease-out duration-200" + leaveFrom="opacity-100 scale-100" + leaveTo="opacity-0 scale-95" + > + <Dialog.Panel className="w-full max-w-2xl transform overflow-hidden rounded-2xl bg-gradient-to-br from-[#1E2B63] to-[#0A1033] p-6 shadow-xl transition-all"> + {/* 绉戞妧鎰熻儗鏅晥鏋� */} + <div className="absolute inset-0 overflow-hidden pointer-events-none"> + <div className="absolute inset-0 opacity-10" + style={{ + backgroundImage: 'radial-gradient(circle, rgba(106, 219, 255, 0.3) 1px, transparent 1px)', + backgroundSize: '20px 20px' + }}> + </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> + + <div className="relative"> + {/* 鏍囬 */} + <Dialog.Title className="text-2xl font-bold text-white mb-4"> + <span className="text-transparent bg-clip-text bg-gradient-to-r from-[#6ADBFF] to-[#5E72EB]"> + {scene.title} + </span> + </Dialog.Title> + + {/* 鍦烘櫙鍥剧墖 */} + <div className="relative h-48 mb-6 rounded-lg overflow-hidden"> + <img + src={scene.imageUrl} + alt={scene.title} + className="w-full h-full object-cover" + /> + <div className="absolute inset-0 bg-gradient-to-t from-[#0A1033]/80 to-transparent"></div> + </div> + + {/* 鍦烘櫙鑳屾櫙 */} + <div className="mb-6"> + <h3 className="text-lg font-semibold text-[#6ADBFF] mb-2">鍦烘櫙鑳屾櫙</h3> + <p className="text-gray-300 leading-relaxed"> + {scene.background || scene.description} + </p> + </div> + + {/* 浣跨敤璇存槑 */} + <div className="mb-8"> + <h3 className="text-lg font-semibold text-[#6ADBFF] mb-2">浣跨敤璇存槑</h3> + <p className="text-gray-300 leading-relaxed"> + {scene.instructions || '閫氳繃鑷劧璇█瀵硅瘽鐨勬柟寮忥紝鎻忚堪鎮ㄧ殑鍏蜂綋闇�姹傦紝AI鍔╂墜灏嗕负鎮ㄦ彁渚涗笓涓氱殑瑙e喅鏂规銆�'} + </p> + </div> + + {/* 鎸夐挳缁� */} + <div className="flex justify-end gap-4"> + <button + onClick={onClose} + className="px-4 py-2 text-sm font-medium text-gray-300 hover:text-white transition-colors" + > + 鍏抽棴 + </button> + <button + onClick={onStartChat} + className="relative px-6 py-2 rounded-lg overflow-hidden group backdrop-blur-sm bg-white/5 border border-[#6ADBFF]/30 hover:border-[#6ADBFF]/50 transition-all duration-300" + > + <div className="absolute inset-0 bg-gradient-to-r from-[#6ADBFF]/5 to-[#5E72EB]/5 group-hover:from-[#6ADBFF]/10 group-hover:to-[#5E72EB]/10 transition-all duration-300"></div> + <span className="relative text-white group-hover:text-[#6ADBFF] transition-colors duration-300"> + 寮�濮嬩娇鐢� + </span> + </button> + </div> + </div> + </Dialog.Panel> + </Transition.Child> + </div> + </div> + </Dialog> + </Transition> + ); +} \ No newline at end of file -- Gitblit v1.9.3