# VentoApp — NBR 6123:2023

> **Status (jul/2026):** 8/8 marcos concluídos. 100% de cobertura da NBR 6123:2023.
> **Próximas melhorias:** ver [`../PROGRESS.md`](../PROGRESS.md) seção "Roadmap pós-Marco 8".

Aplicativo para cálculo de cargas de vento conforme a norma brasileira **ABNT NBR 6123:2023** — Forças devidas ao vento em edificações.

## 🎯 Cobertura

Implementa **100% das seções e anexos normativos**:

- **Sec. 5** — Velocidade característica (V₀, S₁, S₂, S₃, mudança de rugosidade)
- **Sec. 6.1** — Edificações paralelepipédicas (Tabelas 6–12, excentricidade, atrito, alta turbulência)
- **Sec. 6.2** — Superfícies curvas: cilindros, abóbadas, cúpulas (Tabelas 13–22)
- **Sec. 6.3** — Pressão interna (Cpi) — método simplificado + detalhado
- **Sec. 6.4** — Efeitos de vizinhança (fᵥ)
- **Sec. 7** — Muros, placas, coberturas isoladas (Tabelas 23–25)
- **Sec. 8** — Barras prismáticas, reticulados, torres (Tabelas 26–30 + Figs 12–18)
- **Sec. 9** — Efeitos dinâmicos em estruturas alteadas, conforto humano
- **Sec. 10** — Vibração por desprendimento de vórtices (Vcr, Scruton)
- **Sec. 11** — Ação de vento em pontes (Pse, flutter, galope)
- **Anexos A, B, C** — S₂(qualquer t), S₃(Pₘ, vida útil), 49 estações meteorológicas

## 🚀 Stack

- React 19 + TypeScript + Vite 8
- Tailwind v4 + shadcn/ui (new-york)
- Zustand (estado)
- @react-three/fiber + drei (3D)
- @react-pdf/renderer (PDF)
- Vitest (testes) — 38/38 passando

## 🧪 Scripts

```bash
cd app
npm run dev        # desenvolvimento (HMR)
npm run build      # tsc + vite build
npm run lint       # oxlint
npm test           # vitest run (38 testes)
npm run test:watch # vitest watch
```

> **Atenção:** Os binários em `node_modules/.bin/` perdem o bit de execução. Se reclamar `Permission denied`, rode `chmod +x node_modules/.bin/<bin>` antes.

## 📁 Estrutura

```
app/src/
├── lib/
│   ├── wind-kernel.ts          Motor matemático
│   ├── bilinear-interp.ts      Interpolação bilinear (sec. 3.2)
│   ├── log-interp.ts           Interpolação log-linear
│   ├── wind-direction.ts       Mudança de rugosidade (sec. 5.5)
│   ├── internal-pressure.ts    Cpi (sec. 6.3)
│   ├── neighborhood.ts         fᵥ (sec. 6.4)
│   ├── coefficients.ts         Cpe paredes/telhados (Tab. 6-12)
│   ├── excentricity.ts         ea, eb (sec. 6.1.4)
│   ├── friction.ts             Força de atrito (sec. 6.1.5)
│   ├── drag.ts                 Ca baixa/alta turbulência (Figs 4-5)
│   ├── comfort.ts              a_lim ISO 10137
│   ├── storage.ts              Persistência IndexedDB
│   ├── theme.tsx               Dark/light mode
│   ├── i18n.ts                 Strings pt-BR/en-US
│   ├── stations-lookup.ts      49 estações Anexo C
│   ├── export-pdf.tsx          PDF didático
│   ├── export-csv.ts           CSV estruturado
│   ├── modules/                Strategy pattern (7 módulos)
│   ├── nbr-tables/             36 tabelas + 3 anexos
│   ├── hooks/useProjects.ts    Hook React
│   └── __tests__/              Vitest (5 suites, 38 testes)
├── components/
│   ├── ui/                     shadcn/ui
│   ├── three/
│   │   ├── Cylinder3D.tsx
│   │   ├── Vault3D.tsx
│   │   └── Dome3D.tsx
│   ├── Warehouse3D.tsx         Galpão com zonas A-J
│   └── ExportMenu.tsx
├── pages/                       10 páginas
├── store/                       Zustand
└── App.tsx                     Rotas + ThemeProvider + Layout
```

