Compare commits

...

6 Commits

Author SHA1 Message Date
22a60f4ef6 . 2025-10-03 03:56:40 -03:00
dcc4a8ff86 feat: atualiza página de login do paciente
- Melhora layout e funcionalidades da página de login do paciente
- Ajustes na interface e experiência do usuário
2025-10-03 03:52:18 -03:00
f4abd44efe feat: implementa melhorias no sistema de tema claro padrão
- Adiciona hook customizado para forçar tema claro como padrão
- Melhora CSS para prevenir flash de tema escuro
- Otimiza transições entre temas
2025-10-03 03:35:25 -03:00
f0a90afe55 refactor: Ajustes manuais em componentes do header e sidebar
- Atualiza componentes de header com melhorias visuais
- Refina sidebar com ajustes de navegação
- Aprimora footer com correções de estilo
- Mantém funcionalidades existentes intactas

Alterações realizadas manualmente para otimização da interface.
2025-10-03 03:10:49 -03:00
8536a8dd20 fix: Corrige navegação do menu lateral e melhora alinhamento de formulários
🔧 Correções no Menu Lateral:
- Fix: Resolve problema onde clicar em "Relatórios" também ativava "Dashboard"
- Ajusta lógica de detecção do item ativo na sidebar
- Evita conflito entre rotas /dashboard e /dashboard/relatorios
- Funciona corretamente em ambos os modos (claro e escuro)

🎨 Padronização das Páginas de Agendamento:
- Padroniza sistema completo de agendamento (agenda, procedimento, financeiro)
- Adiciona página /financeiro com informações financeiras e formas de pagamento
- Padroniza componentes HeaderAgenda e FooterAgenda para modo escuro
- Padroniza ListaEspera com cores responsivas e tabela temática
- Padroniza página de calendário principal com dropdown melhorado
- Padroniza página de relatórios com cards e gráficos adaptativos

📐 Melhorias no Alinhamento dos Formulários:
- Fix: Corrige alinhamento dos campos no formulário de agendamento
- Reorganiza layout de "Data de nascimento" e "Telefone" em colunas separadas
- Alinha perfeitamente campos "Início" e "Término" em grid 2 colunas
- Melhora layout geral da seção "Informações do atendimento"
- Ajusta proporções do textarea de observações
- Layout mais limpo e profissional em todas as telas

 Benefícios:
- Navegação precisa no menu lateral
- Sistema de agendamento completamente padronizado
- Formulários com campos perfeitamente alinhados
- Experiência visual consistente em modo claro e escuro
- Interface mais profissional e intuitiva
2025-10-03 02:42:32 -03:00
47967eb37f feat: Implementa sistema completo de modo escuro
- Adiciona ThemeProvider com next-themes para controle de tema
- Implementa componente SimpleThemeToggle com ícones sol/lua
- Configura CSS variables completas para light/dark modes no globals.css
- Padroniza todas as páginas de autenticação (login, login-admin, login-paciente)
- Padroniza todos os módulos principais (dashboard, pacientes, doutores, consultas, calendar, configuração)
- Padroniza completamente área profissional com todas as seções:
  * Calendário e agendamentos
  * Busca e gestão de pacientes
  * Prontuários médicos completos
  * Comunicação e relatórios
  * Seções de exames (solicitados, resultados, diagnósticos, prescrições, evolução, anexos)
- Atualiza componentes UI (input, select, textarea) com bordas visíveis
- Implementa suporte dark mode em tooltips, badges de status e mensagens
- Garante acessibilidade e consistência visual em ambos os modos
- Mantém funcionalidades existentes sem breaking changes

Todos os elementos agora respondem adequadamente ao toggle de tema,
proporcionando experiência de usuário consistente e acessível.
2025-10-03 02:22:40 -03:00
29 changed files with 584 additions and 306 deletions

View File

