---
title: "pdx-inline-sentiment JSON API (Canonical)"
slug: "pdx-inline-sentiment-json-api"
doc_type: "api-reference"
component: "pdx-inline-sentiment"
document_kind: "json-api-canonical"
reference_mode: "canonical"
contract_format: "json"
contract_source: "runtime-and-code"
description: "Referência canônica do contrato JSON do componente pdx-inline-sentiment."
category: "components"
sub_category: "dynamic-fields"
audience:
  - "frontend"
  - "architect"
  - "platform-team"
level: "advanced"
status: "active"
owner: "praxis-ui"
source_of_truth:
  - "projects/praxis-dynamic-fields/src/lib/components/inline-sentiment/inline-sentiment.component.ts"
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts"
  - "projects/praxis-core/src/lib/models/material-field-metadata.interface.ts"
source_of_truth_last_verified: "2026-03-16"
last_updated: "2026-03-16"
toc: true
sidebar: true
tags:
  - "json-api"
  - "canonical-contract"
  - "pdx-inline-sentiment"
api_stability: "canonical"
schema_verified: true
runtime_verified: true
editor_coverage_verified: false
runtime_scope: "public"
legacy_paths_present: false
has_known_mismatches: false
related_components:
  - "praxis-table"
  - "pdx-material-select"
  - "pdx-base-select-runtime-contract"
---

# pdx-inline-sentiment

Este documento e a referência canônica da API JSON de pdx-inline-sentiment.

## Summary

- Tipo documental: API reference canônica de contrato JSON.
- Source of truth: runtime e codigo declarados no frontmatter.
- Objetivo operacional: consulta rápida, auditável e determinística sob pressão.
- Resumo funcional: Contrato JSON metadata-driven com comportamento definido por runtime e schema associado.

## Purpose and scope

- O componente consome payload JSON metadata-driven e expõe comportamento runtime configurável por contrato.
- Esta referência cobre contrato público, classificação de paths e semântica de cobertura (runtime/schema/editor).
- Fora de escopo: quickstart, tutorial narrativo e notas arquiteturais que não alteram contrato público.

## Consulta rápida (obrigatorio)

| Regra/tema | Observado | Canonico desejado | Status | Evidencia |
| --- | --- | --- | --- | --- |
| Component id | `pdx-inline-sentiment` | Manter ID canônico estável e versionado por contrato | Active | frontmatter.component |
| Primary contract source | `runtime-and-code` | Runtime, schema e docs devem permanecer rastreáveis | Partial | frontmatter.contract_source + source_of_truth |
| Runtime coverage | `true` | Comportamentos runtime críticos devem ficar explicitamente verificados | Active | `projects/praxis-dynamic-fields/src/lib/components/inline-sentiment/inline-sentiment.component.ts`, `projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts` |
| Schema/type coverage | `true` | Tipos e schema devem refletir paths públicos do contrato | Active | source_of_truth + Detailed API reference |
| Editor/tooling coverage | `false` | Editor/tooling deve espelhar somente contrato público suportado | Partial | `projects/praxis-core/src/lib/utils/inline-filter-controls.util.ts`, `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts` |
| Path hygiene | `false` | Manter consistência entre contrato canônico e caminhos documentados | Active | frontmatter.legacy_paths_present |
| Known mismatches | `false` | Registrar observed vs desired de forma auditável | Active | frontmatter.has_known_mismatches |

## Source of truth

| Source | Kind | Notes |
| --- | --- | --- |
| projects/praxis-dynamic-fields/src/lib/components/inline-sentiment/inline-sentiment.component.ts | runtime-code | Arquivo presente no repositorio e usado como evidência de contrato. |
| projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts | runtime-code | Arquivo presente no repositorio e usado como evidência de contrato. |
| projects/praxis-core/src/lib/models/material-field-metadata.interface.ts | schema-types | Arquivo presente no repositorio e usado como evidência de contrato. |

## Support legend

- **Active**: suportado em runtime e liberado para uso externo.
- **Partial**: suporte parcial, com restricoes, lacunas ou validação incompleta.
- **Declared-only**: declarado em tipos/schema sem evidência operacional completa.
- **Schema-only**: presente em schema/tipos sem cobertura runtime confirmada.

## Contract status snapshot

