hongjli
2025-04-08 d0c9d7d10f846a831228663885e015120cdf950c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
"use client";
 
import { Dialog, Transition } from '@headlessui/react';
import { Fragment } from 'react';
import { motion } from 'framer-motion';
 
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-500"
          enterFrom="opacity-0"
          enterTo="opacity-100"
          leave="ease-in duration-300"
          leaveFrom="opacity-100"
          leaveTo="opacity-0"
        >
          <div className="fixed inset-0 bg-black/80 backdrop-blur-sm" />
        </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-400"
              enterFrom="opacity-0 scale-95 -translate-y-10"
              enterTo="opacity-100 scale-100 translate-y-0"
              leave="ease-in duration-300"
              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-[#131C41] to-[#0A1033] p-6 shadow-[0_0_50px_rgba(106,219,255,0.2)] 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.5) 1px, transparent 1px)', 
                      backgroundSize: '20px 20px' 
                    }}>
                  </div>
                  
                  {/* 扫描线动画 */}
                  <motion.div 
                    className="absolute left-0 right-0 h-[2px] bg-gradient-to-r from-transparent via-[#6ADBFF]/60 to-transparent"
                    initial={{ top: "-20%" }}
                    animate={{ 
                      top: ["0%", "100%"],
                    }}
                    transition={{ 
                      repeat: Infinity, 
                      duration: 3,
                      ease: "linear",
                      repeatType: "loop"
                    }}
                  />
                  
                  {/* 边框装饰 */}
                  <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 left-0 w-16 h-16">
                    <div className="absolute top-0 left-0 w-8 h-[1px] bg-[#6ADBFF]/70"></div>
                    <div className="absolute top-0 left-0 w-[1px] h-8 bg-[#6ADBFF]/70"></div>
                  </div>
                  <div className="absolute top-0 right-0 w-16 h-16">
                    <div className="absolute top-0 right-0 w-8 h-[1px] bg-[#6ADBFF]/70"></div>
                    <div className="absolute top-0 right-0 w-[1px] h-8 bg-[#6ADBFF]/70"></div>
                  </div>
                  <div className="absolute bottom-0 left-0 w-16 h-16">
                    <div className="absolute bottom-0 left-0 w-8 h-[1px] bg-[#6ADBFF]/70"></div>
                    <div className="absolute bottom-0 left-0 w-[1px] h-8 bg-[#6ADBFF]/70"></div>
                  </div>
                  <div className="absolute bottom-0 right-0 w-16 h-16">
                    <div className="absolute bottom-0 right-0 w-8 h-[1px] bg-[#6ADBFF]/70"></div>
                    <div className="absolute bottom-0 right-0 w-[1px] h-8 bg-[#6ADBFF]/70"></div>
                  </div>
                </div>
 
                <div className="relative">
                  {/* 标题 */}
                  <motion.div
                    initial={{ opacity: 0, y: -10 }}
                    animate={{ opacity: 1, y: 0 }}
                    transition={{ duration: 0.4, delay: 0.2 }}
                  >
                    <Dialog.Title className="text-2xl font-bold text-white mb-4 flex items-center">
                      <span className="text-transparent bg-clip-text bg-gradient-to-r from-[#6ADBFF] to-[#5E72EB]">
                        {scene.title}
                      </span>
                      <motion.span 
                        className="ml-2 inline-block w-2 h-2 rounded-full bg-[#6ADBFF]"
                        animate={{ 
                          scale: [1, 1.5, 1],
                          opacity: [0.7, 1, 0.7] 
                        }}
                        transition={{ 
                          duration: 2,
                          repeat: Infinity,
                          ease: "easeInOut"
                        }}
                      />
                    </Dialog.Title>
                  </motion.div>
 
                  {/* 场景图片 */}
                  <motion.div 
                    className="relative h-48 mb-6 rounded-lg overflow-hidden"
                    initial={{ opacity: 0, scale: 0.95 }}
                    animate={{ opacity: 1, scale: 1 }}
                    transition={{ duration: 0.5, delay: 0.3 }}
                  >
                    <div className="absolute inset-0 bg-gradient-to-t from-[#0A1033]/80 to-transparent z-10"></div>
                    <img
                      src={scene.imageUrl}
                      alt={scene.title}
                      className="w-full h-full object-cover transform scale-100 hover:scale-105 transition-transform duration-700 ease-out"
                    />
                    
                    {/* 装饰性科技感元素 */}
                    <div className="absolute top-3 right-3 w-8 h-8 border-t-2 border-r-2 border-[#6ADBFF]/70 opacity-70"></div>
                    <div className="absolute bottom-3 left-3 w-8 h-8 border-b-2 border-l-2 border-[#6ADBFF]/70 opacity-70"></div>
                  </motion.div>
 
                  {/* 场景背景 */}
                  <motion.div 
                    className="mb-6"
                    initial={{ opacity: 0, x: -20 }}
                    animate={{ opacity: 1, x: 0 }}
                    transition={{ duration: 0.5, delay: 0.4 }}
                  >
                    <h3 className="text-lg font-semibold text-[#6ADBFF] mb-2 flex items-center">
                      <div className="w-1 h-4 bg-[#6ADBFF] mr-2"></div>
                      场景背景
                    </h3>
                    <p className="text-gray-300 leading-relaxed ml-3 pl-2 border-l border-[#6ADBFF]/30">
                      {scene.background || scene.description}
                    </p>
                  </motion.div>
 
                  {/* 使用说明 */}
                  <motion.div 
                    className="mb-8"
                    initial={{ opacity: 0, x: -20 }}
                    animate={{ opacity: 1, x: 0 }}
                    transition={{ duration: 0.5, delay: 0.5 }}
                  >
                    <h3 className="text-lg font-semibold text-[#6ADBFF] mb-2 flex items-center">
                      <div className="w-1 h-4 bg-[#6ADBFF] mr-2"></div>
                      使用说明
                    </h3>
                    <p className="text-gray-300 leading-relaxed ml-3 pl-2 border-l border-[#6ADBFF]/30">
                      {scene.instructions || '通过自然语言对话的方式,描述您的具体需求,AI助手将为您提供专业的解决方案。'}
                    </p>
                  </motion.div>
 
                  {/* 按钮组 */}
                  <motion.div 
                    className="flex justify-end gap-4"
                    initial={{ opacity: 0, y: 20 }}
                    animate={{ opacity: 1, y: 0 }}
                    transition={{ duration: 0.5, delay: 0.6 }}
                  >
                    <button
                      onClick={onClose}
                      className="px-4 py-2 text-sm font-medium text-gray-300 hover:text-white transition-colors relative overflow-hidden group"
                    >
                      <span className="relative z-10">关闭</span>
                      <span className="absolute bottom-0 left-0 right-0 h-[1px] bg-gray-300/30 transform scale-x-0 group-hover:scale-x-100 transition-transform duration-300 origin-left"></span>
                    </button>
                    
                    <button
                      onClick={onStartChat}
                      className="group relative"
                    >
                      <div className="absolute -inset-0.5 rounded-lg bg-gradient-to-r from-[#6ADBFF] to-[#5E72EB] opacity-60 blur group-hover:opacity-100 transition-all duration-300"></div>
                      <div className="relative px-6 py-2 rounded-lg bg-[#131C41] text-white group-hover:text-[#6ADBFF] transition-colors duration-300 flex items-center gap-2">
                        <span>开始使用</span>
                        <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 transform group-hover:translate-x-1 transition-transform duration-300" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 7l5 5m0 0l-5 5m5-5H6" />
                        </svg>
                        
                        {/* 粒子效果 */}
                        <div className="absolute inset-0 overflow-hidden rounded-lg pointer-events-none">
                          {[...Array(3)].map((_, i) => (
                            <motion.div
                              key={i}
                              className="absolute w-1 h-1 rounded-full bg-[#6ADBFF]"
                              initial={{ 
                                x: "0%", 
                                y: "0%", 
                                opacity: 0 
                              }}
                              animate={{ 
                                x: ["0%", `${Math.random() * 100}%`, "100%"], 
                                y: ["0%", `${Math.random() * 100}%`, "100%"],
                                opacity: [0, 0.8, 0]
                              }}
                              transition={{ 
                                duration: 1.5 + Math.random(), 
                                repeat: Infinity, 
                                repeatType: "loop",
                                ease: "linear",
                                delay: i * 0.2
                              }}
                            />
                          ))}
                        </div>
                      </div>
                    </button>
                  </motion.div>
                </div>
              </Dialog.Panel>
            </Transition.Child>
          </div>
        </div>
      </Dialog>
    </Transition>
  );