# Model Context Protocol (MCP) - Angular Workspace ## 📋 Visão Geral do Projeto Este é um workspace Angular multi-projeto com foco em gerenciamento de frota de veículos (PraFrota), incluindo sistema de escala e aplicações IDT. O projeto utiliza Angular 19.2.x com arquitetura modular baseada em domínios. ## 🏗️ Estrutura do Workspace ``` angular-workspace/ ├── projects/ │ ├── idt_app/ # Aplicação principal PraFrota │ ├── idt_pattern/ # Biblioteca de padrões │ ├── libs/ # Bibliotecas compartilhadas │ ├── cliente/ # Aplicação cliente │ └── escala/ # Sistema de escala ├── environments/ # Configurações de ambiente ├── proxy.conf.json # Configuração de proxy └── mercado-live-routes-data.json # Dados de rotas ``` ### Projetos Principais 1. **idt_app**: Aplicação principal para gerenciamento de frota 2. **escala**: Sistema de gerenciamento de escalas 3. **cliente**: Aplicação voltada para clientes 4. **libs**: Bibliotecas compartilhadas entre projetos ## 📊 Dashboard Tab System ⭐ **NOVO** ### Visão Geral Sistema de dashboard automático integrado ao `BaseDomainComponent` que adiciona uma aba de dashboard antes da aba de lista em qualquer domínio. ### Características - **Aba Dashboard**: Aparece automaticamente ANTES da "Lista de [Domínio]" - **KPIs Automáticos**: Total, Ativos, Recentes (últimos 7 dias) - **KPIs Customizados**: Definidos por domínio - **Design Responsivo**: Desktop e mobile - **Dark Mode**: Suporte completo - **Configuração Simples**: Apenas uma flag `showDashboardTab: true` ### Implementação ```typescript // Em qualquer domínio (ex: vehicles.component.ts) protected override getDomainConfig(): DomainConfig { return { domain: 'vehicle', title: 'Veículos', entityName: 'veículo', subTabs: ['dados', 'documentos'], showDashboardTab: true, // ✅ Habilita dashboard dashboardConfig: { // ✅ Configuração opcional customKPIs: [ { id: 'active-vehicles', label: 'Veículos Ativos', value: '150', icon: 'fas fa-car', color: 'success', trend: 'up', change: '+5%' } ] }, columns: [...] }; } ``` ### Componentes Envolvidos - `BaseDomainComponent`: Lógica de criação das abas - `DomainDashboardComponent`: Componente visual do dashboard - `TabSystemComponent`: Renderização das abas ### Documentação - [Dashboard Tab System Guide](../components/DASHBOARD_TAB_SYSTEM.md) - [BaseDomainComponent](../architecture/BASE_DOMAIN_COMPONENT.md) ## 🎯 Domínios de Negócio ### IDT App - Estrutura de Domínios ``` projects/idt_app/src/app/domain/ ├── vehicles/ # Gerenciamento de veículos ├── drivers/ # Gerenciamento de motoristas ├── routes/ # Gerenciamento de rotas ├── finances/ # Gestão financeira └── session/ # Controle de sessão ``` ### Shared Resources ``` projects/idt_app/src/app/shared/ ├── components/ # Componentes reutilizáveis │ └── tab-system/ # Sistema de abas para edição ├── services/ # Serviços compartilhados └── interfaces/ # Interfaces TypeScript ``` ## 🔧 Configurações Técnicas ### Scripts NPM Principais - `ng serve`: Desenvolvimento geral - `ESCALA_development`: Desenvolvimento do sistema de escala - `serve:prafrota`: Desenvolvimento da aplicação PraFrota - `build:prafrota`: Build de produção da aplicação PraFrota - `build:prafrota --watch`: Build contínuo para desenvolvimento PWA - `http-server dist/idt_app -p 8080 --ssl`: Servir PWA com HTTPS local ### Dependências Principais - **Angular**: 19.2.13 (Core framework) - **Angular Material**: 19.2.9 (UI Components) - **Leaflet**: Mapas interativos - **NgxMask**: Máscaras de input - **RxJS**: Programação reativa - **TypeScript**: 5.5.4 ## 🌐 Integração de APIs ### Backend Principal - PraFrota - **URL Base**: `https://prafrota-be-bff-tenant-api.grupopra.tech` - **Versão**: v1 - **Autenticação**: Bearer Token (JWT) ### APIs Externas Integradas #### ViaCEP (Consulta CEP) - **URL**: `https://viacep.com.br/ws/{CEP}/json/` - **Proxy**: Configurado via `proxy.conf.json` - **Service**: `CepService` #### Mercado Livre Routes - **Endpoints**: Multiple APIs consolidados - **Paginação**: Client-side para múltiplas APIs - **Tipos**: FirstMile, LineHaul, LastMile ## 📊 Padrões de Dados ### Interfaces de Rotas Mercado Livre ```typescript // Union type para diferentes tipos de rota type MercadoLiveRouteRaw = FirstMileRoute | LineHaulRoute | LastMileRoute; // Interface unificada para exibição interface MercadoLiveRoute { id: string; routeType: 'first_mile' | 'line_haul' | 'last_mile'; vehicleType?: string; locationName?: string; driverName?: string; departureDate?: Date; status: string; // ... outros campos unificados } ``` ### Mapeamento de Dados Padrão de mapeamento type-safe para consolidação de APIs: ```typescript class RouteMapper { static mapRoutesToInterface(routes: MercadoLiveRouteRaw[]): MercadoLiveRoute[] static mapFirstMileRoute(route: FirstMileRoute): MercadoLiveRoute static mapLineHaulRoute(route: LineHaulRoute): MercadoLiveRoute static mapLastMileRoute(route: LastMileRoute): MercadoLiveRoute } ``` ## 🔍 Serviços Principais ### Logger Service Sistema de logging estruturado com buffer e formatação: ```typescript interface LoggerService { debug(message: string, ...args: any[]): void; info(message: string, ...args: any[]): void; warn(message: string, ...args: any[]): void; error(message: string, ...args: any[]): void; } ``` ### CEP Service Consulta de endereços via ViaCEP: ```typescript @Injectable() export class CepService { consultarCep(cep: string): Observable } ``` ### Route Services Gerenciamento de rotas com paginação local: ```typescript @Injectable() export class MercadoLiveService { loadRoutes(page: number, pageSize: number): Observable } ``` ## 🎨 Padrões de Componentes ### Standalone Components Todos os componentes utilizam o padrão standalone: ```typescript @Component({ selector: 'app-component', standalone: true, imports: [CommonModule, ReactiveFormsModule, MaterialModules], templateUrl: './component.html' }) ``` ### 🎯 TEMPLATE HTML OBRIGATÓRIO - BaseDomainComponent TODOS os componentes que estendem BaseDomainComponent DEVEM usar exatamente este template HTML: ```html
``` **Componentes que seguem este padrão:** - VehiclesComponent ✅ - DriversComponent ✅ - RoutesComponent ✅ - FinancialCategoriesComponent ✅ - AccountPayableComponent ✅ ### 🎯 PADRÃO OBRIGATÓRIO - Services com ApiClientService **NUNCA usar HttpClient diretamente!** Todos os services DEVEM usar ApiClientService: ```typescript import { Injectable } from '@angular/core'; import { Observable, map } from 'rxjs'; import { ApiClientService } from '../../shared/services/api/api-client.service'; import { DomainService } from '../../shared/components/base-domain/base-domain.component'; @Injectable({ providedIn: 'root' }) export class ExampleService implements DomainService { constructor( private apiClient: ApiClientService // ✅ CORRETO // private http: HttpClient // ❌ ERRADO ) {} getEntities(page: number, pageSize: number, filters: any): Observable { return this.apiClient.get(`entities?page=${page}&limit=${pageSize}`); } create(data: any): Observable { return this.apiClient.post('entities', data); } update(id: any, data: any): Observable { return this.apiClient.patch(`entities/${id}`, data); } getById(id: string): Observable { return this.apiClient.get(`entities/${id}`); } delete(id: string): Observable { return this.apiClient.delete(`entities/${id}`); } } ``` **Services que seguem este padrão:** - VehiclesService ✅ - DriversService ✅ - RoutesService ✅ - FinancialCategoriesService ✅ - AccountPayableService ✅ ### 🚫 PADRÕES DE NOMENCLATURA OBRIGATÓRIOS **NUNCA criar métodos com sufixos específicos!** Todos os services DEVEM seguir a nomenclatura padrão: #### ✅ MÉTODOS CORRETOS: ```typescript // Métodos da interface DomainService (OBRIGATÓRIOS) getEntities(page: number, pageSize: number, filters: any) create(data: any): Observable update(id: any, data: any): Observable // Métodos específicos padrão (OBRIGATÓRIOS) getById(id: string): Observable delete(id: string): Observable get[Domain]s(page, limit, filters): Observable> ``` #### ❌ MÉTODOS INCORRETOS (NUNCA usar): ```typescript // ❌ ERRADO - Com sufixos específicos createRoute() // Usar apenas: create() updateRoute() // Usar apenas: update() deleteRoute() // Usar apenas: delete() getRoute() // Usar apenas: getById() // ❌ ERRADO - Nomenclatura não padronizada addEntity(), editEntity(), removeEntity(), findById() ``` #### 📋 VERIFICAÇÃO DE CONFORMIDADE: | Service | create | update | delete | getById | get[Domain]s | |---------|--------|--------|--------|---------|--------------| | VehiclesService | ✅ | ✅ | ✅ | ✅ | getVehicles ✅ | | DriversService | ✅ | ✅ | ✅ | ✅ | getDrivers ✅ | | RoutesService | ✅ | ✅ | ✅ | ✅ | getRoutes ✅ | | FinancialCategoriesService | ✅ | ✅ | ✅ | ✅ | getCategories ✅ | | AccountPayableService | ✅ | ✅ | ✅ | ✅ | getAccounts ✅ | ### Reactive Forms Formulários construídos com FormBuilder: ```typescript constructor(private fb: FormBuilder) { this.form = this.fb.group({ field: ['', [Validators.required]] }); } ``` ### Data Tables Componentes de tabela com paginação, filtros e ordenação usando Angular Material. ### Tab System - Sistema de Abas para Edição Sistema avançado de abas para edição de registros com limite configurável e gestão de estado: #### Configuração Básica ```typescript // Configuração do sistema de abas const tabConfig: TabSystemConfig = { maxTabs: 3, // Limite máximo de abas allowDuplicates: false, // Previne duplicatas autoSave: false, // Auto-save desabilitado confirmClose: true // Confirmação para fechar }; // Eventos do sistema const tabEvents = { onMaxTabsReached: () => { console.warn('Limite máximo de abas atingido!'); }, onUnsavedChanges: (tabs: TabItem[]) => { console.warn('Mudanças não salvas:', tabs); } }; ``` #### Uso no Template ```html ``` #### Adicionar Aba Programaticamente ```typescript async addNewTab(item: any) { const tabItem: TabItem = { id: item.id, title: item.name, type: 'driver', // 'product' | 'vehicle' | 'driver' | 'route' data: item, isLoading: true, isModified: false }; const success = await this.tabSystem.addTab(tabItem); if (success) { // Carregar dados detalhados this.loadItemDetails(item.id); } } ``` #### Aplicação no Domínio de Motoristas Exemplo prático implementado em `drivers-tabs-demo.component.ts`: ```typescript @Component({ selector: 'app-drivers-tabs-demo', standalone: true, imports: [/* Material modules */, TabSystemComponent] }) export class DriversTabsDemoComponent { @ViewChild('tabSystem') tabSystem!: TabSystemComponent; // Configuração específica para motoristas tabConfig: TabSystemConfig = { maxTabs: 4, allowDuplicates: false, autoSave: false, confirmClose: true }; async addDriverTab(driver: Driver): Promise { const tabItem: TabItem = { id: driver.id, title: driver.name, type: 'driver', data: driver, isLoading: true, isModified: false }; const success = await this.tabSystem.addTab(tabItem); if (success) { // Simular carregamento de detalhes setTimeout(() => { this.loadDriverDetails(driver.id); }, 1500); } } private loadDriverDetails(driverId: string): void { // Encontrar a aba e atualizar com dados detalhados const tabs = this.tabSystem.getTabs(); const tabIndex = tabs.findIndex(tab => tab.id === driverId && tab.type === 'driver' ); if (tabIndex !== -1) { const detailedData = { documents: { cnh: '123456789', cnh_expiry: new Date() }, performance_score: 85, status: 'ATIVO' }; this.tabSystem.tabSystemService.updateTab(tabIndex, detailedData); this.tabSystem.tabSystemService.setTabLoading(tabIndex, false); } } } ``` #### Funcionalidades do Sistema de Abas - **Limite Configurável**: Máximo de abas simultâneas - **Prevenção de Duplicatas**: Não permite abrir o mesmo item duas vezes - **Estados de Loading**: Indicadores visuais durante carregamento - **Indicadores de Modificação**: Marcação (*) para itens não salvos - **Ícones por Tipo**: product, vehicle, driver, route - **Botões de Fechar**: Com tooltips e confirmação - **Responsividade**: Adaptação para dispositivos móveis - **Otimização Mobile**: Títulos compactos para telas ≤ 768px - **Debug Mode**: Informações de desenvolvimento - **Eventos**: Sistema completo de callbacks #### Otimização Mobile dos Títulos das Tabs Sistema automático de formatação de títulos para dispositivos móveis: ```typescript // Comportamento automático baseado no tamanho da tela // Mobile (≤ 768px): "Motorista: João Silva" → "João Silva" "Veículo: Toyota Corolla" → "Toyota Corolla" "Novo Motorista" → "Novo Motorista" (inalterado) // Desktop (> 768px): "Motorista: João Silva" → "Motorista: João Silva" (completo) ``` **Implementação:** - **Detecção**: Automática via `@HostListener('window:resize')` - **Lógica**: Remove domínio apenas se contém ":" e não inicia com "Novo" - **Responsivo**: Atualização instantânea ao redimensionar - **Universal**: Funciona para todos os domínios (motoristas, veículos, etc.) ## 📊 Data-Table - Otimização Mobile ### Melhorias de Responsividade #### Header da Tabela (Mobile ≤ 768px) **Layout reorganizado em duas linhas:** ``` ┌─────────────────────────────────────┐ │ [🔍 Busca Global - 80%] [Filtros-20%]│ ← Linha 1 │ [Requisições] [Col] [Grup] [5▼] [Exp] │ ← Linha 2 └─────────────────────────────────────┘ ``` **Funcionalidades:** - **Busca Global**: 80% da largura para máximo aproveitamento - **Botões Compactos**: Textos reduzidos ("Col", "Grup", "Exp") - **Layout Edge-to-Edge**: Sem bordas laterais para ganho de espaço - **Filtros Expansíveis**: Sistema toggle para filtros por coluna #### Paginação Otimizada **Mobile:** ``` ┌─────────────────────────────────────┐ │ 1-5 de 5 [◀] [1] [2] [3] [▶] │ ← Linha única └─────────────────────────────────────┘ ``` **Melhorias implementadas:** - **Texto Compacto**: "1-5 de 5" ao invés de "Exibindo 1 a 5 de 5 registros" - **Altura Reduzida**: padding otimizado (0.375rem mobile vs 0.75rem desktop) - **Layout Horizontal**: Forçado em linha única para mobile - **Alinhamento Inteligente**: Texto à esquerda, controles à direita - **Navegação Compacta**: Botões menores com espaçamento otimizado #### CSS Budget Management Sistema de compressão avançada para manter funcionalidades dentro do limite: ```scss // Seção ultra-comprimida para mobile @media (max-width: 768px) { .data-table-container,.table-menu{border-left:none!important;border-right:none!important;border-radius:0!important;margin:0!important} .pagination{padding:.375rem .5rem!important;flex-direction:row!important;justify-content:space-between!important} // ... regras comprimidas } ``` **Estratégias aplicadas:** - **Compressão Manual**: Remoção de espaços e comentários - **Seletores Combinados**: Agrupamento de regras similares - **Important Flags**: Uso estratégico para sobrescrever padrões - **Propriedades Mínimas**: Apenas essenciais para mobile ## 📄 Paginação Multi-API ### Padrão para Consolidação de APIs ```typescript loadRoutes(page: number, pageSize: number) { // 1. Buscar dados de múltiplas APIs const requests = [ this.api.getFirstMile(1, 1000), this.api.getLineHaul(1, 1000), this.api.getLastMile(1, 1000) ]; // 2. Consolidar dados forkJoin(requests).subscribe(results => { const allRoutes = results.flat(); const mappedRoutes = this.mapRoutesToInterface(allRoutes); // 3. Aplicar paginação local const startIndex = (page - 1) * pageSize; const endIndex = startIndex + pageSize; const paginatedRoutes = mappedRoutes.slice(startIndex, endIndex); this.routes = paginatedRoutes; this.totalCount = mappedRoutes.length; }); } ``` ## 🗂️ Estrutura de Arquivos ### Convenções de Nomenclatura - **Arquivos**: `kebab-case` (ex: `vehicle-form.component.ts`) - **Classes**: `PascalCase` (ex: `VehicleFormComponent`) - **Propriedades**: `camelCase` (ex: `vehicleName`) - **Constantes**: `SCREAMING_SNAKE_CASE` (ex: `API_BASE_URL`) ### Organização por Feature ``` domain/vehicles/ ├── components/ │ ├── vehicle-form/ │ ├── vehicle-list/ │ └── vehicle-map/ ├── services/ │ └── vehicle.service.ts ├── interfaces/ │ └── vehicle.interface.ts └── vehicle.routes.ts ``` ## ⚙️ Configurações de Desenvolvimento ### Proxy Configuration ```json { "/api/ws/*": { "target": "https://viacep.com.br", "secure": true, "changeOrigin": true, "logLevel": "debug" } } ``` ### Environment Configuration - **Development**: Local development settings - **Production**: Production optimizations - **Debug Remote**: Remote debugging configuration ## 🔐 Autenticação e Segurança ### Headers Obrigatórios ```http Content-Type: application/json Authorization: Bearer X-Tenant-ID: X-Client-Version: 1.0.0 ``` ### Gestão de Tokens - **JWT**: Bearer tokens para autenticação - **Refresh**: Renovação automática de tokens - **Tenant**: Multi-tenancy via headers ## 📱 Recursos de UI/UX ### Angular Material Componentes Material Design integrados: - Tables com paginação otimizada para mobile - Forms com validação responsiva - Navigation com sidenav adaptativo - Cards e layouts responsivos ### Sistema de Abas Avançado - **Tab System**: Gerenciamento inteligente de abas de edição - **Mobile First**: Títulos otimizados automaticamente para mobile - **Estado Persistente**: Controle de modificações não salvas - **Limite Inteligente**: Máximo configurável de abas simultâneas ### Data-Table Responsiva - **Header Adaptativo**: Layout reorganizado em mobile (duas linhas) - **Paginação Compacta**: Texto reduzido e controles otimizados - **Edge-to-Edge**: Aproveitamento máximo da tela em mobile - **Filtros Inteligentes**: Sistema expansível para dispositivos móveis ### PWA (Progressive Web App) ✅ NOVO Implementação completa de Progressive Web App com funcionalidades nativas: #### Funcionalidades Principais - **Instalação Nativa**: Prompt automático para instalar como app - **Updates Automáticos**: Notificações de novas versões disponíveis - **Offline Ready**: Service Worker configurado para cache - **Notificações Visuais**: Interface responsiva para interações PWA - **Debug Tools**: Painel de desenvolvimento para testes - **Cross-Platform**: Suporte completo para desktop e mobile #### Estrutura de Implementação **Serviços PWA:** ```typescript // PWAService - Gerenciamento principal @Injectable({ providedIn: 'root' }) export class PWAService { // Observables para estado PWA public installPromptAvailable$: Observable public updateAvailable$: Observable // Métodos principais public async activateUpdate(): Promise public async showInstallPrompt(): Promise public async checkForUpdate(): Promise // Verificações de estado public isInstalledPWA(): boolean public isPWASupported(): boolean } ``` **Componente de Notificações:** ```typescript // PWANotificationsComponent - Interface visual @Component({ selector: 'app-pwa-notifications', standalone: true }) export class PWANotificationsComponent { showUpdateNotification = false; showInstallNotification = false; showDebugInfo = false; // ✅ Desabilitado para produção (padrão) } ``` #### Configuração e Setup **1. Service Worker Configuration** (`ngsw-config.json`): ```json { "index": "/index.html", "assetGroups": [ { "name": "app", "installMode": "prefetch", "resources": { "files": ["/favicon.ico", "/index.html", "/manifest.webmanifest", "/*.css", "/*.js"] } }, { "name": "assets", "installMode": "lazy", "updateMode": "prefetch", "resources": { "files": ["/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"] } } ] } ``` **2. Manifest PWA** (`manifest.webmanifest`): ```json { "name": "IDT App - Gestão Inteligente", "short_name": "IDT App", "display": "standalone", "orientation": "portrait-primary", "theme_color": "#FFC82E", "background_color": "#FFFFFF", "categories": ["business", "productivity", "utilities"], "icons": [/* Ícones de 72x72 até 512x512 */] } ``` **3. Build Configuration** (`angular.json`): ```json { "configurations": { "production": { "serviceWorker": "projects/idt_app/ngsw-config.json", "budgets": [{"type": "initial", "maximumWarning": "4mb", "maximumError": "5mb"}] } } } ``` #### Fluxos de Funcionamento **Fluxo de Atualização:** 1. Service Worker detecta nova versão disponível 2. PWAService emite evento via Observable 3. PWANotificationsComponent exibe notificação 4. Usuário clica "Atualizar agora" 5. Service Worker ativa nova versão e recarrega app **Fluxo de Instalação:** 1. Browser dispara evento `beforeinstallprompt` 2. PWAService intercepta e armazena evento 3. Exibe notificação de instalação 4. Usuário clica "Instalar" 5. Mostra dialog nativo do browser 6. Detecta instalação via `appinstalled` #### Interface Responsiva **Desktop - Notificações no canto superior direito:** ```scss .pwa-notification { position: fixed; top: 80px; right: 20px; max-width: 400px; } ``` **Mobile - Bottom sheet acima do footer menu:** ```scss @media (max-width: 768px) { .pwa-notification { bottom: 80px; /* Acima do mobile footer */ left: 10px; right: 10px; max-width: none; } } ``` #### Suporte por Plataforma **Desktop (Chrome, Edge, Firefox):** - ✅ Prompt de instalação automático - ✅ Ícone na barra de tarefas - ✅ Janela standalone - ✅ Notificações de update **Mobile (Android):** - ✅ Add to Home Screen - ✅ Splash screen personalizada - ✅ Tema da status bar (#FFC82E) - ✅ Orientação portrait **iOS (Safari):** - ✅ Add to Home Screen (manual) - ✅ Meta tags específicas - ⚠️ Limitações do Safari PWA #### Debug e Teste **Debug Panel** (desabilitado por padrão, comentado para reativação): ```typescript // 🔧 DEBUG PWA - Painel de desenvolvimento // showDebugInfo = true; // ✅ Habilitar para desenvolvimento/testes showDebugInfo = false; // ✅ Desabilitado para produção (padrão) ``` **Informações exibidas:** - PWA Suportado: ✅/❌ - PWA Instalado: ✅/❌ - Pode Instalar: ✅/❌ - Update Disponível: ✅/❌ **Console Logs informativos:** ```typescript console.log('🚀 IDT App inicializado'); console.log('📱 PWA Suportado:', this.isPWASupported()); console.log('🏠 PWA Instalado:', this.isInstalledPWA()); console.log('🔄 Nova versão disponível!'); console.log('📲 Prompt de instalação PWA disponível'); ``` #### Comandos de Teste **Desenvolvimento PWA:** ```bash # Build de produção (necessário para Service Worker) npm run build:prafrota # Servir com HTTPS (necessário para PWA) npx http-server dist/idt_app -p 8080 --ssl # Acessar: https://localhost:8080 ``` **Testar Updates:** ```bash # 1. Build inicial npm run build:prafrota # 2. Alterar código (ex: adicionar console.log) # 3. Build novamente npm run build:prafrota # 4. Service Worker detectará automaticamente a mudança ``` **DevTools - Verificações:** - **Application > Manifest**: Validar configurações PWA - **Application > Service Workers**: Status do SW - **Lighthouse**: Audit PWA score (esperado: 90-100/100) - **Network > Offline**: Testar funcionamento offline #### Métricas de Performance **Bundle Impact:** ``` PWA Service: ~3kB gzipped PWA Component: ~2kB gzipped Service Worker: ~15kB (Angular SW) Total Impact: ~20kB ``` **Lighthouse PWA Criteria:** - ✅ Manifest válido - ✅ Service Worker registrado - ✅ Ícones adequados (72px-512px) - ✅ HTTPS em produção - ✅ Viewport responsivo - ✅ Splash screen configurada - ✅ Theme color definido #### Futuras Melhorias **Push Notifications:** - Integração com Firebase Cloud Messaging - Notificações de sistema - Badge counts no ícone **Offline Advanced:** - Cache de dados críticos de API - Background sync - Indicador de status de conectividade **App Shortcuts:** - Quick actions no ícone do app - Jump lists personalizadas - Context menus ### Otimizações Mobile Gerais - **Breakpoint**: ≤ 768px para mobile - **Touch-Friendly**: Controles adequados para toque - **Edge-to-Edge**: Layouts que aproveitam toda a tela - **Responsive Typography**: Textos adaptados para cada dispositivo - **PWA Mobile**: Interface nativa com splash screen e tema personalizado - **Navigation**: Bottom sheets e drawers adaptivos - **Performance**: Lazy loading e otimizações específicas para mobile ### 🔒 Prevenção de Zoom Mobile ✅ NOVO Implementação completa para experiência nativa sem zoom indesejado: #### Funcionalidades Implementadas - **Double-tap Prevention**: Bloqueia zoom por dois toques - **Pinch Prevention**: Desabilita zoom por dois dedos - **Keyboard Zoom Prevention**: Previne Ctrl+/- no desktop - **Pull-to-refresh Control**: Gerencia refresh contextual - **iOS Optimization**: Font-size 16px para prevenir auto-zoom #### Configuração Técnica **1. Meta Viewport** (index.html): ```html ``` **2. CSS Prevention** (app.scss): ```scss html, body { touch-action: manipulation; /* Previne pinch/double-tap */ -webkit-touch-callout: none; -webkit-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; } /* Permite seleção em inputs */ input, textarea, select, [contenteditable] { user-select: text; font-size: 16px !important; /* Previne auto-zoom iOS */ } ``` **3. JavaScript Service** (MobileBehaviorService): ```typescript @Injectable({ providedIn: 'root' }) export class MobileBehaviorService { // Prevenção automática de zoom // Otimização de touch // Controle de pull-to-refresh // Detecção de dispositivo mobile } ``` #### Comportamentos Controlados **Zoom Prevention:** - ❌ Double-tap zoom - ❌ Pinch zoom (dois dedos) - ❌ Ctrl+scroll zoom - ❌ Keyboard zoom (Ctrl +/-) **Preservado:** - ✅ Scroll vertical/horizontal - ✅ Seleção de texto em inputs - ✅ Navegação por touch - ✅ Swipe gestures em carousels **Mobile Experience:** - ✅ Experiência nativa sem zoom - ✅ Touch-action otimizado - ✅ 300ms delay removido - ✅ Safe areas respeitadas - ✅ PWA standalone optimized ## 🧪 Testes e Qualidade ### Estrutura de Testes - **Unit Tests**: Jasmine + Karma - **E2E Tests**: Protractor/Cypress (configuração futura) - **Linting**: ESLint + Angular ESLint ### Code Quality - **TypeScript**: Tipagem estrita - **Interfaces**: Contratos bem definidos - **Services**: Injeção de dependência - **Observables**: Programação reativa com RxJS ## 🚀 Deploy e Build ### Scripts de Build - **Development**: `ng serve` - **Production**: `ng build --configuration=production` - **Specific Projects**: Scripts individuais por projeto ### Otimizações - **Tree Shaking**: Remoção de código não utilizado - **Lazy Loading**: Carregamento sob demanda - **Service Workers**: PWA capabilities ## 📚 Documentação Adicional ### Links Úteis - [Angular Documentation](https://angular.io/docs) - [Angular Material](https://material.angular.io/) - [RxJS Documentation](https://rxjs.dev/) - [Leaflet Documentation](https://leafletjs.com/) ### Documentação PWA - **PWA_IMPLEMENTATION.md**: Guia técnico completo da implementação PWA (400+ linhas) - **PWA_QUICK_START.md**: Guia rápido para desenvolvimento e troubleshooting PWA - **Service Worker**: Configuração avançada em `ngsw-config.json` - **Manifest**: Especificações PWA em `manifest.webmanifest` ### Padrões de Arquitetura ✅ NOVO - **PATTERNS_INDEX.md**: Índice centralizado de todos os padrões documentados - **APP_COMPONENT_PATTERN.md**: Padrão de integração PWA/Mobile no app.component.ts - **MOBILE_ZOOM_PREVENTION.md**: Implementação completa de prevenção de zoom mobile - **Tab System**: Sistema avançado de abas para edição com gestão de estado - **Data Table**: Componentes responsivos com otimizações mobile ### Patterns e Best Practices - **DDD**: Domain Driven Design - **SOLID**: Princípios de desenvolvimento - **Reactive Programming**: RxJS patterns - **Component Communication**: Input/Output, Services, State Management - **PWA Best Practices**: Offline-first, installable, reliable --- *Este documento serve como referência central para o desenvolvimento e manutenção do projeto Angular workspace. Mantenha-o atualizado conforme as mudanças na arquitetura e funcionalidades.* **Última atualização**: Janeiro 2025 - Adicionada implementação completa PWA com notificações automáticas, prompts de instalação e documentação técnica detalhada.