Documentação de Engenharia
Análise técnica da arquitetura Client-Side Only, estratégias de privacidade e implementação de PWA.
1. Arquitetura Privacy-First
Ao contrário de soluções SaaS tradicionais, o ContractFlow adota uma abordagem Zero-Knowledge no servidor. Toda a lógica de negócios, persistência de dados e geração de arquivos ocorre no dispositivo do cliente.
Server Side
Apenas hospedagem estática (HTML/JS/Assets). Nenhum banco de dados.
Client Side
Engine de Templates, Renderização de PDF, LocalStorage e Service Workers.
2. Multi-Niche Context Engine
O sistema utiliza um dicionário de dados estruturado para adaptar a interface com base na profissão selecionada. Isso permite escalabilidade infinita de nichos sem alterar a lógica principal.
const INDUSTRY_DATA = { dev: { templates: [ { label: 'Site Institucional', icon: 'fa-laptop-code', items: [...] }, { label: 'App Mobile', icon: 'fa-mobile-screen', items: [...] } ] }, marketing: { templates: [ { label: 'Gestão de Tráfego', icon: 'fa-chart-line', items: [...] } ] } // Fácil extensão para novos nichos };
3. Client-Side PDF Generation
Utilizamos a biblioteca jsPDF para desenhar o documento vetorizado pixel-perfect diretamente no Canvas do navegador.
O sistema suporta injeção de imagens (Logos) convertendo-as para Base64 em tempo de execução.
async function generatePDF() { const doc = new window.jsPDF({ format: 'a4' }); // 1. Renderização do Cabeçalho (Blue Brand) doc.setFillColor(30, 58, 138); doc.rect(0, 0, pageWidth, 40, 'F'); // 2. Processamento do Logo (White Label) if (logoInput.files[0]) { const imgData = await readFileAsDataURL(logoInput.files[0]); doc.addImage(imgData, 'PNG', ...coords); } doc.save('Contrato_Final.pdf'); }
4. PWA & Offline First
Implementação de Service Workers para cacheamento de assets críticos (CSS, Fontes, JS Libs). Isso permite que a aplicação seja instalada (Add to Home Screen) e funcione sem conexão com a internet.
// sw.js - Service Worker Strategy self.addEventListener('fetch', (e) => { e.respondWith( caches.match(e.request).then((response) => { // Retorna do cache ou busca na rede return response || fetch(e.request); }) ); });