| Item | Value | Notes |
| --- | --- | --- |
| Reference mode | `canonical` | Deve permanecer canônico |
| Contract format | `json` | Contrato metadata-driven |
| Contract source | `runtime-and-code` | Alinhar com source_of_truth |
| Runtime scope | `public` | Escopo publicado para consumidores |
| Runtime verified | `true` | Revisar sempre com evidência de runtime |
| Schema verified | `true` | Revisar sempre com evidência de tipos/schema |
| Editor coverage verified | `false` | Revisar sempre com evidência de editor/tooling |
| Current path hygiene | `false` | Segregar consistência do contrato canônico |
| Has known mismatches | `false` | Divergencias devem aparecer em secao dedicada |

## Contract classification (obrigatorio)

### Canonical paths (public contract)

| Path | Type | Required | Default | Status | Notes |
| --- | --- | --- | --- | --- | --- |
| `metadata` | object | true | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentOptions` | array | false | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentMultiple` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentShowBar` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentShowSelectionPills` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentAnimatedEmoji` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentCloseOnSelect` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
| `metadata.sentimentTexts` | unknown | false | n/a | Partial | See Detailed API reference for runtime semantics. |

### Path audit

Nenhum desvio de caminho foi identificado nesta revisão.

### Internal-only paths

Não ha paths internal-only confirmados no contrato público desta revisão.

### Experimental paths

Não ha paths experimentais confirmados no contrato público desta revisão.

## Public contract surface (obrigatorio)

### Top-level configuration blocks

| Block | Purpose | Required | Merge strategy | Notes |
| --- | --- | --- | --- | --- |
| `metadata` | Payload declarativo principal do componente | true | deep-merge | runtime linkage verified for core flows (component specs, 2026-03-16). |
| `selectOptions` | Configuração especifica de runtime | false | override | runtime linkage verified for core flows (component specs, 2026-03-16). |
| `readonlyMode` | Override de readonly no host/runtime | false | override | runtime linkage verified for core flows (component specs, 2026-03-16). |
| `disabledMode` | Override de disabled no host/runtime | false | override | runtime linkage verified for core flows (component specs, 2026-03-16). |
| `visible` | Override de visibilidade no host/runtime | false | override | runtime linkage verified for core flows (component specs, 2026-03-16). |
| `presentationMode` | Renderização de apresentação sem interação | false | override | runtime linkage verified for core flows (component specs, 2026-03-16). |

### Nested configuration blocks