## 📋 Módulos (páginas ativas)

| Rota | Módulo | Tabelas/Figs |
|------|--------|--------------|
| `/galpao` | Galpão retangular com 3D zonas A–J | 6, 7 |
| `/cilindro` | Silos, chaminés, reservatórios | 13 + Reynolds |
| `/abobada` | Abóbadas cilíndricas | 15–20 |
| `/cupula` | Cúpulas (terreno/parede) | 21, 22 + F sust |
| `/muros` | Muros e placas retangulares | 23 |
| `/cobertura-isolada` | Cob. isoladas (uma e duas águas) | 24, 25 |
| `/barras` | Barras (faces planas/circulares) | 26–28 |
| `/pontes` | Pontes (Pse, Cx/Cz, flutter, galope) | 35, 36 + sec. 11 |
| `/dinamica` | Dinâmica + vórtices + conforto | 31–34 |
| `/settings` | Tema, persistência, estado | — |

## 📐 Fórmula central

```
Vₖ = V₀ · S₁ · S₂ · S₃
q  = 0,613 · Vₖ² / 1000  [kN/m²]
p  = q · (Cpe − Cpi)      [kN/m²]
```

## 🧪 Testes (38/38 ✅)

```bash
npm test
```

Cobrem:
- **Motor matemático** (classe, S₂, Vₖ, q, S₃) — 14 testes
- **Interpolação bilinear e log** — 5 testes
- **Cpi simplificado + clamp** — 9 testes
- **Vizinhança** — 4 testes
- **Reynolds + regime de escoamento** — 6 testes

## 💾 Persistência

Projetos salvos em IndexedDB (browser local). Configurações de tema também em `localStorage`.

## 🌗 Temas

- Light, Dark, System (segue `prefers-color-scheme`)
- Toggle em `/settings`

## 📚 Documentação adicional

- [`../PROGRESS.md`](../PROGRESS.md) — Estado atual + roadmap de melhorias futuras
- [`../PLAN.md`](../PLAN.md) — Plano histórico dos 8 marcos
- [`../AGENTS.md`](../AGENTS.md) — Guia para IAs continuarem o trabalho
- [`../NBR-6123-2023.pdf`](../NBR-6123-2023.pdf) — Norma oficial

## 🚧 Próximas melhorias (resumo)

| ID | Item | Esforço | Impacto |
|----|------|---------|---------|
| **M9.1** | Refinar tabelas a partir do PDF real | 3 dias | Alto |
| **M9.2** | Cargas lineares (kN/m) por barra | 2 dias | Alto |
| **M9.3** | Screenshot 3D no PDF | 1 dia | Médio |
| **M9.4** | Export Ftool (.txt) | 2 dias | Médio |
| **M9.5** | Refatoração TypeScript (eliminar `void`) | 1 dia | Baixo |
| **M9.6** | 3D para muros/torres/pontes/barras | 3 dias | Médio |
| **M9.7** | Import JSON de projetos | 1 dia | Médio |
| **M9.8** | i18n completo (en-US) | 2 dias | Baixo |
| **M9.9** | Validação contra Blessmann | 2 dias | Alto |
| **M9.10** | Dark mode em gráficos SVG | 0.5 dia | Baixo |
| **M9.11** | Persistência em servidor (especulativo) | — | — |
| **M9.12** | Testes E2E com Playwright | 2 dias | Médio |

Detalhes e contexto em [`../PROGRESS.md`](../PROGRESS.md).

---

**Aviso:** Esta ferramenta é auxiliar. O projetista é responsável pela validação final dos resultados conforme a NBR 6123:2023 e pela emissão de ART.