# Área do cliente / do parceiro

| Campo | Valor |
|---|---|
| **status** | aprofundada — pronta para tasks |
| **rota pública** | todas (modal do shell) |
| **tela CMS** | Sistema → Layout, aba **Área do cliente** (`/admin/layout`) |
| **permissão** | já existe: `sistema.layout.editar` |
| **fonte do seeder** | `resources/js/components/client-area/content.ts` (`CLIENT_AREA_CONTENT`) |

## Premissas (sem pergunta extra)

| Tema | Decisão |
|---|---|
| Store | Reusar `settings` `group=layout`. Uma key JSON nova: `layout_client_area_modal` |
| Gatilho | `layout_client_area` (`label` + `href` `#area-cliente`) **permanece** no Layout — é do [`003`](003-layout.md) |
| Tela | **Não** criar Manage* nova. Quarta aba em `ManageLayoutPage` |
| Permissão | A mesma do Layout. Sem chave nova |
| Campos | Só o que o modal já mostra. `switchTo` é chrome (cliente ↔ parceiro), não campo |
| Coleções | `options` `0..N` por visão. O grid do modal define o layout |
| Front | Ligar nesta família: [`integracao/004`](../integracao/004-area-do-cliente.md) |

Não é desta spec: autenticação, login, portal. Não inventar URL — seed = os links provisórios do `content.ts`. Copy/QR do WhatsApp (`005`). Lead (`006`).

---

## 1. O que o editor vê

Aba **Área do cliente** no Sistema → Layout, depois de Navegação. Duas seções (Cliente e Parceiro). O rótulo/link do botão do header continuam na aba Navegação.

---

## 2. Key `layout_client_area_modal`

JSON com duas visões (`cliente`, `parceiro`). Cada uma:

| Campo | Seed (cliente / parceiro) |
|---|---|
| `title` | Área do cliente Omni / Área do parceiro Omni |
| `subtitle` | Selecione uma opção: / Selecione uma opção: |
| `switchLabel` | Se você é um parceiro Omni, lojista ou agente, acesse: / Se você é um cliente Omni, acesse o link abaixo: |
| `switchCta` | Acessar área do parceiro / Acessar área do cliente |
| `options` | `0..N` |

Cada opção:

| Campo | Notas |
|---|---|
| `title` | |
| `description` | |
| `href` | URL do portal (seed = as do `content.ts`) |
| `icon` | ReplacementImage, SVG ok. Seed `/images/icons/icon-*.svg` |
| `external` | bool opcional. `true` = nova aba. Ausente/`false` = `<Link>` Inertia (Negocie agora hoje) |

**Seed — cliente**

| title | href | icon | external |
|---|---|---|---|
| Minha conta | `https://ib.omni.com.br/login` | `icon-minha-conta.svg` | sim |
| Meu financiamento | `https://auth-cliente.omni.com.br/auto-atendimento-cliente/login` | `icon-meu-financiamento.svg` | sim |
| Negocie agora | `https://negocie.omni.com.br/` | `icon-negocie-agora.svg` | não |

**Seed — parceiro**

| title | href | icon | external |
|---|---|---|---|
| Crediário | `https://www.bizfacil.com.br/pls/webdad/pck_login.prc_login` | `icon-crediario.svg` | sim |
| Financiamento | `https://www.bizfacil.com.br/pls/webdad/pck_login.prc_login` | `icon-financiamento.svg` | sim |
| Cartão de Crédito | `https://ias.biz-br.com/central/biz_menu_pck.entrar` | `icon-cartao-credito.svg` | sim |

Descrições: literais do `content.ts`.

---

## 3. Seeder e form

`LayoutSettingsSeeder` grava a key. `LayoutFormState` hidrata/desidrata as duas visões (ícone = par ReplacementImage). Upload vazio **não** zera.

Log continua `layout.updated`.

---

## 4. Testes

- Seeder: cliente tem “Minha conta” com `external` e o href do Internet Banking; parceiro tem “Crediário”; Negocie agora **sem** `external`.
- Round-trip do form preserva ícones e `external`.
- Save de outro campo do Layout **não** apaga as opções.

---

## 5. Fora

Tela própria. Permissão nova. Backend de login. Inventar portal. `005` / `006`.

## 6. Tasks

[`CMS-004-01`](../../tasks/CMS-004-01-area-do-cliente-modal.md).