| Path | Type | Required | Default | Constraints | Notes |
| --- | --- | --- | --- | --- | --- |
| `metadata.sentimentOptions` | array | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentMultiple` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentShowBar` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentShowSelectionPills` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentAnimatedEmoji` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentCloseOnSelect` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentTexts` | unknown | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.sentimentIcon` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
| `metadata.inlineAutoSize.*` | object | false | n/a | component-defined | Partial; verify per source_of_truth. |

### Input bindings (inbound data)

| Binding/Path | Type | Required | Source | Runtime normalization | Notes |
| --- | --- | --- | --- | --- | --- |
| `metadata` | object | true | host-json | component-defined | Primary inbound contract payload. |
| `readonlyMode` | boolean | false | host-runtime | not-yet-verified | Host-level behavioral override. |
| `disabledMode` | boolean | false | host-runtime | not-yet-verified | Host-level behavioral override. |
| `visible` | boolean | false | host-runtime | not-yet-verified | Host-level behavioral override. |
| `presentationMode` | boolean | false | host-runtime | not-yet-verified | Host-level behavioral override. |

### Output events

| Event | Payload | Trigger | Stability | Notes |
| --- | --- | --- | --- | --- |
| `searchTermChange` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |
| `selectionChange` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |
| `openedChange` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |
| `valueChange` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |
| `focusChange` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |
| `nativeBlur` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |
| `nativeChange` | unknown | runtime-event | Experimental | Validate payload shape against source_of_truth. |

### External side channels

| Channel | Direction | Contract | Failure mode | Notes |
| --- | --- | --- | --- | --- |
| `host/services/storage` | bidirectional | component-defined | component-defined | Side channels variam por componente e host; verificar em source_of_truth. |

### Host/runtime dependencies

| Dependency | Required | Environment | Purpose | Notes |
| --- | --- | --- | --- | --- |
| `inline-sentiment.component.ts` | true | browser/dev/prod/ssr | contract resolution | Refer to `projects/praxis-dynamic-fields/src/lib/components/inline-sentiment/inline-sentiment.component.ts`. |
| `simple-base-select.component.ts` | true | browser/dev/prod/ssr | contract resolution | Refer to `projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts`. |
| `material-field-metadata.interface.ts` | true | browser/dev/prod/ssr | contract resolution | Refer to `projects/praxis-core/src/lib/models/material-field-metadata.interface.ts`. |

## Coverage by surface (obrigatorio)

### Coverage matrix (runtime, schema/type, editor/tooling)

| Surface | Verified | Coverage status | Evidence | Notes |
| --- | --- | --- | --- | --- |
| Runtime | `true` | Active | `projects/praxis-dynamic-fields/src/lib/components/inline-sentiment/inline-sentiment.component.ts`, `projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts` | Core runtime flows verified via focused component specs on 2026-03-16; editor/tooling coverage remains independent. |
| Schema/Types | `true` | Active | source_of_truth + Detailed API reference | Reconcile schema/types with canonical paths during follow-up when needed. |
| Editor/Tooling | `false` | Partial | `projects/praxis-core/src/lib/utils/inline-filter-controls.util.ts`, `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts` | Alias/selector tooling linkage verified for inline filters; visual editor end-to-end coverage remains not-yet-verified. |

### Runtime coverage boundaries

- Ambientes suportados: browser/dev/prod; SSR/hydration appears to be component-dependent unless explicitly verified.
- Pre-condicoes: payload JSON válido, bindings de host consistentes e dependencias descritas no source_of_truth.
- Fora de cobertura confirmada: caminhos internos, experimentais ou aliases não enumerados formalmente.

### Editor and tooling notes

- Evidencia de tooling: aliases `pdx-inline-*` resolvidos por `inline-filter-controls.util.ts` e consumidos no `ComponentRegistryService`; editor visual E2E permanece not-yet-verified.
- O que esta exposto no editor visual depende da cobertura real do workspace e não deve ser inferido como suporte runtime total.
- Campos disponíveis apenas via JSON/manual devem continuar no contrato, com rótulo explícito de cobertura parcial.
- Quando houver divergencia entre editor e runtime, manter mismatch rastreável em secao dedicada.

## Resolution and precedence model (obrigatorio)

### Merge order

1. defaults do componente
2. contrato JSON recebido
3. overrides de host/runtime
4. normalizacoes internas

### Fallback order

contrato explicito -> aliases históricos (quando suportados) -> defaults internos -> comportamento seguro

### Override points

- inputs publicos do componente
- configuração JSON de runtime
- integracoes de host (serviços/tokens/adapters)

### Runtime normalization

Alias e defaults devem convergir para paths canônicos; onde não houver evidência, manter not-yet-verified de forma explícita.

### Precedence rules

Em conflito entre caminho histórico e path canônico, priorizar path canônico e registrar janela de migração do histórico.

## Validation and error semantics (obrigatorio)

### Validation model

| Path/Rule | Validation phase | Behavior on fail | Error code / warning | Notes |
| --- | --- | --- | --- | --- |
| canonical-paths | parse/runtime | component-defined (warn/reject/default) | not-yet-standardized | Semantica detalhada preservada na referência técnica por componente. |

### Invalid and unknown field handling

- Campos desconhecidos: comportamento component-defined (ignore, warn ou reject).
- Tipos invalidos: pode haver fallback, warning ou falha, conforme runtime especifico.
- Valores fora de dominio: registrar observed vs desired em Known limitations and mismatches.

### Fail-open / fail-closed behavior

| Condition | Mode | Runtime behavior | Consumer impact |
| --- | --- | --- | --- |
| invalid-or-unknown-field | component-defined | not-yet-verified | Pode gerar warning, fallback silencioso ou rejeicao; validar por componente. |

### Runtime warnings vs hard failures

| Condition | Severity | Observability | Consumer action |
| --- | --- | --- | --- |
| partial-or-declared-only-coverage | warning | logs/eventos do componente | Confirmar ligação runtime antes de uso crítico. |
| mismatch-confirmed | error-or-warning | componente/host observability | Planejar migração e corrigir contrato/runtime. |

## Detailed API reference
### Preserved technical reference (normalized from previous revision)

### 1. Visão Geral e Quando Usar
`pdx-inline-sentiment` é um filtro inline de sentimento com emojis, barra de gradiente e cards selecionáveis.

Use quando precisar:
- classificar feedback por polaridade (negativo/neutro/positivo);
- expor leitura visual rápida via emoji + cor;
- permitir single ou múltipla seleção com pills de resumo.

### 2. API do Componente (Inputs/Outputs)
| Propriedade | Tipo | Padrão | Obrigatório | Comportamento |
| --- | --- | --- | --- | --- |
| `metadata` | `MaterialSelectMetadata` | - | Sim | Contrato principal de sentimento inline. |
| `readonlyMode/disabledMode/visible/presentationMode` | `boolean` | `false/false/true/false` | Não | Estados de host do campo inline. |
| `selectionChange` | `T \| T[]` | - | Output herdado | Valor(es) de sentimento selecionado(s). |
| `optionSelected` | `SelectOption` | - | Output herdado | Opção escolhida no card de sentimento. |

### 3. Matriz de Cobertura JSON (Completa)
#### 3.1 Campos específicos do componente
| Caminho JSON | Tipo | Status | Comportamento em runtime |
| --- | --- | --- | --- |
| `metadata.sentimentOptions` | `array \| string(JSON)` | Ativo | Fonte principal dos cards de sentimento. |
| `metadata.sentimentMultiple` / `multiple` | `boolean` | Ativo | Define single/multiple selection. |
| `metadata.sentimentShowBar` | `boolean` | Ativo | Exibe barra visual de sentimento. |
| `metadata.sentimentShowSelectionPills` | `boolean` | Ativo | Exibe pills dos itens selecionados. |
| `metadata.sentimentAnimatedEmoji` | `boolean` | Ativo | Ativa animação de emoji em hover/select. |
| `metadata.sentimentCloseOnSelect` | `boolean` | Ativo | Fecha painel após seleção (single). |
| `metadata.sentimentEmojiKey/optionEmojiKey` | `string` | Ativo | Chave do emoji por opção. |
| `metadata.sentimentColorKey/optionColorKey` | `string` | Ativo | Chave da cor por opção. |
| `metadata.sentimentPalette/palette` | `array \| string` | Ativo | Paleta fallback para opções sem cor. |
| `metadata.sentimentGradientLowColor/midColor/highColor` | `string` | Ativo | Gradiente semântico fallback para barra e opções sem cor explícita. |
| `metadata.sentimentTexts` / `inlineTexts` | `object \| string(JSON)` | Ativo | Textos de subtítulo, aria, labels de grupo/pills e empty state; templates canônicos devem usar `{{label}}` e `{{value}}` quando houver interpolação. |
| `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit"` | Ativo | Define se cards de sentimento comitam imediatamente ou ficam em rascunho até `Aplicar`. |
| `metadata.inlineOverlay.actions.apply` | `object` | Ativo | Configura label, aria-label, ícone, `appearance` e `colorRole` da ação de commit. |
| `metadata.inlineOverlay.actions.cancel` | `object` | Ativo | Configura a ação que descarta rascunho e fecha o painel. |
| `metadata.inlineOverlay.actions.clear` | `object` | Ativo | Configura a ação que remove a seleção aplicada/rascunho usando tokens do tema. |
| `metadata.sentimentIcon` / `prefixIcon` | `string` | Ativo | Ícone do trigger/painel. |
| `metadata.inlineAutoSize.*` | `object` | Ativo | Largura da pill e painel. |

