Girish Jeswani commited on
Commit
e002f17
·
1 Parent(s): dc21a67

change advisors info

Browse files
phd-advisor-frontend/src/components/AdvisorStatusDropdown.js ADDED
@@ -0,0 +1,337 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Users, ChevronDown } from 'lucide-react';
3
+
4
+ const AdvisorStatusDropdown = ({ advisors, thinkingAdvisors, getAdvisorColors, isDark }) => {
5
+ const [isOpen, setIsOpen] = useState(false);
6
+
7
+ // Safety checks
8
+ if (!advisors || typeof advisors !== 'object') {
9
+ return null;
10
+ }
11
+
12
+ const advisorEntries = Object.entries(advisors);
13
+ const thinkingCount = Array.isArray(thinkingAdvisors)
14
+ ? thinkingAdvisors.filter(id => id !== 'system').length
15
+ : 0;
16
+ const totalAdvisors = advisorEntries.length;
17
+
18
+ const handleToggle = () => {
19
+ setIsOpen(!isOpen);
20
+ };
21
+
22
+ // Close dropdown when clicking outside
23
+ useEffect(() => {
24
+ const handleClickOutside = (event) => {
25
+ if (isOpen && !event.target.closest('.advisor-status-dropdown')) {
26
+ setIsOpen(false);
27
+ }
28
+ };
29
+
30
+ document.addEventListener('mousedown', handleClickOutside);
31
+ return () => document.removeEventListener('mousedown', handleClickOutside);
32
+ }, [isOpen]);
33
+
34
+ return (
35
+ <div className="advisor-status-dropdown">
36
+ <button
37
+ className={`advisor-status-button ${isOpen ? 'open' : ''}`}
38
+ onClick={handleToggle}
39
+ >
40
+ <div className="advisor-status-info">
41
+ <Users size={16} />
42
+ <span className="advisor-count">
43
+ {totalAdvisors} Advisor{totalAdvisors !== 1 ? 's' : ''}
44
+ </span>
45
+ {thinkingCount > 0 && (
46
+ <div className="thinking-badge">
47
+ {thinkingCount} thinking
48
+ </div>
49
+ )}
50
+ </div>
51
+ <ChevronDown size={14} className={`dropdown-arrow ${isOpen ? 'rotated' : ''}`} />
52
+ </button>
53
+
54
+ {isOpen && (
55
+ <div className="advisor-dropdown-panel">
56
+ <div className="advisor-list">
57
+ {advisorEntries.map(([id, advisor]) => {
58
+ const IconComponent = advisor.icon;
59
+ const colors = getAdvisorColors(id, isDark);
60
+ const isThinking = Array.isArray(thinkingAdvisors) && thinkingAdvisors.includes(id);
61
+
62
+ return (
63
+ <div
64
+ key={id}
65
+ className={`advisor-item ${isThinking ? 'thinking' : ''}`}
66
+ style={{
67
+ '--advisor-color': colors.color,
68
+ '--advisor-bg': colors.bgColor
69
+ }}
70
+ >
71
+ <div className="advisor-icon">
72
+ <IconComponent size={16} />
73
+ </div>
74
+ <div className="advisor-details">
75
+ <div className="advisor-name">{advisor.name}</div>
76
+ <div className="advisor-description">{advisor.description}</div>
77
+ </div>
78
+ <div className="advisor-status">
79
+ {isThinking ? (
80
+ <div className="status-thinking">
81
+ <div className="thinking-dots">
82
+ <div className="dot"></div>
83
+ <div className="dot"></div>
84
+ <div className="dot"></div>
85
+ </div>
86
+ </div>
87
+ ) : (
88
+ <div className="status-ready">Ready</div>
89
+ )}
90
+ </div>
91
+ </div>
92
+ );
93
+ })}
94
+ </div>
95
+ </div>
96
+ )}
97
+
98
+ <style jsx>{`
99
+ .advisor-status-dropdown {
100
+ position: relative;
101
+ display: inline-block;
102
+ }
103
+
104
+ .advisor-status-button {
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 8px;
108
+ padding: 8px 12px;
109
+ background: var(--bg-primary);
110
+ border: 1px solid var(--border-primary);
111
+ border-radius: 12px;
112
+ cursor: pointer;
113
+ transition: all 0.2s ease;
114
+ font-size: 13px;
115
+ min-width: 140px;
116
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
117
+ color: var(--text-primary);
118
+ }
119
+
120
+ .advisor-status-button:hover {
121
+ background: var(--bg-secondary);
122
+ border-color: var(--accent-primary);
123
+ transform: translateY(-1px);
124
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
125
+ }
126
+
127
+ .advisor-status-button.open {
128
+ background: var(--bg-secondary);
129
+ border-color: var(--accent-primary);
130
+ }
131
+
132
+ .advisor-status-info {
133
+ display: flex;
134
+ align-items: center;
135
+ gap: 6px;
136
+ flex: 1;
137
+ }
138
+
139
+ .advisor-count {
140
+ font-weight: 600;
141
+ color: var(--text-primary);
142
+ }
143
+
144
+ .thinking-badge {
145
+ background: var(--accent-primary);
146
+ color: white;
147
+ padding: 2px 6px;
148
+ border-radius: 8px;
149
+ font-size: 10px;
150
+ font-weight: 600;
151
+ animation: pulse 2s ease-in-out infinite;
152
+ }
153
+
154
+ .dropdown-arrow {
155
+ color: var(--text-secondary);
156
+ transition: transform 0.2s ease;
157
+ }
158
+
159
+ .dropdown-arrow.rotated {
160
+ transform: rotate(180deg);
161
+ }
162
+
163
+ .advisor-dropdown-panel {
164
+ position: absolute;
165
+ top: calc(100% + 8px);
166
+ right: 0;
167
+ min-width: 280px;
168
+ max-width: 320px;
169
+ background: var(--bg-primary);
170
+ border: 1px solid var(--border-primary);
171
+ border-radius: 12px;
172
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15);
173
+ z-index: 1000;
174
+ overflow: hidden;
175
+ backdrop-filter: blur(20px);
176
+ -webkit-backdrop-filter: blur(20px);
177
+ }
178
+
179
+ [data-theme="dark"] .advisor-dropdown-panel {
180
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4);
181
+ }
182
+
183
+ .advisor-list {
184
+ max-height: 300px;
185
+ overflow-y: auto;
186
+ scrollbar-width: thin;
187
+ scrollbar-color: var(--border-primary) transparent;
188
+ }
189
+
190
+ .advisor-list::-webkit-scrollbar {
191
+ width: 6px;
192
+ }
193
+
194
+ .advisor-list::-webkit-scrollbar-track {
195
+ background: transparent;
196
+ }
197
+
198
+ .advisor-list::-webkit-scrollbar-thumb {
199
+ background: var(--border-primary);
200
+ border-radius: 3px;
201
+ }
202
+
203
+ .advisor-item {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 12px;
207
+ padding: 12px 16px;
208
+ border-bottom: 1px solid var(--border-primary);
209
+ transition: background-color 0.2s ease;
210
+ }
211
+
212
+ .advisor-item:last-child {
213
+ border-bottom: none;
214
+ }
215
+
216
+ .advisor-item:hover {
217
+ background: var(--bg-secondary);
218
+ }
219
+
220
+ .advisor-item.thinking {
221
+ background: var(--advisor-bg);
222
+ }
223
+
224
+ .advisor-icon {
225
+ width: 32px;
226
+ height: 32px;
227
+ border-radius: 8px;
228
+ background: var(--advisor-bg);
229
+ color: var(--advisor-color);
230
+ display: flex;
231
+ align-items: center;
232
+ justify-content: center;
233
+ flex-shrink: 0;
234
+ border: 1px solid var(--advisor-color);
235
+ }
236
+
237
+ .advisor-details {
238
+ flex: 1;
239
+ min-width: 0;
240
+ }
241
+
242
+ .advisor-name {
243
+ font-weight: 600;
244
+ color: var(--text-primary);
245
+ font-size: 13px;
246
+ margin-bottom: 2px;
247
+ }
248
+
249
+ .advisor-description {
250
+ font-size: 11px;
251
+ color: var(--text-secondary);
252
+ line-height: 1.3;
253
+ overflow: hidden;
254
+ text-overflow: ellipsis;
255
+ white-space: nowrap;
256
+ }
257
+
258
+ .advisor-status {
259
+ flex-shrink: 0;
260
+ }
261
+
262
+ .status-thinking {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 4px;
266
+ }
267
+
268
+ .thinking-dots {
269
+ display: flex;
270
+ gap: 2px;
271
+ }
272
+
273
+ .thinking-dots .dot {
274
+ width: 4px;
275
+ height: 4px;
276
+ background: var(--advisor-color);
277
+ border-radius: 50%;
278
+ animation: thinking-bounce 1.4s infinite ease-in-out both;
279
+ }
280
+
281
+ .thinking-dots .dot:nth-child(1) { animation-delay: -0.32s; }
282
+ .thinking-dots .dot:nth-child(2) { animation-delay: -0.16s; }
283
+ .thinking-dots .dot:nth-child(3) { animation-delay: 0s; }
284
+
285
+ .status-ready {
286
+ font-size: 11px;
287
+ color: var(--text-tertiary);
288
+ font-weight: 500;
289
+ }
290
+
291
+ @keyframes thinking-bounce {
292
+ 0%, 80%, 100% { transform: scale(0); }
293
+ 40% { transform: scale(1); }
294
+ }
295
+
296
+ @keyframes pulse {
297
+ 0%, 100% { opacity: 1; }
298
+ 50% { opacity: 0.7; }
299
+ }
300
+
301
+ /* Responsive Design */
302
+ @media (max-width: 768px) {
303
+ .advisor-dropdown-panel {
304
+ right: -20px;
305
+ left: -20px;
306
+ min-width: unset;
307
+ max-width: unset;
308
+ }
309
+
310
+ .advisor-status-button {
311
+ min-width: 120px;
312
+ font-size: 12px;
313
+ }
314
+
315
+ .advisor-item {
316
+ padding: 10px 12px;
317
+ }
318
+
319
+ .advisor-icon {
320
+ width: 28px;
321
+ height: 28px;
322
+ }
323
+
324
+ .advisor-name {
325
+ font-size: 12px;
326
+ }
327
+
328
+ .advisor-description {
329
+ font-size: 10px;
330
+ }
331
+ }
332
+ `}</style>
333
+ </div>
334
+ );
335
+ };
336
+
337
+ export default AdvisorStatusDropdown;
phd-advisor-frontend/src/data/advisors.js CHANGED
@@ -1,8 +1,10 @@
1
- import { BookOpen, Target, Brain } from 'lucide-react';
 
 
 
