Merge branch 'fix/visual-adjustments' into fix/avatar

This commit is contained in:
João Gustavo 2025-10-30 23:04:03 -03:00
commit 8443abd785
13 changed files with 256 additions and 227 deletions

View File

@ -147,7 +147,7 @@ export default function AgendamentoPage() {
<div className="flex flex-row"> <div className="flex flex-row">
<Button <Button
variant={"outline"} variant={"outline"}
className="bg-muted hover:bg-muted/80 hover:text-foreground rounded-l-[100px] rounded-r-[0px]" className="bg-muted hover:!bg-primary hover:!text-white transition-colors rounded-l-[100px] rounded-r-[0px]"
onClick={() => setActiveTab("calendar")} onClick={() => setActiveTab("calendar")}
> >
Calendário Calendário
@ -155,7 +155,7 @@ export default function AgendamentoPage() {
<Button <Button
variant={"outline"} variant={"outline"}
className="bg-muted hover:bg-muted/80 hover:text-foreground rounded-r-[100px] rounded-l-[0px]" className="bg-muted hover:!bg-primary hover:!text-white transition-colors rounded-r-[100px] rounded-l-[0px]"
onClick={() => setActiveTab("espera")} onClick={() => setActiveTab("espera")}
> >
Lista de espera Lista de espera

View File

@ -526,12 +526,12 @@ export default function ConsultasPage() {
) : ( ) : (
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow className="bg-primary hover:bg-primary">
<TableHead>Paciente</TableHead> <TableHead className="text-primary-foreground">Paciente</TableHead>
<TableHead>Médico</TableHead> <TableHead className="text-primary-foreground">Médico</TableHead>
<TableHead>Status</TableHead> <TableHead className="text-primary-foreground">Status</TableHead>
<TableHead>Data e Hora</TableHead> <TableHead className="text-primary-foreground">Data e Hora</TableHead>
<TableHead>Ações</TableHead> <TableHead className="text-primary-foreground">Ações</TableHead>
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
@ -564,7 +564,7 @@ export default function ConsultasPage() {
<TableCell> <TableCell>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<button className="h-8 w-8 p-0 flex items-center justify-center rounded-md hover:bg-accent"> <button className="h-8 w-8 p-0 flex items-center justify-center rounded-md hover:bg-primary hover:text-white transition-colors">
<span className="sr-only">Abrir menu</span> <span className="sr-only">Abrir menu</span>
<MoreHorizontal className="h-4 w-4" /> <MoreHorizontal className="h-4 w-4" />
</button> </button>
@ -601,7 +601,7 @@ export default function ConsultasPage() {
<select <select
value={itemsPerPage} value={itemsPerPage}
onChange={(e) => setItemsPerPage(Number(e.target.value))} onChange={(e) => setItemsPerPage(Number(e.target.value))}
className="h-9 rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-1 focus:ring-ring" className="h-9 rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-2 focus:ring-primary hover:border-primary transition-colors cursor-pointer"
> >
<option value={10}>10</option> <option value={10}>10</option>
<option value={15}>15</option> <option value={15}>15</option>
@ -619,6 +619,7 @@ export default function ConsultasPage() {
size="sm" size="sm"
onClick={() => setCurrentPage(1)} onClick={() => setCurrentPage(1)}
disabled={currentPage === 1} disabled={currentPage === 1}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Primeira Primeira
</Button> </Button>
@ -627,6 +628,7 @@ export default function ConsultasPage() {
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))} onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))}
disabled={currentPage === 1} disabled={currentPage === 1}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Anterior Anterior
</Button> </Button>
@ -638,6 +640,7 @@ export default function ConsultasPage() {
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))} onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))}
disabled={currentPage === totalPages || totalPages === 0} disabled={currentPage === totalPages || totalPages === 0}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Próxima Próxima
</Button> </Button>
@ -646,6 +649,7 @@ export default function ConsultasPage() {
size="sm" size="sm"
onClick={() => setCurrentPage(totalPages)} onClick={() => setCurrentPage(totalPages)}
disabled={currentPage === totalPages || totalPages === 0} disabled={currentPage === totalPages || totalPages === 0}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Última Última
</Button> </Button>

View File

@ -283,15 +283,15 @@ export default function DashboardPage() {
<Plus className="h-4 w-4" /> <Plus className="h-4 w-4" />
Novo Paciente Novo Paciente
</Button> </Button>
<Button onClick={() => router.push('/agenda')} variant="outline" className="gap-2 hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground"> <Button onClick={() => router.push('/agenda')} variant="outline" className="gap-2 hover:!bg-primary hover:!text-white transition-colors">
<Calendar className="h-4 w-4" /> <Calendar className="h-4 w-4" />
Novo Agendamento Novo Agendamento
</Button> </Button>
<Button onClick={() => setShowDoctorForm(true)} variant="outline" className="gap-2 hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground"> <Button onClick={() => setShowDoctorForm(true)} variant="outline" className="gap-2 hover:!bg-primary hover:!text-white transition-colors">
<Stethoscope className="h-4 w-4" /> <Stethoscope className="h-4 w-4" />
Novo Médico Novo Médico
</Button> </Button>
<Button onClick={() => router.push('/dashboard/relatorios')} variant="outline" className="gap-2 hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground"> <Button onClick={() => router.push('/dashboard/relatorios')} variant="outline" className="gap-2 hover:!bg-primary hover:!text-white transition-colors">
<FileText className="h-4 w-4" /> <FileText className="h-4 w-4" />
Ver Relatórios Ver Relatórios
</Button> </Button>
@ -340,7 +340,7 @@ export default function DashboardPage() {
<p className="text-xs text-muted-foreground">{report.exam || 'Sem descrição'}</p> <p className="text-xs text-muted-foreground">{report.exam || 'Sem descrição'}</p>
</div> </div>
))} ))}
<Button onClick={() => router.push('/dashboard/relatorios')} variant="ghost" className="w-full mt-2" size="sm"> <Button onClick={() => router.push('/dashboard/relatorios')} variant="ghost" className="w-full mt-2 hover:!bg-primary hover:!text-white transition-colors" size="sm">
Ver Todos Ver Todos
</Button> </Button>
</div> </div>

View File

