diff --git a/SYSTEM_ANALYSIS.md b/SYSTEM_ANALYSIS.md
new file mode 100644
index 00000000..e4b202fe
--- /dev/null
+++ b/SYSTEM_ANALYSIS.md
@@ -0,0 +1,1206 @@
+# 📊 ANÁLISE DETALHADA DO SISTEMA SPE-M
+**Sistema de Pontuação Estética Médica - Medical Aesthetic Scoring System**
+
+---
+
+## 📌 SUMÁRIO EXECUTIVO
+
+### Status Atual: 🟢 FASE 2 CONCLUÍDA - NAVEGAÇÃO IMPLEMENTADA
+
+**Progresso Geral:** 35% Completo
+
+| Fase | Status | Descrição |
+|------|--------|-----------|
+| ✅ Fase 1 | Concluída | Design System Apple Vision Pro |
+| ✅ Fase 2 | Concluída | TopNavBar + Navegação + Layout |
+| 🟡 Fase 3 | Pendente | CRUD de Pacientes |
+| 🟡 Fase 4 | Pendente | Formulário de Pontuação (8 critérios) |
+| 🟡 Fase 5 | Pendente | Integrações & Backend |
+| ⚪ Fase 6 | Não Iniciada | Relatórios & Analytics |
+
+---
+
+## 🏗️ ARQUITETURA DO PROJETO
+
+### Stack Tecnológica Atual
+
+```yaml
+Frontend:
+ - Next.js: 15.3.1 (App Router + Turbopack)
+ - React: 19.0.0
+ - TypeScript: 5.x (strict mode)
+ - Tailwind CSS: 4.1.7
+ - Shadcn/ui: Latest (Radix UI primitives)
+
+Backend/Database:
+ - Database: PostgreSQL (via Neon)
+ - ORM: Drizzle 0.43.1
+ - Auth: Better Auth 1.2.8
+ - Payments: Polar (sandbox mode)
+
+Utilities:
+ - Icons: Lucide React 0.503.0
+ - Forms: React Hook Form 7.56.1 + Zod 3.24.3
+ - Toasts: Sonner 2.0.3
+ - Theme: next-themes 0.4.6
+ - Date: date-fns 4.1.0
+
+Storage:
+ - Images: Cloudflare R2 (via @aws-sdk/client-s3)
+
+AI (Opcional):
+ - OpenAI: @ai-sdk/openai 1.3.22
+```
+
+### Estrutura de Diretórios
+
+```
+nextjs-starter-kit/
+├── app/ # Next.js App Router
+│ ├── api/ # API Routes
+│ │ ├── auth/[...all]/ # Better Auth endpoints
+│ │ ├── chat/ # AI Chat endpoint
+│ │ ├── subscription/ # Polar webhooks
+│ │ └── upload-image/ # R2 image upload
+│ │
+│ ├── dashboard/ # ❌ ANTIGO (Starter Kit)
+│ │ ├── _components/ # Sidebar, ChatBot, etc.
+│ │ ├── chat/
+│ │ ├── payment/
+│ │ ├── settings/
+│ │ └── upload/
+│ │
+│ ├── patients/ # ✅ NOVO (SPE-M)
+│ │ └── page.tsx # Gestão de Pacientes (stub)
+│ │
+│ ├── forms/ # ✅ NOVO (SPE-M)
+│ │ └── page.tsx # Fichas de Avaliação (stub)
+│ │
+│ ├── navigation-demo/ # ✅ NOVO (SPE-M)
+│ │ └── page.tsx # Demo navegação completa
+│ │
+│ ├── design-system/ # ✅ NOVO (SPE-M)
+│ │ └── page.tsx # Design System showcase
+│ │
+│ ├── sign-in/ # Auth pages (Starter Kit)
+│ ├── sign-up/
+│ ├── pricing/
+│ ├── privacy-policy/
+│ ├── terms-of-service/
+│ ├── success/
+│ │
+│ ├── layout.tsx # ✅ ATUALIZADO (SPE-M metadata)
+│ ├── page.tsx # Landing page (Starter Kit)
+│ └── globals.css # ✅ ATUALIZADO (Design System)
+│
+├── components/
+│ ├── layout/ # ✅ NOVO (SPE-M)
+│ │ ├── top-nav-bar.tsx # TopNavBar com glassmorphism
+│ │ ├── dashboard-layout.tsx # Layout wrapper
+│ │ └── index.ts # Exports
+│ │
+│ ├── ui/ # Shadcn/ui components (26 files)
+│ │ ├── button.tsx
+│ │ ├── card.tsx
+│ │ ├── badge.tsx
+│ │ ├── avatar.tsx
+│ │ ├── dropdown-menu.tsx
+│ │ └── ... (21+ more)
+│ │
+│ ├── homepage/ # Landing page components
+│ ├── logos/ # Brand logos
+│ ├── provider.tsx # Theme Provider
+│ └── user-profile.tsx
+│
+├── db/
+│ ├── schema.ts # Drizzle schema (Auth + Subscription)
+│ ├── drizzle.ts # DB connection
+│ └── migrations/ # SQL migrations
+│
+├── lib/
+│ ├── auth.ts # Better Auth config (Google OAuth)
+│ ├── auth-client.ts # Client-side auth helpers
+│ ├── subscription.ts # Polar integration
+│ ├── upload-image.ts # R2 upload utility
+│ └── utils.ts # General utilities
+│
+├── package.json # 77 dependencies
+├── tailwind.config.ts # Tailwind config
+├── next.config.ts # Next.js config
+├── drizzle.config.ts # Drizzle Kit config
+└── .env.example # Environment variables template
+```
+
+---
+
+## ✅ IMPLEMENTADO (35%)
+
+### 1. Design System Apple Vision Pro
+
+**Arquivo:** `app/globals.css` (585 linhas)
+
+#### CSS Variables Completas
+
+```css
+:root {
+ /* Backgrounds */
+ --bg-primary: #ffffff;
+ --bg-secondary: #f5f5f7;
+ --bg-tertiary: #e8e8ed;
+ --bg-elevated: #ffffff;
+
+ /* Glassmorphism */
+ --surface-glass: rgba(255, 255, 255, 0.72);
+ --surface-glass-border: rgba(255, 255, 255, 0.18);
+
+ /* Text Hierarchy */
+ --text-primary: #1d1d1f;
+ --text-secondary: #6e6e73;
+ --text-tertiary: #86868b;
+
+ /* Medical Primary */
+ --color-primary: #007aff;
+ --color-primary-hover: #0051d5;
+ --color-primary-light: #e5f1ff;
+
+ /* Semantic Colors */
+ --color-secondary: #34c759; /* Success */
+ --color-warning: #ff9500;
+ --color-error: #ff3b30;
+ --color-accent: #bf5af2;
+
+ /* Risk Classification (Medical Context) */
+ --risk-low: #34c759; /* 18-24 pts */
+ --risk-low-bg: rgba(52, 199, 89, 0.15);
+ --risk-medium: #ff9500; /* 12-17 pts */
+ --risk-medium-bg: rgba(255, 149, 0, 0.15);
+ --risk-high: #ff3b30; /* 0-11 pts */
+ --risk-high-bg: rgba(255, 59, 48, 0.15);
+
+ /* Apple Depth Shadows */
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.10);
+ --shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.15);
+ --shadow-glass: 0 8px 32px rgba(31, 38, 135, 0.15);
+}
+
+.dark {
+ /* Dark mode variants - brightened colors */
+ --color-primary: #0a84ff;
+ --risk-low: #30d158;
+ --risk-medium: #ff9f0a;
+ --risk-high: #ff453a;
+ /* ... (all colors adapted) */
+}
+```
+
+#### Utility Classes
+
+```css
+.glass-effect /* Glassmorphism completo */
+.depth-1, .depth-2, .depth-3 /* Shadows Apple */
+.hover-lift /* Elevação no hover */
+.transition-base /* Transitions suaves */
+.risk-badge-low/medium/high /* Medical badges */
+.animate-fade-in /* Animações */
+.animate-slide-in-up
+.animate-scale-in
+```
+
+#### Acessibilidade Implementada
+
+- ✅ WCAG 2.1 AA compliance
+- ✅ Contraste mínimo 4.5:1 (texto normal)
+- ✅ Focus visível (outline 2px primary)
+- ✅ Skip to main content link
+- ✅ macOS-style scrollbars
+- ✅ Reduced motion support
+- ✅ High contrast support
+
+---
+
+### 2. Sistema de Navegação
+
+**Arquivos:**
+- `components/layout/top-nav-bar.tsx` (332 linhas)
+- `components/layout/dashboard-layout.tsx` (129 linhas)
+- `components/layout/index.ts` (exports)
+
+#### TopNavBar Features
+
+```tsx
+interface TopNavBarUser {
+ name: string;
+ email: string;
+ avatar?: string;
+ role?: string;
+}
+
+
+```
+
+**Componentes:**
+- ✅ Logo SPE-M (Activity icon + branding)
+- ✅ Nav Links Desktop: Dashboard, Pacientes, Fichas
+- ✅ Active state highlighting (baseado em pathname)
+- ✅ Search button (placeholder)
+- ✅ Notifications badge (3 não lidas - mock)
+- ✅ Theme toggle (Moon/Sun)
+- ✅ User menu dropdown:
+ - Avatar com initials fallback
+ - Nome + Email + Role
+ - Meu Perfil
+ - Configurações
+ - Sair (com toast)
+
+**Mobile Navigation:**
+- ✅ Bottom bar fixa (3 ícones)
+- ✅ Touch targets ≥44px
+- ✅ Esconde em desktop (md:hidden)
+
+#### DashboardLayout Wrapper
+
+```tsx
+
+
+
+```
+
+**Features:**
+- ✅ Inclui TopNavBar automaticamente
+- ✅ Padding correto (pt-16, pb-20 mobile)
+- ✅ Container responsivo (sm/md/lg/xl/2xl/full)
+- ✅ Skip to main content link
+- ✅ Logout handler integrado
+
+---
+
+### 3. Páginas Demo Criadas
+
+#### `/patients` - Gestão de Pacientes (118 linhas)
+
+**Implementado:**
+- ✅ Header com ícone + "Novo Paciente"
+- ✅ Quick stats cards (Total: 127, Novos: 12, Ativos: 118)
+- ✅ Search bar + Filtros
+- ✅ Placeholder para tabela
+- ✅ Animações (fade-in, slide-in-up)
+
+**Pendente:**
+- ⏳ Tabela de pacientes real
+- ⏳ CRUD completo
+- ⏳ Modal de criação/edição
+- ⏳ Validações LGPD (CPF mascarado)
+
+#### `/forms` - Fichas de Avaliação (146 linhas)
+
+**Implementado:**
+- ✅ Header com ícone + "Nova Ficha"
+- ✅ Quick stats (Total: 342, Mês: 28, Score Médio: 16.4, Rascunhos: 5)
+- ✅ Risk distribution badges:
+ - BAIXO: 45% (18-24 pts) - Verde
+ - MÉDIO: 38% (12-17 pts) - Laranja
+ - ALTO: 17% (0-11 pts) - Vermelho
+- ✅ 8 Critérios overview:
+ 1. Desvio de Septo 🔹
+ 2. Giba Óssea 🔸
+ 3. Sulco Nasogeniano 〰️
+ 4. Rugas Periorbitais 👁️
+ 5. Flacidez Facial 📐
+ 6. Acne/Cicatrizes 🔴
+ 7. Pigmentação Cutânea 🎨
+ 8. Textura da Pele ✨
+
+**Pendente:**
+- ⏳ Formulário de 8 critérios (0-3 pts cada)
+- ⏳ Cálculo automático de score (0-24)
+- ⏳ Sistema de rascunho/finalização
+- ⏳ Listagem de fichas
+
+#### `/navigation-demo` - Demo Completa (422 linhas)
+
+**Features:**
+- ✅ Hero section
+- ✅ Features grid (TopNavBar, Pacientes, Fichas)
+- ✅ Implementation status (Concluído vs. Pendente)
+- ✅ Testing instructions
+- ✅ Quick links
+
+#### `/design-system` - Design System Showcase (422 linhas)
+
+**Features:**
+- ✅ Paleta de cores completa
+- ✅ Tipografia Apple System
+- ✅ Glassmorphism effects
+- ✅ Buttons, Badges, Forms
+- ✅ Hover effects
+- ✅ Animations
+- ✅ Accessibility showcase
+
+---
+
+## 🗄️ DATABASE SCHEMA ATUAL
+
+**Arquivo:** `db/schema.ts`
+
+### Tabelas Existentes (Better Auth)
+
+```typescript
+// Auth tables
+user (id, name, email, emailVerified, image, createdAt, updatedAt)
+session (id, expiresAt, token, userId, ipAddress, userAgent)
+account (id, accountId, providerId, userId, accessToken, refreshToken)
+verification (id, identifier, value, expiresAt)
+
+// Subscription table (Polar)
+subscription (id, amount, currency, status, userId, productId, ...)
+```
+
+### Tabelas NECESSÁRIAS (SPE-M) - ⚠️ NÃO IMPLEMENTADAS
+
+```typescript
+// ⏳ PENDENTE: Patient Management
+patient {
+ id: uuid (PK)
+ userId: text (FK → user.id) // Médico responsável
+
+ // Dados pessoais (LGPD compliant)
+ name: text
+ cpf: text (encrypted) // ⚠️ Sempre criptografado
+ email: text
+ phone: text
+ birthDate: date
+ gender: enum('M', 'F', 'Outro')
+
+ // Endereço
+ address: text
+ city: text
+ state: text (2 chars)
+ zipCode: text
+
+ // Metadata
+ createdAt: timestamp
+ updatedAt: timestamp
+ deletedAt: timestamp (soft delete - LGPD)
+
+ // Auditoria
+ createdBy: text (FK → user.id)
+ updatedBy: text (FK → user.id)
+}
+
+// ⏳ PENDENTE: Assessment Forms (Scoring)
+assessmentForm {
+ id: uuid (PK)
+ patientId: uuid (FK → patient.id)
+ userId: text (FK → user.id)
+
+ // Status
+ status: enum('draft', 'finalized', 'archived')
+
+ // 8 Critérios (0-3 pontos cada)
+ criterion1_septoDeviation: integer (0-3)
+ criterion2_boneyHump: integer (0-3)
+ criterion3_nasolabialFold: integer (0-3)
+ criterion4_periorbitalWrinkles: integer (0-3)
+ criterion5_facialSagging: integer (0-3)
+ criterion6_acneScars: integer (0-3)
+ criterion7_skinPigmentation: integer (0-3)
+ criterion8_skinTexture: integer (0-3)
+
+ // Calculated fields
+ totalScore: integer (0-24) GENERATED
+ riskClassification: enum('LOW', 'MEDIUM', 'HIGH') GENERATED
+
+ // Observações
+ notes: text
+
+ // Metadata
+ createdAt: timestamp
+ updatedAt: timestamp
+ finalizedAt: timestamp
+ archivedAt: timestamp
+
+ // Auditoria
+ createdBy: text (FK → user.id)
+ updatedBy: text (FK → user.id)
+}
+
+// ⏳ PENDENTE: Images/Photos
+patientPhoto {
+ id: uuid (PK)
+ patientId: uuid (FK → patient.id)
+ assessmentFormId: uuid (FK → assessmentForm.id) OPTIONAL
+
+ // Image data
+ url: text (R2 URL)
+ thumbnailUrl: text
+ originalFilename: text
+ mimeType: text
+ sizeBytes: integer
+
+ // Photo context
+ photoType: enum('profile', 'before', 'after', 'detail')
+ bodyArea: text // "face", "nose", "eyes", etc.
+ angle: text // "frontal", "lateral", "oblique"
+
+ // Metadata
+ takenAt: timestamp
+ uploadedAt: timestamp
+ deletedAt: timestamp (soft delete)
+
+ // Auditoria
+ uploadedBy: text (FK → user.id)
+}
+
+// ⏳ PENDENTE: Audit Logs (LGPD Compliance)
+auditLog {
+ id: uuid (PK)
+ userId: text (FK → user.id)
+
+ // Action details
+ action: enum('CREATE', 'READ', 'UPDATE', 'DELETE', 'EXPORT')
+ entityType: enum('patient', 'assessmentForm', 'photo', 'user')
+ entityId: text
+
+ // Context
+ ipAddress: text
+ userAgent: text
+ metadata: jsonb // { reason, changedFields, oldValues, newValues }
+
+ // Timestamp
+ timestamp: timestamp
+}
+```
+
+---
+
+## 🔐 AUTENTICAÇÃO & SEGURANÇA
+
+### Sistema de Auth Atual (Better Auth)
+
+**Arquivo:** `lib/auth.ts`
+
+**Features Implementadas:**
+- ✅ Google OAuth (clientId + clientSecret)
+- ✅ Session management (cookie-based, 5min cache)
+- ✅ Polar integration (payments)
+- ✅ Drizzle adapter (PostgreSQL)
+
+**Endpoints Disponíveis:**
+- `/api/auth/sign-in/google` - Google OAuth
+- `/api/auth/sign-out` - Logout
+- `/api/auth/session` - Get current session
+
+### ⚠️ Gaps de Segurança SPE-M
+
+#### Não Implementado:
+
+1. **LGPD Compliance:**
+ - ⏳ CPF encryption (encrypt/decrypt functions)
+ - ⏳ Data masking (CPF: ***.***.***-XX)
+ - ⏳ Audit logs (CRUD tracking)
+ - ⏳ Data export (direito do paciente)
+ - ⏳ Right to be forgotten (soft delete)
+ - ⏳ Consent management
+ - ⏳ Data retention policies
+
+2. **Access Control:**
+ - ⏳ Role-based access (Médico, Enfermeiro, Admin)
+ - ⏳ Patient data ownership (userId filter)
+ - ⏳ CRM validation (médico registration)
+ - ⏳ IP whitelisting (opcional)
+
+3. **Data Validation:**
+ - ⏳ CPF validator (dígitos verificadores)
+ - ⏳ CRM validator (formato: 12345/UF)
+ - ⏳ Age validation (≥18 anos)
+ - ⏳ Input sanitization (XSS prevention)
+
+---
+
+## 🎨 UI/UX DESIGN
+
+### Componentes Shadcn/ui Disponíveis (26)
+
+```
+✅ button ✅ card ✅ badge
+✅ avatar ✅ dropdown-menu ✅ dialog
+✅ input ✅ label ✅ form
+✅ select ✅ checkbox ✅ switch
+✅ tabs ✅ tooltip ✅ separator
+✅ skeleton ✅ progress ✅ sheet
+✅ textarea ✅ toggle ✅ toggle-group
+✅ resizable ✅ chart ✅ sonner (toasts)
+```
+
+### Componentes SPE-M Necessários - ⏳ NÃO IMPLEMENTADOS
+
+```typescript
+// 1. PatientCard Component
+
+
+// 2. RiskBadge Component (React)
+
+// Output: "BAIXO RISCO (18/24)" - Verde
+
+// 3. ScoringForm Component (8 critérios)
+
+
+// 4. PatientTable Component
+
+
+// 5. PhotoUpload Component (Drag & Drop)
+
+
+// 6. CPFInput Component (Masked + Validated)
+
+
+// 7. AuditLogViewer Component
+
+```
+
+---
+
+## 📊 APIS & INTEGRAÇÕES
+
+### APIs Existentes (Starter Kit)
+
+```
+✅ POST /api/auth/[...all] Better Auth endpoints
+✅ POST /api/chat OpenAI chat (AI assistant)
+✅ POST /api/subscription Polar webhooks
+✅ POST /api/upload-image R2 image upload
+```
+
+### APIs SPE-M Necessárias - ⏳ NÃO IMPLEMENTADAS
+
+```typescript
+// Patients API
+GET /api/patients // List with pagination
+GET /api/patients/:id // Get single patient
+POST /api/patients // Create patient
+PUT /api/patients/:id // Update patient
+DELETE /api/patients/:id // Soft delete patient
+GET /api/patients/:id/forms // Get patient forms
+
+// Assessment Forms API
+GET /api/forms // List with filters
+GET /api/forms/:id // Get single form
+POST /api/forms // Create form (draft)
+PUT /api/forms/:id // Update form
+POST /api/forms/:id/finalize // Finalize form
+DELETE /api/forms/:id // Delete form
+
+// Photos API
+POST /api/photos/upload // Upload to R2
+GET /api/photos/:id // Get photo
+DELETE /api/photos/:id // Delete photo
+
+// Audit API
+GET /api/audit // Get audit logs (admin)
+
+// LGPD API
+POST /api/patients/:id/export // Export patient data
+POST /api/patients/:id/forget // Right to be forgotten
+```
+
+---
+
+## 🧪 VALIDAÇÕES & REGRAS DE NEGÓCIO
+
+### Implementado em globals.css
+
+```css
+✅ Risk Classification Colors (LOW/MEDIUM/HIGH)
+✅ Score ranges defined:
+ - LOW: 18-24 points (Green)
+ - MEDIUM: 12-17 points (Orange)
+ - HIGH: 0-11 points (Red)
+```
+
+### ⏳ Pendente em TypeScript
+
+```typescript
+// 1. CPF Validation
+function validateCPF(cpf: string): boolean {
+ // TODO: Validate check digits
+ // TODO: Check for known invalid patterns (000.000.000-00)
+}
+
+// 2. CRM Validation
+function validateCRM(crm: string): boolean {
+ // Pattern: 12345/SP or 123456/RJ
+ // TODO: Validate format
+ // TODO: Optionally check with CRM database
+}
+
+// 3. Age Validation
+function validateAge(birthDate: Date): boolean {
+ const age = getAge(birthDate);
+ return age >= 18; // Medical consent age
+}
+
+// 4. Score Calculation
+function calculateScore(criteria: number[]): {
+ total: number;
+ classification: 'LOW' | 'MEDIUM' | 'HIGH';
+} {
+ if (criteria.length !== 8) {
+ throw new Error("Must provide exactly 8 criteria scores");
+ }
+
+ const total = criteria.reduce((sum, score) => sum + score, 0);
+
+ let classification: 'LOW' | 'MEDIUM' | 'HIGH';
+ if (total >= 18) classification = 'LOW';
+ else if (total >= 12) classification = 'MEDIUM';
+ else classification = 'HIGH';
+
+ return { total, classification };
+}
+
+// 5. Data Masking (LGPD)
+function maskCPF(cpf: string): string {
+ // 123.456.789-10 → ***.***.***-10
+ return cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '***.***.***-$4');
+}
+
+function maskEmail(email: string): string {
+ // joao@example.com → j***o@example.com
+ const [local, domain] = email.split('@');
+ const masked = local[0] + '*'.repeat(local.length - 2) + local.slice(-1);
+ return `${masked}@${domain}`;
+}
+
+function maskPhone(phone: string): string {
+ // (31) 98765-4321 → (31) *****-4321
+ return phone.replace(/(\(\d{2}\)) (\d{5})(\d{4})/, '$1 *****-$3');
+}
+```
+
+---
+
+## 📈 MÉTRICAS DO CÓDIGO
+
+### Tamanho dos Arquivos
+
+```
+app/ 1.9 MB
+ ├── globals.css 585 linhas ✅ SPE-M Design System
+ ├── layout.tsx 51 linhas ✅ SPE-M Metadata
+ ├── patients/ 118 linhas ✅ Stub implementado
+ ├── forms/ 146 linhas ✅ Stub implementado
+ ├── navigation-demo/ 422 linhas ✅ Demo completa
+ └── design-system/ 422 linhas ✅ Design showcase
+
+components/ 120 KB
+ ├── layout/ 461 linhas ✅ TopNavBar + Layout
+ └── ui/ 26 files ✅ Shadcn/ui
+
+db/ 32 KB
+ └── schema.ts 86 linhas ⚠️ Faltam tabelas SPE-M
+
+lib/ 19 KB
+ └── auth.ts ~200 linhas ⚠️ Precisa LGPD helpers
+```
+
+### Qualidade do Código
+
+```
+TypeScript Strict Mode: ✅ Habilitado
+Zero 'any' types: ✅ Sim
+ESLint: ✅ Configurado (Next.js)
+Prettier: ⚠️ Não configurado
+Husky (pre-commit): ⚠️ Não configurado
+Tests: ❌ Não implementados
+```
+
+---
+
+## 🔄 GIT & DEPLOY
+
+### Histórico de Commits
+
+```
+* 0bbee2f (HEAD -> claude/session-011CUYMQ1rteTDLTPcR69Hrf)
+ feat: Implement TopNavBar and Navigation System for SPE-M
+
+* f827c3d
+ feat: Implement Apple Vision Pro Design System for SPE-M
+
+* b80fdf3
+ clean up
+```
+
+### Branch Atual
+
+```
+Branch: claude/session-011CUYMQ1rteTDLTPcR69Hrf
+Status: ✅ Up to date with remote
+Untracked: 0 files
+Modified: 0 files
+```
+
+### Deploy Configuration
+
+```yaml
+Platform: ⚠️ Não definido (provavelmente Vercel)
+
+Environment Variables Necessárias:
+ ✅ NEXT_PUBLIC_APP_URL
+ ✅ DATABASE_URL (Neon PostgreSQL)
+ ✅ BETTER_AUTH_SECRET
+ ✅ GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET
+ ⚠️ R2_UPLOAD_* (Cloudflare)
+ ⚠️ POLAR_ACCESS_TOKEN
+ ⚠️ OPENAI_API_KEY (opcional)
+
+ ⏳ SPE-M Specific (Future):
+ - CPF_ENCRYPTION_KEY
+ - LGPD_AUDIT_RETENTION_DAYS
+ - CRM_API_KEY (optional validation)
+```
+
+---
+
+## ⚠️ GAPS & ISSUES CRÍTICOS
+
+### 1. Database Schema Incompleto
+
+**Problema:** Schema atual só tem tabelas de Auth. Faltam:
+- ❌ `patient` table
+- ❌ `assessmentForm` table
+- ❌ `patientPhoto` table
+- ❌ `auditLog` table
+
+**Impacto:** 🔴 CRÍTICO - Sem isso, CRUD não pode ser implementado
+
+**Solução:**
+```typescript
+// Criar migration:
+npx drizzle-kit generate:pg
+npx drizzle-kit migrate
+```
+
+---
+
+### 2. LGPD Compliance Zero
+
+**Problema:** Nenhuma proteção de dados implementada
+
+**Riscos:**
+- ❌ CPF armazenado em texto plano
+- ❌ Sem audit logs
+- ❌ Sem data masking
+- ❌ Sem right to be forgotten
+- ❌ Sem consent management
+
+**Impacto:** 🔴 CRÍTICO - ILEGAL usar em produção sem isso
+
+**Solução Mínima:**
+1. Implementar `maskCPF()` em todos os displays
+2. Adicionar `auditLog` table
+3. Implementar soft delete (`deletedAt`)
+4. Criar endpoint `/api/patients/:id/export`
+
+---
+
+### 3. Autenticação Não Integrada nas Páginas SPE-M
+
+**Problema:** Páginas `/patients` e `/forms` usam mock user
+
+**Impacto:** 🟡 MÉDIO - Funciona em dev, mas não filtra por usuário
+
+**Código Atual:**
+```typescript
+// ❌ MOCK
+const mockUser = {
+ name: "Dr. João Silva",
+ email: "joao.silva@spe-m.app",
+ role: "Médico Dermatologista",
+};
+```
+
+**Solução:**
+```typescript
+// ✅ REAL
+import { auth } from "@/lib/auth";
+import { headers } from "next/headers";
+
+const session = await auth.api.getSession({
+ headers: await headers(),
+});
+
+if (!session?.user) {
+ redirect("/sign-in");
+}
+```
+
+---
+
+### 4. Validações de Negócio Não Implementadas
+
+**Problema:** Nenhuma validação de CPF, CRM, idade, etc.
+
+**Impacto:** 🟡 MÉDIO - UX ruim, dados inválidos no banco
+
+**Faltando:**
+```typescript
+// Zod schemas
+const patientSchema = z.object({
+ name: z.string().min(3).max(100),
+ cpf: z.string().refine(validateCPF, "CPF inválido"),
+ email: z.string().email(),
+ birthDate: z.date().refine(date => getAge(date) >= 18),
+ // ...
+});
+
+const assessmentSchema = z.object({
+ criterion1: z.number().min(0).max(3),
+ criterion2: z.number().min(0).max(3),
+ // ... (8 critérios)
+});
+```
+
+---
+
+### 5. Componentes SPE-M Faltando
+
+**Problema:** Nenhum componente médico reutilizável implementado
+
+**Impacto:** 🟡 MÉDIO - Dificulta implementação de CRUD
+
+**Necessários:**
+- ⏳ `PatientCard` (display + actions)
+- ⏳ `PatientTable` (pagination + sort + filter)
+- ⏳ `ScoringForm` (8 critérios + auto-calc)
+- ⏳ `RiskBadge` (React component)
+- ⏳ `CPFInput` (masked input)
+- ⏳ `PhotoUpload` (drag & drop)
+- ⏳ `AuditLogViewer` (admin)
+
+---
+
+### 6. Testes Não Implementados
+
+**Problema:** Zero tests no projeto
+
+**Impacto:** 🟢 BAIXO (agora) / 🟡 MÉDIO (produção)
+
+**Faltando:**
+- ❌ Jest config
+- ❌ React Testing Library setup
+- ❌ Unit tests (validations, calculations)
+- ❌ Integration tests (API routes)
+- ❌ E2E tests (Playwright/Cypress)
+
+---
+
+## 📋 ROADMAP SUGERIDO
+
+### FASE 3: CRUD de Pacientes (Estimativa: 8-12h)
+
+**Prioridade:** 🔴 ALTA
+
+**Tasks:**
+1. Criar database schema (`patient` table)
+2. Implementar API routes:
+ - `GET /api/patients` (list + pagination)
+ - `POST /api/patients` (create)
+ - `PUT /api/patients/:id` (update)
+ - `DELETE /api/patients/:id` (soft delete)
+3. Criar componentes:
+ - `PatientCard`
+ - `PatientTable`
+ - `PatientForm` (create/edit modal)
+ - `CPFInput` (masked)
+4. Integrar autenticação real
+5. Implementar validações Zod
+6. Implementar data masking (CPF, email, phone)
+7. Adicionar toasts de feedback
+8. Testes básicos
+
+**Entregáveis:**
+- ✅ CRUD funcional
+- ✅ Paginação (20 por página)
+- ✅ Busca por nome/CPF/email
+- ✅ Soft delete (LGPD)
+- ✅ Data masking (CPF sempre ***.***.***-XX)
+
+---
+
+### FASE 4: Formulário de Pontuação (Estimativa: 10-14h)
+
+**Prioridade:** 🔴 ALTA
+
+**Tasks:**
+1. Criar database schema (`assessmentForm` table)
+2. Implementar API routes:
+ - `GET /api/forms` (list + filters)
+ - `POST /api/forms` (create draft)
+ - `PUT /api/forms/:id` (update)
+ - `POST /api/forms/:id/finalize` (lock form)
+3. Criar componente `ScoringForm`:
+ - 8 critérios (radio buttons 0-3)
+ - Cálculo automático de total
+ - Risk badge dinâmico
+ - Save draft (auto-save a cada 30s)
+ - Finalize form (lock editing)
+4. Criar `RiskBadge` component (React)
+5. Validações Zod (8 critérios obrigatórios)
+6. Preview antes de finalizar
+7. Histórico de versões (optional)
+
+**Entregáveis:**
+- ✅ Formulário de 8 critérios funcional
+- ✅ Cálculo de score (0-24)
+- ✅ Risk classification (LOW/MEDIUM/HIGH)
+- ✅ Draft/Finalized status
+- ✅ Listagem de fichas por paciente
+
+---
+
+### FASE 5: LGPD Compliance (Estimativa: 6-8h)
+
+**Prioridade:** 🔴 CRÍTICA (para produção)
+
+**Tasks:**
+1. Implementar CPF encryption:
+ - `encryptCPF()` - Save to DB
+ - `decryptCPF()` - Load from DB
+ - `maskCPF()` - Display (já implementado)
+2. Criar `auditLog` table
+3. Implementar audit middleware:
+ - Log CRUD operations
+ - Capture IP, user agent, timestamp
+ - Store changed fields (before/after)
+4. Implementar endpoints LGPD:
+ - `POST /api/patients/:id/export` (download JSON)
+ - `POST /api/patients/:id/forget` (soft delete)
+5. Adicionar consent checkboxes
+6. Política de retenção (archive após 5 anos)
+7. Admin audit log viewer
+
+**Entregáveis:**
+- ✅ CPF criptografado no banco
+- ✅ Audit logs completos
+- ✅ Right to be forgotten
+- ✅ Data export (JSON)
+- ✅ Compliance mínimo LGPD
+
+---
+
+### FASE 6: Upload de Fotos (Estimativa: 4-6h)
+
+**Prioridade:** 🟡 MÉDIA
+
+**Tasks:**
+1. Criar `patientPhoto` table
+2. Implementar API route `/api/photos/upload`
+3. Integrar Cloudflare R2 (já configurado)
+4. Criar `PhotoUpload` component (drag & drop)
+5. Thumbnail generation
+6. Galeria de fotos por paciente
+7. Delete photos (LGPD)
+
+**Entregáveis:**
+- ✅ Upload de fotos (before/after)
+- ✅ Galeria por paciente
+- ✅ Thumbnails
+- ✅ Delete funcional
+
+---
+
+### FASE 7: Relatórios & Analytics (Estimativa: 8-10h)
+
+**Prioridade:** 🟢 BAIXA
+
+**Tasks:**
+1. Dashboard com charts (Recharts)
+2. Score médio ao longo do tempo
+3. Distribuição de risco (pie chart)
+4. Pacientes por mês (line chart)
+5. Export CSV/PDF
+6. Filtros avançados (data range, risco, etc.)
+
+---
+
+## 🎯 PRÓXIMOS PASSOS RECOMENDADOS
+
+### Opção A: CRUD de Pacientes (Mais Lógico)
+
+**Por quê?**
+- ✅ Base fundamental do sistema
+- ✅ Permite testar toda a stack (DB → API → UI)
+- ✅ Demonstra integração real de auth
+- ✅ Implementa LGPD desde o início
+
+**Tempo estimado:** 2-3 sessões de trabalho
+
+---
+
+### Opção B: Formulário de Pontuação (Mais Visível)
+
+**Por quê?**
+- ✅ Core business do SPE-M
+- ✅ Demonstra cálculo automático
+- ✅ Risk badges em ação
+- ✅ Mais impressionante para demo
+
+**Tempo estimado:** 2-3 sessões de trabalho
+
+**⚠️ Problema:** Precisa de pacientes cadastrados primeiro
+
+---
+
+### Opção C: LGPD Compliance (Mais Responsável)
+
+**Por quê?**
+- ✅ Crítico para produção
+- ✅ Deve ser desde o início
+- ✅ Evita refatoração futura
+
+**Tempo estimado:** 1-2 sessões de trabalho
+
+**⚠️ Problema:** Menos visível, mais técnico
+
+---
+
+## 💡 RECOMENDAÇÃO FINAL
+
+**Sequência Ideal:**
+
+1. **FASE 3A: Database Schema** (1h)
+ - Criar tabelas `patient`, `assessmentForm`, `auditLog`
+ - Rodar migrations
+ - Testar conexão
+
+2. **FASE 3B: CRUD de Pacientes** (8h)
+ - Implementar conforme roadmap
+ - Incluir LGPD básico (masking + soft delete)
+
+3. **FASE 4: Formulário de Pontuação** (10h)
+ - Implementar conforme roadmap
+ - Vincular a pacientes reais
+
+4. **FASE 5: LGPD Avançado** (4h)
+ - CPF encryption
+ - Audit logs completos
+ - Export/Forget endpoints
+
+---
+
+## 📊 RESUMO EXECUTIVO
+
+### ✅ Pontos Fortes
+
+1. **Design System Completo**
+ - Apple Vision Pro fiel
+ - Dark mode nativo
+ - Acessibilidade WCAG 2.1 AA
+
+2. **Navegação Robusta**
+ - TopNavBar responsiva
+ - Mobile bottom nav
+ - Active state tracking
+
+3. **Stack Moderna**
+ - Next.js 15 + React 19
+ - TypeScript strict
+ - Better Auth + Drizzle
+
+4. **Base Sólida**
+ - Shadcn/ui (26 componentes)
+ - Layout system pronto
+ - CSS variables organizadas
+
+---
+
+### ⚠️ Gaps Críticos
+
+1. **Database Schema Incompleto**
+ - Faltam 4 tabelas SPE-M
+
+2. **LGPD Zero**
+ - CPF em texto plano
+ - Sem audit logs
+
+3. **Componentes SPE-M Faltando**
+ - PatientCard, ScoringForm, etc.
+
+4. **Validações Não Implementadas**
+ - CPF, CRM, idade, etc.
+
+5. **Autenticação Não Integrada**
+ - Mock user nas páginas SPE-M
+
+6. **Testes Zero**
+ - Nenhum test implementado
+
+---
+
+### 📈 Progresso Atual: 35%
+
+```
+████████████░░░░░░░░░░░░░░░░░░░░ 35%
+
+✅ Design System 100%
+✅ Navigation 100%
+⏳ CRUD Pacientes 0%
+⏳ Formulário Score 0%
+⏳ LGPD Compliance 0%
+⏳ Photos Upload 0%
+⏳ Relatórios 0%
+```
+
+---
+
+**Pronto para avançar?**
+
+**Minha recomendação:** Implementar **FASE 3: CRUD de Pacientes** completo, incluindo:
+- Database schema
+- API routes
+- Componentes
+- Validações
+- LGPD básico (masking + soft delete)
+
+Isso cria a base sólida para tudo que vem depois.
+
+**Você concorda? Ou prefere outro caminho?**
diff --git a/app/design-system/page.tsx b/app/design-system/page.tsx
new file mode 100644
index 00000000..6bd3a572
--- /dev/null
+++ b/app/design-system/page.tsx
@@ -0,0 +1,422 @@
+/**
+ * Design System Demo Page
+ *
+ * @description Página de demonstração do Design System SPE-M com Apple Vision Pro aesthetics
+ * Para testar: http://localhost:3000/design-system
+ */
+
+"use client";
+
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Card } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import {
+ Moon,
+ Sun,
+ Activity,
+ Users,
+ FileText,
+ AlertCircle,
+ CheckCircle,
+ AlertTriangle
+} from "lucide-react";
+import { useTheme } from "next-themes";
+
+export default function DesignSystemPage() {
+ const { theme, setTheme } = useTheme();
+ const [mounted, setMounted] = useState(false);
+
+ // Prevent hydration mismatch
+ useState(() => {
+ setMounted(true);
+ });
+
+ return (
+
+ {/* Skip to main content - Accessibility */}
+
+ Pular para conteúdo principal
+
+
+ {/* Header */}
+
+
+
+
+
+
+
SPE-M Design System
+
Apple Vision Pro Inspired
+
+
+
+ {/* Theme Toggle */}
+ {mounted && (
+
+ )}
+
+
+
+
+ {/* Main Content */}
+
+
+ {/* Colors Section */}
+
+ Paleta de Cores
+
+
+ {/* Primary Colors */}
+
+ Primary (Medical Blue)
+
+
+
+
--color-primary-hover
+
+
+
+
--color-primary-light
+
+
+
+ {/* Semantic Colors */}
+
+ Semantic Colors
+
+
+
+
+
+
+ {/* Risk Classification */}
+
+ Risk Classification
+
+
+ BAIXO RISCO
+
+
+ MÉDIO RISCO
+
+
+ ALTO RISCO
+
+
+
+
+
+
+ {/* Typography */}
+
+ Tipografia
+
+
+ Heading 1 - Apple San Francisco
+ Heading 2 - Medium Weight
+ Heading 3 - Tracking Tight
+ Heading 4 - Readable
+
+ Parágrafo normal com fonte system Apple. Otimizado para legibilidade em telas de alta resolução.
+
+
+ Texto secundário com menor contraste, ideal para informações complementares.
+
+
+ Texto terciário para labels e metadados.
+
+ const variable = "SF Mono - Monospace Font";
+
+
+
+ {/* Glassmorphism Effects */}
+
+ Glassmorphism & Depth
+
+
+
+
Glass Effect
+
+ Backdrop blur + saturação + transparência
+
+
+
+
+ Depth Level 1
+
+ Shadow suave para elementos próximos
+
+
+
+
+ Depth Level 2
+
+ Shadow média para elevação moderada
+
+
+
+
+ Depth Level 3
+
+ Shadow profunda para modais e overlays
+
+
+
+
+
+ {/* Buttons */}
+
+ Buttons & Actions
+
+
+
+
Primary Actions
+
+
+
+
+
+
+
+
+
+
+
Sizes
+
+
+
+
+
+
+
+
+
With Icons
+
+
+
+
+
+
+
+
+
+ {/* Badges */}
+
+ Badges & Status
+
+
+
+
Standard Badges
+
+ Default
+ Secondary
+ Outline
+ Destructive
+
+
+
+
+
Medical Context - Risk Levels
+
+
+
+ Risco Baixo (18-24 pts)
+
+
+
+ Risco Médio (12-17 pts)
+
+
+
+ Risco Alto (0-11 pts)
+
+
+
+
+
+
+ {/* Forms */}
+
+
+ {/* Hover Effects */}
+
+ Hover & Transitions
+
+
+
+ Hover Lift
+
+ Passe o mouse para ver o efeito de elevação suave
+
+
+
+
+ Hover Glow
+
+ Passe o mouse para ver o efeito de brilho
+
+
+
+
+
+ {/* Animations */}
+
+ Animations
+
+
+
+ Fade In
+
+ Animação de entrada suave
+
+
+
+
+ Slide In Up
+
+ Desliza de baixo para cima
+
+
+
+
+ Scale In
+
+ Escala de 95% para 100%
+
+
+
+
+
+ {/* Accessibility */}
+
+ Acessibilidade
+
+
+
+
WCAG 2.1 AA Compliance
+
+ - Contraste mínimo de 4.5:1 para texto normal
+ - Contraste mínimo de 3:1 para texto grande (≥18px)
+ - Foco visível em todos os elementos interativos
+ - Labels associados a todos os inputs
+ - ARIA labels em botões sem texto
+ - Navegação por teclado funcional
+ - Suporte para leitores de tela
+
+
+
+
+
Teclado
+
+ Pressione Tab para navegar entre elementos interativos.
+
+
+ Todos os elementos focáveis mostram um outline de 2px na cor primária.
+
+
+
+
+
Reduced Motion
+
+ Animações são desabilitadas automaticamente quando o usuário tem preferência por movimento reduzido (prefers-reduced-motion).
+
+
+
+
+
+
+
+ {/* Footer */}
+
+
+ );
+}
diff --git a/app/forms/page.tsx b/app/forms/page.tsx
new file mode 100644
index 00000000..2d53f295
--- /dev/null
+++ b/app/forms/page.tsx
@@ -0,0 +1,146 @@
+/**
+ * Forms Page - SPE-M
+ *
+ * @description Página de gerenciamento de fichas de avaliação
+ * TODO: Implementar listagem, filtros, criação de fichas
+ */
+
+import { DashboardLayout } from "@/components/layout";
+import { Card } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { Badge } from "@/components/ui/badge";
+import { FileText, Plus, TrendingUp, Calendar } from "lucide-react";
+
+// Mock user - TODO: Replace with real auth
+const mockUser = {
+ name: "Dr. João Silva",
+ email: "joao.silva@spe-m.app",
+ role: "Médico Dermatologista",
+ avatar: undefined,
+};
+
+export default function FormsPage() {
+ return (
+
+ {/* Page Header */}
+
+
+
+
+
+
+
+
Fichas de Avaliação
+
Sistema de Pontuação Estética (0-24 pontos)
+
+
+
+
+
+
+
+ {/* Quick Stats */}
+
+
+
+ 342
+
+
+
+
+ 28
+
+
+
+
+ 16.4
+
+
+
+
+
Rascunhos
+
Pendentes
+
+ 5
+
+
+
+ {/* Risk Distribution */}
+
+ Distribuição de Risco
+
+
+
Risco Baixo
+
45%
+
18-24 pontos
+
+
+
Risco Médio
+
38%
+
12-17 pontos
+
+
+
Risco Alto
+
17%
+
0-11 pontos
+
+
+
+
+ {/* 8 Criteria Overview */}
+
+ 8 Critérios de Avaliação
+
+ {[
+ { id: 1, name: "Desvio de Septo", icon: "🔹" },
+ { id: 2, name: "Giba Óssea", icon: "🔸" },
+ { id: 3, name: "Sulco Nasogeniano", icon: "〰️" },
+ { id: 4, name: "Rugas Periorbitais", icon: "👁️" },
+ { id: 5, name: "Flacidez Facial", icon: "📐" },
+ { id: 6, name: "Acne/Cicatrizes", icon: "🔴" },
+ { id: 7, name: "Pigmentação Cutânea", icon: "🎨" },
+ { id: 8, name: "Textura da Pele", icon: "✨" },
+ ].map((criterion) => (
+
+
{criterion.icon}
+
{criterion.name}
+
0-3 pontos
+
+ ))}
+
+
+
+ {/* Forms List - Placeholder */}
+
+
+
+
Lista de fichas
+
+ Esta funcionalidade será implementada na próxima fase.
+
+
+
✅ Sistema de pontuação definido (0-24)
+
✅ 8 critérios configurados
+
✅ Risk badges funcionando
+
⏳ Formulário de criação (próxima etapa)
+
+
+
+
+ );
+}
diff --git a/app/globals.css b/app/globals.css
index ae4967cd..e9e2c446 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -43,79 +43,337 @@
--radius-xl: 20px;
}
+/* ============================================
+ SPE-M DESIGN SYSTEM
+ Apple Vision Pro Inspired
+ ============================================ */
+
:root {
- /* Apple Light Theme Colors */
+ /* --- LIGHT MODE --- */
+
+ /* Backgrounds */
+ --bg-primary: #ffffff;
+ --bg-secondary: #f5f5f7;
+ --bg-tertiary: #e8e8ed;
+ --bg-elevated: #ffffff;
+
+ /* Surfaces (Cards, Modals) - Glassmorphism */
+ --surface-glass: rgba(255, 255, 255, 0.72);
+ --surface-glass-border: rgba(255, 255, 255, 0.18);
+
+ /* Text Hierarchy */
+ --text-primary: #1d1d1f;
+ --text-secondary: #6e6e73;
+ --text-tertiary: #86868b;
+ --text-inverse: #ffffff;
+
+ /* Medical Primary (Blue) - Adaptado SPE-M */
+ --color-primary: #007aff;
+ --color-primary-hover: #0051d5;
+ --color-primary-light: #e5f1ff;
+
+ /* Semantic Colors */
+ --color-secondary: #34c759; /* Verde - Sucesso */
+ --color-accent: #bf5af2; /* Roxo - Highlights */
+ --color-warning: #ff9500; /* Laranja */
+ --color-error: #ff3b30; /* Vermelho */
+
+ /* Borders */
+ --border-subtle: rgba(0, 0, 0, 0.08);
+ --border-medium: rgba(0, 0, 0, 0.15);
+ --border-strong: rgba(0, 0, 0, 0.25);
+
+ /* Apple Depth Shadows */
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.10);
+ --shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.15);
+ --shadow-glass: 0 8px 32px rgba(31, 38, 135, 0.15);
+
+ /* Risk Classification (Medical Context) */
+ --risk-low: #34c759;
+ --risk-low-bg: rgba(52, 199, 89, 0.15);
+ --risk-medium: #ff9500;
+ --risk-medium-bg: rgba(255, 149, 0, 0.15);
+ --risk-high: #ff3b30;
+ --risk-high-bg: rgba(255, 59, 48, 0.15);
+
+ /* Standard Shadcn/ui compatibility */
--background: #ffffff;
- --foreground: #000000;
+ --foreground: #1d1d1f;
--card: #ffffff;
- --card-foreground: #000000;
+ --card-foreground: #1d1d1f;
--popover: #ffffff;
- --popover-foreground: #000000;
- --primary: #0071e3; /* Apple Blue */
+ --popover-foreground: #1d1d1f;
+ --primary: #007aff;
--primary-foreground: #ffffff;
- --secondary: #f5f5f7; /* Apple Light Gray */
+ --secondary: #f5f5f7;
--secondary-foreground: #1d1d1f;
--muted: #f5f5f7;
--muted-foreground: #86868b;
- --accent: #0071e3; /* Apple Blue */
+ --accent: #007aff;
--accent-foreground: #ffffff;
- --destructive: #ff3b30; /* Apple Red */
+ --destructive: #ff3b30;
--destructive-foreground: #ffffff;
- --border: #e2e2e7; /* Lighter, more subtle border */
+ --border: rgba(0, 0, 0, 0.08);
--input: #f5f5f7;
- --ring: #0071e3;
- --chart-1: #0071e3; /* Apple Blue */
- --chart-2: #34c759; /* Apple Green */
- --chart-3: #ff9500; /* Apple Orange */
- --chart-4: #ffcc00; /* Apple Yellow */
- --chart-5: #af52de; /* Apple Purple */
+ --ring: #007aff;
+
+ /* Chart colors */
+ --chart-1: #007aff;
+ --chart-2: #34c759;
+ --chart-3: #ff9500;
+ --chart-4: #ffcc00;
+ --chart-5: #bf5af2;
+
+ /* Sidebar */
--sidebar: #f5f5f7;
--sidebar-foreground: #1d1d1f;
- --sidebar-primary: #0071e3;
+ --sidebar-primary: #007aff;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #e8e8ed;
--sidebar-accent-foreground: #1d1d1f;
- --sidebar-border: #e2e2e7; /* Lighter border */
- --sidebar-ring: #0071e3;
- /* Apple Fonts */
+ --sidebar-border: rgba(0, 0, 0, 0.08);
+ --sidebar-ring: #007aff;
+
+ /* Typography */
--font-apple-system:
-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue",
Helvetica, sans-serif;
- --font-sf-mono: "SF Mono", Menlo, monospace;
+ --font-sf-mono: "SF Mono", Menlo, Monaco, monospace;
--font-sans: var(--font-apple-system);
--font-serif: "New York", Georgia, serif;
--font-mono: var(--font-sf-mono);
- /* Apple uses more rounded corners */
+
+ /* Spacing Scale (Apple Standard) */
+ --spacing-xs: 0.25rem; /* 4px */
+ --spacing-sm: 0.5rem; /* 8px */
+ --spacing-md: 1rem; /* 16px */
+ --spacing-lg: 1.5rem; /* 24px */
+ --spacing-xl: 2rem; /* 32px */
+ --spacing-2xl: 3rem; /* 48px */
+ --spacing-3xl: 4rem; /* 64px */
+
+ /* Border Radius */
--radius: 10px;
- /* Apple-style shadows */
- --shadow-2xs: 0px 1px 2px rgba(0, 0, 0, 0.05);
- --shadow-xs: 0px 1px 3px rgba(0, 0, 0, 0.1);
- --shadow-sm: 0px 2px 4px rgba(0, 0, 0, 0.1);
- --shadow: 0px 2px 6px rgba(0, 0, 0, 0.1);
- --shadow-md: 0px 4px 8px rgba(0, 0, 0, 0.1);
- --shadow-lg: 0px 8px 16px rgba(0, 0, 0, 0.1);
- --shadow-xl: 0px 12px 24px rgba(0, 0, 0, 0.1);
- --shadow-2xl: 0px 16px 32px rgba(0, 0, 0, 0.1);
+ --radius-sm: 8px;
+ --radius-md: 10px;
+ --radius-lg: 12px;
+ --radius-xl: 20px;
+}
+
+.dark {
+ /* --- DARK MODE --- */
+
+ /* Backgrounds */
+ --bg-primary: #000000;
+ --bg-secondary: #1c1c1e;
+ --bg-tertiary: #2c2c2e;
+ --bg-elevated: #1c1c1e;
+
+ /* Surfaces (Cards, Modals) - Glassmorphism */
+ --surface-glass: rgba(28, 28, 30, 0.72);
+ --surface-glass-border: rgba(255, 255, 255, 0.12);
+
+ /* Text Hierarchy */
+ --text-primary: #ffffff;
+ --text-secondary: #98989d;
+ --text-tertiary: #636366;
+ --text-inverse: #000000;
+
+ /* Medical Primary (Blue) - Brightened for dark BG */
+ --color-primary: #0a84ff;
+ --color-primary-hover: #409cff;
+ --color-primary-light: rgba(10, 132, 255, 0.15);
+
+ /* Semantic Colors - Brightened */
+ --color-secondary: #30d158;
+ --color-accent: #bf5af2;
+ --color-warning: #ff9f0a;
+ --color-error: #ff453a;
+
+ /* Borders */
+ --border-subtle: rgba(255, 255, 255, 0.08);
+ --border-medium: rgba(255, 255, 255, 0.15);
+ --border-strong: rgba(255, 255, 255, 0.25);
+
+ /* Apple Depth Shadows - Enhanced for dark */
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.5);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.6);
+ --shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.7);
+ --shadow-glass: 0 8px 32px rgba(0, 0, 0, 0.4);
+
+ /* Risk Classification (Medical Context) - Brightened */
+ --risk-low: #30d158;
+ --risk-low-bg: rgba(48, 209, 88, 0.2);
+ --risk-medium: #ff9f0a;
+ --risk-medium-bg: rgba(255, 159, 10, 0.2);
+ --risk-high: #ff453a;
+ --risk-high-bg: rgba(255, 69, 58, 0.2);
+
+ /* Standard Shadcn/ui compatibility */
+ --background: #000000;
+ --foreground: #ffffff;
+ --card: #1c1c1e;
+ --card-foreground: #ffffff;
+ --popover: #1c1c1e;
+ --popover-foreground: #ffffff;
+ --primary: #0a84ff;
+ --primary-foreground: #ffffff;
+ --secondary: #1c1c1e;
+ --secondary-foreground: #ffffff;
+ --muted: #2c2c2e;
+ --muted-foreground: #98989d;
+ --accent: #0a84ff;
+ --accent-foreground: #ffffff;
+ --destructive: #ff453a;
+ --destructive-foreground: #ffffff;
+ --border: rgba(255, 255, 255, 0.08);
+ --input: #1c1c1e;
+ --ring: #0a84ff;
+
+ /* Chart colors - Brightened */
+ --chart-1: #0a84ff;
+ --chart-2: #30d158;
+ --chart-3: #ff9f0a;
+ --chart-4: #ffd60a;
+ --chart-5: #bf5af2;
+
+ /* Sidebar */
+ --sidebar: #1c1c1e;
+ --sidebar-foreground: #ffffff;
+ --sidebar-primary: #0a84ff;
+ --sidebar-primary-foreground: #ffffff;
+ --sidebar-accent: #2c2c2e;
+ --sidebar-accent-foreground: #ffffff;
+ --sidebar-border: rgba(255, 255, 255, 0.08);
+ --sidebar-ring: #0a84ff;
}
+/* ============================================
+ UTILITY CLASSES - Apple Vision Pro Effects
+ ============================================ */
+
+/* Glassmorphism Effect */
+.glass-effect {
+ background: var(--surface-glass);
+ backdrop-filter: blur(40px) saturate(180%);
+ -webkit-backdrop-filter: blur(40px) saturate(180%);
+ border: 1px solid var(--surface-glass-border);
+ box-shadow: var(--shadow-glass);
+}
+
+/* Depth Shadows */
+.depth-1 {
+ box-shadow: var(--shadow-sm);
+}
+
+.depth-2 {
+ box-shadow: var(--shadow-md);
+}
+
+.depth-3 {
+ box-shadow: var(--shadow-lg);
+}
+
+/* Transitions - Organic & Fluid */
+.transition-base {
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.transition-fast {
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* Hover Effects */
+.hover-lift {
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
+ box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.hover-lift:hover {
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-lg);
+}
+
+.hover-glow:hover {
+ box-shadow: 0 0 20px var(--color-primary);
+}
+
+/* Background Colors */
+.bg-primary {
+ background-color: var(--bg-primary);
+}
+
+.bg-secondary {
+ background-color: var(--bg-secondary);
+}
+
+.bg-tertiary {
+ background-color: var(--bg-tertiary);
+}
+
+.bg-elevated {
+ background-color: var(--bg-elevated);
+}
+
+/* Text Colors */
+.text-primary {
+ color: var(--text-primary);
+}
+
+.text-secondary {
+ color: var(--text-secondary);
+}
+
+.text-tertiary {
+ color: var(--text-tertiary);
+}
+
+.text-inverse {
+ color: var(--text-inverse);
+}
+
+/* Border Colors */
+.border-subtle {
+ border-color: var(--border-subtle);
+}
+
+.border-medium {
+ border-color: var(--border-medium);
+}
+
+.border-strong {
+ border-color: var(--border-strong);
+}
+
+/* ============================================
+ BASE STYLES
+ ============================================ */
+
@layer base {
* {
@apply border-border outline-ring/50;
}
+
body {
@apply bg-background text-foreground font-sans;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
+
+ /* Interactive Elements - Focus & Transitions */
button,
input,
select,
textarea {
@apply focus:outline-none focus:ring-2 focus:ring-primary/50 transition-all duration-200;
}
+
button {
@apply hover:cursor-pointer;
}
+
+ /* Typography - Apple Style */
h1,
h2,
h3,
@@ -124,4 +382,204 @@
h6 {
@apply font-medium tracking-tight;
}
+
+ h1 {
+ @apply text-4xl leading-tight;
+ }
+
+ h2 {
+ @apply text-3xl leading-tight;
+ }
+
+ h3 {
+ @apply text-2xl leading-tight;
+ }
+
+ h4 {
+ @apply text-xl leading-normal;
+ }
+
+ h5 {
+ @apply text-lg leading-normal;
+ }
+
+ h6 {
+ @apply text-base leading-normal;
+ }
+
+ /* Links */
+ a {
+ @apply text-primary hover:opacity-80 transition-opacity duration-200;
+ }
+
+ /* Code blocks */
+ code {
+ @apply font-mono text-sm bg-muted px-1 py-0.5 rounded;
+ }
+
+ pre {
+ @apply font-mono text-sm bg-muted p-4 rounded-lg overflow-x-auto;
+ }
+
+ /* Selection */
+ ::selection {
+ background-color: var(--color-primary-light);
+ color: var(--text-primary);
+ }
+
+ /* Scrollbar - macOS Style */
+ ::-webkit-scrollbar {
+ width: 12px;
+ height: 12px;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: var(--border-medium);
+ border-radius: 6px;
+ border: 2px solid transparent;
+ background-clip: padding-box;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: var(--border-strong);
+ border: 2px solid transparent;
+ background-clip: padding-box;
+ }
+}
+
+/* ============================================
+ MEDICAL CONTEXT - Risk Classification
+ ============================================ */
+
+.risk-badge-low {
+ background-color: var(--risk-low-bg);
+ color: var(--risk-low);
+}
+
+.risk-badge-medium {
+ background-color: var(--risk-medium-bg);
+ color: var(--risk-medium);
+}
+
+.risk-badge-high {
+ background-color: var(--risk-high-bg);
+ color: var(--risk-high);
+}
+
+/* ============================================
+ ANIMATION UTILITIES
+ ============================================ */
+
+@keyframes fade-in {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes slide-in-up {
+ from {
+ transform: translateY(20px);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+@keyframes slide-in-down {
+ from {
+ transform: translateY(-20px);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+@keyframes scale-in {
+ from {
+ transform: scale(0.95);
+ opacity: 0;
+ }
+ to {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+.animate-fade-in {
+ animation: fade-in 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.animate-slide-in-up {
+ animation: slide-in-up 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.animate-slide-in-down {
+ animation: slide-in-down 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.animate-scale-in {
+ animation: scale-in 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* ============================================
+ ACCESSIBILITY ENHANCEMENTS
+ ============================================ */
+
+/* Focus visible for keyboard navigation */
+.focus-visible:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+/* Skip to main content link */
+.skip-to-main {
+ position: absolute;
+ left: -9999px;
+ z-index: 999;
+}
+
+.skip-to-main:focus {
+ left: 50%;
+ transform: translateX(-50%);
+ top: 1rem;
+ padding: 0.75rem 1.5rem;
+ background: var(--bg-elevated);
+ border: 2px solid var(--color-primary);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-weight: 600;
+ box-shadow: var(--shadow-lg);
+}
+
+/* Reduced motion support */
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
+
+/* High contrast mode support */
+@media (prefers-contrast: high) {
+ .border-subtle {
+ border-color: var(--border-strong);
+ }
+
+ .text-secondary {
+ color: var(--text-primary);
+ }
}
diff --git a/app/layout.tsx b/app/layout.tsx
index 343328f1..145d4275 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -4,26 +4,27 @@ import { ThemeProvider } from "../components/provider";
import "./globals.css";
import { Analytics } from "@vercel/analytics/next";
export const metadata: Metadata = {
- title: "Next.js Starter Kit - Launch Your SAAS",
+ title: "SPE-M - Sistema de Pontuação Estética Médica",
description:
- "A modern, full-stack Next.js starter kit with authentication, payments, and dashboard. Built with TypeScript, Tailwind CSS, and shadcn/ui.",
+ "Sistema profissional de avaliação estética médica. Gerencie pacientes, registre avaliações detalhadas e acompanhe resultados com segurança e compliance LGPD.",
openGraph: {
- title: "Next.js Starter Kit",
+ title: "SPE-M - Sistema de Pontuação Estética Médica",
description:
- "A modern, full-stack Next.js starter kit with authentication, payments, and dashboard. Built with TypeScript, Tailwind CSS, and shadcn/ui.",
- url: "nextstarter.xyz",
- siteName: "Next.js Starter Kit",
- images: [
- {
- url: "https://jdj14ctwppwprnqu.public.blob.vercel-storage.com/nsk-w9fFwBBmLDLxrB896I4xqngTUEEovS.png",
- width: 1200,
- height: 630,
- alt: "Next.js Starter Kit",
- },
- ],
- locale: "en-US",
+ "Sistema profissional de avaliação estética médica com compliance LGPD e design Apple Vision Pro.",
+ url: "https://spe-m.app",
+ siteName: "SPE-M",
+ locale: "pt-BR",
type: "website",
},
+ keywords: [
+ "estética médica",
+ "avaliação estética",
+ "prontuário digital",
+ "LGPD",
+ "sistema médico",
+ "dermatologia",
+ "cirurgia plástica",
+ ],
};
export default function RootLayout({
@@ -32,13 +33,12 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
+
{children}
diff --git a/app/navigation-demo/page.tsx b/app/navigation-demo/page.tsx
new file mode 100644
index 00000000..3f8262e3
--- /dev/null
+++ b/app/navigation-demo/page.tsx
@@ -0,0 +1,247 @@
+/**
+ * Navigation Demo - SPE-M
+ *
+ * @description Página de demonstração do sistema de navegação completo
+ * Acesse: http://localhost:3000/navigation-demo
+ */
+
+import { DashboardLayout } from "@/components/layout";
+import { Card } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { Badge } from "@/components/ui/badge";
+import {
+ Activity,
+ Users,
+ FileText,
+ CheckCircle,
+ ArrowRight,
+ Sparkles,
+} from "lucide-react";
+import Link from "next/link";
+
+// Mock user - TODO: Replace with real auth
+const mockUser = {
+ name: "Dr. João Silva",
+ email: "joao.silva@spe-m.app",
+ role: "Médico Dermatologista",
+ avatar: undefined,
+};
+
+export default function NavigationDemoPage() {
+ return (
+
+ {/* Hero Section */}
+
+
+
+
+ Sistema de Navegação Ativo
+
+
+
+
+ SPE-M Sistema Médico
+
+
+ Sistema de Pontuação Estética Médica com navegação Apple Vision Pro
+
+
+
+ {/* Features Grid */}
+
+ {/* Feature 1 */}
+
+
+ TopNavBar
+
+ Navegação fixa com glassmorphism, dark mode toggle e user menu
+
+
+
+
+ Glassmorphism effect
+
+
+
+ Responsive + Mobile nav
+
+
+
+ Accessibility WCAG 2.1
+
+
+
+
+ {/* Feature 2 */}
+
+
+
+
+ Pacientes
+
+ Gestão completa de pacientes com dados protegidos (LGPD)
+
+
+
+
+
+
+ {/* Feature 3 */}
+
+
+
+
+ Fichas
+
+ Sistema de pontuação estética com 8 critérios (0-24 pontos)
+
+
+
+
+
+
+
+ {/* Implementation Status */}
+
+
+ Status de Implementação
+
+
+
+ {/* Completed */}
+
+
+
+ Concluído
+
+
+ {[
+ "Design System Apple Vision Pro",
+ "CSS Variables (light + dark)",
+ "Glassmorphism & Depth Effects",
+ "Risk Classification Badges",
+ "TopNavBar Component",
+ "DashboardLayout Wrapper",
+ "Mobile Bottom Navigation",
+ "Theme Toggle (Dark Mode)",
+ "User Menu & Dropdown",
+ "Accessibility (WCAG 2.1 AA)",
+ ].map((item, idx) => (
+ -
+
+ {item}
+
+ ))}
+
+
+
+ {/* Pending */}
+
+
+
+ Próximas Etapas
+
+
+ {[
+ "CRUD de Pacientes",
+ "Tabela com paginação",
+ "Formulário de 8 critérios",
+ "Cálculo automático de score",
+ "PatientCard Component",
+ "RiskBadge Component (React)",
+ "Validações LGPD",
+ "Masking de dados sensíveis",
+ "Audit logs",
+ "Integração com Backend",
+ ].map((item, idx) => (
+ -
+
+ {item}
+
+ ))}
+
+
+
+
+
+ {/* Testing Instructions */}
+
+
+ Como Testar
+
+
+
+
+ 1
+
+
Navegação
+
+ Clique em "Pacientes" ou "Fichas" na TopNavBar para navegar
+
+
+
+
+
+ 2
+
+
Dark Mode
+
+ Clique no ícone de lua/sol no canto superior direito
+
+
+
+
+
+ 3
+
+
User Menu
+
+ Clique no avatar para ver perfil, configurações e logout
+
+
+
+
+
+ {/* Quick Links */}
+
+
+
+ Design System
+
+ Ver todos os componentes e paleta de cores
+
+ Demo completa
+
+
+
+
+
+ Pacientes
+
+ Página de gestão de pacientes
+
+ Em construção
+
+
+
+
+
+ Fichas
+
+ Sistema de pontuação estética
+
+ Em construção
+
+
+
+
+ );
+}
diff --git a/app/patients/page.tsx b/app/patients/page.tsx
new file mode 100644
index 00000000..b73bd01b
--- /dev/null
+++ b/app/patients/page.tsx
@@ -0,0 +1,118 @@
+/**
+ * Patients Page - SPE-M
+ *
+ * @description Página de gerenciamento de pacientes
+ * TODO: Implementar CRUD completo, tabela com paginação, busca
+ */
+
+import { DashboardLayout } from "@/components/layout";
+import { Card } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { Badge } from "@/components/ui/badge";
+import { Users, Plus, Search, Filter } from "lucide-react";
+
+// Mock user - TODO: Replace with real auth
+const mockUser = {
+ name: "Dr. João Silva",
+ email: "joao.silva@spe-m.app",
+ role: "Médico Dermatologista",
+ avatar: undefined,
+};
+
+export default function PatientsPage() {
+ return (
+
+ {/* Page Header */}
+
+
+
+
+
+
+
+
Pacientes
+
Gerencie seus pacientes e históricos
+
+
+
+
+
+
+
+ {/* Quick Stats */}
+
+
+
+
+
Total de Pacientes
+
127
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Filters & Search */}
+
+
+
+
+
+
+
+
+
+
+ {/* Patients List - Placeholder */}
+
+
+
+
Lista de pacientes
+
+ Esta funcionalidade será implementada na próxima fase.
+
+
+
✅ TopNavBar funcionando
+
✅ Layout responsivo
+
✅ Dark mode ativo
+
⏳ Tabela de pacientes (próxima etapa)
+
+
+
+
+ );
+}
diff --git a/components/layout/dashboard-layout.tsx b/components/layout/dashboard-layout.tsx
new file mode 100644
index 00000000..806b3317
--- /dev/null
+++ b/components/layout/dashboard-layout.tsx
@@ -0,0 +1,129 @@
+/**
+ * DashboardLayout - Layout principal do sistema SPE-M
+ *
+ * @description Wrapper que inclui TopNavBar e garante padding correto
+ *
+ * RESPONSABILIDADE:
+ * - Renderizar TopNavBar fixa no topo
+ * - Garantir pt-16 no main para não cobrir conteúdo
+ * - Garantir pb-20 no mobile para não cobrir bottom nav
+ * - Fornecer container responsivo
+ *
+ * @example
+ * ```tsx
+ *
+ *
+ *
+ * ```
+ */
+
+"use client";
+
+import { TopNavBar, TopNavBarUser } from "./top-nav-bar";
+import { useRouter } from "next/navigation";
+import { toast } from "sonner";
+
+// ============================================
+// TYPES & INTERFACES
+// ============================================
+
+export interface DashboardLayoutProps {
+ children: React.ReactNode;
+ user: TopNavBarUser;
+ maxWidth?: "sm" | "md" | "lg" | "xl" | "2xl" | "full";
+ className?: string;
+}
+
+// ============================================
+// MAIN COMPONENT
+// ============================================
+
+export const DashboardLayout: React.FC = ({
+ children,
+ user,
+ maxWidth = "2xl",
+ className = "",
+}) => {
+ const router = useRouter();
+
+ // Handle logout
+ const handleLogout = () => {
+ // TODO: Implementar lógica real de logout quando auth estiver pronto
+ toast.success("Logout realizado com sucesso!");
+ router.push("/sign-in");
+ };
+
+ // Container width classes
+ const containerClasses = {
+ sm: "max-w-screen-sm",
+ md: "max-w-screen-md",
+ lg: "max-w-screen-lg",
+ xl: "max-w-screen-xl",
+ "2xl": "max-w-screen-2xl",
+ full: "max-w-full",
+ };
+
+ return (
+
+ {/* Skip to main content - Accessibility */}
+
+ Pular para conteúdo principal
+
+
+ {/* TopNavBar - Fixed */}
+
+
+ {/* Main Content Area */}
+
+
+ {children}
+
+
+
+ {/* Mobile Bottom Nav Spacer */}
+
+
+ );
+};
+
+/**
+ * DashboardLayoutSimple - Versão sem container para páginas full-width
+ *
+ * @description Útil para dashboards, mapas, editores, etc.
+ */
+export const DashboardLayoutSimple: React.FC<
+ Omit
+> = ({ children, user, className = "" }) => {
+ const router = useRouter();
+
+ const handleLogout = () => {
+ toast.success("Logout realizado com sucesso!");
+ router.push("/sign-in");
+ };
+
+ return (
+
+ );
+};
diff --git a/components/layout/index.ts b/components/layout/index.ts
new file mode 100644
index 00000000..8ff6c5e1
--- /dev/null
+++ b/components/layout/index.ts
@@ -0,0 +1,11 @@
+/**
+ * Layout Components - SPE-M
+ *
+ * @description Componentes de layout reutilizáveis
+ */
+
+export { TopNavBar } from "./top-nav-bar";
+export type { TopNavBarProps, TopNavBarUser } from "./top-nav-bar";
+
+export { DashboardLayout, DashboardLayoutSimple } from "./dashboard-layout";
+export type { DashboardLayoutProps } from "./dashboard-layout";
diff --git a/components/layout/top-nav-bar.tsx b/components/layout/top-nav-bar.tsx
new file mode 100644
index 00000000..0fa56fda
--- /dev/null
+++ b/components/layout/top-nav-bar.tsx
@@ -0,0 +1,332 @@
+/**
+ * TopNavBar - SPE-M Medical System Navigation
+ *
+ * @description Barra de navegação fixa no topo com glassmorphism Apple Vision Pro
+ *
+ * ESTRUTURA:
+ * - Altura: 64px (h-16)
+ * - Posição: fixed top-0 z-50
+ * - Background: glassmorphism com blur
+ * - Border bottom: border-subtle
+ *
+ * LAYOUT:
+ * [Logo] [Nav Links] [Spacer] [Search] [Notifications] [Theme Toggle] [User Menu]
+ *
+ * @example
+ * ```tsx
+ *
+ * ```
+ */
+
+"use client";
+
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import {
+ Activity,
+ Search,
+ Bell,
+ ChevronDown,
+ User,
+ Settings,
+ LogOut,
+ Moon,
+ Sun,
+ FileText,
+ Users,
+ LayoutDashboard,
+} from "lucide-react";
+import { useTheme } from "next-themes";
+
+// ============================================
+// TYPES & INTERFACES
+// ============================================
+
+export interface TopNavBarUser {
+ name: string;
+ email: string;
+ avatar?: string;
+ role?: string;
+}
+
+export interface TopNavBarProps {
+ user: TopNavBarUser;
+ onLogout?: () => void;
+}
+
+interface NavLinkProps {
+ href: string;
+ icon: React.ReactNode;
+ children: React.ReactNode;
+ active: boolean;
+}
+
+// ============================================
+// SUB-COMPONENTS
+// ============================================
+
+/**
+ * NavLink - Link de navegação com estado ativo
+ */
+const NavLink: React.FC = ({ href, icon, children, active }) => {
+ return (
+
+ {icon}
+ {children}
+
+ );
+};
+
+// ============================================
+// MAIN COMPONENT
+// ============================================
+
+export const TopNavBar: React.FC = ({ user, onLogout }) => {
+ const pathname = usePathname();
+ const { theme, setTheme } = useTheme();
+ const [mounted, setMounted] = useState(false);
+
+ // Prevent hydration mismatch
+ useState(() => {
+ setMounted(true);
+ });
+
+ // Helper function to check if path is active
+ const isActive = (path: string): boolean => {
+ if (path === "/dashboard") {
+ return pathname === "/dashboard";
+ }
+ return pathname.startsWith(path);
+ };
+
+ // Get user initials for avatar fallback
+ const getUserInitials = (name: string): string => {
+ return name
+ .split(" ")
+ .map((n) => n[0])
+ .join("")
+ .toUpperCase()
+ .slice(0, 2);
+ };
+
+ return (
+
+ );
+};