style: refine admin dashboard and project management UI with cohesive color palette and improved readability
- Update background colors and text styles for better contrast and legibility. - Enhance button styles and hover effects for a more modern look. - Remove unnecessary scaling effects and adjust border styles for consistency. - Introduce a cohesive design language across components to improve user experience.
This commit is contained in:
@@ -143,7 +143,7 @@ export const EmailManager: React.FC = () => {
|
||||
case 'high': return 'text-red-400';
|
||||
case 'medium': return 'text-yellow-400';
|
||||
case 'low': return 'text-green-400';
|
||||
default: return 'text-blue-400';
|
||||
default: return 'text-stone-400';
|
||||
}
|
||||
};
|
||||
|
||||
@@ -153,7 +153,7 @@ export const EmailManager: React.FC = () => {
|
||||
<motion.div
|
||||
animate={{ rotate: 360 }}
|
||||
transition={{ duration: 1, repeat: Infinity, ease: "linear" }}
|
||||
className="w-8 h-8 border-2 border-blue-500 border-t-transparent rounded-full"
|
||||
className="w-8 h-8 border-2 border-stone-500 border-t-transparent rounded-full"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
@@ -164,12 +164,12 @@ export const EmailManager: React.FC = () => {
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<h2 className="text-2xl font-bold text-white">Email Manager</h2>
|
||||
<p className="text-white/70 mt-1">Manage your contact messages</p>
|
||||
<h2 className="text-2xl font-bold text-stone-900">Email Manager</h2>
|
||||
<p className="text-stone-500 mt-1">Manage your contact messages</p>
|
||||
</div>
|
||||
<button
|
||||
onClick={loadMessages}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-blue-500/20 text-blue-400 rounded-lg hover:bg-blue-500/30 transition-colors"
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-stone-100 text-stone-700 rounded-lg hover:bg-stone-200 transition-colors"
|
||||
>
|
||||
<RefreshCw className="w-4 h-4" />
|
||||
<span>Refresh</span>
|
||||
@@ -179,13 +179,13 @@ export const EmailManager: React.FC = () => {
|
||||
{/* Filters and Search */}
|
||||
<div className="flex flex-col sm:flex-row gap-4">
|
||||
<div className="relative flex-1">
|
||||
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-white/50 w-4 h-4" />
|
||||
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-stone-400 w-4 h-4" />
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Search messages..."
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
className="w-full pl-10 pr-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
className="w-full pl-10 pr-4 py-2 bg-white border border-stone-200 rounded-lg text-stone-900 placeholder:text-stone-400 focus:outline-none focus:ring-2 focus:ring-stone-400"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex space-x-2">
|
||||
@@ -195,8 +195,8 @@ export const EmailManager: React.FC = () => {
|
||||
onClick={() => setFilter(filterType as 'all' | 'unread' | 'responded')}
|
||||
className={`px-4 py-2 rounded-lg transition-colors ${
|
||||
filter === filterType
|
||||
? 'bg-blue-500 text-white'
|
||||
: 'bg-white/10 text-white/70 hover:bg-white/20'
|
||||
? 'bg-stone-900 text-stone-50'
|
||||
: 'bg-white border border-stone-200 text-stone-600 hover:bg-stone-50'
|
||||
}`}
|
||||
>
|
||||
{filterType.charAt(0).toUpperCase() + filterType.slice(1)}
|
||||
@@ -209,7 +209,7 @@ export const EmailManager: React.FC = () => {
|
||||
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
|
||||
<div className="lg:col-span-1 space-y-3">
|
||||
{filteredMessages.length === 0 ? (
|
||||
<div className="text-center py-12 text-white/50">
|
||||
<div className="text-center py-12 text-stone-400">
|
||||
<Mail className="w-12 h-12 mx-auto mb-4 opacity-50" />
|
||||
<p>No messages found</p>
|
||||
</div>
|
||||
@@ -219,36 +219,36 @@ export const EmailManager: React.FC = () => {
|
||||
key={message.id}
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
className={`p-4 rounded-lg cursor-pointer transition-all ${
|
||||
className={`p-4 rounded-lg cursor-pointer transition-all border ${
|
||||
selectedMessage?.id === message.id
|
||||
? 'bg-blue-500/20 border border-blue-500/50'
|
||||
: 'bg-white/5 border border-white/10 hover:bg-white/10'
|
||||
? 'bg-stone-100 border-stone-300 shadow-sm'
|
||||
: 'bg-white border-stone-200 hover:bg-stone-50'
|
||||
}`}
|
||||
onClick={() => handleMessageClick(message)}
|
||||
>
|
||||
<div className="flex items-start justify-between mb-2">
|
||||
<h3 className="font-semibold text-white truncate">{message.subject}</h3>
|
||||
<h3 className="font-semibold text-stone-900 truncate">{message.subject}</h3>
|
||||
<div className="flex items-center space-x-2">
|
||||
{!message.read && <Circle className="w-3 h-3 text-blue-400" />}
|
||||
{message.responded && <CheckCircle className="w-3 h-3 text-green-400" />}
|
||||
{!message.read && <Circle className="w-3 h-3 text-stone-600" />}
|
||||
{message.responded && <CheckCircle className="w-3 h-3 text-green-500" />}
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-white/70 text-sm mb-2">{message.name}</p>
|
||||
<p className="text-white/50 text-xs">{formatDate(message.createdAt)}</p>
|
||||
<p className="text-stone-600 text-sm mb-2">{message.name}</p>
|
||||
<p className="text-stone-400 text-xs">{formatDate(message.createdAt)}</p>
|
||||
</motion.div>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Message Detail */}
|
||||
<div className="lg:col-span-2 admin-glass-card p-6 rounded-xl">
|
||||
<div className="lg:col-span-2 admin-glass-card p-6 rounded-xl bg-white border border-stone-200">
|
||||
{selectedMessage ? (
|
||||
<div className="space-y-6">
|
||||
{/* Message Header */}
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="space-y-2">
|
||||
<h3 className="text-xl font-bold text-white">{selectedMessage.subject}</h3>
|
||||
<div className="flex items-center space-x-4 text-sm text-white/70">
|
||||
<h3 className="text-xl font-bold text-stone-900">{selectedMessage.subject}</h3>
|
||||
<div className="flex items-center space-x-4 text-sm text-stone-500">
|
||||
<div className="flex items-center space-x-2">
|
||||
<User className="w-4 h-4" />
|
||||
<span>{selectedMessage.name}</span>
|
||||
@@ -264,15 +264,15 @@ export const EmailManager: React.FC = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
{!selectedMessage.read && <Circle className="w-4 h-4 text-blue-400" />}
|
||||
{selectedMessage.responded && <CheckCircle className="w-4 h-4 text-green-400" />}
|
||||
{!selectedMessage.read && <Circle className="w-4 h-4 text-stone-600" />}
|
||||
{selectedMessage.responded && <CheckCircle className="w-4 h-4 text-green-500" />}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Message Body */}
|
||||
<div className="p-4 bg-white/5 rounded-lg border border-white/10">
|
||||
<h4 className="text-white font-medium mb-3">Message:</h4>
|
||||
<div className="text-white/80 whitespace-pre-wrap leading-relaxed">
|
||||
<div className="p-4 bg-stone-50 rounded-lg border border-stone-200">
|
||||
<h4 className="text-stone-700 font-medium mb-3">Message:</h4>
|
||||
<div className="text-stone-600 whitespace-pre-wrap leading-relaxed">
|
||||
{selectedMessage.message}
|
||||
</div>
|
||||
</div>
|
||||
@@ -281,21 +281,21 @@ export const EmailManager: React.FC = () => {
|
||||
<div className="flex space-x-3">
|
||||
<button
|
||||
onClick={() => setShowReplyModal(true)}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors"
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-stone-900 text-stone-50 rounded-lg hover:bg-stone-800 transition-colors"
|
||||
>
|
||||
<Reply className="w-4 h-4" />
|
||||
<span>Reply</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setSelectedMessage(null)}
|
||||
className="px-4 py-2 bg-white/10 text-white rounded-lg hover:bg-white/20 transition-colors"
|
||||
className="px-4 py-2 bg-white border border-stone-200 text-stone-600 rounded-lg hover:bg-stone-50 transition-colors"
|
||||
>
|
||||
Close
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="text-center py-12 text-white/50">
|
||||
<div className="text-center py-12 text-stone-400">
|
||||
<Eye className="w-12 h-12 mx-auto mb-4 opacity-50" />
|
||||
<p>Select a message to view details</p>
|
||||
</div>
|
||||
@@ -311,23 +311,23 @@ export const EmailManager: React.FC = () => {
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
exit={{ opacity: 0 }}
|
||||
className="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center p-4"
|
||||
className="fixed inset-0 bg-stone-900/20 backdrop-blur-sm z-50 flex items-center justify-center p-4"
|
||||
onClick={() => setShowReplyModal(false)}
|
||||
>
|
||||
<motion.div
|
||||
initial={{ scale: 0.9, opacity: 0 }}
|
||||
animate={{ scale: 1, opacity: 1 }}
|
||||
exit={{ scale: 0.9, opacity: 0 }}
|
||||
className="bg-gray-900/95 backdrop-blur-xl border border-white/20 rounded-2xl p-6 max-w-2xl w-full"
|
||||
className="bg-white border border-stone-200 rounded-2xl p-6 max-w-2xl w-full shadow-xl"
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
<div className="flex items-center justify-between mb-6">
|
||||
<h2 className="text-xl font-bold text-white">Reply to {selectedMessage.name}</h2>
|
||||
<h2 className="text-xl font-bold text-stone-900">Reply to {selectedMessage.name}</h2>
|
||||
<button
|
||||
onClick={() => setShowReplyModal(false)}
|
||||
className="p-2 hover:bg-white/10 rounded-lg transition-colors"
|
||||
className="p-2 hover:bg-stone-100 rounded-lg transition-colors"
|
||||
>
|
||||
<X className="w-5 h-5 text-white/70" />
|
||||
<X className="w-5 h-5 text-stone-500" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -336,20 +336,20 @@ export const EmailManager: React.FC = () => {
|
||||
value={replyContent}
|
||||
onChange={(e) => setReplyContent(e.target.value)}
|
||||
placeholder="Type your reply..."
|
||||
className="w-full h-32 p-3 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-none"
|
||||
className="w-full h-32 p-3 bg-stone-50 border border-stone-200 rounded-lg text-stone-900 placeholder:text-stone-400 focus:outline-none focus:ring-2 focus:ring-stone-400 resize-none"
|
||||
/>
|
||||
|
||||
<div className="flex space-x-3">
|
||||
<button
|
||||
onClick={handleReply}
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors"
|
||||
className="flex items-center space-x-2 px-4 py-2 bg-stone-900 text-stone-50 rounded-lg hover:bg-stone-800 transition-colors"
|
||||
>
|
||||
<Send className="w-4 h-4" />
|
||||
<span>Send Reply</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setShowReplyModal(false)}
|
||||
className="px-4 py-2 bg-white/10 text-white rounded-lg hover:bg-white/20 transition-colors"
|
||||
className="px-4 py-2 bg-white border border-stone-200 text-stone-600 rounded-lg hover:bg-stone-50 transition-colors"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
|
||||
Reference in New Issue
Block a user