Girish Jeswani commited on
Commit
d735bc0
·
1 Parent(s): 938013d

add dark theme

Browse files
phd-advisor-frontend/src/App.js CHANGED
@@ -1,4 +1,5 @@
1
  import React, { useState } from 'react';
 
2
  import HomePage from './pages/HomePage';
3
  import ChatPage from './pages/ChatPage';
4
  import './styles/components.css';
@@ -22,13 +23,15 @@ function App() {
22
  };
23
 
24
  return (
25
- <div className="App">
26
- {currentView === 'home' ? (
27
- <HomePage onNavigateToChat={navigateToChat} />
28
- ) : (
29
- <ChatPage onNavigateToHome={navigateToHome} />
30
- )}
31
- </div>
 
 
32
  );
33
  }
34
 
 
1
  import React, { useState } from 'react';
2
+ import { ThemeProvider } from './contexts/ThemeContext';
3
  import HomePage from './pages/HomePage';
4
  import ChatPage from './pages/ChatPage';
5
  import './styles/components.css';
 
23
  };
24
 
25
  return (
26
+ <ThemeProvider>
27
+ <div className="App">
28
+ {currentView === 'home' ? (
29
+ <HomePage onNavigateToChat={navigateToChat} />
30
+ ) : (
31
+ <ChatPage onNavigateToHome={navigateToHome} />
32
+ )}
33
+ </div>
34
+ </ThemeProvider>
35
  );
36
  }
37
 
phd-advisor-frontend/src/components/AdvisorCard.js CHANGED
@@ -1,20 +1,24 @@
1
  import React from 'react';
 
 
2
 