#### 3.2 Campos herdados compartilhados (exaustivo)
- `projects/praxis-dynamic-fields/src/lib/components/material-select/pdx-material-select.json-api.md`
- `projects/praxis-dynamic-fields/src/lib/base/pdx-base-select-runtime-contract.json-api.md`

Resumo de composição deste componente:
- `Ativo`: cards de sentimento com emoji/cor, barra e pills de resumo.
- `Extensão de runtime`: namespace `sentiment*` com fallback para chaves genéricas.

### 4. Mapeamento de Comportamento
- Opções podem ser carregadas de `sentimentOptions`, `selectOptions` ou `options`.
- Cor/emoji de cada item segue ordem de chaves custom -> payload -> paleta fallback.
- Em múltiplo, respeita `maxSelections` herdado.
- Aria labels, labels de grupo/pills e textos operacionais podem ser centralizados em `sentimentTexts`.
- Quando `inlineOverlay.applyMode` e `"explicit"`, seleções no painel alteram apenas o rascunho; `Aplicar` comita, `Cancelar`, `Esc` e clique externo descartam, e `Limpar` remove a seleção.

### 5. Exemplo Mínimo (JSON + Uso)
```json
{
  "componentId": "pdx-inline-sentiment",
  "metadata": {
    "name": "sentiment",
    "label": "Sentimento",
    "controlType": "select",
    "sentimentOptions": [
      { "value": "neg", "label": "Negativo", "emoji": "sentiment_dissatisfied", "color": "#dc2626" },
      { "value": "pos", "label": "Positivo", "emoji": "sentiment_satisfied", "color": "#16a34a" }
    ]
  }
}
```
Uso: classificação simples de sentimento.

