# CMS-003-02 — ManageLayoutPage (Layout)

| Campo | Valor |
|---|---|
| **status** | feita |
| **spec** | [`docs/specs/cms/003-layout.md`](../specs/cms/003-layout.md) §§1, 5–6, 9 |
| **depende de** | [CMS-003-01](CMS-003-01-layout-schema-seeder.md) |
| **primo** | **não há** ManageLayout. Espelhar o *molde* de `ManageSettingsPage` (Blade, `ClearsReplacementUploads`, ReplacementImage) |

## Objetivo

Tela **Sistema → Layout** salvando só as keys vivas da spec. Front ainda não lê o CMS.

## Fazer

1. `ManageLayoutPage`: nav Sistema, label Layout, slug `layout`, sort **4**, ícone `bars-3`, view Blade no padrão das outras Manage* (form + Salvar alterações).
2. `ActivityLogResource` `navigationSort` **5** (hoje 4).
3. `canAccess` / `shouldRegisterNavigation`: root ou `sistema.layout.editar`. **Não** criar chave nova.
4. Form em 3 abas (Navegação, Links rápidos, Footer) com os campos da spec §4. Repeaters `0..N`, colapsáveis, `itemLabel` = label/category/title. Mega menu **opcional** por item da nav (aninhado: colunas → itens). Defaults do `mount` = seeder.
5. Mídia: par ReplacementImage (preview da publicada + FileUpload vazio). Disco `public`, pasta `layout/` (subpastas ok). SVG ok em logo, ícones e badges das lojas. Helper da 003-01 para `/images/...` vs storage. Upload vazio **não** zera path (raiz via `ClearsReplacementUploads`; repeaters: skip no `save`).
6. `save()`: skip null e upload vazio; `Setting::set(..., 'layout')`; `layout.updated` + notification “Layout salvo!”.
7. Não misturar fields do `002`. Não copiar busca da navbar.

## Testes (PHPUnit, `tests/Feature/Cms/`)

- Root: `ManageLayoutPage::canAccess()` true; autenticado GET `/admin/layout` 200.
- Usuario com perfil vazio (sem a chave): `canAccess` false.
- Usuario com `sistema.layout.editar`: `canAccess` true.
- Livewire: alterar um scalar (heading do app ou label da Área do cliente), `save`, assert no banco + `ActivityLog` `layout.updated`.
- Com `layout_logo` (ou imagem de loja) já gravado, `save` com FileUpload vazio **não** zera o path.

## Fora

`HandleInertiaRequests`, `navigation.ts`, `SiteFooter.tsx`, spec `010`.