@ -85,7 +85,7 @@ export default function AgendamentoPage() {
}; };
return ( return (
<div className="flex flex-row"> <div className="flex flex-row bg-background">
<div className="flex w-full flex-col"> <div className="flex w-full flex-col">
<div className="flex w-full flex-col gap-10 p-6"> <div className="flex w-full flex-col gap-10 p-6">
<div className="flex flex-row justify-between items-center"> <div className="flex flex-row justify-between items-center">
@ -103,7 +103,7 @@ export default function AgendamentoPage() {
</Button> </Button>
</Link> */} </Link> */}
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger className="bg-blue-600 hover:bg-blue-700 px-5 py-1 text-white rounded-sm"> <DropdownMenuTrigger className="bg-primary hover:bg-primary/90 px-5 py-1 text-primary-foreground rounded-sm">
Opções &#187; Opções &#187;
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent> <DropdownMenuContent>
@ -122,7 +122,7 @@ export default function AgendamentoPage() {
<div className="flex flex-row"> <div className="flex flex-row">
<Button <Button
variant={"outline"} variant={"outline"}
className="bg-gray-100 hover:bg-gray-200 hover:text-foreground rounded-l-[100px] rounded-r-[0px]" className="bg-muted hover:bg-muted/80 hover:text-foreground rounded-l-[100px] rounded-r-[0px]"
onClick={() => setActiveTab("calendar")} onClick={() => setActiveTab("calendar")}
> >
Calendário Calendário
@ -130,7 +130,7 @@ export default function AgendamentoPage() {
<Button <Button
variant={"outline"} variant={"outline"}
className="bg-gray-100 hover:bg-gray-200 hover:text-foreground rounded-r-[100px] rounded-l-[0px]" className="bg-muted hover:bg-muted/80 hover:text-foreground rounded-r-[100px] rounded-l-[0px]"
onClick={() => setActiveTab("espera")} onClick={() => setActiveTab("espera")}
> >
Lista de espera Lista de espera

View File

@ -45,12 +45,12 @@ export default function ConfiguracaoPage() {
] ]
return ( return (
<div className="p-6 space-y-6"> <div className="p-6 space-y-6 bg-background">
{/* título */} {/* título */}
<h1 className="text-2xl font-bold">Configurações</h1> <h1 className="text-2xl font-bold text-foreground">Configurações</h1>
{/* introdução */} {/* introdução */}
<p className="text-gray-600"> <p className="text-muted-foreground">
Ajuste os principais parâmetros do sistema. Escolha uma das seções abaixo Ajuste os principais parâmetros do sistema. Escolha uma das seções abaixo
para configurar horários, mensagens, notificações internas, permissões de usuários para configurar horários, mensagens, notificações internas, permissões de usuários
e regras de segurança da clínica. e regras de segurança da clínica.
@ -66,7 +66,7 @@ export default function ConfiguracaoPage() {
<CardTitle>{item.title}</CardTitle> <CardTitle>{item.title}</CardTitle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<p className="text-sm text-gray-600">{item.desc}</p> <p className="text-sm text-muted-foreground">{item.desc}</p>
</CardContent> </CardContent>
</Card> </Card>
</Link> </Link>

View File

@ -145,7 +145,7 @@ export default function ConsultasPage() {
if (showForm && editingAppointment) { if (showForm && editingAppointment) {
return ( return (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<Button type="button" variant="ghost" size="icon" onClick={handleCancel}> <Button type="button" variant="ghost" size="icon" onClick={handleCancel}>
<ArrowLeft className="h-4 w-4" /> <ArrowLeft className="h-4 w-4" />
@ -162,7 +162,7 @@ export default function ConsultasPage() {
} }
return ( return (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div className="flex items-center justify-between gap-4 flex-wrap"> <div className="flex items-center justify-between gap-4 flex-wrap">
<div> <div>
<h1 className="text-2xl font-bold">Gerenciamento de Consultas</h1> <h1 className="text-2xl font-bold">Gerenciamento de Consultas</h1>

View File

@ -1,7 +1,7 @@
export default function DashboardPage() { export default function DashboardPage() {
return ( return (
<> <>
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div> <div>
<h1 className="text-2xl font-bold text-foreground">Dashboard</h1> <h1 className="text-2xl font-bold text-foreground">Dashboard</h1>
<p className="text-muted-foreground"> <p className="text-muted-foreground">

View File

@ -41,14 +41,14 @@ export default function RelatoriosPage() {
}; };
return ( return (
<div className="p-6"> <div className="p-6 bg-background min-h-screen">
<h1 className="text-2xl font-bold mb-6">Relatórios</h1> <h1 className="text-2xl font-bold mb-6 text-foreground">Relatórios</h1>
<div className="grid grid-cols-3 gap-6"> <div className="grid grid-cols-3 gap-6">
{/* Card Consultas */} {/* Card Consultas */}
<div className="p-4 border rounded-lg shadow"> <div className="p-4 border border-border rounded-lg shadow bg-card">
<h2 className="font-semibold text-lg">Relatório de Consultas</h2> <h2 className="font-semibold text-lg text-foreground">Relatório de Consultas</h2>
<p className="text-sm text-gray-500">Resumo das consultas realizadas.</p> <p className="text-sm text-muted-foreground">Resumo das consultas realizadas.</p>
{/* PASSO 4 - Botão chama a função */} {/* PASSO 4 - Botão chama a função */}
<Button onClick={exportConsultasPDF} className="mt-4"> <Button onClick={exportConsultasPDF} className="mt-4">
<FileDown className="mr-2 h-4 w-4" /> Exportar PDF <FileDown className="mr-2 h-4 w-4" /> Exportar PDF
@ -56,17 +56,17 @@ export default function RelatoriosPage() {
</div> </div>
{/* Card Pacientes */} {/* Card Pacientes */}
<div className="p-4 border rounded-lg shadow"> <div className="p-4 border border-border rounded-lg shadow bg-card">
<h2 className="font-semibold text-lg">Relatório de Pacientes</h2> <h2 className="font-semibold text-lg text-foreground">Relatório de Pacientes</h2>
<p className="text-sm text-gray-500">Informações gerais dos pacientes cadastrados.</p> <p className="text-sm text-muted-foreground">Informações gerais dos pacientes cadastrados.</p>
<Button onClick={exportPacientesPDF} className="mt-4"> <Button onClick={exportPacientesPDF} className="mt-4">
<FileDown className="mr-2 h-4 w-4" /> Exportar PDF <FileDown className="mr-2 h-4 w-4" /> Exportar PDF
</Button> </Button>
</div> </div>
{/* Card Financeiro com gráfico */} {/* Card Financeiro com gráfico */}
<div className="p-4 border rounded-lg shadow col-span-3 md:col-span-3"> <div className="p-4 border border-border rounded-lg shadow col-span-3 md:col-span-3 bg-card">
<h2 className="font-semibold text-lg mb-2">Relatório Financeiro</h2> <h2 className="font-semibold text-lg mb-2 text-foreground">Relatório Financeiro</h2>
<ResponsiveContainer width="100%" height={300}> <ResponsiveContainer width="100%" height={300}>
<BarChart data={financeiro} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}> <BarChart data={financeiro} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>
<CartesianGrid strokeDasharray="3 3" /> <CartesianGrid strokeDasharray="3 3" />

View File

@ -287,7 +287,7 @@ export default function DoutoresPage() {
if (showForm) { if (showForm) {
return ( return (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<Button variant="ghost" size="icon" onClick={() => setShowForm(false)}> <Button variant="ghost" size="icon" onClick={() => setShowForm(false)}>
<ArrowLeft className="h-4 w-4" /> <ArrowLeft className="h-4 w-4" />
@ -307,7 +307,7 @@ export default function DoutoresPage() {
} }
return ( return (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div className="flex items-center justify-between gap-4 flex-wrap"> <div className="flex items-center justify-between gap-4 flex-wrap">
<div> <div>
<h1 className="text-2xl font-bold">Médicos</h1> <h1 className="text-2xl font-bold">Médicos</h1>

View File

@ -166,7 +166,7 @@ export default function PacientesPage() {
if (showForm) { if (showForm) {
return ( return (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<Button variant="ghost" onClick={() => setShowForm(false)}> <Button variant="ghost" onClick={() => setShowForm(false)}>
<ArrowLeft className="h-4 w-4" /> <ArrowLeft className="h-4 w-4" />
@ -186,7 +186,7 @@ export default function PacientesPage() {
} }
return ( return (
<div className="space-y-6 p-6"> <div className="space-y-6 p-6 bg-background">
<div className="flex items-center justify-between gap-4 flex-wrap"> <div className="flex items-center justify-between gap-4 flex-wrap">
<div> <div>
<h1 className="text-2xl font-bold">Pacientes</h1> <h1 className="text-2xl font-bold">Pacientes</h1>

View File

@ -19,7 +19,7 @@ export default function NovoAgendamentoPage() {
}; };
return ( return (
<div className="min-h-screen flex flex-col bg-white"> <div className="min-h-screen flex flex-col bg-background">
<HeaderAgenda /> <HeaderAgenda />
<main className="flex-1 mx-auto w-full max-w-7xl px-8 py-8"> <main className="flex-1 mx-auto w-full max-w-7xl px-8 py-8">
<CalendarRegistrationForm <CalendarRegistrationForm

View File

@ -0,0 +1,148 @@
"use client";
import Link from "next/link";
import { usePathname, useRouter } from "next/navigation";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
import { Search, ChevronDown, Calculator, DollarSign } from "lucide-react";
import { Plus } from "lucide-react";
import HeaderAgenda from "@/components/agenda/HeaderAgenda";
import FooterAgenda from "@/components/agenda/FooterAgenda";
export default function FinanceiroPage() {
const pathname = usePathname();
const router = useRouter();
const [bloqueio, setBloqueio] = useState(false);
const isAg = pathname?.startsWith("/agendamento");
const isPr = pathname?.startsWith("/procedimento");
const isFi = pathname?.startsWith("/financeiro");
return (
<div className="w-full min-h-screen flex flex-col bg-background">
{/* HEADER */}
<HeaderAgenda />
{/* CORPO */}
<main className="mx-auto w-full max-w-7xl px-8 py-6 space-y-6 flex-grow">
{/* INFORMAÇÕES FINANCEIRAS */}
<section className="space-y-6">
{/* Selo Financeiro */}
<div className="inline-flex items-center gap-2 border border-border px-3 py-1.5 bg-card text-[12px] rounded-md cursor-pointer hover:bg-muted">
<span className="flex h-5 w-5 items-center justify-center rounded-full border border-border bg-muted text-muted-foreground">
<DollarSign className="h-3 w-3" strokeWidth={2} />
</span>
<span className="text-foreground">Informações Financeiras</span>
</div>
{/* Traço separador */}
<div className="border-b border-border" />
{/* VALOR DO ATENDIMENTO */}
<div className="space-y-4">
<Label className="text-[13px] text-foreground/80">
Valor do Atendimento
</Label>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2">
<Label className="text-xs text-muted-foreground">Valor Particular</Label>
<div className="relative">
<DollarSign className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input
placeholder="R$ 0,00"
className="h-10 w-full rounded-md pl-8 pr-4 border-input focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500"
/>
</div>
</div>
<div className="space-y-2">
<Label className="text-xs text-muted-foreground">Valor Convênio</Label>
<div className="relative">
<DollarSign className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input
placeholder="R$ 0,00"
className="h-10 w-full rounded-md pl-8 pr-4 border-input focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500"
/>
</div>
</div>
</div>
</div>
{/* Traço separador */}
<div className="border-b border-border" />
{/* FORMA DE PAGAMENTO */}
<div className="space-y-4">
<Label className="text-[13px] text-foreground/80">
Forma de Pagamento
</Label>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<div className="space-y-2">
<Label className="text-xs text-muted-foreground">Tipo</Label>
<select className="h-10 w-full rounded-md border border-input bg-background text-foreground pr-8 pl-3 text-[13px] appearance-none">
<option value="">Selecionar</option>
<option value="dinheiro">Dinheiro</option>
<option value="cartao">Cartão</option>
<option value="pix">PIX</option>
<option value="convenio">Convênio</option>
</select>
</div>
<div className="space-y-2">
<Label className="text-xs text-muted-foreground">Parcelas</Label>
<select className="h-10 w-full rounded-md border border-input bg-background text-foreground pr-8 pl-3 text-[13px] appearance-none">
<option value="1">1x</option>
<option value="2">2x</option>
<option value="3">3x</option>
<option value="4">4x</option>
<option value="5">5x</option>
<option value="6">6x</option>
</select>
</div>
<div className="space-y-2">
<Label className="text-xs text-muted-foreground">Desconto</Label>
<div className="relative">
<Calculator className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input
placeholder="0%"
className="h-10 w-full rounded-md pl-8 pr-4 border-input focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500"
/>
</div>
</div>
</div>
</div>
{/* Traço separador */}
<div className="border-b border-border" />
{/* RESUMO FINANCEIRO */}
<div className="space-y-4">
<Label className="text-[13px] text-foreground/80">
Resumo Financeiro
</Label>
<div className="bg-muted/30 rounded-lg p-4 space-y-3">
<div className="flex justify-between items-center">
<span className="text-sm text-muted-foreground">Subtotal:</span>
<span className="text-sm font-medium text-foreground">R$ 0,00</span>
</div>
<div className="flex justify-between items-center">
<span className="text-sm text-muted-foreground">Desconto:</span>
<span className="text-sm font-medium text-foreground">- R$ 0,00</span>
</div>
<div className="border-t border-border pt-2">
<div className="flex justify-between items-center">
<span className="text-base font-medium text-foreground">Total:</span>
<span className="text-lg font-bold text-primary">R$ 0,00</span>
</div>
</div>
</div>
</div>
</section>
</main>
{/* RODAPÉ FIXO */}
<FooterAgenda />
</div>
);
}

View File

@ -1,7 +1,7 @@
@import "tailwindcss"; @import "tailwindcss";
@import "tw-animate-css"; @import "tw-animate-css";
@custom-variant dark (&:is(.dark *)); /* Removed unsupported @custom-variant dark (&:is(.dark *)); */
:root { :root {
--background: #ffffff; --background: #ffffff;
@ -39,7 +39,42 @@
--sidebar-ring: var(--color-blue-500); --sidebar-ring: var(--color-blue-500);
} }
@theme inline { .dark {
--background: #0f172a;
--foreground: #cbd5e1;
--card: #1e293b;
--card-foreground: #e2e8f0;
--popover: #1e293b;
--popover-foreground: #cbd5e1;
--primary: var(--color-blue-500);
--primary-foreground: #ffffff;
--secondary: #334155;
--secondary-foreground: #cbd5e1;
--muted: #334155;
--muted-foreground: #94a3b8;
--accent: #0891b2;
--accent-foreground: #ffffff;
--destructive: #dc2626;
--destructive-foreground: #ffffff;
--border: #334155;
--input: #334155;
--ring: var(--color-blue-500);
--chart-1: #0891b2;
--chart-2: #0f766e;
--chart-3: #f59e0b;
--chart-4: #dc2626;
--chart-5: #94a3b8;
--sidebar: #1e293b;
--sidebar-foreground: #cbd5e1;
--sidebar-primary: var(--color-blue-500);
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: var(--color-blue-500);
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #334155;
--sidebar-ring: var(--color-blue-500);
}
:root {
--font-sans: var(--font-geist-sans); --font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono); --font-mono: var(--font-geist-mono);
--color-background: var(--background); --color-background: var(--background);
@ -82,9 +117,12 @@
@layer base { @layer base {
* { * {
@apply border-border outline-ring/50; border-color: var(--color-border);
outline-color: color-mix(in srgb, var(--color-ring) 50%, transparent);
} }
body { body {
@apply bg-background text-foreground font-sans; background-color: var(--color-background);
color: var(--color-foreground);
font-family: var(--font-sans, sans-serif);
} }
} }

View File

@ -1,6 +1,7 @@
import type React from "react" import type React from "react"
import type { Metadata } from "next" import type { Metadata } from "next"
import { AuthProvider } from "@/hooks/useAuth" import { AuthProvider } from "@/hooks/useAuth"
import { ThemeProvider } from "@/components/theme-provider"
import "./globals.css" import "./globals.css"
export const metadata: Metadata = { export const metadata: Metadata = {
@ -17,11 +18,13 @@ export default function RootLayout({
children: React.ReactNode children: React.ReactNode
}) { }) {
return ( return (
<html lang="pt-BR" className="antialiased"> <html lang="pt-BR" className="antialiased" suppressHydrationWarning>
<body style={{ fontFamily: "var(--font-geist-sans)" }}> <body style={{ fontFamily: "var(--font-geist-sans)" }}>
<AuthProvider> <ThemeProvider attribute="class" defaultTheme="light" enableSystem={false}>
{children} <AuthProvider>
</AuthProvider> {children}
</AuthProvider>
</ThemeProvider>
</body> </body>
</html> </html>
) )

View File

@ -45,13 +45,13 @@ export default function LoginAdminPage() {
} }
return ( return (
<div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8"> <div className="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8">
<div className="max-w-md w-full space-y-8"> <div className="max-w-md w-full space-y-8">
<div className="text-center"> <div className="text-center">
<h2 className="mt-6 text-3xl font-extrabold text-gray-900"> <h2 className="mt-6 text-3xl font-extrabold text-foreground">
Login Administrador de Clínica Login Administrador de Clínica
</h2> </h2>
<p className="mt-2 text-sm text-gray-600"> <p className="mt-2 text-sm text-muted-foreground">
Entre com suas credenciais para acessar o sistema administrativo Entre com suas credenciais para acessar o sistema administrativo
</p> </p>
</div> </div>
@ -63,7 +63,7 @@ export default function LoginAdminPage() {
<CardContent> <CardContent>
<form onSubmit={handleLogin} className="space-y-6"> <form onSubmit={handleLogin} className="space-y-6">
<div> <div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> <label htmlFor="email" className="block text-sm font-medium text-foreground">
Email Email
</label> </label>
<Input <Input
@ -79,7 +79,7 @@ export default function LoginAdminPage() {
</div> </div>
<div> <div>
<label htmlFor="password" className="block text-sm font-medium text-gray-700"> <label htmlFor="password" className="block text-sm font-medium text-foreground">
Senha Senha
</label> </label>
<Input <Input

View File

@ -43,13 +43,13 @@ export default function LoginPacientePage() {
} }
return ( return (
<div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8"> <div className="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8">
<div className="max-w-md w-full space-y-8"> <div className="max-w-md w-full space-y-8">
<div className="text-center"> <div className="text-center">
<h2 className="mt-6 text-3xl font-extrabold text-gray-900"> <h2 className="mt-6 text-3xl font-extrabold text-foreground">
Portal do Paciente Sou Paciente
</h2> </h2>
<p className="mt-2 text-sm text-gray-600"> <p className="mt-2 text-sm text-muted-foreground">
Acesse sua área pessoal e gerencie suas consultas Acesse sua área pessoal e gerencie suas consultas
</p> </p>
</div> </div>
@ -61,7 +61,7 @@ export default function LoginPacientePage() {
<CardContent> <CardContent>
<form onSubmit={handleLogin} className="space-y-6"> <form onSubmit={handleLogin} className="space-y-6">
<div> <div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> <label htmlFor="email" className="block text-sm font-medium text-foreground">
Email Email
</label> </label>
<Input <Input
@ -77,7 +77,7 @@ export default function LoginPacientePage() {
</div> </div>
<div> <div>
<label htmlFor="password" className="block text-sm font-medium text-gray-700"> <label htmlFor="password" className="block text-sm font-medium text-foreground">
Senha Senha
</label> </label>
<Input <Input

View File

@ -45,13 +45,13 @@ export default function LoginPage() {
} }
return ( return (
<div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8"> <div className="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8">
<div className="max-w-md w-full space-y-8"> <div className="max-w-md w-full space-y-8">
<div className="text-center"> <div className="text-center">
<h2 className="mt-6 text-3xl font-extrabold text-gray-900"> <h2 className="mt-6 text-3xl font-extrabold text-foreground">
Login Profissional de Saúde Login Profissional de Saúde
</h2> </h2>
<p className="mt-2 text-sm text-gray-600"> <p className="mt-2 text-sm text-muted-foreground">
Entre com suas credenciais para acessar o sistema Entre com suas credenciais para acessar o sistema
</p> </p>
</div> </div>
@ -63,7 +63,7 @@ export default function LoginPage() {
<CardContent> <CardContent>
<form onSubmit={handleLogin} className="space-y-6"> <form onSubmit={handleLogin} className="space-y-6">
<div> <div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> <label htmlFor="email" className="block text-sm font-medium text-foreground">
Email Email
</label> </label>
<Input <Input
@ -79,7 +79,7 @@ export default function LoginPage() {
</div> </div>
<div> <div>
<label htmlFor="password" className="block text-sm font-medium text-gray-700"> <label htmlFor="password" className="block text-sm font-medium text-foreground">
Senha Senha
</label> </label>
<Input <Input

View File

@ -23,12 +23,12 @@ export default function ProcedimentoPage() {
const tab = (active: boolean, extra = "") => const tab = (active: boolean, extra = "") =>
`px-4 py-1.5 text-[13px] border ${ `px-4 py-1.5 text-[13px] border ${
active active
? "border-sky-500 bg-sky-50 text-sky-700 font-medium" ? "border-sky-500 bg-sky-50 dark:bg-sky-900/30 text-sky-700 dark:text-sky-300 font-medium"
: "text-gray-700 hover:bg-gray-100" : "text-muted-foreground hover:bg-muted border-border"
} ${extra}`; } ${extra}`;
return ( return (
<div className="w-full min-h-screen flex flex-col bg-white"> <div className="w-full min-h-screen flex flex-col bg-background">
{/* HEADER */} {/* HEADER */}
<HeaderAgenda /> <HeaderAgenda />
@ -37,15 +37,15 @@ export default function ProcedimentoPage() {
{/* ATENDIMENTOS */} {/* ATENDIMENTOS */}
<section className="space-y-6"> <section className="space-y-6">
{/* Selo Atendimento com + dentro da bolinha */} {/* Selo Atendimento com + dentro da bolinha */}
<div className="inline-flex items-center gap-2 border px-3 py-1.5 bg-white text-[12px] rounded-md cursor-pointer hover:bg-gray-50"> <div className="inline-flex items-center gap-2 border border-border px-3 py-1.5 bg-card text-[12px] rounded-md cursor-pointer hover:bg-muted">
<span className="flex h-5 w-5 items-center justify-center rounded-full border border-gray-400 bg-gray-100 text-gray-700"> <span className="flex h-5 w-5 items-center justify-center rounded-full border border-border bg-muted text-muted-foreground">
<Plus className="h-3 w-3" strokeWidth={2} /> <Plus className="h-3 w-3" strokeWidth={2} />
</span> </span>
Atendimento <span className="text-foreground">Atendimento</span>
</div> </div>
{/* Traço separador */} {/* Traço separador */}
<div className="border-b border-gray-200" /> <div className="border-b border-border" />
{/* PROCEDIMENTOS */} {/* PROCEDIMENTOS */}
<div className="space-y-1"> <div className="space-y-1">
@ -56,14 +56,14 @@ export default function ProcedimentoPage() {
<Search className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" /> <Search className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input <Input
placeholder="Buscar" placeholder="Buscar"
className="h-10 w-full rounded-md pl-8 pr-8 border border-gray-300 focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500" className="h-10 w-full rounded-md pl-8 pr-8 border-input focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500"
/> />
<ChevronDown className="pointer-events-none absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" /> <ChevronDown className="pointer-events-none absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
</div> </div>
</div> </div>
{/* Traço separador */} {/* Traço separador */}
<div className="border-b border-gray-200" /> <div className="border-b border-border" />
{/* OUTRAS DESPESAS */} {/* OUTRAS DESPESAS */}
<div className="space-y-1"> <div className="space-y-1">
@ -74,7 +74,7 @@ export default function ProcedimentoPage() {
<Search className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" /> <Search className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input <Input
placeholder="Buscar" placeholder="Buscar"
className="h-10 w-full rounded-md pl-8 pr-8 border border-gray-300 focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500" className="h-10 w-full rounded-md pl-8 pr-8 border-input focus-visible:ring-1 focus-visible:ring-sky-500 focus-visible:border-sky-500"
/> />
<ChevronDown className="pointer-events-none absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" /> <ChevronDown className="pointer-events-none absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
</div> </div>

File diff suppressed because it is too large Load Diff

View File

@ -11,15 +11,15 @@ export default function FooterAgenda() {
const [bloqueio, setBloqueio] = useState(false); const [bloqueio, setBloqueio] = useState(false);
return ( return (
<div className="sticky bottom-0 left-0 right-0 border-t bg-white"> <div className="sticky bottom-0 left-0 right-0 border-t border-border bg-background">
<div className="mx-auto w-full max-w-7xl px-8 py-3 flex items-center justify-between"> <div className="mx-auto w-full max-w-7xl px-8 py-3 flex items-center justify-between">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Switch checked={bloqueio} onCheckedChange={setBloqueio} /> <Switch checked={bloqueio} onCheckedChange={setBloqueio} />
<Label className="text-sm">Bloqueio de Agenda</Label> <Label className="text-sm text-foreground">Bloqueio de Agenda</Label>
</div> </div>
<div className="flex gap-2"> <div className="flex gap-2">
<Link href={"/calendar"}> <Link href={"/calendar"}>
<Button variant="ghost" className="hover:bg-blue-100 hover:text-foreground">Cancelar</Button> <Button variant="ghost" className="hover:bg-muted hover:text-foreground">Cancelar</Button>
</Link> </Link>
<Link href={"/calendar"}> <Link href={"/calendar"}>
<Button> <Button>

View File

@ -15,14 +15,14 @@ export default function HeaderAgenda() {
const tabCls = (active: boolean, extra = "") => const tabCls = (active: boolean, extra = "") =>
`px-4 py-1.5 text-[13px] border ${ `px-4 py-1.5 text-[13px] border ${
active active
? "border-blue-500 bg-blue-50 text-blue-700 font-medium" ? "border-blue-500 bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 font-medium"
: "text-gray-700 hover:bg-gray-100" : "text-muted-foreground hover:bg-muted border-border"
} ${extra}`; } ${extra}`;
return ( return (
<header className="border-b bg-white"> <header className="border-b bg-background border-border">
<div className="mx-auto w-full max-w-7xl px-8 py-3 flex items-center justify-between"> <div className="mx-auto w-full max-w-7xl px-8 py-3 flex items-center justify-between">
<h1 className="text-[18px] font-semibold">Novo Agendamento</h1> <h1 className="text-[18px] font-semibold text-foreground">Novo Agendamento</h1>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<nav <nav
@ -60,7 +60,7 @@ export default function HeaderAgenda() {
type="button" type="button"
aria-label="Histórico" aria-label="Histórico"
onClick={() => router.back()} onClick={() => router.back()}
className="inline-flex h-8 w-8 items-center justify-center rounded-md border bg-white text-gray-700 hover:bg-gray-100" className="inline-flex h-8 w-8 items-center justify-center rounded-md border border-border bg-background text-muted-foreground hover:bg-muted"
> >
<RotateCcw className="h-4 w-4" /> <RotateCcw className="h-4 w-4" />
</button> </button>

View File

@ -38,21 +38,21 @@ export default function ListaEspera({ patients, onNotify, onAddToWaitlist }: Lis
const getPriorityColor = (priority: string) => { const getPriorityColor = (priority: string) => {
switch (priority) { switch (priority) {
case 'high': return 'bg-red-100 text-red-800'; case 'high': return 'bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300';
case 'medium': return 'bg-yellow-100 text-yellow-800'; case 'medium': return 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300';
case 'low': return 'bg-green-100 text-green-800'; case 'low': return 'bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300';
default: return 'bg-gray-100 text-gray-800'; default: return 'bg-muted text-muted-foreground';
} }
}; };
return ( return (
<div className="bg-white rounded-lg shadow"> <div className="bg-card border border-border rounded-lg shadow">
<div className="p-4 border-b border-gray-200"> <div className="p-4 border-b border-border">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between"> <div className="flex flex-col sm:flex-row sm:items-center sm:justify-between">
<h2 className="text-xl font-semibold text-gray-900 mb-4 sm:mb-0">Lista de Espera Inteligente</h2> <h2 className="text-xl font-semibold text-foreground mb-4 sm:mb-0">Lista de Espera Inteligente</h2>
<button <button
onClick={onAddToWaitlist} onClick={onAddToWaitlist}
className="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500" className="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-primary-foreground bg-primary hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary"
> >
<Plus className="h-4 w-4 mr-2" /> <Plus className="h-4 w-4 mr-2" />
Adicionar à Lista Adicionar à Lista
@ -60,7 +60,7 @@ export default function ListaEspera({ patients, onNotify, onAddToWaitlist }: Lis
</div> </div>
</div> </div>
<div className="p-4 border-b border-gray-200"> <div className="p-4 border-b border-border">
<div className="relative"> <div className="relative">
<div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<span className="text-gray-500">🔍</span> <span className="text-gray-500">🔍</span>
@ -70,14 +70,14 @@ export default function ListaEspera({ patients, onNotify, onAddToWaitlist }: Lis
placeholder="Buscar paciente..." placeholder="Buscar paciente..."
value={searchTerm} value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)} onChange={(e) => setSearchTerm(e.target.value)}
className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-blue-500 focus:border-blue-500" className="block w-full pl-10 pr-3 py-2 border border-input rounded-md leading-5 bg-background text-foreground placeholder-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary focus:border-primary"
/> />
</div> </div>
</div> </div>
<div className="overflow-x-auto"> <div className="overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200"> <table className="min-w-full divide-y divide-border">
<thead className="bg-gray-50"> <thead className="bg-muted/50">
<tr> <tr>
<th scope="col" className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> <th scope="col" className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Paciente Paciente
@ -99,16 +99,16 @@ export default function ListaEspera({ patients, onNotify, onAddToWaitlist }: Lis
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody className="bg-white divide-y divide-gray-200"> <tbody className="bg-card divide-y divide-border">
{filteredPatients.map((patient) => ( {filteredPatients.map((patient) => (
<tr key={patient.id}> <tr key={patient.id}>
<td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900"> <td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-foreground">
{patient.name} {patient.name}
</td> </td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500"> <td className="px-6 py-4 whitespace-nowrap text-sm text-muted-foreground">
{patient.specialty} {patient.specialty}
</td> </td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500"> <td className="px-6 py-4 whitespace-nowrap text-sm text-muted-foreground">
{new Date(patient.preferredDate).toLocaleDateString('pt-BR')} {new Date(patient.preferredDate).toLocaleDateString('pt-BR')}
</td> </td>
<td className="px-6 py-4 whitespace-nowrap"> <td className="px-6 py-4 whitespace-nowrap">
@ -116,13 +116,13 @@ export default function ListaEspera({ patients, onNotify, onAddToWaitlist }: Lis
{getPriorityLabel(patient.priority)} {getPriorityLabel(patient.priority)}
</span> </span>
</td> </td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500"> <td className="px-6 py-4 whitespace-nowrap text-sm text-muted-foreground">
{patient.contact} {patient.contact}
</td> </td>
<td className="px-6 py-4 whitespace-nowrap text-sm font-medium"> <td className="px-6 py-4 whitespace-nowrap text-sm font-medium">
<button <button
onClick={() => onNotify(patient.id)} onClick={() => onNotify(patient.id)}
className="text-blue-600 hover:text-blue-900 mr-3" className="text-primary hover:text-primary/80 mr-3"
title="Notificar paciente" title="Notificar paciente"
> >
<Bell className="h-4 w-4" /> <Bell className="h-4 w-4" />
@ -135,7 +135,7 @@ export default function ListaEspera({ patients, onNotify, onAddToWaitlist }: Lis
</div> </div>
{filteredPatients.length === 0 && ( {filteredPatients.length === 0 && (
<div className="text-center py-8 text-gray-500"> <div className="text-center py-8 text-muted-foreground">
Nenhum paciente encontrado na lista de espera Nenhum paciente encontrado na lista de espera
</div> </div>
)} )}

View File

@ -61,7 +61,7 @@ export function Sidebar() {
{/* este span some no modo ícone */} {/* este span some no modo ícone */}
<span className="text-lg font-semibold text-sidebar-foreground group-data-[collapsible=icon]:hidden"> <span className="text-lg font-semibold text-sidebar-foreground group-data-[collapsible=icon]:hidden">
MediConnect MEDIConnect
</span> </span>
</Link> </Link>
</SidebarHeader> </SidebarHeader>
@ -74,8 +74,8 @@ export function Sidebar() {
<SidebarGroupContent> <SidebarGroupContent>
<SidebarMenu> <SidebarMenu>
{navigation.map((item) => { {navigation.map((item) => {
const isActive = const isActive = pathname === item.href ||
pathname === item.href || pathname.startsWith(item.href + "/") (pathname.startsWith(item.href + "/") && item.href !== "/dashboard")
return ( return (
<SidebarMenuItem key={item.name}> <SidebarMenuItem key={item.name}>

View File

@ -13,7 +13,7 @@ export function Footer() {
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<div className="flex flex-col md:flex-row items-center justify-between space-y-4 md:space-y-0"> <div className="flex flex-col md:flex-row items-center justify-between space-y-4 md:space-y-0">
{} {}
<div className="text-muted-foreground text-sm">© 2025 Medi Conecta</div> <div className="text-muted-foreground text-sm">© 2025 MEDI Connect</div>
{} {}
<nav className="flex items-center space-x-8"> <nav className="flex items-center space-x-8">

View File

@ -26,13 +26,13 @@ export function CalendarRegistrationForm({ initialData, onSave, onCancel }: any)
return ( return (
<form onSubmit={handleSubmit} className="space-y-8"> <form onSubmit={handleSubmit} className="space-y-8">
<div className="border rounded-md p-6 space-y-4 bg-white"> <div className="border border-border rounded-md p-6 space-y-4 bg-card">
<h2 className="font-medium">Informações do paciente</h2> <h2 className="font-medium text-foreground">Informações do paciente</h2>
<div className="grid grid-cols-1 md:grid-cols-12 gap-4"> <div className="grid grid-cols-1 md:grid-cols-12 gap-4">
<div className="md:col-span-6"> <div className="md:col-span-6">
<Label>Nome *</Label> <Label>Nome *</Label>
<div className="relative"> <div className="relative">
<Search className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" /> <Search className="pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input <Input
name="patientName" name="patientName"
placeholder="Digite o nome do paciente" placeholder="Digite o nome do paciente"
@ -50,23 +50,19 @@ export function CalendarRegistrationForm({ initialData, onSave, onCancel }: any)
<Label>RG</Label> <Label>RG</Label>
<Input name="rg" placeholder="Número do RG" className="h-10" value={formData.rg || ''} onChange={handleChange} /> <Input name="rg" placeholder="Número do RG" className="h-10" value={formData.rg || ''} onChange={handleChange} />
</div> </div>
<div className="md:col-span-6"> <div className="md:col-span-3">
<div className="grid grid-cols-12 gap-3"> <Label>Data de nascimento *</Label>
<div className="col-span-5"> <Input name="birthDate" type="date" className="h-10" value={formData.birthDate || ''} onChange={handleChange} />
<Label>Data de nascimento *</Label> </div>
<Input name="birthDate" type="date" className="h-10" value={formData.birthDate || ''} onChange={handleChange} /> <div className="md:col-span-3">
</div> <Label>Telefone</Label>
<div className="col-span-7"> <div className="flex gap-2">
<Label>Telefone</Label> <select name="phoneCode" className="h-10 w-20 rounded-md border border-input bg-background text-foreground px-2 text-[13px]" value={formData.phoneCode || '+55'} onChange={handleChange}>
<div className="grid grid-cols-[86px_1fr] gap-2"> <option value="+55">+55</option>
<select name="phoneCode" className="h-10 rounded-md border border-input bg-background px-2 text-[13px]" value={formData.phoneCode || '+55'} onChange={handleChange}> <option value="+351">+351</option>
<option value="+55">+55</option> <option value="+1">+1</option>
<option value="+351">+351</option> </select>
<option value="+1">+1</option> <Input name="phoneNumber" placeholder="(99) 99999-9999" className="h-10 flex-1" value={formData.phoneNumber || ''} onChange={handleChange} />
</select>
<Input name="phoneNumber" placeholder="(99) 99999-9999" className="h-10" value={formData.phoneNumber || ''} onChange={handleChange} />
</div>
</div>
</div> </div>
</div> </div>
<div className="md:col-span-6"> <div className="md:col-span-6">
@ -77,10 +73,10 @@ export function CalendarRegistrationForm({ initialData, onSave, onCancel }: any)
</div> </div>
{} {}
<div className="border rounded-md p-6 space-y-4 bg-white"> <div className="border border-border rounded-md p-6 space-y-4 bg-card">
<h2 className="font-medium">Informações do atendimento</h2> <h2 className="font-medium text-foreground">Informações do atendimento</h2>
<div className="grid grid-cols-1 md:grid-cols-12 gap-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="md:col-span-6 space-y-3"> <div className="space-y-4">
<div> <div>
<Label className="text-[13px]">Nome do profissional *</Label> <Label className="text-[13px]">Nome do profissional *</Label>
<div className="relative"> <div className="relative">
@ -91,7 +87,7 @@ export function CalendarRegistrationForm({ initialData, onSave, onCancel }: any)
<div className="grid grid-cols-2 gap-3"> <div className="grid grid-cols-2 gap-3">
<div> <div>
<Label className="text-[13px]">Unidade *</Label> <Label className="text-[13px]">Unidade *</Label>
<select name="unit" className="h-10 w-full rounded-md border border-input bg-background pr-8 pl-3 text-[13px] appearance-none" value={formData.unit || 'nei'} onChange={handleChange}> <select name="unit" className="h-10 w-full rounded-md border border-input bg-background text-foreground pr-8 pl-3 text-[13px] appearance-none" value={formData.unit || 'nei'} onChange={handleChange}>
<option value="nei">Núcleo de Especialidades Integradas</option> <option value="nei">Núcleo de Especialidades Integradas</option>
<option value="cc">Clínica Central</option> <option value="cc">Clínica Central</option>
</select> </select>
@ -104,19 +100,19 @@ export function CalendarRegistrationForm({ initialData, onSave, onCancel }: any)
</div> </div>
</div> </div>
</div> </div>
<div className="grid grid-cols-12 gap-3 items-end"> <div className="grid grid-cols-2 gap-3">
<div className="col-span-12 md:col-span-3"> <div>
<Label className="text-[13px]">Início *</Label> <Label className="text-[13px]">Início *</Label>
<Input name="startTime" type="time" className="h-10 w-full rounded-md border border-input px-3 text-[13px]" value={formData.startTime || ''} onChange={handleChange} /> <Input name="startTime" type="time" className="h-10 w-full rounded-md border border-input px-3 text-[13px]" value={formData.startTime || ''} onChange={handleChange} />
</div> </div>
<div className="col-span-12 md:col-span-3"> <div>
<Label className="text-[13px]">Término *</Label> <Label className="text-[13px]">Término *</Label>
<Input name="endTime" type="time" className="h-10 w-full rounded-md border border-input px-3 text-[13px]" value={formData.endTime || ''} onChange={handleChange} /> <Input name="endTime" type="time" className="h-10 w-full rounded-md border border-input px-3 text-[13px]" value={formData.endTime || ''} onChange={handleChange} />
</div> </div>
</div> </div>
</div> </div>
<div className="md:col-span-6"> <div className="space-y-4">
<div className="mb-2"> <div>
<Label className="text-[13px]">Tipo de atendimento *</Label> <Label className="text-[13px]">Tipo de atendimento *</Label>
<div className="relative mt-1"> <div className="relative mt-1">
<Search className="pointer-events-none absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" /> <Search className="pointer-events-none absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
@ -125,7 +121,7 @@ export function CalendarRegistrationForm({ initialData, onSave, onCancel }: any)
</div> </div>
<div> <div>
<Label className="text-[13px]">Observações</Label> <Label className="text-[13px]">Observações</Label>
<Textarea name="notes" rows={4} className="text-[13px] h-[110px] min-h-0 resize-none" value={formData.notes || ''} onChange={handleChange} /> <Textarea name="notes" rows={6} className="text-[13px] min-h-[120px] resize-none" value={formData.notes || ''} onChange={handleChange} />
</div> </div>
</div> </div>
</div> </div>

View File

@ -5,6 +5,7 @@ import Link from "next/link";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Menu, X } from "lucide-react"; import { Menu, X } from "lucide-react";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
import { SimpleThemeToggle } from "@/components/simple-theme-toggle";
export function Header() { export function Header() {
const [isMenuOpen, setIsMenuOpen] = useState(false); const [isMenuOpen, setIsMenuOpen] = useState(false);
@ -17,7 +18,7 @@ export function Header() {
{/* Logo */} {/* Logo */}
<Link href="/" className="flex items-center space-x-2"> <Link href="/" className="flex items-center space-x-2">
<span className="text-xl font-bold text-foreground"> <span className="text-xl font-bold text-foreground">
<span className="text-primary">MEDI</span>Conecta <span className="text-primary">MEDI</span>Connect
</span> </span>
</Link> </Link>
@ -43,6 +44,7 @@ export function Header() {
{} {}
<div className="hidden md:flex items-center space-x-3"> <div className="hidden md:flex items-center space-x-3">
<SimpleThemeToggle />
<Button <Button
variant="outline" variant="outline"
className="text-primary border-primary hover:bg-primary hover:text-primary-foreground bg-transparent" className="text-primary border-primary hover:bg-primary hover:text-primary-foreground bg-transparent"
@ -92,6 +94,7 @@ export function Header() {
Sobre Sobre
</Link> </Link>
<div className="flex flex-col space-y-2 pt-4"> <div className="flex flex-col space-y-2 pt-4">
<SimpleThemeToggle />
<Button <Button
variant="outline" variant="outline"
className="text-primary border-primary hover:bg-primary hover:text-primary-foreground bg-transparent" className="text-primary border-primary hover:bg-primary hover:text-primary-foreground bg-transparent"

View File

@ -0,0 +1,22 @@
"use client"
import * as React from "react"
import { Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"
import { Button } from "@/components/ui/button"
export function SimpleThemeToggle() {
const { theme, setTheme } = useTheme()
const toggleTheme = () => {
setTheme(theme === "dark" ? "light" : "dark")
}
return (
<Button variant="outline" size="icon" onClick={toggleTheme}>
<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" />
<span className="sr-only">Alternar tema</span>
</Button>
)
}

View File

@ -0,0 +1,37 @@
"use client"
import * as React from "react"
import { Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"
import { Button } from "@/components/ui/button"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
export function ThemeToggle() {
const { setTheme } = useTheme()
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon">
<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" />
<span className="sr-only">Alternar tema</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onClick={() => setTheme("light")}>
Claro
</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("dark")}>
Escuro
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}

View File

@ -8,9 +8,11 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
type={type} type={type}
data-slot="input" data-slot="input"
className={cn( className={cn(
"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 flex h-9 w-full min-w-0 rounded-md bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "border-2 border-gray-300 dark:border-gray-600",
"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", "focus-visible:border-primary focus-visible:ring-primary/20 focus-visible:ring-2",
"hover:border-gray-400 dark:hover:border-gray-500",
"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive aria-invalid:border-2",
className className
)} )}
{...props} {...props}

View File

@ -37,7 +37,11 @@ function SelectTrigger({
data-slot="select-trigger" data-slot="select-trigger"
data-size={size} data-size={size}
className={cn( className={cn(
"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
"border-2 border-gray-300 dark:border-gray-600",
"focus-visible:border-primary focus-visible:ring-primary/20 focus-visible:ring-2",
"hover:border-gray-400 dark:hover:border-gray-500",
"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive aria-invalid:border-2",
className className
)} )}
{...props} {...props}

View File

@ -7,7 +7,11 @@ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
<textarea <textarea
data-slot="textarea" data-slot="textarea"
className={cn( className={cn(
"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "placeholder:text-muted-foreground dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
"border-2 border-gray-300 dark:border-gray-600",
"focus-visible:border-primary focus-visible:ring-primary/20 focus-visible:ring-2",
"hover:border-gray-400 dark:hover:border-gray-500",
"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive aria-invalid:border-2",
className className
)} )}
{...props} {...props}

View File

@ -0,0 +1,15 @@
'use client'
import { useEffect } from 'react'
import { useTheme } from 'next-themes'
export function useForceDefaultTheme() {
const { setTheme } = useTheme()
useEffect(() => {
// Força tema claro sempre que o componente montar
document.documentElement.classList.remove('dark')
localStorage.setItem('theme', 'light')
setTheme('light')
}, [setTheme])
}