# Workstream F — Front (derivado do `maps.js`, não 100%)

> Objetivo: front **próprio do `Central2`**, usando `controladores/_Src/maps.js` como **base/referência**, mas **coeso/desacoplado**. Workstream **paralelo** (F-1/F-2 após B0; F-3 após B1).
> Ref. PRD: §11 (decisão de front) + D-2. ⚠️ **Não editar** o `maps.js` compartilhado — é a fronteira fixa da V1; o front da V2 é asset separado sob `Central2/html/`.

---

## F-1 — Portar núcleo de mapa/markers/desenho de rota ⬜

- **Status:** ⬜ · **Esforço:** L · **Depende de:** B0-1
- **Objetivo:** trazer do `maps.js` a parte provider-agnóstica (render do mapa, markers, desenho/colorização de rota) para um asset próprio.
- **Arquivos:** `html/central2.js` (+ módulos auxiliares sob `html/`)
- **Critérios de aceite:**
  - [ ] Núcleo de mapa/markers/rota funciona isolado, sem depender do `maps.js` global.
  - [ ] Nenhuma linha do `controladores/_Src/maps.js` editada.
  - [ ] Identificado e **deixado de fora** o código morto/legado do `maps.js`.

## F-2 — Store de estado (substitui o textarea `.rotasGeradas`) ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** F-1
- **Objetivo:** fonte de verdade de estado explícita (store), em vez do hack do textarea oculto da V1.
- **Critérios de aceite:**
  - [ ] Estado das rotas num store único, sem `.rotasGeradas`.
  - [ ] Mutações centralizadas (sem race entre socket e interação do usuário).

## F-3 — Camada de socket desacoplada no front (rooms `_v2`) ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** B1-2, F-2
- **Objetivo:** handler de socket da V2 (equivalente ao `CentralSocketHandler`) consumindo o **contrato explícito** da `CentralBroadcastInterface` nas rooms `_v2`.
- **Critérios de aceite:**
  - [ ] Conecta só nas rooms `_v2`; nada vaza pra/da V1.
  - [ ] Sem dispatch implícito por `typeof fn === 'function'` — handlers registrados explicitamente.
  - [ ] Valida o payload recebido contra o contrato.

## F-4 — i18n via `show()` ⬜

- **Status:** ⬜ · **Esforço:** S · **Depende de:** F-1
- **Objetivo:** nenhuma string PT hardcoded (a V1 tem ~22) — usar `show("texto PT literal")` (padrão Galaxia md5).
- **Critérios de aceite:**
  - [ ] Strings de alerta/toast passam por `show()`.
  - [ ] Conferido em ES/EN no browser que nenhuma cai em PT.