3
- const AdvisorCard = ({ advisor }) => {
4
  const Icon = advisor.icon;
 
 
5
 
6
  return (
7
  <div className="advisor-card">
8
  <div
9
  className="advisor-card-icon"
10
- style={{ backgroundColor: advisor.bgColor }}
11
  >
12
- <Icon style={{ color: advisor.color }} />
13
  </div>
14
  <h3 className="advisor-card-title">{advisor.name}</h3>
15
  <p
16
  className="advisor-card-role"
17
- style={{ color: advisor.color }}
18
  >
19
  {advisor.role}
20
  </p>
 
1
  import React from 'react';
2
+ import { getAdvisorColors } from '../data/advisors';
3
+ import { useTheme } from '../contexts/ThemeContext';
4
 
5
+ const AdvisorCard = ({ advisor, advisorId }) => {
6
  const Icon = advisor.icon;
7
+ const { isDark } = useTheme();
8
+ const colors = getAdvisorColors(advisorId, isDark);
9
 
10
  return (
11
  <div className="advisor-card">
12
  <div
13
  className="advisor-card-icon"
14
+ style={{ backgroundColor: colors.bgColor }}
15
  >
16
+ <Icon style={{ color: colors.color }} />
17
  </div>
18
  <h3 className="advisor-card-title">{advisor.name}</h3>
19
  <p
20
  className="advisor-card-role"
21
+ style={{ color: colors.color }}
22
  >
23
  {advisor.role}
24
  </p>
phd-advisor-frontend/src/components/MessageBubble.js CHANGED
@@ -1,7 +1,10 @@
1
  import React from 'react';
2
- import { advisors } from '../data/advisors';
 
3
 
4
  const MessageBubble = ({ message }) => {
 
 
5
  if (message.type === 'user') {
6
  return (
7
  <div className="user-message-container">
@@ -15,31 +18,51 @@ const MessageBubble = ({ message }) => {
15
  if (message.type === 'advisor') {
16
  const advisor = advisors[message.advisorId];
17
  const Icon = advisor.icon;
 
18
 
19
  return (
20
  <div className="advisor-message-container">
21
  <div
22
  className="advisor-avatar"
23
- style={{ backgroundColor: advisor.bgColor }}
24
  >
25
- <Icon style={{ color: advisor.color }} />
26
  </div>
27
- <div className="advisor-message-bubble">
 
 
 
 
 
 
28
  <div className="advisor-message-header">
29
  <h4
30
  className="advisor-message-name"
31
- style={{ color: advisor.color }}
32
  >
33
  {advisor.name}
34
  </h4>
35
- <span className="message-time">
 
 
 
 
 
 
36
  {message.timestamp.toLocaleTimeString([], {
37
  hour: '2-digit',
38
  minute: '2-digit'
39
  })}
40
  </span>
41
  </div>
42
- <p className="advisor-message-text">{message.content}</p>
 
 
 
 
 
 
 
43
  </div>
44
  </div>
45
  );
 
1
  import React from 'react';
2
+ import { advisors, getAdvisorColors } from '../data/advisors';
3
+ import { useTheme } from '../contexts/ThemeContext';
4
 
5
  const MessageBubble = ({ message }) => {
6
+ const { isDark } = useTheme();
7
+
8
  if (message.type === 'user') {
9
  return (
10
  <div className="user-message-container">
 
18
  if (message.type === 'advisor') {
19
  const advisor = advisors[message.advisorId];
20
  const Icon = advisor.icon;
21
+ const colors = getAdvisorColors(message.advisorId, isDark);
22
 
23
  return (
24
  <div className="advisor-message-container">
25
  <div
26
  className="advisor-avatar"
27
+ style={{ backgroundColor: colors.bgColor }}
28
  >
29
+ <Icon style={{ color: colors.color }} />
30
  </div>
31
+ <div
32
+ className="advisor-message-bubble"
33
+ style={{
34
+ backgroundColor: colors.bgColor,
35
+ borderColor: colors.color + '40' // Adding transparency to the border
36
+ }}
37
+ >
38
  <div className="advisor-message-header">
39
  <h4
40
  className="advisor-message-name"
41
+ style={{ color: colors.color }}
42
  >
43
  {advisor.name}
44
  </h4>
45
+ <span
46
+ className="message-time"
47
+ style={{
48
+ color: colors.color,
49
+ opacity: 0.7
50
+ }}
51
+ >
52
  {message.timestamp.toLocaleTimeString([], {
53
  hour: '2-digit',
54
  minute: '2-digit'
55
  })}
56
  </span>
57
  </div>
58
+ <p
59
+ className="advisor-message-text"
60
+ style={{
61
+ color: colors.textColor
62
+ }}
63
+ >
64
+ {message.content}
65
+ </p>
66
  </div>
67
  </div>
68
  );
phd-advisor-frontend/src/components/ThinkingIndicator.js CHANGED
@@ -1,23 +1,32 @@
1
  import React from 'react';
2
- import { advisors } from '../data/advisors';
 
3
 
4
  const ThinkingIndicator = ({ advisorId }) => {
5
  const advisor = advisors[advisorId];
6
  const Icon = advisor.icon;
 
 
7
 
8
  return (
9
  <div className="thinking-container">
10
  <div
11
  className="advisor-avatar"
12
- style={{ backgroundColor: advisor.bgColor }}
13
  >
14
- <Icon style={{ color: advisor.color }} />
15
  </div>
16
- <div className="thinking-bubble">
 
 
 
 
 
 
17
  <div className="thinking-header">
18
  <h4
19
  className="advisor-name"
20
- style={{ color: advisor.color }}
21
  >
22
  {advisor.name}
23
  </h4>
@@ -26,26 +35,34 @@ const ThinkingIndicator = ({ advisorId }) => {
26
  <div
27
  className="thinking-dot"
28
  style={{
29
- backgroundColor: advisor.color,
30
  animationDelay: '0ms'
31
  }}
32
  ></div>
33
  <div
34
  className="thinking-dot"
35
  style={{
36
- backgroundColor: advisor.color,
37
  animationDelay: '150ms'
38
  }}
39
  ></div>
40
  <div
41
  className="thinking-dot"
42
  style={{
43
- backgroundColor: advisor.color,
44
  animationDelay: '300ms'
45
  }}
46
  ></div>
47
  </div>
48
- <p className="thinking-text">thinking...</p>
 
 
 
 
 
 
 
 
49
  </div>
50
  </div>
51
  );
 
1
  import React from 'react';
2
+ import { advisors, getAdvisorColors } from '../data/advisors';
3
+ import { useTheme } from '../contexts/ThemeContext';
4
 
5
  const ThinkingIndicator = ({ advisorId }) => {
6
  const advisor = advisors[advisorId];
7
  const Icon = advisor.icon;
8
+ const { isDark } = useTheme();
9
+ const colors = getAdvisorColors(advisorId, isDark);
10
 
11
  return (
12
  <div className="thinking-container">
13
  <div
14
  className="advisor-avatar"
15
+ style={{ backgroundColor: colors.bgColor }}
16
  >
17
+ <Icon style={{ color: colors.color }} />
18
  </div>
19
+ <div
20
+ className="thinking-bubble"
21
+ style={{
22
+ backgroundColor: colors.bgColor,
23
+ borderColor: colors.color + '40' // Adding transparency to the border
24
+ }}
25
+ >
26
  <div className="thinking-header">
27
  <h4
28
  className="advisor-name"
29
+ style={{ color: colors.color }}
30
  >
31
  {advisor.name}
32
  </h4>
 
35
  <div
36
  className="thinking-dot"
37
  style={{
38
+ backgroundColor: colors.color,
39
  animationDelay: '0ms'
40
  }}
41
  ></div>
42
  <div
43
  className="thinking-dot"
44
  style={{
45
+ backgroundColor: colors.color,
46
  animationDelay: '150ms'
47
  }}
48
  ></div>
49
  <div
50
  className="thinking-dot"
51
  style={{
52
+ backgroundColor: colors.color,
53
  animationDelay: '300ms'
54
  }}
55
  ></div>
56
  </div>
57
+ <p
58
+ className="thinking-text"
59
+ style={{
60
+ color: colors.color,
61
+ opacity: 0.8
62
+ }}
63
+ >
64
+ thinking...
65
+ </p>
66
  </div>
67
  </div>
68
  );
phd-advisor-frontend/src/data/advisors.js CHANGED
@@ -4,25 +4,57 @@ export const advisors = {
4
  methodist: {
5
  name: 'Dr. Methodist',
6
  role: 'Methodical Advisor',
 
7
  color: '#3B82F6',
8
  bgColor: '#EFF6FF',
 
 
 
 
9
  icon: BookOpen,
10
  description: 'Structured & Planning-focused'
11
  },
12
  theorist: {
13
  name: 'Dr. Theorist',
14
  role: 'Theoretical Advisor',
 
15
  color: '#8B5CF6',
16
  bgColor: '#F3E8FF',
 
 
 
 
17
  icon: Brain,
18
  description: 'Abstract & Conceptual'
19
  },
20
  pragmatist: {
21
  name: 'Dr. Pragmatist',
22
  role: 'Practical Advisor',
 
23
  color: '#10B981',
24
  bgColor: '#ECFDF5',
 
 
 
 
25
  icon: Target,
26
  description: 'Real-world & Outcome-focused'
27
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  };
 
4
  methodist: {
5
  name: 'Dr. Methodist',
6
  role: 'Methodical Advisor',
7
+ // Light theme colors
8
  color: '#3B82F6',
9
  bgColor: '#EFF6FF',
10
+ // Dark theme colors
11
+ darkColor: '#60A5FA',
12
+ darkBgColor: '#1E3A8A',
13
+ // Icon and description
14
  icon: BookOpen,
15
  description: 'Structured & Planning-focused'
16
  },
17
  theorist: {
18
  name: 'Dr. Theorist',
19
  role: 'Theoretical Advisor',
20
+ // Light theme colors
21
  color: '#8B5CF6',
22
  bgColor: '#F3E8FF',
23
+ // Dark theme colors
24
+ darkColor: '#A78BFA',
25
+ darkBgColor: '#581C87',
26
+ // Icon and description
27
  icon: Brain,
28
  description: 'Abstract & Conceptual'
29
  },
30
  pragmatist: {
31
  name: 'Dr. Pragmatist',
32
  role: 'Practical Advisor',
33
+ // Light theme colors
34
  color: '#10B981',
35
  bgColor: '#ECFDF5',
36
+ // Dark theme colors
37
+ darkColor: '#34D399',
38
+ darkBgColor: '#065F46',
39
+ // Icon and description
40
  icon: Target,
41
  description: 'Real-world & Outcome-focused'
42
  }
43
+ };
44
+
45
+ // Helper function to get theme-appropriate colors
46
+ export const getAdvisorColors = (advisorId, isDark = false) => {
47
+ const advisor = advisors[advisorId];
48
+ if (!advisor) return { color: '#6B7280', bgColor: '#F3F4F6' };
49
+
50
+ return {
51
+ color: isDark ? advisor.darkColor : advisor.color,
52
+ bgColor: isDark ? advisor.darkBgColor : advisor.bgColor,
53
+ // For text that needs to be readable on colored backgrounds
54
+ textColor: isDark ? '#F9FAFB' :
55
+ advisor.color === '#10B981' ? '#047857' : // Darker green for pragmatist
56
+ advisor.color === '#3B82F6' ? '#1D4ED8' : // Darker blue for methodist
57
+ advisor.color === '#8B5CF6' ? '#7C3AED' : // Darker purple for theorist
58
+ '#374151' // fallback
59
+ };
60
  };
phd-advisor-frontend/src/pages/ChatPage.js CHANGED
@@ -3,7 +3,10 @@ import { Home, MessageCircle } from 'lucide-react';
3
  import ChatInput from '../components/ChatInput';
4
  import MessageBubble from '../components/MessageBubble';
5
  import ThinkingIndicator from '../components/ThinkingIndicator';
6
- import { advisors } from '../data/advisors';
 
 
 
7
 
8
  const ChatPage = ({ onNavigateToHome }) => {
9
  const [messages, setMessages] = useState([]);
@@ -11,6 +14,7 @@ const ChatPage = ({ onNavigateToHome }) => {
11
  const [thinkingAdvisors, setThinkingAdvisors] = useState([]);
12
  const [collectedInfo, setCollectedInfo] = useState({});
13
  const messagesEndRef = useRef(null);
 
14
 
15
  const scrollToBottom = () => {
16
  messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
@@ -120,6 +124,10 @@ const ChatPage = ({ onNavigateToHome }) => {
120
  }
121
  };
122
 
 
 
 
 
123
  return (
124
  <div className="chat-page">
125
  {/* Header */}
@@ -137,24 +145,28 @@ const ChatPage = ({ onNavigateToHome }) => {
137
  <p className="chat-subtitle">
138
  {Object.keys(collectedInfo).length > 0
139
  ? `Context: ${Object.entries(collectedInfo).map(([k,v]) => `${k}: ${v}`).join(', ')}`
140
- : 'Consulting with your three advisors'
141
  }
142
  </p>
143
  </div>
144
  </div>
145
- <div className="advisor-indicators">
146
- {Object.entries(advisors).map(([id, advisor]) => {
147
- const Icon = advisor.icon;
148
- return (
149
- <div
150
- key={id}
151
- className="advisor-indicator"
152
- style={{ backgroundColor: advisor.bgColor }}
153
- >
154
- <Icon style={{ color: advisor.color }} />
155
- </div>
156
- );
157
- })}
 
 
 
 
158
  </div>
159
  </div>
160
  </header>
@@ -165,37 +177,29 @@ const ChatPage = ({ onNavigateToHome }) => {
165
  {/* Messages */}
166
  <div className="messages-container">
167
  {messages.length === 0 && (
168
- <div className="empty-state">
169
- <div className="empty-state-icon">
170
- <MessageCircle />
171
- </div>
172
- <h3 className="empty-state-title">Start Your Consultation</h3>
173
- <p className="empty-state-text">
174
- Ask a question and get insights from all three advisors
175
- </p>
176
- </div>
177
  )}
178
 
179
  {messages.map((message, index) => {
180
  if (message.type === 'orchestrator') {
181
  return (
182
  <div key={index} className="advisor-message-container">
183
- <div className="advisor-avatar" style={{ backgroundColor: '#F3F4F6' }}>
184
- <MessageCircle style={{ color: '#6B7280' }} />
185
  </div>
186
- <div className="advisor-message-bubble">
187
  <div className="advisor-message-header">
188
- <h4 className="advisor-message-name" style={{ color: '#6B7280' }}>
189
  PhD Assistant
190
  </h4>
191
- <span className="message-time">
192
  {message.timestamp.toLocaleTimeString([], {
193
  hour: '2-digit',
194
  minute: '2-digit'
195
  })}
196
  </span>
197
  </div>
198
- <p className="advisor-message-text">{message.content}</p>
199
  </div>
200
  </div>
201
  );
@@ -206,21 +210,21 @@ const ChatPage = ({ onNavigateToHome }) => {
206
  {/* Thinking Indicators */}
207
  {thinkingAdvisors.includes('system') && (
208
  <div className="thinking-container">
209
- <div className="advisor-avatar" style={{ backgroundColor: '#F3F4F6' }}>
210
- <MessageCircle style={{ color: '#6B7280' }} />
211
  </div>
212
- <div className="thinking-bubble">
213
  <div className="thinking-header">
214
- <h4 className="advisor-name" style={{ color: '#6B7280' }}>
215
  Processing...
216
  </h4>
217
  </div>
218
  <div className="thinking-dots">
219
- <div className="thinking-dot" style={{ backgroundColor: '#6B7280', animationDelay: '0ms' }}></div>
220
- <div className="thinking-dot" style={{ backgroundColor: '#6B7280', animationDelay: '150ms' }}></div>
221
- <div className="thinking-dot" style={{ backgroundColor: '#6B7280', animationDelay: '300ms' }}></div>
222
  </div>
223
- <p className="thinking-text">analyzing your question...</p>
224
  </div>
225
  </div>
226
  )}
 
3
  import ChatInput from '../components/ChatInput';
4
  import MessageBubble from '../components/MessageBubble';
5
  import ThinkingIndicator from '../components/ThinkingIndicator';
6
+ import SuggestionsPanel from '../components/SuggestionsPanel';
7
+ import ThemeToggle from '../components/ThemeToggle';
8
+ import { advisors, getAdvisorColors } from '../data/advisors';
9
+ import { useTheme } from '../contexts/ThemeContext';
10
 
11
  const ChatPage = ({ onNavigateToHome }) => {
12
  const [messages, setMessages] = useState([]);
 
14
  const [thinkingAdvisors, setThinkingAdvisors] = useState([]);
15
  const [collectedInfo, setCollectedInfo] = useState({});
16
  const messagesEndRef = useRef(null);
17
+ const { isDark } = useTheme();
18
 
19
  const scrollToBottom = () => {
20
  messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
 
124
  }
125
  };
126
 
127
+ const handleSuggestionClick = (suggestion) => {
128
+ handleSendMessage(suggestion);
129
+ };
130
+
131
  return (
132
  <div className="chat-page">
133
  {/* Header */}
 
145
  <p className="chat-subtitle">
146
  {Object.keys(collectedInfo).length > 0
147
  ? `Context: ${Object.entries(collectedInfo).map(([k,v]) => `${k}: ${v}`).join(', ')}`
148
+ : 'Consulting with personas'
149
  }
150
  </p>
151
  </div>
152
  </div>
153
+ <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>
154
+ <div className="advisor-indicators">
155
+ {Object.entries(advisors).map(([id, advisor]) => {
156
+ const Icon = advisor.icon;
157
+ const colors = getAdvisorColors(id, isDark);
158
+ return (
159
+ <div
160
+ key={id}
161
+ className="advisor-indicator"
162
+ style={{ backgroundColor: colors.bgColor }}
163
+ >
164
+ <Icon style={{ color: colors.color }} />
165
+ </div>
166
+ );
167
+ })}
168
+ </div>
169
+ <ThemeToggle />
170
  </div>
171
  </div>
172
  </header>
 
177
  {/* Messages */}
178
  <div className="messages-container">
179
  {messages.length === 0 && (
180
+ <SuggestionsPanel onSuggestionClick={handleSuggestionClick} />
 
 
 
 
 
 
 
 
181
  )}
182
 
183
  {messages.map((message, index) => {
184
  if (message.type === 'orchestrator') {
185
  return (
186
  <div key={index} className="advisor-message-container">
187
+ <div className="advisor-avatar orchestrator-avatar">
188
+ <MessageCircle className="orchestrator-icon" />
189
  </div>
190
+ <div className="advisor-message-bubble orchestrator-bubble">
191
  <div className="advisor-message-header">
192
+ <h4 className="advisor-message-name orchestrator-name">
193
  PhD Assistant
194
  </h4>
195
+ <span className="message-time orchestrator-time">
196
  {message.timestamp.toLocaleTimeString([], {
197
  hour: '2-digit',
198
  minute: '2-digit'
199
  })}
200
  </span>
201
  </div>
202
+ <p className="advisor-message-text orchestrator-text">{message.content}</p>
203
  </div>
204
  </div>
205
  );
 
210
  {/* Thinking Indicators */}
211
  {thinkingAdvisors.includes('system') && (
212
  <div className="thinking-container">
213
+ <div className="advisor-avatar orchestrator-avatar">
214
+ <MessageCircle className="orchestrator-icon" />
215
  </div>
216
+ <div className="thinking-bubble orchestrator-bubble">
217
  <div className="thinking-header">
218
+ <h4 className="advisor-name orchestrator-name">
219
  Processing...
220
  </h4>
221
  </div>
222
  <div className="thinking-dots">
223
+ <div className="thinking-dot orchestrator-dot" style={{ animationDelay: '0ms' }}></div>
224
+ <div className="thinking-dot orchestrator-dot" style={{ animationDelay: '150ms' }}></div>
225
+ <div className="thinking-dot orchestrator-dot" style={{ animationDelay: '300ms' }}></div>
226
  </div>
227
+ <p className="thinking-text orchestrator-thinking-text">analyzing your question...</p>
228
  </div>
229
  </div>
230
  )}
phd-advisor-frontend/src/pages/HomePage.js CHANGED
@@ -1,6 +1,7 @@
1
  import React from 'react';
2
  import { MessageCircle, Users, Target, Brain, ArrowRight } from 'lucide-react';
3
  import AdvisorCard from '../components/AdvisorCard';
 
4
  import { advisors } from '../data/advisors';
5
 
6
  const HomePage = ({ onNavigateToChat }) => {
@@ -18,6 +19,9 @@ const HomePage = ({ onNavigateToChat }) => {
18
  <p className="logo-subtitle">Your AI-powered academic advisors</p>
19
  </div>
20
  </div>
 
 
 
21
  </div>
22
  </header>
23
 
@@ -25,7 +29,7 @@ const HomePage = ({ onNavigateToChat }) => {
25
  <main className="main">
26
  <div className="hero-section">
27
  <h2 className="hero-title">
28
- Get Guidance from <span className="hero-highlight">Three Expert Advisors</span>
29
  </h2>
30
  <p className="hero-subtitle">
31
  Receive diverse perspectives on your PhD journey from our specialized AI advisors,
@@ -44,7 +48,7 @@ const HomePage = ({ onNavigateToChat }) => {
44
  {/* Advisors Grid */}
45
  <div className="advisors-grid">
46
  {Object.entries(advisors).map(([id, advisor]) => (
47
- <AdvisorCard key={id} advisor={advisor} />
48
  ))}
49
  </div>
50
 
 
1
  import React from 'react';
2
  import { MessageCircle, Users, Target, Brain, ArrowRight } from 'lucide-react';
3
  import AdvisorCard from '../components/AdvisorCard';
4
+ import ThemeToggle from '../components/ThemeToggle';
5
  import { advisors } from '../data/advisors';
6
 
7
  const HomePage = ({ onNavigateToChat }) => {
 
19
  <p className="logo-subtitle">Your AI-powered academic advisors</p>
20
  </div>
21
  </div>
22
+ <div className="header-right">
23
+ <ThemeToggle />
24
+ </div>
25
  </div>
26
  </header>
27
 
 
29
  <main className="main">
30
  <div className="hero-section">
31
  <h2 className="hero-title">
32
+ Get Guidance from <span className="hero-highlight">Advisor Personas</span>
33
  </h2>
34
  <p className="hero-subtitle">
35
  Receive diverse perspectives on your PhD journey from our specialized AI advisors,
 
48
  {/* Advisors Grid */}
49
  <div className="advisors-grid">
50
  {Object.entries(advisors).map(([id, advisor]) => (
51
+ <AdvisorCard key={id} advisor={advisor} advisorId={id} />
52
  ))}
53
  </div>
54
 
phd-advisor-frontend/src/styles/components.css CHANGED
@@ -1,13 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  /* Homepage Styles */
2
  .homepage {
3
  min-height: 100vh;
4
- background: linear-gradient(135deg, #EFF6FF 0%, #FFFFFF 50%, #F3E8FF 100%);
5
  }
6
 
7
  .header {
8
- background-color: #FFFFFF;
9
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
10
- border-bottom: 1px solid #E5E7EB;
11
  }
12
 
13
  .header-content {
@@ -25,10 +143,16 @@
25
  gap: 12px;
26
  }
27
 
 
 
 
 
 
 
28
  .logo-container {
29
  width: 40px;
30
  height: 40px;
31
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
32
  border-radius: 8px;
33
  display: flex;
34
  align-items: center;
@@ -44,13 +168,13 @@
44
  .logo-title {
45
  font-size: 20px;
46
  font-weight: bold;
47
- color: #111827;
48
  margin: 0;
49
  }
50
 
51
  .logo-subtitle {
52
  font-size: 14px;
53
- color: #6B7280;
54
  margin: 0;
55
  }
56
 
@@ -68,13 +192,13 @@
68
  .hero-title {
69
  font-size: 48px;
70
  font-weight: bold;
71
- color: #111827;
72
  margin-bottom: 24px;
73
  line-height: 1.1;
74
  }
75
 
76
  .hero-highlight {
77
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
78
  -webkit-background-clip: text;
79
  -webkit-text-fill-color: transparent;
80
  background-clip: text;
@@ -82,7 +206,7 @@
82
 
83
  .hero-subtitle {
84
  font-size: 20px;
85
- color: #6B7280;
86
  max-width: 768px;
87
  margin: 0 auto 32px auto;
88
  line-height: 1.6;
@@ -92,7 +216,7 @@
92
  display: inline-flex;
93
  align-items: center;
94
  gap: 12px;
95
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
96
  color: #FFFFFF;
97
  padding: 16px 32px;
98
  border-radius: 12px;
@@ -100,7 +224,7 @@
100
  font-weight: 600;
101
  border: none;
102
  cursor: pointer;
103
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
104
  transition: all 0.3s ease;
105
  text-decoration: none;
106
  }
@@ -128,16 +252,16 @@
128
  }
129
 
130
  .advisor-card {
131
- background-color: #FFFFFF;
132
  border-radius: 16px;
133
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
134
  padding: 32px;
135
- border: 1px solid #E5E7EB;
136
  transition: box-shadow 0.3s ease;
137
  }
138
 
139
  .advisor-card:hover {
140
- box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
141
  }
142
 
143
  .advisor-card-icon {
@@ -158,7 +282,7 @@
158
  .advisor-card-title {
159
  font-size: 24px;
160
  font-weight: bold;
161
- color: #111827;
162
  margin-bottom: 8px;
163
  }
164
 
@@ -169,24 +293,24 @@
169
  }
170
 
171
  .advisor-card-description {
172
- color: #6B7280;
173
  line-height: 1.6;
174
  margin: 0;
175
  }
176
 
177
  /* Features Section */
178
  .features-section {
179
- background-color: #FFFFFF;
180
  border-radius: 24px;
181
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
182
  padding: 48px;
183
- border: 1px solid #E5E7EB;
184
  }
185
 
186
  .features-title {
187
  font-size: 32px;
188
  font-weight: bold;
189
- color: #111827;
190
  text-align: center;
191
  margin-bottom: 48px;
192
  }
@@ -204,7 +328,7 @@
204
  .feature-icon {
205
  width: 48px;
206
  height: 48px;
207
- background-color: #EFF6FF;
208
  border-radius: 12px;
209
  display: flex;
210
  align-items: center;
@@ -215,260 +339,32 @@
215
  .feature-icon svg {
216
  width: 24px;
217
  height: 24px;
218
- color: #6366F1;
219
  }
220
 
221
  .feature-title {
222
  font-weight: 600;
223
- color: #111827;
224
  margin-bottom: 8px;
225
  font-size: 18px;
226
  }
227
 
228
  .feature-description {
229
- color: #6B7280;
230
  margin: 0;
231
  line-height: 1.6;
232
  }
233
 
234
- /* Clarification Flow Styles */
235
- .clarification-flow {
236
- background-color: #FFFFFF;
237
- border-radius: 16px;
238
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
239
- padding: 24px;
240
- margin: 24px auto;
241
- max-width: 600px;
242
- border: 1px solid #E5E7EB;
243
- }
244
-
245
- .clarification-header {
246
- text-align: center;
247
- margin-bottom: 24px;
248
- padding-bottom: 16px;
249
- border-bottom: 1px solid #F3F4F6;
250
- }
251
-
252
- .clarification-icon {
253
- width: 48px;
254
- height: 48px;
255
- background-color: #EFF6FF;
256
- border-radius: 12px;
257
- display: flex;
258
- align-items: center;
259
- justify-content: center;
260
- margin: 0 auto 16px auto;
261
- }
262
-
263
- .clarification-icon svg {
264
- width: 24px;
265
- height: 24px;
266
- }
267
-
268
- .clarification-title {
269
- font-size: 20px;
270
- font-weight: 600;
271
- color: #111827;
272
- margin-bottom: 8px;
273
- }
274
-
275
- .clarification-subtitle {
276
- font-size: 14px;
277
- color: #6B7280;
278
- margin: 0;
279
- }
280
-
281
- .clarification-conversation {
282
- max-height: 300px;
283
- overflow-y: auto;
284
- margin-bottom: 16px;
285
- }
286
-
287
- .clarification-message {
288
- margin-bottom: 12px;
289
- }
290
-
291
- .user-clarification-message {
292
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
293
- color: #FFFFFF;
294
- border-radius: 12px;
295
- padding: 10px 16px;
296
- margin-left: auto;
297
- max-width: 80%;
298
- width: fit-content;
299
- }
300
-
301
- .user-clarification-message p {
302
- margin: 0;
303
- font-size: 14px;
304
- }
305
-
306
- .system-clarification-message {
307
- display: flex;
308
- align-items: flex-start;
309
- gap: 8px;
310
- background-color: #F9FAFB;
311
- border-radius: 12px;
312
- padding: 12px 16px;
313
- max-width: 90%;
314
- }
315
-
316
- .system-clarification-message p {
317
- margin: 0;
318
- font-size: 14px;
319
- color: #374151;
320
- line-height: 1.5;
321
- }
322
-
323
- .current-question {
324
- margin-bottom: 16px;
325
- padding: 16px;
326
- background-color: #EFF6FF;
327
- border-radius: 12px;
328
- border-left: 4px solid #6366F1;
329
- }
330
-
331
- .collected-info {
332
- background-color: #F0FDF4;
333
- border-radius: 12px;
334
- padding: 16px;
335
- margin-bottom: 16px;
336
- border-left: 4px solid #10B981;
337
- }
338
-
339
- .collected-info h4 {
340
- margin: 0 0 12px 0;
341
- font-size: 14px;
342
- font-weight: 600;
343
- color: #065F46;
344
- }
345
-
346
- .info-tags {
347
- display: flex;
348
- flex-wrap: wrap;
349
- gap: 8px;
350
- }
351
-
352
- .info-tag {
353
- display: flex;
354
- align-items: center;
355
- gap: 4px;
356
- background-color: #DCFCE7;
357
- color: #166534;
358
- padding: 4px 8px;
359
- border-radius: 6px;
360
- font-size: 12px;
361
- font-weight: 500;
362
- }
363
-
364
- .info-tag svg {
365
- width: 14px;
366
- height: 14px;
367
- }
368
-
369
- .clarification-input-area {
370
- border-top: 1px solid #F3F4F6;
371
- padding-top: 16px;
372
- }
373
-
374
- .clarification-input-container {
375
- display: flex;
376
- flex-direction: column;
377
- gap: 12px;
378
- }
379
-
380
- .clarification-input {
381
- width: 100%;
382
- resize: none;
383
- border: 1px solid #D1D5DB;
384
- border-radius: 8px;
385
- padding: 12px;
386
- font-size: 14px;
387
- font-family: inherit;
388
- outline: none;
389
- transition: border-color 0.2s ease;
390
- }
391
-
392
- .clarification-input:focus {
393
- border-color: #6366F1;
394
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
395
- }
396
-
397
- .clarification-buttons {
398
- display: flex;
399
- gap: 8px;
400
- flex-wrap: wrap;
401
- }
402
-
403
- .clarification-submit-btn {
404
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
405
- color: #FFFFFF;
406
- padding: 8px 16px;
407
- border-radius: 8px;
408
- border: none;
409
- font-weight: 500;
410
- cursor: pointer;
411
- transition: all 0.2s ease;
412
- display: flex;
413
- align-items: center;
414
- gap: 6px;
415
- font-size: 14px;
416
- }
417
-
418
- .clarification-submit-btn:hover:not(:disabled) {
419
- transform: translateY(-1px);
420
- box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
421
- }
422
-
423
- .clarification-submit-btn:disabled {
424
- opacity: 0.5;
425
- cursor: not-allowed;
426
- transform: none;
427
- }
428
-
429
- .clarification-skip-btn {
430
- background-color: #F3F4F6;
431
- color: #6B7280;
432
- padding: 8px 16px;
433
- border-radius: 8px;
434
- border: none;
435
- font-weight: 500;
436
- cursor: pointer;
437
- transition: all 0.2s ease;
438
- font-size: 14px;
439
- }
440
-
441
- .clarification-skip-btn:hover {
442
- background-color: #E5E7EB;
443
- color: #374151;
444
- }
445
-
446
- .clarification-cancel-btn {
447
- background-color: transparent;
448
- color: #DC2626;
449
- padding: 8px 16px;
450
- border-radius: 8px;
451
- border: 1px solid #FCA5A5;
452
- font-weight: 500;
453
- cursor: pointer;
454
- transition: all 0.2s ease;
455
- font-size: 14px;
456
- }
457
-
458
- .clarification-cancel-btn:hover {
459
- background-color: #FEF2F2;
460
- }
461
-
462
  /* Chat Page Styles */
463
  .chat-page {
464
  min-height: 100vh;
465
- background-color: #F9FAFB;
466
  }
467
 
468
  .chat-header {
469
- background-color: #FFFFFF;
470
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
471
- border-bottom: 1px solid #E5E7EB;
472
  position: sticky;
473
  top: 0;
474
  z-index: 10;
@@ -499,25 +395,25 @@
499
  }
500
 
501
  .home-button:hover {
502
- background-color: #F3F4F6;
503
  }
504
 
505
  .home-icon {
506
  width: 20px;
507
  height: 20px;
508
- color: #6B7280;
509
  }
510
 
511
  .chat-title {
512
  font-size: 18px;
513
  font-weight: 600;
514
- color: #111827;
515
  margin: 0;
516
  }
517
 
518
  .chat-subtitle {
519
  font-size: 14px;
520
- color: #6B7280;
521
  margin: 0;
522
  }
523
 
@@ -549,9 +445,9 @@
549
  }
550
 
551
  .chat-box {
552
- background-color: #FFFFFF;
553
  border-radius: 16px;
554
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
555
  height: calc(100vh - 200px);
556
  display: flex;
557
  flex-direction: column;
@@ -566,42 +462,146 @@
566
  gap: 16px;
567
  }
568
 
569
- /* Empty State */
570
- .empty-state {
 
 
 
 
 
 
571
  text-align: center;
572
- padding: 48px 0;
573
  }
574
 
575
- .empty-state-icon {
576
- width: 64px;
577
- height: 64px;
578
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
579
- border-radius: 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
580
  display: flex;
581
  align-items: center;
582
- justify-content: center;
583
- margin: 0 auto 16px auto;
 
 
584
  }
585
 
586
- .empty-state-icon svg {
587
- width: 32px;
588
- height: 32px;
589
- color: #FFFFFF;
 
 
 
 
590
  }
591
 
592
- .empty-state-title {
593
- font-size: 18px;
594
  font-weight: 600;
595
- color: #111827;
596
- margin-bottom: 8px;
 
597
  }
598
 
599
- .empty-state-text {
600
- color: #6B7280;
601
- margin: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  }
603
 
604
- /* Message Bubbles */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
605
  .user-message-container {
606
  display: flex;
607
  justify-content: flex-end;
@@ -609,7 +609,7 @@
609
  }
610
 
611
  .user-message {
612
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
613
  color: #FFFFFF;
614
  border-radius: 16px;
615
  padding: 12px 24px;
@@ -643,10 +643,9 @@
643
  }
644
 
645
  .advisor-message-bubble {
646
- background-color: #FFFFFF;
647
  border-radius: 12px;
648
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
649
- border: 1px solid #E5E7EB;
650
  padding: 16px;
651
  max-width: 512px;
652
  }
@@ -665,11 +664,9 @@
665
 
666
  .message-time {
667
  font-size: 12px;
668
- color: #9CA3AF;
669
  }
670
 
671
  .advisor-message-text {
672
- color: #374151;
673
  line-height: 1.6;
674
  margin: 0;
675
  }
@@ -682,9 +679,9 @@
682
  }
683
 
684
  .error-message {
685
- background-color: #FEF2F2;
686
- border: 1px solid #FECACA;
687
- color: #DC2626;
688
  border-radius: 12px;
689
  padding: 12px 16px;
690
  max-width: 384px;
@@ -704,10 +701,9 @@
704
  }
705
 
706
  .thinking-bubble {
707
- background-color: #FFFFFF;
708
  border-radius: 12px;
709
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
710
- border: 1px solid #E5E7EB;
711
  padding: 16px;
712
  max-width: 288px;
713
  }
@@ -739,14 +735,13 @@
739
 
740
  .thinking-text {
741
  font-size: 14px;
742
- color: #6B7280;
743
  margin-top: 4px;
744
  margin-bottom: 0;
745
  }
746
 
747
  /* Chat Input */
748
  .input-area {
749
- border-top: 1px solid #E5E7EB;
750
  padding: 16px;
751
  }
752
 
@@ -758,22 +753,28 @@
758
  .message-input {
759
  flex: 1;
760
  resize: none;
761
- border: 1px solid #D1D5DB;
762
  border-radius: 12px;
763
  padding: 12px 16px;
764
  font-size: 14px;
765
  font-family: inherit;
766
  outline: none;
767
  transition: border-color 0.2s ease;
 
 
 
 
 
 
768
  }
769
 
770
  .message-input:focus {
771
- border-color: #6366F1;
772
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
773
  }
774
 
775
  .send-button {
776
- background: linear-gradient(135deg, #6366F1, #8B5CF6);
777
  color: #FFFFFF;
778
  padding: 12px 24px;
779
  border-radius: 12px;
@@ -788,7 +789,7 @@
788
 
789
  .send-button:hover:not(:disabled) {
790
  transform: translateY(-1px);
791
- box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
792
  }
793
 
794
  .send-button:disabled {
@@ -806,8 +807,85 @@
806
  display: none;
807
  }
808
 
809
- @media (min-width: 640px) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
810
  .send-text {
811
  display: inline;
812
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
813
  }
 
1
+ /* CSS Custom Properties for Theming */
2
+ :root[data-theme="light"] {
3
+ /* Background Colors */
4
+ --bg-primary: #FFFFFF;
5
+ --bg-secondary: #F9FAFB;
6
+ --bg-tertiary: #F3F4F6;
7
+ --bg-gradient: linear-gradient(135deg, #EFF6FF 0%, #FFFFFF 50%, #F3E8FF 100%);
8
+
9
+ /* Text Colors */
10
+ --text-primary: #111827;
11
+ --text-secondary: #6B7280;
12
+ --text-tertiary: #9CA3AF;
13
+ --text-accent: #374151;
14
+
15
+ /* Border Colors */
16
+ --border-primary: #E5E7EB;
17
+ --border-secondary: #D1D5DB;
18
+ --border-tertiary: #F3F4F6;
19
+
20
+ /* Accent Colors */
21
+ --accent-primary: #6366F1;
22
+ --accent-secondary: #8B5CF6;
23
+ --accent-gradient: linear-gradient(135deg, #6366F1, #8B5CF6);
24
+
25
+ /* Shadow Colors */
26
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
27
+ --shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
28
+ --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
29
+ --shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
30
+
31
+ /* Feature Colors */
32
+ --feature-bg: #EFF6FF;
33
+ --feature-icon-color: #6366F1;
34
+
35
+ /* Error Colors */
36
+ --error-bg: #FEF2F2;
37
+ --error-border: #FECACA;
38
+ --error-text: #DC2626;
39
+
40
+ /* Input Colors */
41
+ --input-bg: #FFFFFF;
42
+ --input-border: #D1D5DB;
43
+ --input-focus: #6366F1;
44
+ --input-focus-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
45
+ }
46
+
47
+ :root[data-theme="dark"] {
48
+ /* Background Colors */
49
+ --bg-primary: #1F2937;
50
+ --bg-secondary: #111827;
51
+ --bg-tertiary: #374151;
52
+ --bg-gradient: linear-gradient(135deg, #1F2937 0%, #111827 50%, #374151 100%);
53
+
54
+ /* Text Colors */
55
+ --text-primary: #F9FAFB;
56
+ --text-secondary: #D1D5DB;
57
+ --text-tertiary: #9CA3AF;
58
+ --text-accent: #E5E7EB;
59
+
60
+ /* Border Colors */
61
+ --border-primary: #374151;
62
+ --border-secondary: #4B5563;
63
+ --border-tertiary: #6B7280;
64
+
65
+ /* Accent Colors */
66
+ --accent-primary: #818CF8;
67
+ --accent-secondary: #A78BFA;
68
+ --accent-gradient: linear-gradient(135deg, #818CF8, #A78BFA);
69
+
70
+ /* Shadow Colors */
71
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
72
+ --shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
73
+ --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.3);
74
+ --shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
75
+
76
+ /* Feature Colors */
77
+ --feature-bg: #374151;
78
+ --feature-icon-color: #818CF8;
79
+
80
+ /* Error Colors */
81
+ --error-bg: #7F1D1D;
82
+ --error-border: #DC2626;
83
+ --error-text: #FCA5A5;
84
+
85
+ /* Input Colors */
86
+ --input-bg: #374151;
87
+ --input-border: #4B5563;
88
+ --input-focus: #818CF8;
89
+ --input-focus-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);
90
+ }
91
+
92
+ /* Theme Toggle Button */
93
+ .theme-toggle {
94
+ padding: 8px;
95
+ background-color: transparent;
96
+ border: 1px solid var(--border-primary);
97
+ border-radius: 8px;
98
+ cursor: pointer;
99
+ transition: all 0.2s ease;
100
+ color: var(--text-secondary);
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: center;
104
+ }
105
+
106
+ .theme-toggle:hover {
107
+ background-color: var(--bg-tertiary);
108
+ border-color: var(--accent-primary);
109
+ color: var(--accent-primary);
110
+ }
111
+
112
+ .theme-icon {
113
+ width: 20px;
114
+ height: 20px;
115
+ }
116
+
117
+ /* Updated Component Styles with Theme Variables */
118
+
119
  /* Homepage Styles */
120
  .homepage {
121
  min-height: 100vh;
122
+ background: var(--bg-gradient);
123
  }
124
 
125
  .header {
126
+ background-color: var(--bg-primary);
127
+ box-shadow: var(--shadow-sm);
128
+ border-bottom: 1px solid var(--border-primary);
129
  }
130
 
131
  .header-content {
 
143
  gap: 12px;
144
  }
145
 
146
+ .header-right {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 12px;
150
+ }
151
+
152
  .logo-container {
153
  width: 40px;
154
  height: 40px;
155
+ background: var(--accent-gradient);
156
  border-radius: 8px;
157
  display: flex;
158
  align-items: center;
 
168
  .logo-title {
169
  font-size: 20px;
170
  font-weight: bold;
171
+ color: var(--text-primary);
172
  margin: 0;
173
  }
174
 
175
  .logo-subtitle {
176
  font-size: 14px;
177
+ color: var(--text-secondary);
178
  margin: 0;
179
  }
180
 
 
192
  .hero-title {
193
  font-size: 48px;
194
  font-weight: bold;
195
+ color: var(--text-primary);
196
  margin-bottom: 24px;
197
  line-height: 1.1;
198
  }
199
 
200
  .hero-highlight {
201
+ background: var(--accent-gradient);
202
  -webkit-background-clip: text;
203
  -webkit-text-fill-color: transparent;
204
  background-clip: text;
 
206
 
207
  .hero-subtitle {
208
  font-size: 20px;
209
+ color: var(--text-secondary);
210
  max-width: 768px;
211
  margin: 0 auto 32px auto;
212
  line-height: 1.6;
 
216
  display: inline-flex;
217
  align-items: center;
218
  gap: 12px;
219
+ background: var(--accent-gradient);
220
  color: #FFFFFF;
221
  padding: 16px 32px;
222
  border-radius: 12px;
 
224
  font-weight: 600;
225
  border: none;
226
  cursor: pointer;
227
+ box-shadow: var(--shadow-md);
228
  transition: all 0.3s ease;
229
  text-decoration: none;
230
  }
 
252
  }
253
 
254
  .advisor-card {
255
+ background-color: var(--bg-primary);
256
  border-radius: 16px;
257
+ box-shadow: var(--shadow-md);
258
  padding: 32px;
259
+ border: 1px solid var(--border-primary);
260
  transition: box-shadow 0.3s ease;
261
  }
262
 
263
  .advisor-card:hover {
264
+ box-shadow: var(--shadow-lg);
265
  }
266
 
267
  .advisor-card-icon {
 
282
  .advisor-card-title {
283
  font-size: 24px;
284
  font-weight: bold;
285
+ color: var(--text-primary);
286
  margin-bottom: 8px;
287
  }
288
 
 
293
  }
294
 
295
  .advisor-card-description {
296
+ color: var(--text-secondary);
297
  line-height: 1.6;
298
  margin: 0;
299
  }
300
 
301
  /* Features Section */
302
  .features-section {
303
+ background-color: var(--bg-primary);
304
  border-radius: 24px;
305
+ box-shadow: var(--shadow-xl);
306
  padding: 48px;
307
+ border: 1px solid var(--border-primary);
308
  }
309
 
310
  .features-title {
311
  font-size: 32px;
312
  font-weight: bold;
313
+ color: var(--text-primary);
314
  text-align: center;
315
  margin-bottom: 48px;
316
  }
 
328
  .feature-icon {
329
  width: 48px;
330
  height: 48px;
331
+ background-color: var(--feature-bg);
332
  border-radius: 12px;
333
  display: flex;
334
  align-items: center;
 
339
  .feature-icon svg {
340
  width: 24px;
341
  height: 24px;
342
+ color: var(--feature-icon-color);
343
  }
344
 
345
  .feature-title {
346
  font-weight: 600;
347
+ color: var(--text-primary);
348
  margin-bottom: 8px;
349
  font-size: 18px;
350
  }
351
 
352
  .feature-description {
353
+ color: var(--text-secondary);
354
  margin: 0;
355
  line-height: 1.6;
356
  }
357
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  /* Chat Page Styles */
359
  .chat-page {
360
  min-height: 100vh;
361
+ background-color: var(--bg-secondary);
362
  }
363
 
364
  .chat-header {
365
+ background-color: var(--bg-primary);
366
+ box-shadow: var(--shadow-sm);
367
+ border-bottom: 1px solid var(--border-primary);
368
  position: sticky;
369
  top: 0;
370
  z-index: 10;
 
395
  }
396
 
397
  .home-button:hover {
398
+ background-color: var(--bg-tertiary);
399
  }
400
 
401
  .home-icon {
402
  width: 20px;
403
  height: 20px;
404
+ color: var(--text-secondary);
405
  }
406
 
407
  .chat-title {
408
  font-size: 18px;
409
  font-weight: 600;
410
+ color: var(--text-primary);
411
  margin: 0;
412
  }
413
 
414
  .chat-subtitle {
415
  font-size: 14px;
416
+ color: var(--text-secondary);
417
  margin: 0;
418
  }
419
 
 
445
  }
446
 
447
  .chat-box {
448
+ background-color: var(--bg-primary);
449
  border-radius: 16px;
450
+ box-shadow: var(--shadow-md);
451
  height: calc(100vh - 200px);
452
  display: flex;
453
  flex-direction: column;
 
462
  gap: 16px;
463
  }
464
 
465
+ /* Suggestions Panel */
466
+ .suggestions-panel {
467
+ padding: 32px 0;
468
+ max-width: 900px;
469
+ margin: 0 auto;
470
+ }
471
+
472
+ .suggestions-header {
473
  text-align: center;
474
+ margin-bottom: 32px;
475
  }
476
 
477
+ .suggestions-title {
478
+ font-size: 28px;
479
+ font-weight: bold;
480
+ color: var(--text-primary);
481
+ margin-bottom: 8px;
482
+ }
483
+
484
+ .suggestions-subtitle {
485
+ font-size: 16px;
486
+ color: var(--text-secondary);
487
+ margin: 0;
488
+ }
489
+
490
+ .suggestions-grid {
491
+ display: grid;
492
+ grid-template-columns: repeat(2, 1fr);
493
+ gap: 24px;
494
+ }
495
+
496
+ .suggestion-category {
497
+ background-color: var(--bg-primary);
498
+ border-radius: 12px;
499
+ border: 1px solid var(--border-primary);
500
+ padding: 20px;
501
+ box-shadow: var(--shadow-sm);
502
+ transition: box-shadow 0.2s ease;
503
+ min-height: 200px;
504
+ display: flex;
505
+ flex-direction: column;
506
+ }
507
+
508
+ .suggestion-category:hover {
509
+ box-shadow: var(--shadow-md);
510
+ }
511
+
512
+ .category-header {
513
  display: flex;
514
  align-items: center;
515
+ gap: 12px;
516
+ margin-bottom: 16px;
517
+ padding-bottom: 12px;
518
+ border-bottom: 1px solid var(--border-tertiary);
519
  }
520
 
521
+ .category-icon {
522
+ width: 36px;
523
+ height: 36px;
524
+ border-radius: 8px;
525
+ display: flex;
526
+ align-items: center;
527
+ justify-content: center;
528
+ flex-shrink: 0;
529
  }
530
 
531
+ .category-title {
532
+ font-size: 16px;
533
  font-weight: 600;
534
+ margin: 0;
535
+ line-height: 1.3;
536
+ color: var(--text-primary);
537
  }
538
 
539
+ .suggestion-buttons {
540
+ display: flex;
541
+ flex-direction: column;
542
+ gap: 8px;
543
+ flex: 1;
544
+ }
545
+
546
+ .suggestion-button {
547
+ background-color: var(--bg-primary);
548
+ border: 1px solid var(--border-primary);
549
+ border-radius: 8px;
550
+ padding: 12px 16px;
551
+ text-align: left;
552
+ font-size: 14px;
553
+ line-height: 1.4;
554
+ color: var(--text-accent);
555
+ cursor: pointer;
556
+ transition: all 0.2s ease;
557
+ width: 100%;
558
+ }
559
+
560
+ .suggestion-button:hover {
561
+ background-color: var(--bg-tertiary);
562
+ border-color: var(--accent-primary);
563
+ transform: translateY(-1px);
564
+ box-shadow: var(--shadow-sm);
565
  }
566
 
567
+ .suggestion-button:active {
568
+ transform: translateY(0);
569
+ }
570
+
571
+ /* Orchestrator/PhD Assistant Styles */
572
+ .orchestrator-avatar {
573
+ background-color: var(--bg-tertiary) !important;
574
+ }
575
+
576
+ .orchestrator-icon {
577
+ color: var(--text-secondary) !important;
578
+ }
579
+
580
+ .orchestrator-bubble {
581
+ background-color: var(--bg-tertiary) !important;
582
+ border-color: var(--border-secondary) !important;
583
+ }
584
+
585
+ .orchestrator-name {
586
+ color: var(--text-secondary) !important;
587
+ }
588
+
589
+ .orchestrator-time {
590
+ color: var(--text-tertiary) !important;
591
+ }
592
+
593
+ .orchestrator-text {
594
+ color: var(--text-accent) !important;
595
+ }
596
+
597
+ .orchestrator-dot {
598
+ background-color: var(--text-secondary) !important;
599
+ }
600
+
601
+ .orchestrator-thinking-text {
602
+ color: var(--text-secondary) !important;
603
+ opacity: 0.8;
604
+ }
605
  .user-message-container {
606
  display: flex;
607
  justify-content: flex-end;
 
609
  }
610
 
611
  .user-message {
612
+ background: var(--accent-gradient);
613
  color: #FFFFFF;
614
  border-radius: 16px;
615
  padding: 12px 24px;
 
643
  }
644
 
645
  .advisor-message-bubble {
 
646
  border-radius: 12px;
647
+ box-shadow: var(--shadow-sm);
648
+ border: 1px solid;
649
  padding: 16px;
650
  max-width: 512px;
651
  }
 
664
 
665
  .message-time {
666
  font-size: 12px;
 
667
  }
668
 
669
  .advisor-message-text {
 
670
  line-height: 1.6;
671
  margin: 0;
672
  }
 
679
  }
680
 
681
  .error-message {
682
+ background-color: var(--error-bg);
683
+ border: 1px solid var(--error-border);
684
+ color: var(--error-text);
685
  border-radius: 12px;
686
  padding: 12px 16px;
687
  max-width: 384px;
 
701
  }
702
 
703
  .thinking-bubble {
 
704
  border-radius: 12px;
705
+ box-shadow: var(--shadow-sm);
706
+ border: 1px solid;
707
  padding: 16px;
708
  max-width: 288px;
709
  }
 
735
 
736
  .thinking-text {
737
  font-size: 14px;
 
738
  margin-top: 4px;
739
  margin-bottom: 0;
740
  }
741
 
742
  /* Chat Input */
743
  .input-area {
744
+ border-top: 1px solid var(--border-primary);
745
  padding: 16px;
746
  }
747
 
 
753
  .message-input {
754
  flex: 1;
755
  resize: none;
756
+ border: 1px solid var(--input-border);
757
  border-radius: 12px;
758
  padding: 12px 16px;
759
  font-size: 14px;
760
  font-family: inherit;
761
  outline: none;
762
  transition: border-color 0.2s ease;
763
+ background-color: var(--input-bg);
764
+ color: var(--text-primary);
765
+ }
766
+
767
+ .message-input::placeholder {
768
+ color: var(--text-secondary);
769
  }
770
 
771
  .message-input:focus {
772
+ border-color: var(--input-focus);
773
+ box-shadow: var(--input-focus-shadow);
774
  }
775
 
776
  .send-button {
777
+ background: var(--accent-gradient);
778
  color: #FFFFFF;
779
  padding: 12px 24px;
780
  border-radius: 12px;
 
789
 
790
  .send-button:hover:not(:disabled) {
791
  transform: translateY(-1px);
792
+ box-shadow: var(--shadow-md);
793
  }
794
 
795
  .send-button:disabled {
 
807
  display: none;
808
  }
809
 
810
+ /* Animations */
811
+ @keyframes bounce {
812
+ 0%, 80%, 100% {
813
+ transform: scale(0);
814
+ }
815
+ 40% {
816
+ transform: scale(1);
817
+ }
818
+ }
819
+
820
+ /* Responsive adjustments */
821
+ @media (max-width: 1024px) {
822
+ .suggestions-panel {
823
+ padding: 24px 16px;
824
+ }
825
+
826
+ .suggestion-category {
827
+ padding: 18px;
828
+ min-height: 180px;
829
+ }
830
+ }
831
+
832
+ @media (max-width: 768px) {
833
+ .suggestions-grid {
834
+ grid-template-columns: 1fr;
835
+ gap: 16px;
836
+ }
837
+
838
+ .suggestions-panel {
839
+ padding: 24px 16px;
840
+ }
841
+
842
+ .suggestions-title {
843
+ font-size: 24px;
844
+ }
845
+
846
+ .suggestion-category {
847
+ padding: 16px;
848
+ min-height: auto;
849
+ }
850
+
851
+ .suggestion-button {
852
+ padding: 10px 14px;
853
+ font-size: 13px;
854
+ }
855
+
856
  .send-text {
857
  display: inline;
858
  }
859
+
860
+ .hero-title {
861
+ font-size: 36px;
862
+ }
863
+
864
+ .hero-subtitle {
865
+ font-size: 18px;
866
+ }
867
+
868
+ .advisors-grid {
869
+ grid-template-columns: 1fr;
870
+ }
871
+
872
+ .features-grid {
873
+ grid-template-columns: 1fr;
874
+ }
875
+
876
+ .chat-header-content {
877
+ padding: 12px 16px;
878
+ }
879
+
880
+ .chat-container {
881
+ padding: 16px;
882
+ }
883
+
884
+ .chat-box {
885
+ height: calc(100vh - 160px);
886
+ }
887
+
888
+ .messages-container {
889
+ padding: 16px;
890
+ }
891
  }