2
 
3
  export const advisors = {
4
  methodologist: {
5
- // Original structure preserved
6
  name: 'Methodologist',
7
  role: 'Research Methodology Expert',
8
  // Light theme colors
@@ -15,7 +17,6 @@ export const advisors = {
15
  icon: BookOpen,
16
  description: 'Structured & Planning-focused',
17
 
18
- // Enhanced information added
19
  fullTitle: 'Methodologist - Research Methodology Expert',
20
  credentials: 'PhD in Research Methods and Statistics from Stanford University',
21
  experience: '15+ years of experience guiding doctoral students',
@@ -62,7 +63,6 @@ export const advisors = {
62
  },
63
 
64
  theorist: {
65
- // Original structure preserved
66
  name: 'Theorist',
67
  role: 'Theoretical Frameworks Specialist',
68
  // Light theme colors
@@ -75,7 +75,6 @@ export const advisors = {
75
  icon: Brain,
76
  description: 'Abstract & Conceptual',
77
 
78
- // Enhanced information added
79
  fullTitle: 'Theorist - Theoretical Frameworks Specialist',
80
  credentials: 'PhD in Philosophy of Science from Oxford University',
81
  experience: 'Deep expertise in epistemology and conceptual development',
@@ -122,7 +121,6 @@ export const advisors = {
122
  },
123
 
124
  pragmatist: {
125
- // Original structure preserved
126
  name: 'Pragmatist',
127
  role: 'Action-Focused Research Coach',
128
  // Light theme colors
@@ -135,7 +133,6 @@ export const advisors = {
135
  icon: Target,
136
  description: 'Real-world & Outcome-focused',
137
 
138
- // Enhanced information added
139
  fullTitle: 'Pragmatist - Action-Focused Research Coach',
140
  credentials: 'PhD in Applied Psychology from UC Berkeley',
141
  experience: '12+ years of mentoring experience specializing in practical progress',
@@ -179,6 +176,419 @@ export const advisors = {
179
  structure: 'Always ends with specific, actionable next steps',
180
  citations: 'References practical examples and success strategies'
181
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  }
183
  };
184
 
@@ -192,9 +602,16 @@ export const getAdvisorColors = (advisorId, isDark = false) => {
192
  bgColor: isDark ? advisor.darkBgColor : advisor.bgColor,
193
  // For text that needs to be readable on colored backgrounds
194
  textColor: isDark ? '#F9FAFB' :
195
- advisor.color === '#10B981' ? '#047857' : // Darker green for pragmatist
196
- advisor.color === '#3B82F6' ? '#1D4ED8' : // Darker blue for methodologist
197
- advisor.color === '#8B5CF6' ? '#7C3AED' : // Darker purple for theorist
 
 
 
 
 
 
 
198
  '#374151' // fallback
199
  };
200
  };
 
1
+ import {
2
+ BookOpen, Target, Brain, HelpCircle, Zap, Search,
3
+ Feather, Minus, Eye, Heart
4
+ } from 'lucide-react';
5
 
6
  export const advisors = {
7
  methodologist: {
 
8
  name: 'Methodologist',
9
  role: 'Research Methodology Expert',
10
  // Light theme colors
 
17
  icon: BookOpen,
18
  description: 'Structured & Planning-focused',
19
 
 
20
  fullTitle: 'Methodologist - Research Methodology Expert',
21
  credentials: 'PhD in Research Methods and Statistics from Stanford University',
22
  experience: '15+ years of experience guiding doctoral students',
 
63
  },
64
 
65
  theorist: {
 
66
  name: 'Theorist',
67
  role: 'Theoretical Frameworks Specialist',
68
  // Light theme colors
 
75
  icon: Brain,
76
  description: 'Abstract & Conceptual',
77
 
 
78
  fullTitle: 'Theorist - Theoretical Frameworks Specialist',
79
  credentials: 'PhD in Philosophy of Science from Oxford University',
80
  experience: 'Deep expertise in epistemology and conceptual development',
 
121
  },
122
 
123
  pragmatist: {
 
124
  name: 'Pragmatist',
125
  role: 'Action-Focused Research Coach',
126
  // Light theme colors
 
133
  icon: Target,
134
  description: 'Real-world & Outcome-focused',
135
 
 
136
  fullTitle: 'Pragmatist - Action-Focused Research Coach',
137
  credentials: 'PhD in Applied Psychology from UC Berkeley',
138
  experience: '12+ years of mentoring experience specializing in practical progress',
 
176
  structure: 'Always ends with specific, actionable next steps',
177
  citations: 'References practical examples and success strategies'
178
  }
179
+ },
180
+
181
+ socratic: {
182
+ name: 'Socratic Mentor',
183
+ role: 'Critical Thinking Guide',
184
+ // Light theme colors
185
+ color: '#F59E0B',
186
+ bgColor: '#FEF3C7',
187
+ // Dark theme colors
188
+ darkColor: '#FBBF24',
189
+ darkBgColor: '#92400E',
190
+ // Icon and description
191
+ icon: HelpCircle,
192
+ description: 'Question-driven & Discovery-focused',
193
+
194
+ fullTitle: 'Socratic Mentor - Critical Thinking Guide',
195
+ credentials: 'PhD in Philosophy from Harvard University',
196
+ experience: '20+ years of experience in philosophical inquiry and critical thinking development',
197
+
198
+ specialties: [
199
+ 'Socratic Questioning Techniques',
200
+ 'Critical Thinking Development',
201
+ 'Philosophical Inquiry & Logic',
202
+ 'Self-directed Learning Facilitation',
203
+ 'Assumption Challenging',
204
+ 'Perspective Broadening'
205
+ ],
206
+
207
+ expertise: {
208
+ primary: 'Critical Thinking & Inquiry',
209
+ secondary: ['Philosophical Methods', 'Logical Reasoning', 'Self-Discovery'],
210
+ documentTypes: ['argument analyses', 'research justifications', 'theoretical discussions'],
211
+ strengths: [
212
+ 'Guiding self-discovery through questions',
213
+ 'Challenging assumptions constructively',
214
+ 'Developing critical thinking skills',
215
+ 'Facilitating intellectual breakthroughs'
216
+ ]
217
+ },
218
+
219
+ personality: {
220
+ tone: 'Thoughtful, probing, and intellectually curious',
221
+ approach: 'Guides discovery through systematic questioning',
222
+ communicationStyle: 'Question-heavy, reflective, discovery-oriented',
223
+ documentHandling: 'Questions assumptions and guides deeper inquiry into their reasoning'
224
+ },
225
+
226
+ sampleQuestions: [
227
+ "What assumptions are underlying my research approach?",
228
+ "How did I arrive at this particular research question?",
229
+ "What would happen if I questioned this fundamental assumption?",
230
+ "What evidence would challenge my current thinking?"
231
+ ],
232
+
233
+ responseStyle: {
234
+ length: 'Focused on strategic questioning with minimal direct answers',
235
+ structure: 'Series of probing questions building toward insight',
236
+ citations: 'References philosophical traditions and questioning methodologies'
237
+ }
238
+ },
239
+
240
+ motivator: {
241
+ name: 'Motivational Coach',
242
+ role: 'Academic Resilience Specialist',
243
+ // Light theme colors
244
+ color: '#EF4444',
245
+ bgColor: '#FEF2F2',
246
+ // Dark theme colors
247
+ darkColor: '#F87171',
248
+ darkBgColor: '#991B1B',
249
+ // Icon and description
250
+ icon: Zap,
251
+ description: 'Energizing & Confidence-building',
252
+
253
+ fullTitle: 'Motivational Coach - Academic Resilience Specialist',
254
+ credentials: 'PhD in Educational Psychology from University of Pennsylvania',
255
+ experience: 'Performance coaching certification and expertise in academic motivation',
256
+
257
+ specialties: [
258
+ 'Academic Motivation & Goal Setting',
259
+ 'Resilience Building & Stress Management',
260
+ 'Growth Mindset Development',
261
+ 'Overcoming Imposter Syndrome',
262
+ 'Performance Psychology',
263
+ 'Sustainable Productivity Habits'
264
+ ],
265
+
266
+ expertise: {
267
+ primary: 'Motivation & Resilience',
268
+ secondary: ['Goal Setting', 'Stress Management', 'Performance Psychology'],
269
+ documentTypes: ['progress reports', 'goal statements', 'reflection journals'],
270
+ strengths: [
271
+ 'Building academic confidence',
272
+ 'Maintaining motivation through challenges',
273
+ 'Developing resilience strategies',
274
+ 'Creating sustainable work habits'
275
+ ]
276
+ },
277
+
278
+ personality: {
279
+ tone: 'Energetic, enthusiastic, and genuinely encouraging',
280
+ approach: 'Focuses on strengths, progress, and potential',
281
+ communicationStyle: 'Inspiring, supportive, achievement-oriented',
282
+ documentHandling: 'Highlights progress and reframes challenges as growth opportunities'
283
+ },
284
+
285
+ sampleQuestions: [
286
+ "How can I stay motivated during difficult research phases?",
287
+ "What strategies help overcome academic imposter syndrome?",
288
+ "How do I build resilience for the long PhD journey?",
289
+ "What are my core strengths I can leverage more?"
290
+ ],
291
+
292
+ responseStyle: {
293
+ length: 'Energetic and uplifting with concrete motivation strategies',
294
+ structure: 'Acknowledges challenges then focuses on solutions and strengths',
295
+ citations: 'References motivational psychology and success stories'
296
+ }
297
+ },
298
+
299
+ critic: {
300
+ name: 'Constructive Critic',
301
+ role: 'Academic Quality Analyst',
302
+ // Light theme colors
303
+ color: '#DC2626',
304
+ bgColor: '#FEF2F2',
305
+ // Dark theme colors
306
+ darkColor: '#F87171',
307
+ darkBgColor: '#7F1D1D',
308
+ // Icon and description
309
+ icon: Search,
310
+ description: 'Detail-oriented & Standards-focused',
311
+
312
+ fullTitle: 'Constructive Critic - Academic Quality Analyst',
313
+ credentials: 'PhD in Critical Studies from Cambridge University',
314
+ experience: 'Journal editor and dissertation examiner with expertise in scholarly rigor',
315
+
316
+ specialties: [
317
+ 'Critical Analysis & Logic Assessment',
318
+ 'Academic Writing Evaluation',
319
+ 'Research Design Critique',
320
+ 'Literature Review Quality Control',
321
+ 'Scholarly Rigor Standards',
322
+ 'Peer Review Excellence'
323
+ ],
324
+
325
+ expertise: {
326
+ primary: 'Critical Analysis & Quality Assurance',
327
+ secondary: ['Academic Standards', 'Logical Consistency', 'Evidence Evaluation'],
328
+ documentTypes: ['draft chapters', 'research proposals', 'manuscript submissions'],
329
+ strengths: [
330
+ 'Identifying logical gaps and weaknesses',
331
+ 'Ensuring methodological rigor',
332
+ 'Improving argument coherence',
333
+ 'Preparing work for peer review'
334
+ ]
335
+ },
336
+
337
+ personality: {
338
+ tone: 'Direct, honest, and constructively critical',
339
+ approach: 'Systematic analysis with specific improvement recommendations',
340
+ communicationStyle: 'Precise, detailed, standards-focused',
341
+ documentHandling: 'Thoroughly analyzes work for gaps, inconsistencies, and improvement areas'
342
+ },
343
+
344
+ sampleQuestions: [
345
+ "What are the weakest aspects of my argument?",
346
+ "Where might reviewers find fault with my methodology?",
347
+ "How can I strengthen the logic of my research design?",
348
+ "What gaps exist in my literature review?"
349
+ ],
350
+
351
+ responseStyle: {
352
+ length: 'Detailed with specific critiques and improvement suggestions',
353
+ structure: 'Systematic analysis with balanced critique and constructive guidance',
354
+ citations: 'References academic standards and best practices'
355
+ }
356
+ },
357
+
358
+ storyteller: {
359
+ name: 'Narrative Advisor',
360
+ role: 'Communication & Storytelling Expert',
361
+ // Light theme colors
362
+ color: '#6366F1',
363
+ bgColor: '#EEF2FF',
364
+ // Dark theme colors
365
+ darkColor: '#818CF8',
366
+ darkBgColor: '#3730A3',
367
+ // Icon and description
368
+ icon: Feather,
369
+ description: 'Creative & Communication-focused',
370
+
371
+ fullTitle: 'Narrative Advisor - Communication & Storytelling Expert',
372
+ credentials: 'PhD in Rhetoric and Composition from Northwestern University',
373
+ experience: 'Science communication expertise and narrative-based knowledge translation',
374
+
375
+ specialties: [
376
+ 'Narrative Structure & Storytelling',
377
+ 'Academic Communication & Translation',
378
+ 'Metaphor & Analogy Development',
379
+ 'Public Engagement & Accessibility',
380
+ 'Creative Thinking & Perspective',
381
+ 'Knowledge Synthesis Through Stories'
382
+ ],
383
+
384
+ expertise: {
385
+ primary: 'Communication & Storytelling',
386
+ secondary: ['Knowledge Translation', 'Creative Expression', 'Audience Engagement'],
387
+ documentTypes: ['presentations', 'public-facing writing', 'research narratives'],
388
+ strengths: [
389
+ 'Making complex ideas accessible',
390
+ 'Creating compelling research narratives',
391
+ 'Developing effective analogies',
392
+ 'Enhancing communication skills'
393
+ ]
394
+ },
395
+
396
+ personality: {
397
+ tone: 'Creative, engaging, and imaginatively insightful',
398
+ approach: 'Uses stories, analogies, and narratives to illuminate concepts',
399
+ communicationStyle: 'Vivid, memorable, narrative-driven',
400
+ documentHandling: 'Identifies narrative threads and helps communicate research stories'
401
+ },
402
+
403
+ sampleQuestions: [
404
+ "How can I tell the story of my research more compellingly?",
405
+ "What analogies would help explain my complex methodology?",
406
+ "How do I make my findings accessible to broader audiences?",
407
+ "What's the narrative arc of my dissertation?"
408
+ ],
409
+
410
+ responseStyle: {
411
+ length: 'Rich with stories, examples, and creative illustrations',
412
+ structure: 'Narrative-driven with memorable analogies and examples',
413
+ citations: 'References storytelling traditions and communication research'
414
+ }
415
+ },
416
+
417
+ minimalist: {
418
+ name: 'Minimalist Mentor',
419
+ role: 'Essential Focus Advisor',
420
+ // Light theme colors
421
+ color: '#6B7280',
422
+ bgColor: '#F9FAFB',
423
+ // Dark theme colors
424
+ darkColor: '#9CA3AF',
425
+ darkBgColor: '#374151',
426
+ // Icon and description
427
+ icon: Minus,
428
+ description: 'Concise & Priority-focused',
429
+
430
+ fullTitle: 'Minimalist Mentor - Essential Focus Advisor',
431
+ credentials: 'PhD in Cognitive Science from MIT',
432
+ experience: 'Systems thinking background with expertise in efficient academic progress',
433
+
434
+ specialties: [
435
+ 'Essential Thinking & Priority Identification',
436
+ 'Efficient Research Strategies',
437
+ 'Core Concept Simplification',
438
+ 'Decision-making Frameworks',
439
+ 'Focused Attention & Deep Work',
440
+ 'Academic Productivity Optimization'
441
+ ],
442
+
443
+ expertise: {
444
+ primary: 'Essential Focus & Efficiency',
445
+ secondary: ['Priority Setting', 'Simplification', 'Clear Decision-making'],
446
+ documentTypes: ['focused plans', 'priority matrices', 'streamlined processes'],
447
+ strengths: [
448
+ 'Cutting through complexity to essentials',
449
+ 'Identifying core priorities',
450
+ 'Streamlining decision-making',
451
+ 'Eliminating unnecessary elements'
452
+ ]
453
+ },
454
+
455
+ personality: {
456
+ tone: 'Concise, direct, and clarity-focused',
457
+ approach: 'Strips away complexity to reveal essential elements',
458
+ communicationStyle: 'Brief, structured, action-oriented',
459
+ documentHandling: 'Identifies core contributions and essential elements requiring focus'
460
+ },
461
+
462
+ sampleQuestions: [
463
+ "What's the one most important thing I should focus on?",
464
+ "How can I simplify my research approach?",
465
+ "What can I eliminate to improve my progress?",
466
+ "What are the essential elements of my dissertation?"
467
+ ],
468
+
469
+ responseStyle: {
470
+ length: 'Concise and to-the-point without unnecessary elaboration',
471
+ structure: 'Simple frameworks with clear, actionable guidance',
472
+ citations: 'References efficiency principles and focus methodologies'
473
+ }
474
+ },
475
+
476
+ visionary: {
477
+ name: 'Visionary Strategist',
478
+ role: 'Innovation & Future Trends Expert',
479
+ // Light theme colors
480
+ color: '#06B6D4',
481
+ bgColor: '#ECFEFF',
482
+ // Dark theme colors
483
+ darkColor: '#22D3EE',
484
+ darkBgColor: '#0E7490',
485
+ // Icon and description
486
+ icon: Eye,
487
+ description: 'Forward-thinking & Innovation-focused',
488
+
489
+ fullTitle: 'Visionary Strategist - Innovation & Future Trends Expert',
490
+ credentials: 'PhD in Futures Studies from University of Houston',
491
+ experience: 'Innovation strategy experience with expertise in transformative research directions',
492
+
493
+ specialties: [
494
+ 'Emerging Trends Analysis & Forecasting',
495
+ 'Innovation Strategy & Disruptive Thinking',
496
+ 'Interdisciplinary Connections',
497
+ 'Technology Integration & Digital Transformation',
498
+ 'Global Challenges & Systemic Solutions',
499
+ 'Transformative Research Positioning'
500
+ ],
501
+
502
+ expertise: {
503
+ primary: 'Innovation & Future Strategy',
504
+ secondary: ['Trend Analysis', 'Interdisciplinary Thinking', 'Impact Maximization'],
505
+ documentTypes: ['innovation proposals', 'future scenarios', 'strategic plans'],
506
+ strengths: [
507
+ 'Identifying emerging opportunities',
508
+ 'Connecting disparate fields',
509
+ 'Anticipating future developments',
510
+ 'Maximizing transformative potential'
511
+ ]
512
+ },
513
+
514
+ personality: {
515
+ tone: 'Inspiring, ambitious, and forward-looking',
516
+ approach: 'Encourages bold thinking and explores future possibilities',
517
+ communicationStyle: 'Visionary, expansive, possibility-oriented',
518
+ documentHandling: 'Identifies innovative potential and connects to future trends'
519
+ },
520
+
521
+ sampleQuestions: [
522
+ "How might my research transform the field in 10 years?",
523
+ "What emerging trends should influence my research direction?",
524
+ "How can I position my work for maximum future impact?",
525
+ "What innovative approaches haven't been tried yet?"
526
+ ],
527
+
528
+ responseStyle: {
529
+ length: 'Expansive with big-picture thinking and future scenarios',
530
+ structure: 'Explores possibilities and connects to broader trends',
531
+ citations: 'References innovation research and future studies'
532
+ }
533
+ },
534
+
535
+ empathetic: {
536
+ name: 'Empathetic Listener',
537
+ role: 'Well-being & Support Specialist',
538
+ // Light theme colors
539
+ color: '#EC4899',
540
+ bgColor: '#FDF2F8',
541
+ // Dark theme colors
542
+ darkColor: '#F472B6',
543
+ darkBgColor: '#BE185D',
544
+ // Icon and description
545
+ icon: Heart,
546
+ description: 'Caring & Emotionally supportive',
547
+
548
+ fullTitle: 'Empathetic Listener - Well-being & Support Specialist',
549
+ credentials: 'PhD in Clinical Psychology from Yale University',
550
+ experience: 'Academic counseling specialization with expertise in student well-being',
551
+
552
+ specialties: [
553
+ 'Academic Stress Management & Well-being',
554
+ 'Work-life Balance & Self-care',
555
+ 'Mental Health Awareness & Support',
556
+ 'Interpersonal Relationships in Academia',
557
+ 'Identity Development & Personal Growth',
558
+ 'Mindfulness & Stress Reduction'
559
+ ],
560
+
561
+ expertise: {
562
+ primary: 'Emotional Support & Well-being',
563
+ secondary: ['Stress Management', 'Self-care', 'Personal Development'],
564
+ documentTypes: ['reflection journals', 'well-being plans', 'personal statements'],
565
+ strengths: [
566
+ 'Providing emotional validation',
567
+ 'Supporting work-life balance',
568
+ 'Addressing mental health concerns',
569
+ 'Fostering personal growth'
570
+ ]
571
+ },
572
+
573
+ personality: {
574
+ tone: 'Warm, compassionate, and genuinely caring',
575
+ approach: 'Validates emotions and provides holistic support',
576
+ communicationStyle: 'Gentle, understanding, person-centered',
577
+ documentHandling: 'Recognizes emotional labor and provides supportive validation'
578
+ },
579
+
580
+ sampleQuestions: [
581
+ "How can I manage PhD stress and maintain well-being?",
582
+ "How do I deal with feelings of isolation in research?",
583
+ "What strategies help with academic anxiety?",
584
+ "How can I maintain healthy boundaries during my PhD?"
585
+ ],
586
+
587
+ responseStyle: {
588
+ length: 'Supportive and validating with emphasis on emotional well-being',
589
+ structure: 'Acknowledges emotions first, then provides gentle guidance',
590
+ citations: 'References well-being research and self-care practices'
591
+ }
592
  }
593
  };
594
 
 
602
  bgColor: isDark ? advisor.darkBgColor : advisor.bgColor,
603
  // For text that needs to be readable on colored backgrounds
604
  textColor: isDark ? '#F9FAFB' :
605
+ advisor.color === '#10B981' ? '#047857' :
606
+ advisor.color === '#3B82F6' ? '#1D4ED8' :
607
+ advisor.color === '#8B5CF6' ? '#7C3AED' :
608
+ advisor.color === '#F59E0B' ? '#92400E' :
609
+ advisor.color === '#EF4444' ? '#DC2626' :
610
+ advisor.color === '#DC2626' ? '#7F1D1D' :
611
+ advisor.color === '#6366F1' ? '#3730A3' :
612
+ advisor.color === '#6B7280' ? '#374151' :
613
+ advisor.color === '#06B6D4' ? '#0E7490' :
614
+ advisor.color === '#EC4899' ? '#BE185D' :
615
  '#374151' // fallback
616
  };
617
  };
phd-advisor-frontend/src/pages/ChatPage.js CHANGED
@@ -12,6 +12,7 @@ import { advisors, getAdvisorColors } from '../data/advisors';
12
  import { useTheme } from '../contexts/ThemeContext';
13
  import '../styles/ChatPage.css';
14
  import '../styles/EnhancedChatInput.css';
 
15
 
16
  const ChatPage = ({ user, authToken, onNavigateToHome, onSignOut }) => {
17
  const [messages, setMessages] = useState([]);
@@ -246,11 +247,13 @@ const handleNewChat = async (sessionId = null) => {
246
  }
247
  };
248
 
 
 
249
  const handleFileUploaded = async (fileInfo) => {
250
  const documentMessage = {
251
  id: generateMessageId(),
252
  type: 'document_upload',
253
- content: `Document uploaded: ${fileInfo.filename}`,
254
  timestamp: new Date()
255
  };
256
 
@@ -268,7 +271,7 @@ const handleNewChat = async (sessionId = null) => {
268
 
269
  // Create user message
270
  const userMessage = {
271
- id: generateMessageId(), // This uses your existing function
272
  type: 'user',
273
  content: inputMessage,
274
  timestamp: new Date()
@@ -303,7 +306,6 @@ const handleNewChat = async (sessionId = null) => {
303
  setThinkingAdvisors(['system']);
304
 
305
  try {
306
- // Your existing API call logic here...
307
  const response = await fetch('http://localhost:8000/chat-sequential', {
308
  method: 'POST',
309
  headers: {
@@ -321,8 +323,21 @@ const handleNewChat = async (sessionId = null) => {
321
 
322
  const data = await response.json();
323
 
324
- if (data.type === 'sequential_responses' && data.responses) {
325
- // Create advisor messages
 
 
 
 
 
 
 
 
 
 
 
 
 
326
  const advisorMessages = data.responses.map((advisor) => ({
327
  id: generateMessageId(),
328
  type: 'advisor',
@@ -332,7 +347,6 @@ const handleNewChat = async (sessionId = null) => {
332
  timestamp: new Date()
333
  }));
334
 
335
- // Add to local state
336
  setMessages(prev => [...prev, ...advisorMessages]);
337
 
338
  // Save each advisor message to database
@@ -556,6 +570,16 @@ const handleNewChat = async (sessionId = null) => {
556
  }
557
  };
558
 
 
 
 
 
 
 
 
 
 
 
559
  const cancelReply = () => {
560
  setReplyingTo(null);
561
  };
@@ -602,35 +626,12 @@ const handleNewChat = async (sessionId = null) => {
602
  </div>
603
 
604
  <div className="header-right">
605
- <div className="advisor-pills">
606
- {Object.entries(advisors).map(([id, advisor]) => {
607
- const Icon = advisor.icon;
608
- const colors = getAdvisorColors(id, isDark);
609
- const isThinking = thinkingAdvisors.includes(id);
610
-
611
- return (
612
- <div
613
- key={id}
614
- className={`advisor-pill ${isThinking ? 'thinking' : ''}`}
615
- style={{
616
- '--advisor-color': colors.color,
617
- '--advisor-bg': colors.bgColor
618
- }}
619
- title={`${advisor.name} - ${advisor.expertise}`}
620
- >
621
- <Icon size={16} />
622
- <span>{advisor.name}</span>
623
- {isThinking && (
624
- <div className="thinking-dots">
625
- <div className="dot"></div>
626
- <div className="dot"></div>
627
- <div className="dot"></div>
628
- </div>
629
- )}
630
- </div>
631
- );
632
- })}
633
- </div>
634
 
635
  <div className="header-controls">
636
  {/* Add session title display */}
@@ -737,6 +738,37 @@ const handleNewChat = async (sessionId = null) => {
737
  </div>
738
  </div>
739
  )}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
740
  </div>
741
  ))}
742
 
@@ -781,7 +813,7 @@ const handleNewChat = async (sessionId = null) => {
781
  )}
782
 
783
  <EnhancedChatInput
784
- onSendMessage={handleSendMessage}
785
  onFileUploaded={handleFileUploaded}
786
  uploadedDocuments={uploadedDocuments}
787
  isLoading={isLoading}
 
12
  import { useTheme } from '../contexts/ThemeContext';
13
  import '../styles/ChatPage.css';
14
  import '../styles/EnhancedChatInput.css';
15
+ import AdvisorStatusDropdown from '../components/AdvisorStatusDropdown';
16
 
17
  const ChatPage = ({ user, authToken, onNavigateToHome, onSignOut }) => {
18
  const [messages, setMessages] = useState([]);
 
247
  }
248
  };
249
 
250
+
251
+
252
  const handleFileUploaded = async (fileInfo) => {
253
  const documentMessage = {
254
  id: generateMessageId(),
255
  type: 'document_upload',
256
+ content: `Document uploaded: ${fileInfo.name}`,
257
  timestamp: new Date()
258
  };
259
 
 
271
 
272
  // Create user message
273
  const userMessage = {
274
+ id: generateMessageId(),
275
  type: 'user',
276
  content: inputMessage,
277
  timestamp: new Date()
 
306
  setThinkingAdvisors(['system']);
307
 
308
  try {
 
309
  const response = await fetch('http://localhost:8000/chat-sequential', {
310
  method: 'POST',
311
  headers: {
 
323
 
324
  const data = await response.json();
325
 
326
+ // Handle clarification needed case
327
+ if (data.type === 'clarification_needed') {
328
+ const clarificationMessage = {
329
+ id: generateMessageId(),
330
+ type: 'clarification',
331
+ content: data.message,
332
+ suggestions: data.suggestions || [],
333
+ timestamp: new Date()
334
+ };
335
+
336
+ setMessages(prev => [...prev, clarificationMessage]);
337
+ await saveMessageToSession(clarificationMessage);
338
+
339
+ } else if (data.type === 'sequential_responses' && data.responses) {
340
+ // Handle normal advisor responses
341
  const advisorMessages = data.responses.map((advisor) => ({
342
  id: generateMessageId(),
343
  type: 'advisor',
 
347
  timestamp: new Date()
348
  }));
349
 
 
350
  setMessages(prev => [...prev, ...advisorMessages]);
351
 
352
  // Save each advisor message to database
 
570
  }
571
  };
572
 
573
+ const handleInputSubmit = async (inputMessage) => {
574
+ if (replyingTo) {
575
+ // This is a reply to a specific message
576
+ await handleReplyToAdvisor(inputMessage, replyingTo);
577
+ } else {
578
+ // This is a regular message
579
+ await handleSendMessage(inputMessage);
580
+ }
581
+ };
582
+
583
  const cancelReply = () => {
584
  setReplyingTo(null);
585
  };
 
626
  </div>
627
 
628
  <div className="header-right">
629
+ <AdvisorStatusDropdown
630
+ advisors={advisors}
631
+ thinkingAdvisors={thinkingAdvisors}
632
+ getAdvisorColors={getAdvisorColors}
633
+ isDark={isDark}
634
+ />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
635
 
636
  <div className="header-controls">
637
  {/* Add session title display */}
 
738
  </div>
739
  </div>
740
  )}
741
+
742
+ {message.type === 'clarification' && (
743
+ <div className="clarification-message-container">
744
+ <div className="clarification-message">
745
+ <div className="clarification-header">
746
+ <MessageCircle size={16} />
747
+ <span>I need a bit more information</span>
748
+ </div>
749
+ <p>{message.content}</p>
750
+
751
+ {message.suggestions && message.suggestions.length > 0 && (
752
+ <div className="clarification-suggestions">
753
+ <p className="suggestions-label">Here are some ways you could be more specific:</p>
754
+ <div className="suggestions-list">
755
+ {message.suggestions.map((suggestion, index) => (
756
+ <button
757
+ key={index}
758
+ className="suggestion-button"
759
+ onClick={() => handleSendMessage(suggestion)}
760
+ >
761
+ {suggestion}
762
+ </button>
763
+ ))}
764
+ </div>
765
+ </div>
766
+ )}
767
+ </div>
768
+ </div>
769
+ )}
770
+
771
+
772
  </div>
773
  ))}
774
 
 
813
  )}
814
 
815
  <EnhancedChatInput
816
+ onSendMessage={handleInputSubmit}
817
  onFileUploaded={handleFileUploaded}
818
  uploadedDocuments={uploadedDocuments}
819
  isLoading={isLoading}
phd-advisor-frontend/src/styles/ChatPage.css CHANGED
@@ -106,29 +106,7 @@
106
  gap: 12px;
107
  }
108
 
109
- /* Advisor Pills */
110
- .advisor-pills {
111
- display: flex;
112
- gap: 8px;
113
- }
114
 
115
- .advisor-pill {
116
- display: flex;
117
- align-items: center;
118
- gap: 6px;
119
- padding: 8px 12px;
120
- border-radius: 20px;
121
- border: 1px solid;
122
- background: var(--bg-primary);
123
- font-size: 12px;
124
- font-weight: 500;
125
- transition: all 0.3s ease;
126
- position: relative;
127
- }
128
-
129
- .advisor-pill.thinking {
130
- animation: pulse 2s ease-in-out infinite;
131
- }
132
 
133
  .thinking-pulse {
134
  position: absolute;
@@ -767,6 +745,142 @@
767
  letter-spacing: 0.5px;
768
  }
769
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
770
  .dropdown-arrow {
771
  color: var(--text-secondary);
772
  transition: transform 0.2s ease;
@@ -884,9 +998,6 @@
884
  gap: 12px;
885
  }
886
 
887
- .advisor-pills {
888
- display: none;
889
- }
890
 
891
  .main-content {
892
  padding: 24px 12px 120px 12px; /* Adjusted for mobile */
@@ -933,4 +1044,23 @@
933
  .main-chat-area.sidebar-collapsed {
934
  margin-left: 0;
935
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
936
  }
 
106
  gap: 12px;
107
  }
108
 
 
 
 
 
 
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
  .thinking-pulse {
112
  position: absolute;
 
745
  letter-spacing: 0.5px;
746
  }
747
 
748
+ .clarification-message-container {
749
+ display: flex;
750
+ justify-content: center;
751
+ margin: 24px 0;
752
+ }
753
+
754
+ .clarification-message {
755
+ background: var(--bg-secondary);
756
+ border: 1px solid var(--border-primary);
757
+ color: var(--text-primary);
758
+ padding: 20px;
759
+ border-radius: 16px;
760
+ max-width: 600px;
761
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
762
+ border-left: 4px solid var(--accent-primary);
763
+ position: relative;
764
+ overflow: hidden;
765
+ }
766
+
767
+ /* Add subtle accent background */
768
+ .clarification-message::before {
769
+ content: '';
770
+ position: absolute;
771
+ top: 0;
772
+ left: 0;
773
+ right: 0;
774
+ bottom: 0;
775
+ background: var(--accent-gradient);
776
+ opacity: 0.03;
777
+ pointer-events: none;
778
+ }
779
+
780
+ [data-theme="dark"] .clarification-message {
781
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
782
+ }
783
+
784
+ [data-theme="dark"] .clarification-message::before {
785
+ opacity: 0.05;
786
+ }
787
+
788
+ .clarification-header {
789
+ display: flex;
790
+ align-items: center;
791
+ gap: 8px;
792
+ margin-bottom: 12px;
793
+ font-weight: 600;
794
+ font-size: 14px;
795
+ color: var(--accent-primary);
796
+ position: relative;
797
+ z-index: 1;
798
+ }
799
+
800
+ .clarification-message p {
801
+ margin: 0 0 16px 0;
802
+ line-height: 1.6;
803
+ font-size: 15px;
804
+ color: var(--text-secondary);
805
+ position: relative;
806
+ z-index: 1;
807
+ }
808
+
809
+ .clarification-suggestions {
810
+ margin-top: 16px;
811
+ padding-top: 16px;
812
+ border-top: 1px solid var(--border-primary);
813
+ position: relative;
814
+ z-index: 1;
815
+ }
816
+
817
+ .suggestions-label {
818
+ font-size: 13px;
819
+ margin-bottom: 12px;
820
+ color: var(--text-secondary);
821
+ font-weight: 500;
822
+ }
823
+
824
+ .suggestions-list {
825
+ display: flex;
826
+ flex-direction: column;
827
+ gap: 8px;
828
+ }
829
+
830
+ .suggestion-button {
831
+ background: var(--bg-primary);
832
+ border: 1px solid var(--border-primary);
833
+ color: var(--text-primary);
834
+ padding: 12px 16px;
835
+ border-radius: 12px;
836
+ cursor: pointer;
837
+ text-align: left;
838
+ font-size: 13px;
839
+ font-weight: 500;
840
+ transition: all 0.2s ease;
841
+ position: relative;
842
+ overflow: hidden;
843
+ }
844
+
845
+ .suggestion-button::before {
846
+ content: '';
847
+ position: absolute;
848
+ top: 0;
849
+ left: 0;
850
+ right: 0;
851
+ bottom: 0;
852
+ background: var(--accent-primary);
853
+ opacity: 0;
854
+ transition: opacity 0.2s ease;
855
+ pointer-events: none;
856
+ }
857
+
858
+ .suggestion-button:hover {
859
+ border-color: var(--accent-primary);
860
+ transform: translateY(-1px);
861
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
862
+ }
863
+
864
+ .suggestion-button:hover::before {
865
+ opacity: 0.05;
866
+ }
867
+
868
+ .suggestion-button:hover {
869
+ color: var(--accent-primary);
870
+ }
871
+
872
+ [data-theme="dark"] .suggestion-button:hover {
873
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
874
+ }
875
+
876
+ [data-theme="dark"] .suggestion-button:hover::before {
877
+ opacity: 0.1;
878
+ }
879
+
880
+ .suggestion-button:active {
881
+ transform: translateY(0);
882
+ }
883
+
884
  .dropdown-arrow {
885
  color: var(--text-secondary);
886
  transition: transform 0.2s ease;
 
998
  gap: 12px;
999
  }
1000
 
 
 
 
1001
 
1002
  .main-content {
1003
  padding: 24px 12px 120px 12px; /* Adjusted for mobile */
 
1044
  .main-chat-area.sidebar-collapsed {
1045
  margin-left: 0;
1046
  }
1047
+
1048
+ .clarification-message {
1049
+ margin: 0 16px;
1050
+ max-width: none;
1051
+ padding: 16px;
1052
+ }
1053
+
1054
+ .clarification-header {
1055
+ font-size: 13px;
1056
+ }
1057
+
1058
+ .clarification-message p {
1059
+ font-size: 14px;
1060
+ }
1061
+
1062
+ .suggestion-button {
1063
+ padding: 10px 14px;
1064
+ font-size: 12px;
1065
+ }
1066
  }