@ -102,7 +102,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><BarChart2 className="w-5 h-5" /> Consultas por Período</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><BarChart2 className="w-5 h-5" /> Consultas por Período</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Consultas por Período", "Resumo das consultas realizadas por período.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Consultas por Período", "Resumo das consultas realizadas por período.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<ResponsiveContainer width="100%" height={220}> <ResponsiveContainer width="100%" height={220}>
<BarChart data={consultasPorPeriodo}> <BarChart data={consultasPorPeriodo}>
@ -119,7 +119,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><DollarSign className="w-5 h-5" /> Faturamento Mensal</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><DollarSign className="w-5 h-5" /> Faturamento Mensal</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Faturamento Mensal", "Resumo do faturamento mensal.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Faturamento Mensal", "Resumo do faturamento mensal.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<ResponsiveContainer width="100%" height={220}> <ResponsiveContainer width="100%" height={220}>
<LineChart data={faturamentoMensal}> <LineChart data={faturamentoMensal}>
@ -138,7 +138,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><UserCheck className="w-5 h-5" /> Taxa de No-show</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><UserCheck className="w-5 h-5" /> Taxa de No-show</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Taxa de No-show", "Resumo da taxa de no-show.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Taxa de No-show", "Resumo da taxa de no-show.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<ResponsiveContainer width="100%" height={220}> <ResponsiveContainer width="100%" height={220}>
<LineChart data={taxaNoShow}> <LineChart data={taxaNoShow}>
@ -155,7 +155,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><ThumbsUp className="w-5 h-5" /> Satisfação dos Pacientes</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><ThumbsUp className="w-5 h-5" /> Satisfação dos Pacientes</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Satisfação dos Pacientes", "Resumo dos indicadores de satisfação.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Satisfação dos Pacientes", "Resumo dos indicadores de satisfação.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<div className="flex flex-col items-center justify-center h-[220px]"> <div className="flex flex-col items-center justify-center h-[220px]">
<span className="text-5xl font-bold text-green-500">92%</span> <span className="text-5xl font-bold text-green-500">92%</span>
@ -169,7 +169,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><Users className="w-5 h-5" /> Pacientes Mais Atendidos</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><Users className="w-5 h-5" /> Pacientes Mais Atendidos</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Pacientes Mais Atendidos", "Lista dos pacientes mais atendidos.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Pacientes Mais Atendidos", "Lista dos pacientes mais atendidos.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<table className="w-full text-sm mt-4"> <table className="w-full text-sm mt-4">
<thead> <thead>
@ -193,7 +193,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><Briefcase className="w-5 h-5" /> Médicos Mais Produtivos</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><Briefcase className="w-5 h-5" /> Médicos Mais Produtivos</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Médicos Mais Produtivos", "Lista dos médicos mais produtivos.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Médicos Mais Produtivos", "Lista dos médicos mais produtivos.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<table className="w-full text-sm mt-4"> <table className="w-full text-sm mt-4">
<thead> <thead>
@ -219,7 +219,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><DollarSign className="w-5 h-5" /> Análise de Convênios</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><DollarSign className="w-5 h-5" /> Análise de Convênios</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Análise de Convênios", "Resumo da análise de convênios.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Análise de Convênios", "Resumo da análise de convênios.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<ResponsiveContainer width="100%" height={220}> <ResponsiveContainer width="100%" height={220}>
<PieChart> <PieChart>
@ -238,7 +238,7 @@ export default function RelatoriosPage() {
<div className="bg-card border border-border rounded-lg shadow p-6"> <div className="bg-card border border-border rounded-lg shadow p-6">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><TrendingUp className="w-5 h-5" /> Performance por Médico</h2> <h2 className="font-semibold text-lg text-foreground flex items-center gap-2"><TrendingUp className="w-5 h-5" /> Performance por Médico</h2>
<Button size="sm" variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground" onClick={() => exportPDF("Performance por Médico", "Resumo da performance por médico.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button> <Button size="sm" variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={() => exportPDF("Performance por Médico", "Resumo da performance por médico.")}> <FileDown className="w-4 h-4 mr-1" /> Exportar PDF</Button>
</div> </div>
<table className="w-full text-sm mt-4"> <table className="w-full text-sm mt-4">
<thead> <thead>
@ -263,3 +263,4 @@ export default function RelatoriosPage() {
</div> </div>
); );
} }

View File

