Files
VPS 4 Deploy Agent 5ec6bd6354
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
chore(ops): migrate clube67 to newwhats.clube67.com directory
2026-05-18 03:26:41 +02:00

125 lines
8.6 KiB
TypeScript

import React from 'react';
import {
Users, Calendar, DollarSign, Activity,
ArrowUpRight, ArrowDownRight, Zap, Target,
TrendingUp, Clock, AlertCircle
} from 'lucide-react';
export const MedDashboard: React.FC = () => {
const stats = [
{ label: 'Pacientes Ativos', value: '1.284', change: '+12%', positive: true, icon: Users, color: 'cyan' },
{ label: 'Consultas Hoje', value: '24', change: '+4', positive: true, icon: Calendar, color: 'blue' },
{ label: 'Receita Est. (MRR)', value: 'R$ 84.200', change: '+8%', positive: true, icon: DollarSign, color: 'emerald' },
{ label: 'Taxa de Fidelidade', value: '94.2%', change: '-2%', positive: false, icon: Activity, color: 'purple' },
];
return (
<div className="space-y-10 animate-in fade-in duration-700">
{/* Header */}
<div>
<h1 className="text-4xl font-black tracking-tighter text-white mb-2 uppercase italic">Painel <span className="text-cyan-400">Estratégico</span></h1>
<p className="text-slate-500 font-bold uppercase tracking-widest text-xs">Visão geral do ecossistema médico e fidelidade</p>
</div>
{/* Stats Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
{stats.map((stat, i) => {
const Icon = stat.icon;
return (
<div key={i} className="bg-white/5 border border-white/10 p-8 rounded-[2rem] hover:bg-white/[0.08] transition-all group">
<div className="flex justify-between items-start mb-6">
<div className={`p-4 rounded-2xl bg-${stat.color}-500/10 text-${stat.color}-400 group-hover:scale-110 transition-transform`}>
<Icon size={24} />
</div>
<div className={`flex items-center gap-1 text-[10px] font-black uppercase tracking-widest ${stat.positive ? 'text-emerald-400' : 'text-rose-400'}`}>
{stat.positive ? <ArrowUpRight size={14} /> : <ArrowDownRight size={14} />}
{stat.change}
</div>
</div>
<div className="space-y-1">
<span className="text-slate-500 text-[10px] font-black uppercase tracking-[0.2em]">{stat.label}</span>
<div className="text-3xl font-black text-white tracking-tighter">{stat.value}</div>
</div>
</div>
);
})}
</div>
{/* Main Content Grid */}
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
{/* Upcoming Appointments */}
<div className="lg:col-span-2 bg-white/5 border border-white/10 rounded-[2.5rem] overflow-hidden">
<div className="p-8 border-b border-white/5 flex justify-between items-center">
<h3 className="text-sm font-black uppercase tracking-[0.3em] text-white">Próximos Atendimentos</h3>
<button className="text-[10px] font-black text-cyan-400 hover:text-cyan-300 uppercase tracking-widest transition-colors">Ver Agenda Completa</button>
</div>
<div className="p-4">
{[
{ name: 'Ricardo Santos', time: '09:00', type: 'Consulta Geral', plan: 'Premium' },
{ name: 'Ana Oliveira', time: '10:30', type: 'Retorno', plan: 'Base' },
{ name: 'Marcos Viana', time: '13:00', type: 'Primeira Vez', plan: 'Premium' },
{ name: 'Juliana Costa', time: '15:15', type: 'Check-up', plan: 'Base' },
].map((item, i) => (
<div key={i} className="flex items-center justify-between p-4 hover:bg-white/5 rounded-2xl transition-all cursor-pointer group">
<div className="flex items-center gap-4">
<div className="w-12 h-12 rounded-xl bg-slate-800 flex flex-col items-center justify-center border border-white/5">
<span className="text-[10px] font-black text-slate-500 leading-none">HRS</span>
<span className="text-sm font-black text-white">{item.time}</span>
</div>
<div>
<div className="text-sm font-black text-white uppercase tracking-tight group-hover:text-cyan-400 transition-colors">{item.name}</div>
<div className="text-[10px] text-slate-500 font-bold uppercase tracking-widest">{item.type}</div>
</div>
</div>
<div className="flex items-center gap-4">
<span className={`px-3 py-1 rounded-full text-[9px] font-black uppercase tracking-widest ${item.plan === 'Premium' ? 'bg-cyan-500/10 text-cyan-400' : 'bg-slate-800 text-slate-400'
}`}>
Plano {item.plan}
</span>
<button className="p-2 text-slate-600 hover:text-white transition-colors">
<ArrowUpRight size={18} />
</button>
</div>
</div>
))}
</div>
</div>
{/* Intelligent Insights */}
<div className="bg-gradient-to-b from-cyan-600/20 to-transparent border border-cyan-500/20 rounded-[2.5rem] p-8 relative overflow-hidden">
<div className="absolute top-0 right-0 w-32 h-32 bg-cyan-500/20 blur-[60px]"></div>
<div className="relative">
<div className="w-12 h-12 bg-cyan-500 rounded-2xl flex items-center justify-center text-white mb-8 shadow-lg shadow-cyan-500/20">
<Zap size={24} />
</div>
<h3 className="text-xl font-black text-white tracking-tighter mb-4 italic uppercase">Inteligência <br />Médica</h3>
<div className="space-y-6">
<div className="p-5 bg-black/20 rounded-2xl border border-white/5">
<div className="flex items-center gap-2 mb-2">
<AlertCircle size={14} className="text-amber-400" />
<span className="text-[10px] font-black text-amber-400 uppercase tracking-widest">Alerta de Agenda</span>
</div>
<p className="text-xs text-slate-300 leading-relaxed font-medium">3 pacientes do Plano Base estão aptos para upgrade para o Premium este mês.</p>
</div>
<div className="p-5 bg-black/20 rounded-2xl border border-white/5">
<div className="flex items-center gap-2 mb-2">
<TrendingUp size={14} className="text-emerald-400" />
<span className="text-[10px] font-black text-emerald-400 uppercase tracking-widest">Performance</span>
</div>
<p className="text-xs text-slate-300 leading-relaxed font-medium">Sua produtividade aumentou 15% após a integração com o módulo Dental.</p>
</div>
</div>
<button className="w-full mt-10 py-5 bg-white text-slate-900 rounded-2xl font-black uppercase tracking-widest hover:bg-cyan-400 transition-all flex items-center justify-center gap-3">
Ver Insights <ArrowRight size={18} />
</button>
</div>
</div>
</div>
</div>
);
};
const ArrowRight: React.FC<{ size: number }> = ({ size }) => (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14m-7-7 7 7-7 7" /></svg>
);