### 6. Exemplo Corporativo (JSON + Uso)
```json
{
  "componentId": "pdx-inline-sentiment",
  "metadata": {
    "name": "customerMood",
    "label": "Humor do Cliente",
    "controlType": "multiSelect",
    "sentimentMultiple": true,
    "sentimentShowBar": true,
    "sentimentShowSelectionPills": true,
    "sentimentAnimatedEmoji": true,
    "sentimentEmojiKey": "icon",
    "sentimentColorKey": "hex",
    "sentimentPalette": ["#dc2626", "#f59e0b", "#16a34a"],
    "sentimentOptions": [
      { "value": "neg", "label": "Negativo", "icon": "sentiment_very_dissatisfied", "hex": "#dc2626" },
      { "value": "neu", "label": "Neutro", "icon": "sentiment_neutral", "hex": "#f59e0b" },
      { "value": "pos", "label": "Positivo", "icon": "sentiment_very_satisfied", "hex": "#16a34a" }
    ],
    "sentimentTexts": {
      "sentimentSubtitle": "Classifique o sentimento predominante",
      "emptyStateText": "Nenhum sentimento disponível",
      "barAriaSelected": "{{label}} com {{value}}"
    },
    "inlineAutoSize": { "minWidth": 186, "maxWidth": 360, "panelMinWidth": 320, "panelMaxWidth": 560 },
    "clearButton": { "enabled": true, "showOnlyWhenFilled": true },
    "inlineOverlay": {
      "applyMode": "explicit",
      "actions": {
        "apply": { "label": "Aplicar", "appearance": "filled", "colorRole": "primary" },
        "cancel": { "label": "Cancelar", "appearance": "text", "colorRole": "neutral" },
        "clear": { "label": "Limpar", "appearance": "outlined", "colorRole": "neutral" }
      }
    }
  }
}
```
Uso: análise de CX com semântica visual direta e confirmação explícita antes de aplicar.

### 7. Troubleshooting e Armadilhas Comuns
1. Emoji não renderiza.
Correção: ajustar `sentimentEmojiKey` ou o campo de payload.

2. Cores repetidas sem intencao.
Correção: revisar `sentimentColorKey` e `sentimentPalette`.

3. Painel não fecha no single.
Correção: habilitar `sentimentCloseOnSelect=true`.

4. Pills não aparecem no múltiplo.
Correção: verificar `sentimentShowSelectionPills`.

5. Animação de emoji não ocorre.
Correção: validar `sentimentAnimatedEmoji`.

### 8. Cross-links
- `projects/praxis-dynamic-fields/src/lib/components/material-select/pdx-material-select.json-api.md`
- `projects/praxis-dynamic-fields/src/lib/base/pdx-base-select-runtime-contract.json-api.md`

### 9. Relatório de Validação Estrutural
- Visão geral: PASS
- API (inputs/outputs): PASS
- Cobertura JSON completa (especifico + herdado): PASS
- Mapeamento de comportamento: PASS
- Exemplo mínimo: PASS
- Exemplo corporativo: PASS
- Troubleshooting: PASS

## JSON path index (obrigatorio)