@ -483,12 +483,12 @@ export default function DoutoresPage() {
<div className="border rounded-lg overflow-hidden"> <div className="border rounded-lg overflow-hidden">
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow className="bg-primary hover:bg-primary">
<TableHead>Nome</TableHead> <TableHead className="text-primary-foreground">Nome</TableHead>
<TableHead>Especialidade</TableHead> <TableHead className="text-primary-foreground">Especialidade</TableHead>
<TableHead>CRM</TableHead> <TableHead className="text-primary-foreground">CRM</TableHead>
<TableHead>Contato</TableHead> <TableHead className="text-primary-foreground">Contato</TableHead>
<TableHead className="w-[100px]">Ações</TableHead> <TableHead className="w-[100px] text-primary-foreground">Ações</TableHead>
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
@ -515,7 +515,7 @@ export default function DoutoresPage() {
<TableCell> <TableCell>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<button className="h-8 w-8 p-0 flex items-center justify-center rounded-md hover:bg-accent"> <button className="h-8 w-8 p-0 flex items-center justify-center rounded-md hover:bg-primary hover:text-white transition-colors">
<MoreHorizontal className="h-4 w-4" /> <MoreHorizontal className="h-4 w-4" />
<span className="sr-only">Abrir menu</span> <span className="sr-only">Abrir menu</span>
</button> </button>
@ -605,7 +605,7 @@ export default function DoutoresPage() {
<select <select
value={itemsPerPage} value={itemsPerPage}
onChange={(e) => setItemsPerPage(Number(e.target.value))} onChange={(e) => setItemsPerPage(Number(e.target.value))}
className="h-9 rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-1 focus:ring-ring" className="h-9 rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-2 focus:ring-primary hover:border-primary transition-colors cursor-pointer"
> >
<option value={10}>10</option> <option value={10}>10</option>
<option value={15}>15</option> <option value={15}>15</option>
@ -623,6 +623,7 @@ export default function DoutoresPage() {
size="sm" size="sm"
onClick={() => setCurrentPage(1)} onClick={() => setCurrentPage(1)}
disabled={currentPage === 1} disabled={currentPage === 1}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Primeira Primeira
</Button> </Button>
@ -631,6 +632,7 @@ export default function DoutoresPage() {
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))} onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))}
disabled={currentPage === 1} disabled={currentPage === 1}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Anterior Anterior
</Button> </Button>
@ -642,6 +644,7 @@ export default function DoutoresPage() {
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))} onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))}
disabled={currentPage === totalPages || totalPages === 0} disabled={currentPage === totalPages || totalPages === 0}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Próxima Próxima
</Button> </Button>
@ -650,6 +653,7 @@ export default function DoutoresPage() {
size="sm" size="sm"
onClick={() => setCurrentPage(totalPages)} onClick={() => setCurrentPage(totalPages)}
disabled={currentPage === totalPages || totalPages === 0} disabled={currentPage === totalPages || totalPages === 0}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Última Última
</Button> </Button>

View File

@ -236,13 +236,13 @@ export default function PacientesPage() {
<div className="border rounded-lg overflow-hidden"> <div className="border rounded-lg overflow-hidden">
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow className="bg-primary hover:bg-primary">
<TableHead>Nome</TableHead> <TableHead className="text-primary-foreground">Nome</TableHead>
<TableHead>CPF</TableHead> <TableHead className="text-primary-foreground">CPF</TableHead>
<TableHead>Telefone</TableHead> <TableHead className="text-primary-foreground">Telefone</TableHead>
<TableHead>Cidade</TableHead> <TableHead className="text-primary-foreground">Cidade</TableHead>
<TableHead>Estado</TableHead> <TableHead className="text-primary-foreground">Estado</TableHead>
<TableHead className="w-[100px]">Ações</TableHead> <TableHead className="w-[100px] text-primary-foreground">Ações</TableHead>
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
@ -257,7 +257,7 @@ export default function PacientesPage() {
<TableCell> <TableCell>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<button className="h-8 w-8 p-0 flex items-center justify-center rounded-md hover:bg-accent"> <button className="h-8 w-8 p-0 flex items-center justify-center rounded-md hover:bg-primary hover:text-white transition-colors">
<span className="sr-only">Abrir menu</span> <span className="sr-only">Abrir menu</span>
<MoreHorizontal className="h-4 w-4" /> <MoreHorizontal className="h-4 w-4" />
</button> </button>
@ -302,7 +302,7 @@ export default function PacientesPage() {
<select <select
value={itemsPerPage} value={itemsPerPage}
onChange={(e) => setItemsPerPage(Number(e.target.value))} onChange={(e) => setItemsPerPage(Number(e.target.value))}
className="h-9 rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-1 focus:ring-ring" className="h-9 rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-2 focus:ring-primary hover:border-primary transition-colors cursor-pointer"
> >
<option value={10}>10</option> <option value={10}>10</option>
<option value={15}>15</option> <option value={15}>15</option>
@ -320,6 +320,7 @@ export default function PacientesPage() {
size="sm" size="sm"
onClick={() => setCurrentPage(1)} onClick={() => setCurrentPage(1)}
disabled={currentPage === 1} disabled={currentPage === 1}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Primeira Primeira
</Button> </Button>
@ -328,6 +329,7 @@ export default function PacientesPage() {
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))} onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))}
disabled={currentPage === 1} disabled={currentPage === 1}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Anterior Anterior
</Button> </Button>
@ -339,6 +341,7 @@ export default function PacientesPage() {
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))} onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))}
disabled={currentPage === totalPages || totalPages === 0} disabled={currentPage === totalPages || totalPages === 0}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Próxima Próxima
</Button> </Button>
@ -347,6 +350,7 @@ export default function PacientesPage() {
size="sm" size="sm"
onClick={() => setCurrentPage(totalPages)} onClick={() => setCurrentPage(totalPages)}
disabled={currentPage === totalPages || totalPages === 0} disabled={currentPage === totalPages || totalPages === 0}
className="hover:!bg-primary hover:!text-white transition-colors"
> >
Última Última
</Button> </Button>

View File

@ -437,25 +437,21 @@ export default function PacientePage() {
const [tipoConsulta, setTipoConsulta] = useState<'teleconsulta' | 'presencial'>('teleconsulta') const [tipoConsulta, setTipoConsulta] = useState<'teleconsulta' | 'presencial'>('teleconsulta')
const [especialidade, setEspecialidade] = useState('cardiologia') const [especialidade, setEspecialidade] = useState('cardiologia')
const [localizacao, setLocalizacao] = useState('') const [localizacao, setLocalizacao] = useState('')
const [mostrarAgendadas, setMostrarAgendadas] = useState(false)
const hoverPrimaryClass = "transition duration-200 hover:bg-[#2563eb] hover:text-white focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97]" const hoverPrimaryClass = "transition duration-200 hover:bg-[#2563eb] hover:text-white focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97]"
const activeToggleClass = "w-full transition duration-200 focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97] bg-[#2563eb] text-white hover:bg-[#2563eb] hover:text-white" const activeToggleClass = "w-full transition duration-200 focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97] bg-[#2563eb] text-white hover:bg-[#2563eb] hover:text-white"
const inactiveToggleClass = "w-full transition duration-200 bg-slate-50 text-[#2563eb] border border-[#2563eb]/30 hover:bg-slate-100 hover:text-[#2563eb] dark:bg-white/5 dark:text-white dark:hover:bg-white/10 dark:border-white/20" const inactiveToggleClass = "w-full transition duration-200 bg-slate-50 text-[#2563eb] border border-[#2563eb]/30 hover:bg-slate-100 hover:text-[#2563eb] dark:bg-white/5 dark:text-white dark:hover:bg-white/10 dark:border-white/20"
const hoverPrimaryIconClass = "rounded-xl bg-white text-[#1e293b] border border-black/10 shadow-[0_2px_8px_rgba(0,0,0,0.03)] transition duration-200 hover:bg-[#2563eb] hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#2563eb] dark:bg-slate-800 dark:text-slate-100 dark:border-white/10 dark:shadow-none dark:hover:bg-[#2563eb] dark:hover:text-white" const hoverPrimaryIconClass = "rounded-xl bg-white text-[#1e293b] border border-black/10 shadow-[0_2px_8px_rgba(0,0,0,0.03)] transition duration-200 hover:bg-[#2563eb] hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#2563eb] dark:bg-slate-800 dark:text-slate-100 dark:border-white/10 dark:shadow-none dark:hover:bg-[#2563eb] dark:hover:text-white"
const today = new Date(); today.setHours(0, 0, 0, 0); const today = new Date(); today.setHours(0, 0, 0, 0);
const selectedDate = new Date(currentDate); selectedDate.setHours(0, 0, 0, 0); const selectedDate = new Date(currentDate); selectedDate.setHours(0, 0, 0, 0);
const isSelectedDateToday = selectedDate.getTime() === today.getTime() const isSelectedDateToday = selectedDate.getTime() === today.getTime()
// Appointments state (loaded when component mounts)
// Appointments state (loaded when "Ver consultas agendadas" is opened)
const [appointments, setAppointments] = useState<any[] | null>(null) const [appointments, setAppointments] = useState<any[] | null>(null)
const [loadingAppointments, setLoadingAppointments] = useState(false) const [loadingAppointments, setLoadingAppointments] = useState(false)
const [appointmentsError, setAppointmentsError] = useState<string | null>(null) const [appointmentsError, setAppointmentsError] = useState<string | null>(null)
useEffect(() => { useEffect(() => {
let mounted = true let mounted = true
if (!mostrarAgendadas) return
if (!patientId) { if (!patientId) {
setAppointmentsError('Paciente não identificado. Faça login novamente.') setAppointmentsError('Paciente não identificado. Faça login novamente.')
return return
@ -551,7 +547,7 @@ export default function PacientePage() {
loadAppointments() loadAppointments()
return () => { mounted = false } return () => { mounted = false }
}, [mostrarAgendadas, patientId]) }, [patientId])
// Monta a URL de resultados com os filtros atuais // Monta a URL de resultados com os filtros atuais
const buildResultadosHref = () => { const buildResultadosHref = () => {
@ -564,70 +560,63 @@ export default function PacientePage() {
return `/resultados?${qs.toString()}` return `/resultados?${qs.toString()}`
} }
// derived lists for the "Ver consultas agendadas" dialog (computed after appointments state is declared) // derived lists for the page (computed after appointments state is declared)
const _dialogSource = (appointments !== null ? appointments : consultasFicticias) const _dialogSource = (appointments !== null ? appointments : consultasFicticias)
const _todaysAppointments = (_dialogSource || []).filter((c: any) => c.data === todayStr) const _todaysAppointments = (_dialogSource || []).filter((c: any) => c.data === todayStr)
return ( return (
<section className="bg-card shadow-md rounded-lg border border-border p-6"> <div className="space-y-6">
<div className="max-w-3xl mx-auto space-y-8"> {/* Hero Section */}
<header className="text-center space-y-2"> <section className="bg-gradient-to-br from-card to-card/95 shadow-lg rounded-2xl border border-primary/10 p-8">
<h2 className="text-3xl font-semibold text-foreground">Agende sua próxima consulta</h2> <div className="max-w-3xl mx-auto space-y-8">
<p className="text-muted-foreground">Escolha o formato ideal, selecione a especialidade e encontre o profissional perfeito para você.</p> <header className="text-center space-y-4">
</header> <h2 className="text-4xl font-bold text-foreground">Agende sua próxima consulta</h2>
<p className="text-lg text-muted-foreground leading-relaxed">Escolha o formato ideal, selecione a especialidade e encontre o profissional perfeito para você.</p>
</header>
<div className="space-y-6 rounded-lg border border-border bg-muted/40 p-6"> <div className="space-y-6 rounded-2xl border border-primary/15 bg-gradient-to-r from-primary/5 to-primary/10 p-8 shadow-sm">
{/* Remover campos de especialidade e localização, deixar só o botão centralizado */} <div className="flex justify-center">
<div className="flex justify-center"> <Button asChild className="w-full md:w-auto px-10 py-3 bg-primary text-white hover:!bg-primary/90 hover:!text-white transition-all duration-200 font-semibold text-base rounded-lg shadow-md hover:shadow-lg active:scale-95">
<Button asChild className={`w-full md:w-40 ${hoverPrimaryClass}`}> <Link href={buildResultadosHref()} prefetch={false}>
<Link href={buildResultadosHref()} prefetch={false}> Pesquisar Médicos
Pesquisar </Link>
</Link> </Button>
</Button> </div>
</div> </div>
</div> </div>
</section>
<div className="text-center"> {/* Consultas Agendadas Section */}
<Button <section className="bg-card shadow-md rounded-lg border border-border p-6">
variant="ghost" <div className="space-y-6">
size="sm" <header>
className="transition duration-200 bg-[#2563eb] text-white border border-[#2563eb]/40 rounded-md shadow-[0_2px_6px_rgba(0,0,0,0.03)] hover:bg-[#1e40af] hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 dark:bg-[#2563eb] dark:text-white dark:border-[#2563eb]/50 dark:hover:bg-[#1e40af]" <h2 className="text-3xl font-bold text-foreground mb-2">Suas Consultas Agendadas</h2>
onClick={() => setMostrarAgendadas(true)} <p className="text-muted-foreground">Gerencie suas consultas confirmadas, pendentes ou canceladas.</p>
> </header>
Ver consultas agendadas
</Button>
</div>
</div>
<Dialog open={mostrarAgendadas} onOpenChange={open => setMostrarAgendadas(open)}> {/* Date Navigation */}
<DialogContent className="max-w-3xl space-y-6 sm:max-h-[85vh] overflow-hidden flex flex-col"> <div className="flex flex-col gap-4 rounded-2xl border border-primary/20 bg-gradient-to-r from-primary/5 to-primary/10 p-6 sm:flex-row sm:items-center sm:justify-between shadow-sm">
<DialogHeader> <div className="flex items-center gap-2 sm:gap-3">
<DialogTitle className="text-2xl font-semibold text-foreground">Consultas agendadas</DialogTitle>
<DialogDescription>Gerencie suas consultas confirmadas, pendentes ou canceladas.</DialogDescription>
</DialogHeader>
<div className="flex flex-col gap-4 rounded-lg border border-border bg-muted/40 p-4 sm:flex-row sm:items-center sm:justify-between">
<div className="flex items-center gap-3">
<Button <Button
type="button" type="button"
variant="outline" variant="outline"
size="icon" size="icon"
onClick={(e: any) => { e.stopPropagation(); e.preventDefault(); navigateDate('prev') }} onClick={(e: any) => { e.stopPropagation(); e.preventDefault(); navigateDate('prev') }}
aria-label="Dia anterior" aria-label="Dia anterior"
className={`group shadow-sm ${hoverPrimaryIconClass}`} className={`group shadow-sm hover:!bg-primary hover:!text-white hover:!border-primary transition-all ${hoverPrimaryIconClass}`}
> >
<ChevronLeft className="h-4 w-4 transition group-hover:text-white" /> <ChevronLeft className="h-5 w-5 transition group-hover:text-white" />
</Button> </Button>
<span className="text-lg font-medium text-foreground">{formatDatePt(currentDate)}</span> <span className="text-base sm:text-lg font-semibold text-foreground min-w-fit">{formatDatePt(currentDate)}</span>
<Button <Button
type="button" type="button"
variant="outline" variant="outline"
size="icon" size="icon"
onClick={(e: any) => { e.stopPropagation(); e.preventDefault(); navigateDate('next') }} onClick={(e: any) => { e.stopPropagation(); e.preventDefault(); navigateDate('next') }}
aria-label="Próximo dia" aria-label="Próximo dia"
className={`group shadow-sm ${hoverPrimaryIconClass}`} className={`group shadow-sm hover:!bg-primary hover:!text-white hover:!border-primary transition-all ${hoverPrimaryIconClass}`}
> >
<ChevronRight className="h-4 w-4 transition group-hover:text-white" /> <ChevronRight className="h-5 w-5 transition group-hover:text-white" />
</Button> </Button>
{isSelectedDateToday && ( {isSelectedDateToday && (
<Button <Button
@ -636,88 +625,105 @@ export default function PacientePage() {
size="sm" size="sm"
onClick={goToToday} onClick={goToToday}
disabled disabled
className="border border-border text-foreground focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97] hover:bg-transparent hover:text-foreground disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-foreground" className="border border-border/50 text-foreground focus-visible:ring-2 focus-visible:ring-primary/40 active:scale-[0.97] hover:bg-primary/5 hover:text-foreground transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-foreground"
> >
Hoje Hoje
</Button> </Button>
)} )}
</div> </div>
<div className="text-sm text-muted-foreground"> <div className="text-sm font-medium text-muted-foreground bg-background/50 px-4 py-2 rounded-lg">
{`${_todaysAppointments.length} consulta${_todaysAppointments.length !== 1 ? 's' : ''} agendada${_todaysAppointments.length !== 1 ? 's' : ''}`} <span className="text-primary font-semibold">{_todaysAppointments.length}</span> consulta{_todaysAppointments.length !== 1 ? 's' : ''} agendada{_todaysAppointments.length !== 1 ? 's' : ''}
</div> </div>
</div> </div>
<div className="flex-1 flex flex-col gap-4 overflow-y-auto pr-1 sm:pr-2 pb-6"> {/* Appointments List */}
{loadingAppointments && mostrarAgendadas ? ( <div className="flex flex-col gap-6">
{loadingAppointments ? (
<div className="text-center py-10 text-muted-foreground">Carregando consultas...</div> <div className="text-center py-10 text-muted-foreground">Carregando consultas...</div>
) : appointmentsError ? ( ) : appointmentsError ? (
<div className="text-center py-10 text-red-600">{appointmentsError}</div> <div className="text-center py-10 text-red-600">{appointmentsError}</div>
) : ( ) : (
// prefer appointments (client-loaded) when present; fallback to fictitious list
(() => { (() => {
const todays = _todaysAppointments const todays = _todaysAppointments
if (!todays || todays.length === 0) { if (!todays || todays.length === 0) {
return ( return (
<div className="text-center py-10 text-muted-foreground"> <div className="flex flex-col items-center justify-center py-16 px-4">
<Calendar className="h-12 w-12 mx-auto mb-4 opacity-60" /> <div className="rounded-full bg-primary/10 p-4 mb-4">
<p className="text-lg font-medium">Nenhuma consulta agendada para este dia</p> <Calendar className="h-10 w-10 text-primary" />
<p className="text-sm">Use a busca para marcar uma nova consulta.</p> </div>
<p className="text-xl font-bold text-foreground mb-2">Nenhuma consulta agendada para este dia</p>
<p className="text-base text-muted-foreground text-center max-w-sm">Use a busca acima para marcar uma nova consulta ou navegue entre os dias.</p>
</div> </div>
) )
} }
return todays.map((consulta: any) => ( return todays.map((consulta: any) => (
<div <div
key={consulta.id} key={consulta.id}
className="rounded-xl border border-black/5 dark:border-white/10 bg-card shadow-[0_4px_12px_rgba(0,0,0,0.05)] dark:shadow-none p-5" className="rounded-2xl border border-primary/15 bg-card shadow-md hover:shadow-xl transition-all duration-300 p-6 hover:border-primary/30 hover:bg-card/95"
> >
<div className="grid gap-4 md:grid-cols-[minmax(0,2fr)_minmax(0,1fr)_minmax(0,1fr)_minmax(0,1.4fr)] items-start"> <div className="grid gap-6 grid-cols-1 sm:grid-cols-2 lg:grid-cols-[1.5fr_0.8fr_1fr_1.2fr] items-start">
<div className="flex items-start gap-3"> {/* Doctor Info */}
<div className="flex items-start gap-4 min-w-0">
<span <span
className="mt-1 h-3 w-3 flex-shrink-0 rounded-full" className="mt-2 h-4 w-4 flex-shrink-0 rounded-full shadow-sm"
style={{ backgroundColor: consulta.status === 'Confirmada' ? '#22c55e' : consulta.status === 'Pendente' ? '#fbbf24' : '#ef4444' }} style={{ backgroundColor: consulta.status === 'Confirmada' ? '#10b981' : consulta.status === 'Pendente' ? '#f59e0b' : '#ef4444' }}
aria-hidden
/> />
<div className="space-y-1"> <div className="space-y-3 min-w-0">
<div className="font-medium flex items-center gap-2 text-foreground"> <div className="font-bold flex items-center gap-2.5 text-foreground text-lg leading-tight">
<Stethoscope className="h-4 w-4 text-muted-foreground" /> <Stethoscope className="h-5 w-5 text-primary flex-shrink-0" />
{consulta.medico} <span className="truncate">{consulta.medico}</span>
</div> </div>
<p className="text-sm text-muted-foreground break-words"> <p className="text-sm text-muted-foreground break-words leading-relaxed">
{consulta.especialidade} {consulta.local} <span className="font-medium text-foreground/70">{consulta.especialidade}</span>
<span className="mx-1.5"></span>
<span>{consulta.local}</span>
</p> </p>
</div> </div>
</div> </div>
<div className="flex items-center gap-2 text-foreground"> {/* Time */}
<Clock className="h-4 w-4 text-muted-foreground" /> <div className="flex items-center justify-start gap-2.5 text-foreground">
<span className="font-medium">{consulta.hora}</span> <Clock className="h-5 w-5 text-primary flex-shrink-0" />
<span className="font-bold text-lg">{consulta.hora}</span>
</div> </div>
<div className="flex items-center"> {/* Status Badge */}
<span className={`px-3 py-1 rounded-full text-sm font-medium text-white ${consulta.status === 'Confirmada' ? 'bg-green-600' : consulta.status === 'Pendente' ? 'bg-yellow-500' : 'bg-red-600'}`}> <div className="flex items-center justify-start">
<span className={`px-4 py-2.5 rounded-full text-xs font-bold text-white shadow-md transition-all ${
consulta.status === 'Confirmada'
? 'bg-gradient-to-r from-emerald-500 to-emerald-600 shadow-emerald-500/20'
: consulta.status === 'Pendente'
? 'bg-gradient-to-r from-amber-500 to-amber-600 shadow-amber-500/20'
: 'bg-gradient-to-r from-red-500 to-red-600 shadow-red-500/20'
}`}>
{consulta.status} {consulta.status}
</span> </span>
</div> </div>
<div className="flex flex-wrap items-center justify-end gap-2"> {/* Action Buttons */}
<div className="flex flex-col sm:flex-row items-stretch gap-2">
<Button <Button
type="button" type="button"
variant="outline"
size="sm" size="sm"
className="border border-[#2563eb]/40 text-[#2563eb] hover:bg-transparent hover:text-[#2563eb] focus-visible:ring-2 focus-visible:ring-[#2563eb]/40 active:scale-[0.97]" className="border border-primary/30 text-primary bg-primary/5 hover:!bg-primary hover:!text-white hover:!border-primary transition-all duration-200 focus-visible:ring-2 focus-visible:ring-primary/40 active:scale-95 text-xs font-semibold flex-1"
> >
Detalhes Detalhes
</Button> </Button>
{consulta.status !== 'Cancelada' && ( {consulta.status !== 'Cancelada' && (
<Button type="button" variant="secondary" size="sm" className={hoverPrimaryClass}> <Button
type="button"
size="sm"
className="bg-primary/10 text-primary border border-primary/30 hover:!bg-primary hover:!text-white hover:!border-primary transition-all duration-200 focus-visible:ring-2 focus-visible:ring-primary/40 active:scale-95 text-xs font-semibold flex-1"
>
Reagendar Reagendar
</Button> </Button>
)} )}
{consulta.status !== 'Cancelada' && ( {consulta.status !== 'Cancelada' && (
<Button <Button
type="button" type="button"
variant="destructive"
size="sm" size="sm"
className="transition duration-200 hover:bg-[#dc2626] focus-visible:ring-2 focus-visible:ring-[#dc2626]/60 active:scale-[0.97]" className="border border-destructive/30 text-destructive bg-destructive/5 hover:!bg-destructive hover:!text-white hover:!border-destructive transition-all duration-200 focus-visible:ring-2 focus-visible:ring-destructive/40 active:scale-95 text-xs font-semibold flex-1"
> >
Cancelar Cancelar
</Button> </Button>
@ -729,15 +735,9 @@ export default function PacientePage() {
})() })()
)} )}
</div> </div>
</div>
<DialogFooter className="justify-center border-t border-border pt-4 mt-2"> </section>
<Button variant="outline" onClick={() => { setMostrarAgendadas(false) }} className="w-full sm:w-auto"> </div>
Fechar
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</section>
) )
} }
@ -1120,9 +1120,9 @@ export default function PacientePage() {
})()} })()}
<div className="text-base md:text-base text-muted-foreground mt-1">Data: {new Date(r.report_date || r.created_at || Date.now()).toLocaleDateString('pt-BR')}</div> <div className="text-base md:text-base text-muted-foreground mt-1">Data: {new Date(r.report_date || r.created_at || Date.now()).toLocaleDateString('pt-BR')}</div>
</div> </div>
<div className="flex gap-2 mt-3 md:mt-0"> <div className="flex gap-2 mt-2 md:mt-0">
<Button variant="outline" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground text-sm md:text-base" onClick={async () => { setSelectedReport(r); }}>{strings.visualizarLaudo}</Button> <Button variant="outline" className="hover:!bg-primary hover:!text-white transition-colors" onClick={async () => { setSelectedReport(r); }}>{strings.visualizarLaudo}</Button>
<Button variant="secondary" className="text-sm md:text-base" onClick={async () => { try { await navigator.clipboard.writeText(JSON.stringify(r)); setToast({ type: 'success', msg: 'Laudo copiado.' }) } catch { setToast({ type: 'error', msg: 'Falha ao copiar.' }) } }}>{strings.compartilhar}</Button> <Button variant="secondary" className="hover:!bg-primary hover:!text-white transition-colors" onClick={async () => { try { await navigator.clipboard.writeText(JSON.stringify(r)); setToast({ type: 'success', msg: 'Laudo copiado.' }) } catch { setToast({ type: 'error', msg: 'Falha ao copiar.' }) } }}>{strings.compartilhar}</Button>
</div> </div>
</div> </div>
))} ))}
@ -1321,66 +1321,84 @@ export default function PacientePage() {
// Renderização principal // Renderização principal
return ( return (
<ProtectedRoute requiredUserType={["paciente"]}> <ProtectedRoute requiredUserType={["paciente"]}>
<div className="min-h-screen bg-background text-foreground flex flex-col"> <div className="container mx-auto px-4 py-8">
{/* Header só com título e botão de sair */} {/* Header com informações do paciente */}
<header className="flex items-center justify-between px-4 py-2 border-b bg-card"> <header className="sticky top-0 z-40 bg-card shadow-md rounded-lg border border-border p-4 mb-6 flex items-center justify-between">
<div className="flex items-center gap-2"> <div className="flex items-center gap-4">
<User className="h-6 w-6 text-primary" aria-hidden /> <Avatar className="h-12 w-12">
<span className="font-bold">Portal do Paciente</span> <AvatarFallback className="bg-primary text-white font-bold">{profileData.nome?.charAt(0) || 'P'}</AvatarFallback>
<Button asChild variant="outline" className="ml-4"> </Avatar>
<div className="flex flex-col min-w-0">
<span className="text-sm text-muted-foreground">Conta do paciente</span>
<span className="font-bold text-lg leading-none">{profileData.nome || 'Paciente'}</span>
<span className="text-sm text-muted-foreground truncate">{profileData.email || 'Email não disponível'}</span>
</div>
</div>
<div className="flex items-center gap-3">
<SimpleThemeToggle />
<Button asChild variant="outline" className="hover:!bg-primary hover:!text-white hover:!border-primary transition-colors">
<Link href="/"> <Link href="/">
<Home className="h-4 w-4 mr-1" /> Início <Home className="h-4 w-4 mr-1" /> Início
</Link> </Link>
</Button> </Button>
</div> <Button
<div className="flex items-center gap-2"> onClick={handleLogout}
<SimpleThemeToggle /> variant="outline"
<Button onClick={handleLogout} variant="destructive" aria-label={strings.sair} disabled={loading} className="ml-2"><LogOut className="h-4 w-4" /> {strings.sair}</Button> aria-label={strings.sair}
disabled={loading}
className="text-destructive border-destructive hover:!bg-destructive hover:!text-white hover:!border-destructive transition-colors"
>
<LogOut className="h-4 w-4 mr-1" /> {strings.sair}
</Button>
</div> </div>
</header> </header>
<div className="flex flex-1 min-h-0"> {/* Layout com sidebar e conteúdo */}
{/* Sidebar vertical */} <div className="grid grid-cols-1 md:grid-cols-[220px_1fr] gap-6">
<nav aria-label="Navegação do dashboard" className="w-56 bg-card border-r flex flex-col py-6 px-2 gap-2"> {/* Sidebar vertical - sticky */}
<Button <aside className="sticky top-24 h-fit">
variant={tab==='dashboard'?'secondary':'ghost'} <nav aria-label="Navegação do dashboard" className="bg-card shadow-md rounded-lg border border-border p-3 space-y-1 z-30">
aria-current={tab==='dashboard'} <Button
onClick={()=>setTab('dashboard')} variant={tab==='dashboard'?'default':'ghost'}
className={`justify-start ${tab==='dashboard' ? 'bg-primary/10 text-primary' : ''}`} aria-current={tab==='dashboard'}
> onClick={()=>setTab('dashboard')}
<Calendar className="mr-2 h-5 w-5" />{strings.dashboard} className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
</Button> >
<Button <Calendar className="mr-2 h-4 w-4" />{strings.dashboard}
variant={tab==='consultas'?'secondary':'ghost'} </Button>
aria-current={tab==='consultas'} <Button
onClick={()=>setTab('consultas')} variant={tab==='consultas'?'default':'ghost'}
className={`justify-start ${tab==='consultas' ? 'bg-primary/10 text-primary' : ''}`} aria-current={tab==='consultas'}
> onClick={()=>setTab('consultas')}
<Calendar className="mr-2 h-5 w-5" />{strings.consultas} className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
</Button> >
<Button <Calendar className="mr-2 h-4 w-4" />{strings.consultas}
variant={tab==='exames'?'secondary':'ghost'} </Button>
aria-current={tab==='exames'} <Button
onClick={()=>setTab('exames')} variant={tab==='exames'?'default':'ghost'}
className={`justify-start ${tab==='exames' ? 'bg-primary/10 text-primary' : ''}`} aria-current={tab==='exames'}
> onClick={()=>setTab('exames')}
<FileText className="mr-2 h-5 w-5" />{strings.exames} className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
</Button> >
<FileText className="mr-2 h-4 w-4" />{strings.exames}
<Button </Button>
variant={tab==='perfil'?'secondary':'ghost'}
aria-current={tab==='perfil'} <Button
onClick={()=>setTab('perfil')} variant={tab==='perfil'?'default':'ghost'}
className={`justify-start ${tab==='perfil' ? 'bg-primary/10 text-primary' : ''}`} aria-current={tab==='perfil'}
> onClick={()=>setTab('perfil')}
<UserCog className="mr-2 h-5 w-5" />{strings.perfil} className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
</Button> >
</nav> <UserCog className="mr-2 h-4 w-4" />{strings.perfil}
</Button>
</nav>
</aside>
{/* Conteúdo principal */} {/* Conteúdo principal */}
<div className="flex-1 min-w-0 p-4 max-w-4xl mx-auto w-full"> <main className="flex-1 w-full">
{/* Toasts de feedback */} {/* Toasts de feedback */}
{toast && ( {toast && (
<div className={`fixed top-4 right-4 z-50 px-4 py-2 rounded shadow-lg ${toast.type==='success'?'bg-green-600 text-white':'bg-red-600 text-white'}`} role="alert">{toast.msg}</div> <div className={`fixed top-24 right-4 z-50 px-4 py-2 rounded shadow-lg ${toast.type==='success'?'bg-green-600 text-white':'bg-red-600 text-white'}`} role="alert">{toast.msg}</div>
)} )}
{/* Loader global */} {/* Loader global */}
@ -1389,15 +1407,14 @@ export default function PacientePage() {
{/* Conteúdo principal */} {/* Conteúdo principal */}
{!loading && !error && ( {!loading && !error && (
<main className="flex-1"> <>
{tab==='dashboard' && <DashboardCards />} {tab==='dashboard' && <DashboardCards />}
{tab==='consultas' && <Consultas />} {tab==='consultas' && <Consultas />}
{tab==='exames' && <ExamesLaudos />} {tab==='exames' && <ExamesLaudos />}
{tab==='perfil' && <Perfil />} {tab==='perfil' && <Perfil />}
</main> </>
)} )}
</div> </main>
</div> </div>
</div> </div>
</ProtectedRoute> </ProtectedRoute>

View File

@ -690,9 +690,9 @@ const ProfissionalPage = () => {
variant="outline" variant="outline"
size="sm" size="sm"
onClick={() => navigateDate('prev')} onClick={() => navigateDate('prev')}
className="p-2 hover:bg-blue-50 cursor-pointer dark:hover:bg-primary dark:hover:text-primary-foreground" className="p-2 hover:!bg-primary hover:!text-white cursor-pointer transition-colors"
> >
<ChevronLeft className="h-4 w-4 hover:!text-white" /> <ChevronLeft className="h-4 w-4" />
</Button> </Button>
<h3 className="text-lg font-medium text-foreground"> <h3 className="text-lg font-medium text-foreground">
{formatDate(currentCalendarDate)} {formatDate(currentCalendarDate)}
@ -701,9 +701,9 @@ const ProfissionalPage = () => {
variant="outline" variant="outline"
size="sm" size="sm"
onClick={() => navigateDate('next')} onClick={() => navigateDate('next')}
className="p-2 hover:bg-blue-50 cursor-pointer dark:hover:bg-primary dark:hover:text-primary-foreground" className="p-2 hover:!bg-primary hover:!text-white cursor-pointer transition-colors"
> >
<ChevronRight className="h-4 w-4 hover:!text-white" /> <ChevronRight className="h-4 w-4" />
</Button> </Button>
</div> </div>
@ -900,7 +900,7 @@ const ProfissionalPage = () => {
variant={selectedRange === 'todos' ? 'default' : 'outline'} variant={selectedRange === 'todos' ? 'default' : 'outline'}
size="sm" size="sm"
onClick={() => setSelectedRange('todos')} onClick={() => setSelectedRange('todos')}
className="hover:bg-primary/10 hover:text-primary" className="hover:!bg-primary hover:!text-white transition-colors"
> >
Todos Todos
</Button> </Button>
@ -908,7 +908,7 @@ const ProfissionalPage = () => {
variant={selectedRange === 'semana' ? 'default' : 'outline'} variant={selectedRange === 'semana' ? 'default' : 'outline'}
size="sm" size="sm"
onClick={() => setSelectedRange('semana')} onClick={() => setSelectedRange('semana')}
className="hover:bg-primary/10 hover:text-primary" className="hover:!bg-primary hover:!text-white transition-colors"
> >
Semana Semana
</Button> </Button>
@ -916,7 +916,7 @@ const ProfissionalPage = () => {
variant={selectedRange === 'mes' ? 'default' : 'outline'} variant={selectedRange === 'mes' ? 'default' : 'outline'}
size="sm" size="sm"
onClick={() => setSelectedRange('mes')} onClick={() => setSelectedRange('mes')}
className="hover:bg-primary/10 hover:text-primary" className="hover:!bg-primary hover:!text-white transition-colors"
> >
Mês Mês
</Button> </Button>
@ -1077,7 +1077,7 @@ const ProfissionalPage = () => {
<Button size="sm" onClick={doSearch} disabled={searching}> <Button size="sm" onClick={doSearch} disabled={searching}>
Buscar Buscar
</Button> </Button>
<Button size="sm" variant="ghost" onClick={handleClear}> <Button size="sm" variant="ghost" onClick={handleClear} className="hover:!bg-primary hover:!text-white transition-colors">
Limpar Limpar
</Button> </Button>
</div> </div>
@ -1383,7 +1383,7 @@ const ProfissionalPage = () => {
setIsViewing(true); setIsViewing(true);
} }
}} }}
className="flex items-center gap-1 hover:bg-blue-50 dark:hover:bg-accent dark:hover:text-accent-foreground" className="flex items-center gap-1 hover:!bg-primary hover:!text-white transition-colors"
> >
<Eye className="w-4 h-4" /> <Eye className="w-4 h-4" />
Ver Laudo Ver Laudo
@ -2457,7 +2457,7 @@ const ProfissionalPage = () => {
Este editor permite escrever relatórios de forma livre, com formatação de texto rica. Este editor permite escrever relatórios de forma livre, com formatação de texto rica.
</div> </div>
<div className="flex gap-2"> <div className="flex gap-2">
<Button variant="outline" onClick={onClose} className="hover:bg-blue-50 dark:hover:bg-accent dark:hover:text-accent-foreground"> <Button variant="outline" onClick={onClose} className="hover:!bg-primary hover:!text-white transition-colors">
Cancelar Cancelar
</Button> </Button>
{/* botão 'Salvar Rascunho' removido por não ser utilizado */} {/* botão 'Salvar Rascunho' removido por não ser utilizado */}
@ -2656,7 +2656,7 @@ const ProfissionalPage = () => {
<Button onClick={handleSaveProfile} className="flex items-center gap-2"> <Button onClick={handleSaveProfile} className="flex items-center gap-2">
Salvar Salvar
</Button> </Button>
<Button variant="outline" onClick={handleCancelEdit} className="hover:bg-blue-50 dark:hover:bg-accent dark:hover:text-accent-foreground"> <Button variant="outline" onClick={handleCancelEdit} className="hover:!bg-primary hover:!text-white transition-colors">
Cancelar Cancelar
</Button> </Button>
</div> </div>
@ -2779,7 +2779,7 @@ const ProfissionalPage = () => {
</Avatar> </Avatar>
{isEditingProfile && ( {isEditingProfile && (
<div className="space-y-2"> <div className="space-y-2">
<Button variant="outline" size="sm" className="hover:bg-primary/10 hover:text-primary dark:hover:bg-accent dark:hover:text-accent-foreground"> <Button variant="outline" size="sm" className="hover:!bg-primary hover:!text-white transition-colors">
Alterar Foto Alterar Foto
</Button> </Button>
<p className="text-xs text-muted-foreground"> <p className="text-xs text-muted-foreground">
@ -2875,7 +2875,7 @@ const ProfissionalPage = () => {
<nav className="bg-card shadow-md rounded-lg border border-border p-3 space-y-1"> <nav className="bg-card shadow-md rounded-lg border border-border p-3 space-y-1">
<Button <Button
variant={activeSection === 'calendario' ? 'default' : 'ghost'} variant={activeSection === 'calendario' ? 'default' : 'ghost'}
className="w-full justify-start transition-colors hover:bg-primary hover:text-white cursor-pointer" className="w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer"
onClick={() => setActiveSection('calendario')} onClick={() => setActiveSection('calendario')}
> >
<CalendarIcon className="mr-2 h-4 w-4" /> <CalendarIcon className="mr-2 h-4 w-4" />
@ -2883,7 +2883,7 @@ const ProfissionalPage = () => {
</Button> </Button>
<Button <Button
variant={activeSection === 'pacientes' ? 'default' : 'ghost'} variant={activeSection === 'pacientes' ? 'default' : 'ghost'}
className="w-full justify-start transition-colors hover:bg-primary hover:text-white cursor-pointer" className="w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer"
onClick={() => setActiveSection('pacientes')} onClick={() => setActiveSection('pacientes')}
> >
<Users className="mr-2 h-4 w-4" /> <Users className="mr-2 h-4 w-4" />
@ -2891,7 +2891,7 @@ const ProfissionalPage = () => {
</Button> </Button>
<Button <Button
variant={activeSection === 'laudos' ? 'default' : 'ghost'} variant={activeSection === 'laudos' ? 'default' : 'ghost'}
className="w-full justify-start transition-colors hover:bg-primary hover:text-white cursor-pointer" className="w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer"
onClick={() => setActiveSection('laudos')} onClick={() => setActiveSection('laudos')}
> >
<FileText className="mr-2 h-4 w-4" /> <FileText className="mr-2 h-4 w-4" />
@ -2899,7 +2899,7 @@ const ProfissionalPage = () => {
</Button> </Button>
<Button <Button
variant={activeSection === 'comunicacao' ? 'default' : 'ghost'} variant={activeSection === 'comunicacao' ? 'default' : 'ghost'}
className="w-full justify-start transition-colors hover:bg-primary hover:text-white cursor-pointer" className="w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer"
onClick={() => setActiveSection('comunicacao')} onClick={() => setActiveSection('comunicacao')}
> >
<MessageSquare className="mr-2 h-4 w-4" /> <MessageSquare className="mr-2 h-4 w-4" />
@ -2907,7 +2907,7 @@ const ProfissionalPage = () => {
</Button> </Button>
<Button <Button
variant={activeSection === 'perfil' ? 'default' : 'ghost'} variant={activeSection === 'perfil' ? 'default' : 'ghost'}
className="w-full justify-start transition-colors hover:bg-primary hover:text-white cursor-pointer" className="w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer"
onClick={() => setActiveSection('perfil')} onClick={() => setActiveSection('perfil')}
> >
<Settings className="mr-2 h-4 w-4" /> <Settings className="mr-2 h-4 w-4" />
@ -2957,7 +2957,7 @@ const ProfissionalPage = () => {
<Button <Button
onClick={() => setShowPopup(false)} onClick={() => setShowPopup(false)}
variant="outline" variant="outline"
className="flex-1 hover:bg-blue-50 dark:hover:bg-accent dark:hover:text-accent-foreground" className="flex-1 hover:!bg-primary hover:!text-white transition-colors"
> >
Cancelar Cancelar
</Button> </Button>
@ -3072,7 +3072,7 @@ const ProfissionalPage = () => {
<Button <Button
onClick={() => setShowActionModal(false)} onClick={() => setShowActionModal(false)}
variant="outline" variant="outline"
className="w-full mt-2 hover:bg-blue-50 dark:hover:bg-accent dark:hover:text-accent-foreground" className="w-full mt-2 hover:!bg-primary hover:!text-white transition-colors"
> >
Cancelar Cancelar
</Button> </Button>

View File

@ -573,7 +573,7 @@ export default function ResultadosClient() {
</div> </div>
<Button <Button
variant="outline" variant="outline"
className="rounded-full border-primary-foreground/30 bg-primary-foreground/10 text-primary-foreground hover:bg-primary-foreground hover:text-primary" className="rounded-full border-primary-foreground/30 bg-primary-foreground/10 text-primary-foreground hover:!bg-primary-foreground hover:!text-primary transition-colors"
> >
Ajustar filtros Ajustar filtros
</Button> </Button>
@ -617,7 +617,7 @@ export default function ResultadosClient() {
</Toggle> </Toggle>
<Select value={convenio} onValueChange={setConvenio}> <Select value={convenio} onValueChange={setConvenio}>
<SelectTrigger className="h-10 min-w-[180px] rounded-full border border-primary/40 bg-primary/10 text-primary transition duration-200 hover:bg-primary/10 hover:text-primary"> <SelectTrigger className="h-10 min-w-[180px] rounded-full border border-primary/40 bg-primary/10 text-primary transition duration-200 hover:!border-primary focus:ring-2 focus:ring-primary cursor-pointer">
<SelectValue placeholder="Convênio" /> <SelectValue placeholder="Convênio" />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
@ -631,7 +631,7 @@ export default function ResultadosClient() {
</Select> </Select>
<Select value={bairro} onValueChange={setBairro}> <Select value={bairro} onValueChange={setBairro}>
<SelectTrigger className="h-10 min-w-[160px] rounded-full border border-primary/40 bg-primary/10 text-primary transition duration-200 hover:bg-primary/10 hover:text-primary"> <SelectTrigger className="h-10 min-w-[160px] rounded-full border border-primary/40 bg-primary/10 text-primary transition duration-200 hover:!border-primary focus:ring-2 focus:ring-primary cursor-pointer">
<SelectValue placeholder="Bairro" /> <SelectValue placeholder="Bairro" />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
@ -644,7 +644,7 @@ export default function ResultadosClient() {
<Button <Button
variant="outline" variant="outline"
className="rounded-full border border-primary/40 bg-primary/10 text-primary transition duration-200 hover:bg-primary/10 hover:text-primary" className="rounded-full border border-primary/40 bg-primary/10 text-primary hover:!bg-primary hover:!text-white transition-colors"
> >
<Filter className="mr-2 h-4 w-4" /> <Filter className="mr-2 h-4 w-4" />
Mais filtros Mais filtros
@ -652,7 +652,7 @@ export default function ResultadosClient() {
<Button <Button
variant="ghost" variant="ghost"
className="ml-auto rounded-full text-primary hover:bg-primary/10" className="ml-auto rounded-full text-primary hover:!bg-primary hover:!text-white transition-colors"
onClick={() => router.back()} onClick={() => router.back()}
> >
Voltar Voltar
@ -711,7 +711,7 @@ export default function ResultadosClient() {
</div> </div>
<Button <Button
variant="ghost" variant="ghost"
className="ml-auto h-fit rounded-full text-primary hover:bg-primary/10" className="ml-auto h-fit rounded-full text-primary hover:!bg-primary hover:!text-white transition-colors"
onClick={() => { onClick={() => {
setMedicoSelecionado(medico) setMedicoSelecionado(medico)
setAbaDetalhe('experiencia') setAbaDetalhe('experiencia')
@ -782,12 +782,12 @@ export default function ResultadosClient() {
> >
Agendar consulta Agendar consulta
</Button> </Button>
<Button variant="outline" className="h-11 rounded-full border-primary/40 bg-primary/10 text-primary transition duration-200 hover:bg-primary/10 hover:text-primary"> <Button variant="outline" className="h-11 rounded-full border-primary/40 bg-primary/10 text-primary hover:!bg-primary hover:!text-white transition-colors">
Enviar mensagem Enviar mensagem
</Button> </Button>
<Button <Button
variant="ghost" variant="ghost"
className="h-11 rounded-full text-primary hover:bg-primary/10" className="h-11 rounded-full text-primary hover:!bg-primary hover:!text-white transition-colors"
onClick={() => { onClick={() => {
const willOpen = !agendasExpandida[id] const willOpen = !agendasExpandida[id]
setAgendasExpandida(prev => ({ ...prev, [id]: !prev[id] })) setAgendasExpandida(prev => ({ ...prev, [id]: !prev[id] }))
@ -979,18 +979,17 @@ export default function ResultadosClient() {
</Dialog> </Dialog>
{/* Dialog: Mostrar mais horários (escolher data arbitrária) */} {/* Dialog: Mostrar mais horários (escolher data arbitrária) */}
<Dialog open={!!moreTimesForDoctor} onOpenChange={(open) => { if (!open) { setMoreTimesForDoctor(null); setMoreTimesSlots([]); setMoreTimesException(null); } }}> <Dialog open={!!moreTimesForDoctor} onOpenChange={(open) => { if (!open) { setMoreTimesForDoctor(null); setMoreTimesSlots([]); setMoreTimesException(null); } }}>
<DialogContent className="w-full max-w-2xl border border-border bg-card p-4"> <DialogContent className="w-full max-w-2xl border border-border bg-card p-6">
<div className="flex items-center justify-between gap-4"> <DialogHeader className="mb-4">
<DialogHeader> <DialogTitle>Mais horários</DialogTitle>
<DialogTitle>Mais horários</DialogTitle> </DialogHeader>
</DialogHeader>
<div className="ml-auto flex items-center gap-2"> <div className="flex items-center gap-2 mb-4">
<input type="date" className="rounded-md border border-border px-3 py-2 text-sm" value={moreTimesDate} onChange={(e) => setMoreTimesDate(e.target.value)} /> <input type="date" className="flex-1 rounded-md border border-border px-3 py-2 text-sm" value={moreTimesDate} onChange={(e) => setMoreTimesDate(e.target.value)} />
<Button className="h-10" onClick={async () => { if (moreTimesForDoctor) await fetchSlotsForDate(moreTimesForDoctor, moreTimesDate) }}>Buscar horários</Button> <Button className="h-10" onClick={async () => { if (moreTimesForDoctor) await fetchSlotsForDate(moreTimesForDoctor, moreTimesDate) }}>Buscar horários</Button>
</div>
</div> </div>
<div className="mt-4"> <div className="mt-2">
{moreTimesLoading ? ( {moreTimesLoading ? (
<div className="text-sm text-muted-foreground">Carregando horários...</div> <div className="text-sm text-muted-foreground">Carregando horários...</div>
) : moreTimesException ? ( ) : moreTimesException ? (

View File

@ -43,7 +43,7 @@ export function PagesHeader({ title = "", subtitle = "" }: { title?: string, sub
</div> </div>
<div className="flex items-center space-x-4"> <div className="flex items-center space-x-4">
<Button variant="ghost" size="icon"> <Button variant="ghost" size="icon" className="hover:!bg-primary hover:!text-white transition-colors">
<Bell className="h-4 w-4" /> <Bell className="h-4 w-4" />
</Button> </Button>

View File

@ -17,7 +17,7 @@ export function SimpleThemeToggle() {
variant="outline" variant="outline"
size="icon" size="icon"
onClick={toggleTheme} onClick={toggleTheme}
className="hover:text-muted-foreground cursor-pointer !shadow-sm !shadow-black/10 !border-2 !border-black dark:!shadow-none dark:!border-border" className="hover:!bg-primary hover:!text-white hover:!border-primary cursor-pointer !shadow-sm !shadow-black/10 !border-2 !border-black dark:!shadow-none dark:!border-border transition-colors"
> >
<Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /> <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /> <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />

View File

@ -74,7 +74,7 @@ function DropdownMenuItem({
data-inset={inset} data-inset={inset}
data-variant={variant} data-variant={variant}
className={cn( className={cn(
"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "focus:bg-primary focus:text-primary-foreground hover:bg-primary hover:text-primary-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 transition-colors",
className className
)} )}
{...props} {...props}

View File

@ -266,7 +266,7 @@ function SidebarTrigger({
data-slot="sidebar-trigger" data-slot="sidebar-trigger"
variant="ghost" variant="ghost"
size="icon" size="icon"
className={cn("size-7", className)} className={cn("size-7 hover:!bg-primary hover:!text-white transition-colors", className)}
onClick={(event) => { onClick={(event) => {
onClick?.(event) onClick?.(event)
toggleSidebar() toggleSidebar()