# Módulo Demo (`Desenvolvimento/Demo`)

> Contrato de leitura do módulo (ADR-004/ADR-014). Módulo de **demonstração** do produto: prova o
> shell, o CMS, o widget, a mídia e o serviço de segurança sem depender de conteúdo real.

## Propósito

- **Grupo:** `Desenvolvimento` (organizacional — não entra no token).
- **Áreas:** portal · CMS.
- **Token:** `demo` (a exceção de nome do provider é intencional; o token do módulo é `demo`).
- **Ativação:** dado em `core_module_discovery_settings` (ADR-034):
  `php artisan core:module:activate Demo [--disable]`.

## Estrutura (contrato físico)

```
src/modules/Desenvolvimento/Demo/
├── ModuleProvider.php
├── Database/Migrations/       # demo_milestones (timestamptz; sem HTML/CSS no banco)
├── Database/Models/           # Milestone (mídia/SEO em jsonb)
├── Logic/Controllers/         # portal e CMS (invocáveis)
├── Widgets/                   # DemoStatusWidget (WidgetSource)
├── Routes/{portal,cms}.php
├── Layout/Views/              # demo:: (namespace do módulo)
├── Lang/{pt_BR,en,es,fr}/     # menu/show/cms/widget
└── Test/PublicMilestoneTest.php
```

## Rotas

| Nome | Método | URI | Controller | Acesso |
|---|---|---|---|---|
| `demo.cms.index` | GET | `/demo/milestones` | `CmsMilestoneIndexController` | CMS; `demo.ver` |
| `demo.milestones.show` | GET | `/demo/milestones/{id}` | `PublicMilestoneController` | pública |

## Permissões (ADR-033)

`demo.ver` é aplicada no controller do CMS com `Permission::authorize('Demo', Permission::VIEW)`
(negação por padrão).

## Eventos e observabilidade (ADR-024/ADR-035)

- **Emite:** nenhum evento de domínio próprio; mutações de `Milestone` entram na trilha pelo
  `GlobalAuditSubscriber`.
- **Widget:** `demo.status` é registrado no `WidgetRegistry` e referencia o slot canônico
  `main.right` (ADR-016).

## Layout (ADR-016)

- A view pública usa `<x-layout::portal>`; a view do CMS usa `<x-layout::cms>`.
- Imagem de capa pelo fluxo único `<x-media::picture>` (ADR-026), com `width`/`height`.

## Comandos

```bash
php artisan core:module:activate Demo
php artisan core:module:activate Demo --disable
php artisan migrate
```

## Verificação

```bash
make check            # lint, PHPStan max, gates, testes, cobertura
make check E2E=1      # e2e/axe/sniff/perf quando a UI muda
bash tools/name-check.sh --grep demo
```
