# INT-003-01 — SiteLayoutPresenter e share `siteLayout`

| Campo | Valor |
|---|---|
| **status** | feita |
| **spec** | [`docs/specs/integracao/003-layout.md`](../specs/integracao/003-layout.md) §§2–3, §5 |
| **depende de** | [INT-002-02](INT-002-02-layout-reads-site-settings.md) (feita) |
| **primo** | share lazy de estrutura de layout (aqui não há `layoutBrands`) |

## Objetivo

Toda visita Inertia recebe `siteLayout` com logo, nav, footer estrutural. Header/footer React ainda podem ignorar nesta task.

## Fazer

1. `App\Presenters\SiteLayoutPresenter::make(): array` — keys `group=layout`; DTO camelCase da spec; `PublicMedia::resolve` em `logo` / `icon` / `featuredImage` / `image`.
2. `HandleInertiaRequests`: `'siteLayout' => fn (): array => SiteLayoutPresenter::make()`.
3. `resources/js/types`: `SiteLayout` + prop no `PageProps`. `NavItem` ganha `icon` opcional se o type viver em `navigation.ts`.
4. Testes em `tests/Feature/Integracao/`.

## Testes (PHPUnit)

- Seeder: logo `/images/logo/omni.svg`; Para você com mega (carro) e Renova `Novo`; Para empresas `/omni-empresas` sem mega; `4004 3500`; lojas `url` `''`.
- Logo `layout/x.webp` → `/storage/layout/x.webp`.
- Sem seed: `nav` `[]`; `GET /` 200.
- `GET /` com seeder: Inertia `siteLayout.logo` e label “Para você”.

## Fora

Ligar `Navbar` / `SiteFooter` (task 02). Filament. Modal do App.