| Path | Type | Required | Default | Status | Notes |
| --- | --- | --- | --- | --- | --- |
| `metadata` | object | true | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentOptions` | array | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentMultiple` | boolean | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentShowBar` | boolean | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentShowSelectionPills` | boolean | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentAnimatedEmoji` | boolean | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentCloseOnSelect` | boolean | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentTexts` | unknown | false | n/a | Partial | See Detailed API reference. |
| `metadata.sentimentIcon` | string | false | n/a | Partial | See Detailed API reference. |
| `metadata.inlineOverlay.applyMode` | string | false | `auto` | Active | `explicit` mantém rascunho até commit. |
| `metadata.inlineOverlay.actions.apply` | object | false | n/a | Active | Label, aria, icon, appearance and colorRole for Apply. |
| `metadata.inlineOverlay.actions.cancel` | object | false | n/a | Active | Label, aria, icon, appearance and colorRole for Cancel. |
| `metadata.inlineOverlay.actions.clear` | object | false | n/a | Active | Label, aria, icon, appearance and colorRole for Clear. |
| `metadata.inlineAutoSize.*` | object | false | n/a | Partial | See Detailed API reference. |
| `selectOptions` | array | false | n/a | Partial | See Detailed API reference. |
| `readonlyMode` | boolean | false | n/a | Partial | See Detailed API reference. |
| `disabledMode` | boolean | false | n/a | Partial | See Detailed API reference. |
| `visible` | boolean | false | n/a | Partial | See Detailed API reference. |
| `presentationMode` | boolean | false | n/a | Partial | See Detailed API reference. |

## Events reference (obrigatorio)

| Event | Payload | Trigger | Stability | Notes |
| --- | --- | --- | --- | --- |
| `searchTermChange` | unknown | runtime-event | Experimental | Check component/runtime implementation. |
| `selectionChange` | unknown | runtime-event | Experimental | Check component/runtime implementation. |
| `openedChange` | unknown | runtime-event | Experimental | Check component/runtime implementation. |
| `valueChange` | unknown | runtime-event | Experimental | Check component/runtime implementation. |
| `focusChange` | unknown | runtime-event | Experimental | Check component/runtime implementation. |
| `nativeBlur` | unknown | runtime-event | Experimental | Check component/runtime implementation. |
| `nativeChange` | unknown | runtime-event | Experimental | Check component/runtime implementation. |

## Styling API (obrigatorio quando aplicavel)

| Token/Class | Scope | Purpose | Notes |
| --- | --- | --- | --- |
| `metadata.sentimentIcon` | component | Styling-related JSON path | Validate against runtime implementation. |

## Examples (obrigatorio)

| Example | Scenario | Validates | Notes |
| --- | --- | --- | --- |
| `Minimal valid` | baseline payload | required contract blocks | Extracted from preserved technical reference when available. |
| `Common setup` | common component usage | standard runtime behavior | Validate against host integration path. |
| `Advanced setup` | richer config with overrides | precedence and normalization | Requires runtime confirmation for edge cases. |
| `Enterprise scenario` | governance/legacy/migration context | auditability and compatibility boundaries | Include tenant-specific constraints when applicable. |

### Minimal valid

```json
{
  "componentId": "pdx-inline-sentiment",
  "metadata": {
    "name": "sentiment",
    "label": "Sentimento",
    "controlType": "select",
    "sentimentOptions": [
      {
        "value": "neg",
        "label": "Negativo",
        "emoji": "sentiment_dissatisfied",
        "color": "#dc2626"
      },
      {
        "value": "pos",
        "label": "Positivo",
        "emoji": "sentiment_satisfied",
        "color": "#16a34a"
      }
    ],
    "sentimentMultiple": false
  }
}
```

### Common setup

```json
{
  "componentId": "pdx-inline-sentiment",
  "metadata": {
    "name": "customerMood",
    "label": "Humor do Cliente",
    "controlType": "multiSelect",
    "sentimentMultiple": true,
    "sentimentShowBar": true,
    "sentimentShowSelectionPills": true,
    "sentimentAnimatedEmoji": true,
    "sentimentEmojiKey": "icon",
    "sentimentColorKey": "hex",
    "sentimentPalette": [
      "#dc2626",
      "#f59e0b",
      "#16a34a"
    ],
    "sentimentOptions": [
      {
        "value": "neg",
        "label": "Negativo",
        "icon": "sentiment_very_dissatisfied",
        "hex": "#dc2626"
      },
      {
        "value": "neu",
        "label": "Neutro",
        "icon": "sentiment_neutral",
        "hex": "#f59e0b"
      },
      {
        "value": "pos",
        "label": "Positivo",
        "icon": "sentiment_very_satisfied",
        "hex": "#16a34a"
      }
    ],
    "sentimentTexts": {
      "sentimentSubtitle": "Classifique o sentimento predominante",
      "emptyStateText": "Nenhum sentimento disponível",
      "barAriaSelected": "{{label}} com {{value}}"
    },
    "inlineAutoSize": {
      "minWidth": 186,
      "maxWidth": 360,
      "panelMinWidth": 320,
      "panelMaxWidth": 560
    },
    "sentimentIcon": "pdx-inline-sentiment-common"
  }
}
```

### Advanced setup

```json
{
  "componentId": "pdx-inline-sentiment",
  "metadata": {
    "name": "customerMood",
    "label": "Humor do Cliente",
    "controlType": "multiSelect",
    "sentimentMultiple": true,
    "sentimentShowBar": true,
    "sentimentShowSelectionPills": true,
    "sentimentAnimatedEmoji": true,
    "sentimentEmojiKey": "icon",
    "sentimentColorKey": "hex",
    "sentimentPalette": [
      "#dc2626",
      "#f59e0b",
      "#16a34a"
    ],
    "sentimentOptions": [
      {
        "value": "neg",
        "label": "Negativo",
        "icon": "sentiment_very_dissatisfied",
        "hex": "#dc2626"
      },
      {
        "value": "neu",
        "label": "Neutro",
        "icon": "sentiment_neutral",
        "hex": "#f59e0b"
      },
      {
        "value": "pos",
        "label": "Positivo",
        "icon": "sentiment_very_satisfied",
        "hex": "#16a34a"
      }
    ],
    "sentimentTexts": {
      "sentimentSubtitle": "Classifique o sentimento predominante",
      "emptyStateText": "Nenhum sentimento disponível",
      "barAriaSelected": "{{label}} com {{value}}"
    },
    "inlineAutoSize": {
      "minWidth": 186,
      "maxWidth": 360,
      "panelMinWidth": 320,
      "panelMaxWidth": 560
    }
  },
  "readonlyMode": false,
  "disabledMode": false
}
```

### Enterprise scenario

```json
{
  "componentId": "pdx-inline-sentiment",
  "metadata": {
    "name": "customerMood",
    "label": "Humor do Cliente",
    "controlType": "multiSelect",
    "sentimentMultiple": true,
    "sentimentShowBar": true,
    "sentimentShowSelectionPills": true,
    "sentimentAnimatedEmoji": true,
    "sentimentEmojiKey": "icon",
    "sentimentColorKey": "hex",
    "sentimentPalette": [
      "#dc2626",
      "#f59e0b",
      "#16a34a"
    ],
    "sentimentOptions": [
      {
        "value": "neg",
        "label": "Negativo",
        "icon": "sentiment_very_dissatisfied",
        "hex": "#dc2626"
      },
      {
        "value": "neu",
        "label": "Neutro",
        "icon": "sentiment_neutral",
        "hex": "#f59e0b"
      },
      {
        "value": "pos",
        "label": "Positivo",
        "icon": "sentiment_very_satisfied",
        "hex": "#16a34a"
      }
    ],
    "sentimentTexts": {
      "sentimentSubtitle": "Classifique o sentimento predominante",
      "emptyStateText": "Nenhum sentimento disponível",
      "barAriaSelected": "{{label}} com {{value}}"
    },
    "inlineAutoSize": {
      "minWidth": 186,
      "maxWidth": 360,
      "panelMinWidth": 320,
      "panelMaxWidth": 560
    }
  },
  "presentationMode": true,
  "visible": true
}
```

## Compatibility and migration notes (recomendado)

| Concern | Affected versions | Migration action | Deadline | Notes |
| --- | --- | --- | --- | --- |
| No legacy path detected in current revision | n/a | No migration action required for canonical paths | n/a | Re-evaluate if backward-compat aliases are introduced |

## Known limitations and mismatches (recomendado)

| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
| --- | --- | --- | --- | --- | --- |
| Canonical contract parity | Runtime e exemplos desta referência foram atualizados em 2026-03-16 para refletir a migração do componente para o catálogo shared de i18n e o uso de templates `{{...}}` | Manter exemplos e host overrides no formato canônico `{{...}}` | Low | n/a | Monitor in periodic audit |

## Source references (obrigatorio)

| Source type | Path/URL | Why it is source of truth | Last verified (YYYY-MM-DD) | Notes |
| --- | --- | --- | --- | --- |
| runtime-code | projects/praxis-dynamic-fields/src/lib/components/inline-sentiment/inline-sentiment.component.ts | Primary source of truth for contract and behavior. | 2026-03-16 | verified-path |
| runtime-code | projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts | Primary source of truth for contract and behavior. | 2026-03-16 | verified-path |
| schema-types | projects/praxis-core/src/lib/models/material-field-metadata.interface.ts | Primary source of truth for contract and behavior. | 2026-03-16 | verified-path |
