Arquitetura de Software
Componentes
flowchart LR
Browser["Navegador"] --> React["React 18"]
React --> Router["TanStack Router"]
React --> Query["TanStack Query"]
React --> UI["Componentes UI"]
Query --> Api["src/lib/api.ts"]
Api --> Demo["src/lib/demo-api.ts"]
Demo --> Loader["src/mocks/corpus-loader.ts"]
Loader --> PublicJson["JSON público do tenant"]
Loader --> Fallback["src/mocks/data.ts"]
Demo --> Storage["localStorage"]
Demo --> Export["ExportMenu / Blob download"]
React --> Theme["siteConfig + variáveis CSS"]
Resolução de tenant
flowchart TD
A["Inicialização Vite"] --> B["Ler VITE_PHPB_TENANT"]
B --> C{"Tenant definido?"}
C -- "sim" --> D["TENANT_CONFIGS[tenant]"]
C -- "não" --> E["TENANT_CONFIGS.hub"]
D --> F["siteConfig"]
E --> F
F --> G["Tema"]
F --> H["Conteúdo institucional"]
F --> I["dataUrl"]
F --> J["projectRoute"]
Carregamento de corpus
sequenceDiagram
participant UI as "Página React"
participant Query as "TanStack Query"
participant Api as "demo-api"
participant Loader as "loadCorpus"
participant Json as "JSON público"
participant Store as "localStorage"
participant Fallback as "fixtures"
UI->>Query: queryFn()
Query->>Api: api.collections.list()
Api->>Loader: loadCorpus()
Loader->>Json: fetch(siteConfig.dataUrl)
alt JSON carregado
Json-->>Loader: CorpusPayload
else falha
Loader->>Fallback: import('./data')
Fallback-->>Loader: CorpusPayload
end
Loader->>Store: ler overrides
Store-->>Loader: correções locais
Loader-->>Api: payload aplicado
Api-->>Query: dados filtrados
Query-->>UI: renderização
Exportação
sequenceDiagram
participant User as "Usuário"
participant Menu as "ExportMenu"
participant Api as "api.export.corpus"
participant Demo as "demo-api"
participant Browser as "Navegador"
User->>Menu: seleciona formato
Menu->>Api: corpus(format, payload)
Api->>Demo: resolve documentos/amostras/análise
Demo-->>Api: ExportResponse
Api-->>Menu: filename, mime_type, content
Menu->>Browser: Blob + link.download