---
title: "pdx-material-searchable-select JSON API (Canonical)"
slug: "pdx-material-searchable-select-json-api"
doc_type: "api-reference"
component: "pdx-material-searchable-select"
document_kind: "json-api-canonical"
reference_mode: "canonical"
contract_format: "json"
contract_source: "runtime-and-code"
description: "Referencia canonica do contrato JSON do componente pdx-material-searchable-select."
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/material-searchable-select/material-searchable-select.metadata.ts"
  - "projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.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-04-27"
last_updated: "2026-04-27"
toc: true
sidebar: true
tags:
  - "json-api"
  - "canonical-contract"
  - "pdx-material-searchable-select"
api_stability: "canonical"
schema_verified: true
runtime_verified: true
editor_coverage_verified: false
runtime_scope: "public"
legacy_paths_present: true
has_known_mismatches: false
related_components:
  - "praxis-table"
  - "pdx-base-select-runtime-contract"
  - "pdx-base-input-runtime-contract"
  - "pdx-material-async-select"
  - "pdx-material-multi-select"
---

# pdx-material-searchable-select

Este documento e a referencia canonica da API JSON de pdx-material-searchable-select.

## Summary

- Tipo documental: API reference canonica de contrato JSON.
- Source of truth: runtime e codigo declarados no frontmatter.
- Objetivo operacional: consulta rapida, auditavel e deterministica sob pressao.
- 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 expoe comportamento runtime configuravel por contrato.
- Esta referencia cobre contrato publico, classificacao de paths e semantica de cobertura (runtime/schema/editor).
- Fora de escopo: quickstart, tutorial narrativo e notas arquiteturais que nao alteram contrato publico.

## Consulta rapida (obrigatorio)

| Regra/tema | Observado | Canonico desejado | Status | Evidencia |
| --- | --- | --- | --- | --- |
| Component id | `pdx-material-searchable-select` | Manter ID canonico estavel e versionado por contrato | Active | frontmatter.component |
| Primary contract source | `runtime-and-code` | Runtime, schema e docs devem permanecer rastreaveis | Partial | frontmatter.contract_source + source_of_truth |
| Runtime coverage | `true` | Comportamentos runtime criticos devem ficar explicitamente verificados | Active | `projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.metadata.ts`, `projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.component.ts`; focused component specs for local search, remote loading, dependency cascades and governed states, 2026-04-27 |
| Schema/type coverage | `true` | Tipos e schema devem refletir paths publicos do contrato | Active | source_of_truth + Detailed API reference |
| Editor/tooling coverage | `false` | Editor/tooling deve espelhar somente contrato publico suportado | Partial | `projects/praxis-core/src/lib/metadata/field-selector-control-type.constants.ts`, `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts` |
| Legacy paths | `true` | Segregar legado de caminhos canonicos com janela de migracao | Partial | frontmatter.legacy_paths_present |
| Known mismatches | `false` | Registrar observed vs desired de forma auditavel | Active | frontmatter.has_known_mismatches |

## Source of truth

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

## Support legend

- **Active**: suportado em runtime e liberado para uso externo.
- **Partial**: suporte parcial, com restricoes, lacunas ou validacao incompleta.
- **Declared-only**: declarado em tipos/schema sem evidencia operacional completa.
- **Schema-only**: presente em schema/tipos sem cobertura runtime confirmada.
- **Deprecated**: legado suportado por janela de migracao definida.

## Contract status snapshot

| Item | Value | Notes |
| --- | --- | --- |
| Reference mode | `canonical` | Deve permanecer canonico |
| 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 evidencia de runtime |
| Schema verified | `true` | Revisar sempre com evidencia de tipos/schema |
| Editor coverage verified | `false` | Revisar sempre com evidencia de editor/tooling |
| Legacy paths present | `true` | Segregar legado de contrato canonico |
| 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. |
| `readonlyMode` | boolean | false | `false` | Active | Bloqueia busca, selecao, clear e paginacao sem declarar disabled. |
| `disabledMode` | boolean | false | `false` | Active | Desabilita o `FormControl`, bloqueia abertura, busca, selecao, clear e paginacao. |
| `visible` | boolean | false | `true` | Active | Controla `display` do host e `aria-hidden` quando invisivel. |
| `presentationMode` | boolean | false | `false` | Active | Renderiza sem permitir mutacao por interacao ou handlers publicos governados. |

### Supported legacy paths

| Legacy path | Canonical replacement | Support window | Runtime behavior | Notes |
| --- | --- | --- | --- | --- |
| `metadata.options` | `metadata.selectOptions` | not-yet-defined | accepted for backward compatibility | Alias inferido da evidencia preservada; validar em runtime. |

### Internal-only paths

Nao ha paths internal-only confirmados no contrato publico desta revisao.

### Experimental paths

Nao ha paths experimentais confirmados no contrato publico desta revisao.

## 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-04-27). |
| `readonlyMode` | Override de readonly no host/runtime | false | override | Bloqueia busca, selecao, clear e paginacao; expoe `aria-readonly` (component specs, 2026-04-27). |
| `disabledMode` | Override de disabled no host/runtime | false | override | Desabilita o `FormControl`, bloqueia abertura, busca, selecao, clear e paginacao; expoe `aria-disabled` (component specs, 2026-04-27). |
| `visible` | Override de visibilidade no host/runtime | false | override | Controla display/`aria-hidden` no host. |
| `presentationMode` | Renderizacao de apresentacao sem interacao | false | override | Bloqueia mutacao por interacao e handlers publicos governados (component specs, 2026-04-27). |

### Nested configuration blocks

| Path | Type | Required | Default | Constraints | Notes |
| --- | --- | --- | --- | --- | --- |
| `metadata` | object | true | n/a | component-defined | Detailed API reference preserves component-specific fields. |

### 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 | Angular input binding | Host-level readonly override; blocks mutation and lookup actions without disabling the control. |
| `disabledMode` | boolean | false | host-runtime | Angular input binding | Host-level disabled override; disables the FormControl and blocks lookup actions. |
| `visible` | boolean | false | host-runtime | Angular input binding | Host-level visibility override. |
| `presentationMode` | boolean | false | host-runtime | Angular input binding | Non-interactive presentation 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. |

### Runtime semantics addendum

- `disabledMode` sincroniza o estado disabled no `FormControl`, bloqueia abertura do painel, busca local/remota, selecao, clear, reload e paginacao incremental.
- `readonlyMode` e `presentationMode` bloqueiam `selectOption`, `toggleSelectAll`, `onClearClick`, `onSearch`, `loadNextPage`, `reload` e abertura do painel sem transformar o controle em disabled.
- Opcoes disabled continuam bloqueadas individualmente; estados governados desabilitam todas as opcoes visiveis.
- Em cascatas metadata-driven, dependencias continuam resolvidas pelo contrato base, mas recarga efetiva respeita o estado interativo atual.

### 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 |
| --- | --- | --- | --- | --- |
| `material-searchable-select.metadata.ts` | true | browser/dev/prod/ssr | contract resolution | Refer to `projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.metadata.ts`. |
| `material-searchable-select.component.ts` | true | browser/dev/prod/ssr | contract resolution | Refer to `projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.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/material-searchable-select/material-searchable-select.metadata.ts`, `projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.component.ts` | Core runtime flows and governed states verified via focused component specs on 2026-04-27; 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/metadata/field-selector-control-type.constants.ts`, `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts` | Selector/control-type tooling linkage verified via default selector map and registry seeding; 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 valido, bindings de host consistentes e dependencias descritas no source_of_truth.
- Fora de cobertura confirmada: caminhos internos, experimentais ou aliases nao enumerados formalmente.

### Editor and tooling notes

- Evidencia de tooling: selector `pdx-*` mapeado em `DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP` e semeado no `ComponentRegistryService`; editor visual E2E permanece not-yet-verified.
- O que esta exposto no editor visual depende da cobertura real do workspace e nao deve ser inferido como suporte runtime total.
- Campos disponiveis apenas via JSON/manual devem continuar no contrato, com rotulo explicito de cobertura parcial.
- Quando houver divergencia entre editor e runtime, manter mismatch rastreavel 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 legados (quando suportados) -> defaults internos -> comportamento seguro

### Override points

- inputs publicos do componente
- configuracao JSON de runtime
- integracoes de host (servicos/tokens/adapters)

### Runtime normalization

Alias e defaults devem convergir para paths canonicos; onde nao houver evidencia, manter not-yet-verified de forma explicita.

### Precedence rules

Em conflito entre alias legado e path canonico, priorizar path canonico e registrar janela de migracao do legado.

## 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 referencia tecnica 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 ligacao runtime antes de uso critico. |
| mismatch-confirmed | error-or-warning | componente/host observability | Planejar migracao e corrigir contrato/runtime. |

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

`pdx-material-searchable-select` e um select config-first com busca embutida no painel, mantendo o contrato padrao de select local/remoto. Nao e apenas variacao visual de select; e um runtime metadata-driven para cenarios onde filtro textual no dropdown e requisito de produto.

### Prova em 20 segundos

```json
{
  "componentId": "pdx-material-searchable-select",
  "metadata": {
    "name": "status",
    "label": "Status",
    "controlType": "select",
    "selectOptions": [
      { "value": "A", "text": "Ativo" },
      { "value": "I", "text": "Inativo" }
    ]
  }
}
```

- O runtime renderiza select com input de busca dentro do painel.
- O mesmo contrato suporta single e multiple, com fonte estatica ou remota.
- Mudancas no metadata reconfiguram UX sem alterar template do host.

### Table of contents

- [Start here](#start-here)
  - [Promessa e limites](#promessa-e-limites)
  - [Controle de comportamento](#controle-de-comportamento)
  - [Status model](#status-model)
  - [Checklist corporativo](#checklist-corporativo)
- [Contrato tecnico completo](#contrato-tecnico-completo)
  - [API do componente](#api-do-componente)
  - [Matriz completa de cobertura JSON](#matriz-completa-de-cobertura-json)
  - [Saidas runtime compartilhadas](#saidas-runtime-compartilhadas)
  - [Troubleshooting](#troubleshooting)
  - [Cross-links](#cross-links)
- [Referencias oficiais Angular](#referencias-oficiais-angular)

### Start here

#### Promessa e limites

**O que isso habilita:** select com busca inline no painel, suporte local/remoto e modo single/multiple no mesmo contrato.

**Quando usar:** dropdown com volume medio/alto de opcoes onde busca textual e obrigatoria.

**Exemplo minimo:** `selectOptions` para local, `resourcePath` para remoto legado, ou `optionSource` para o endpoint canonico de opcoes, mantendo busca embutida.

Garantias:

- input de busca esta presente na UI do componente.
- carga remota e cascata seguem contrato base de select.
- `multiple` e respeitado para alternar single/multiple.

Limites:

- `searchable` no metadata e tratado como parcial: componente mantem busca habilitada por design.
- ordenacao nao possui contrato dedicado.
- `loadOn`/cascata dependem da infraestrutura de endpoint no backend.

#### Controle de comportamento

**O que isso habilita:** busca por termo no painel com recarga incremental de opcoes.

**Quando usar:** quando a descoberta de item exige filtro textual antes da selecao.

**Exemplo minimo:** `loadOn='open'` para adiar primeira carga remota.

Precedencia de comportamento:

1. `selectOptions` e usado como fonte local imediata.
2. `options` atua como alias legado quando `selectOptions` nao e enviado.
3. `optionSource` ativa consulta remota pelo endpoint canonico `/option-sources/{key}/options/filter`.
4. `resourcePath` ativa consulta remota paginada legada com termo de busca.

#### Status model

- `Status: Active` - consumido diretamente no runtime do componente/base.
- `Status: Partial` - contrato existe, mas componente fixa parte do comportamento.
- `Status: Runtime-extension` - chave adicional suportada para compatibilidade runtime.

#### Checklist corporativo

- alinhe backend para pesquisa por termo e include de selecionados.
- para lookups metadata-driven, publique `optionSource.dependsOn` e `optionSource.dependencyFilterMap` no schema canonico.
- padronize `optionLabelKey`/`optionValueKey` entre dominios.
- defina `dependencyLoadOnChange` conforme UX esperada em cascata.
- use `maxSelections` quando multi-select exigir limite de negocio.

### Contrato tecnico completo

#### API do componente

| Propriedade | Tipo | Padrao | Obrigatorio | Comportamento |
| --- | --- | --- | --- | --- |
| `metadata` | `MaterialSelectMetadata` | - | Sim | Contrato principal do searchable select. |
| `readonlyMode` | `boolean` | `false` | Nao | Bloqueia busca e selecao sem declarar disabled. |
| `disabledMode` | `boolean` | `false` | Nao | Desabilita o FormControl e bloqueia busca/selecao. |
| `visible` | `boolean` | `true` | Nao | Controla exibicao do host. |
| `presentationMode` | `boolean` | `false` | Nao | Modo apresentacao sem interacao. |
| `selectionChange` | `T \| T[]` | - | Output herdado | Mudanca de valor selecionado. |
| `optionSelected` | `SelectOption` | - | Output herdado | Selecao individual de opcao. |
| `optionsLoaded` | `SelectOption[]` | - | Output herdado | Lote remoto carregado. |
| `openedChange` | `boolean` | - | Output herdado | Estado de abertura do painel. |
| `searchTermChange` | `string` | - | Output herdado | Mudanca no termo de busca. |

#### Matriz completa de cobertura JSON

| Caminho JSON | Tipo | Status | Comportamento em runtime |
| --- | --- | --- | --- |
| `metadata.controlType` | `'select' \| 'multiSelect'` | Active | Contrato aceito para single/multiple. |
| `metadata.selectOptions` | `Array<{ value; text; label?; disabled? }>` | Active | Fonte principal de opcoes locais. |
| `metadata.options` | `Array<any>` | Runtime-extension | Alias legado quando `selectOptions` nao e informado. |
| `metadata.multiple` | `boolean` | Active | Define branch single/multiple no template. |
| `metadata.emptyOptionText` | `string` | Active | Exibe opcao nula no modo single. |
| `metadata.selectAll` | `boolean` | Active | Suporte herdado para modo multiplo. |
| `metadata.maxSelections` | `number` | Active | Limita selecoes em modo multiplo. |
| `metadata.resourcePath` | `string` | Active | Ativa carga remota de opcoes. |
| `metadata.optionSource` | `OptionSourceMetadata` | Active | Ativa endpoint canonico de option-source e busca pelo parametro `search`. |
| `metadata.optionSource.dependsOn` | `string[]` | Active | Fonte canonica backend/editor para cascata; o mapper deriva `dependencyFields`. |
| `metadata.optionSource.dependencyFilterMap` | `Record<string, string>` | Active | Mapeia campo dependente para chave de filtro enviada ao backend. |
| `metadata.filterCriteria` | `Record<string, any>` | Active | Filtros base para consulta remota. |
| `metadata.optionLabelKey` | `string` | Active | Chave de label no payload remoto. |
| `metadata.optionValueKey` | `string` | Active | Chave de value no payload remoto. |
| `metadata.searchable` | `boolean` | Partial | Campo existe no contrato, mas busca permanece habilitada neste componente. |
| `metadata.loadOn` | `'open' \| 'init' \| 'none'` | Runtime-extension | Estrategia de primeira carga remota. |
| `metadata.dependencyLoadOnChange` | `'respectLoadOn' \| 'immediate' \| 'manual'` | Runtime-extension | Regras de recarga por dependencia. |

Notas de runtime:

- em remoto, `loadOptions` usa filtro com include de selecionados na pagina 0.
- com `optionSource`, `loadOptions` chama `filterOptionSourceOptions` e envia termo de busca como `search`, nao como campo de filtro textual.
- `onSearch` limpa estado local e reinicia pagina para novo termo.
- estados governados bloqueiam busca, abertura, selecao, reload, clear e `loadNextPage`.

Contrato compartilhado completo:

- [pdx-base-select-runtime-contract.json-api.md](projects/praxis-dynamic-fields/src/lib/base/pdx-base-select-runtime-contract.json-api.md)
- [pdx-base-input-runtime-contract.json-api.md](projects/praxis-dynamic-fields/src/lib/base/pdx-base-input-runtime-contract.json-api.md)

#### Saidas runtime compartilhadas

Os outputs sao herdados de `SimpleBaseSelectComponent` e utilizados para integracao com fluxo host, observabilidade e analytics.

#### Troubleshooting

1. `searchable=false` nao desativa busca.
Correcao: neste componente a busca e estrutural e permanece ativa.

2. Nada carrega ao abrir painel remoto.
Correcao: revise `loadOn`, `resourcePath` e permissao de endpoint.

3. Filtro remoto usa campo errado.
Correcao: alinhe `optionLabelKey` e `optionValueKey` ao payload real.

4. Item selecionado some apos nova busca.
Correcao: backend deve suportar include de ids selecionados na pagina inicial.

5. Cascata nao atualiza automaticamente.
Correcao: use `dependencyLoadOnChange='immediate'` ou dispare recarga no host.

#### Cross-links

- `projects/praxis-dynamic-fields/src/lib/components/material-async-select/pdx-material-async-select.json-api.md`
- `projects/praxis-dynamic-fields/src/lib/components/material-multi-select/pdx-material-multi-select.json-api.md`
- `projects/praxis-dynamic-fields/src/lib/base/pdx-base-select-runtime-contract.json-api.md`

### Referencias oficiais Angular

- Acessibilidade em Angular: https://angular.dev/best-practices/a11y
- Criacao e manutencao de libraries: https://angular.dev/tools/libraries/creating-libraries

## JSON path index (obrigatorio)

| Path | Type | Required | Default | Status | Notes |
| --- | --- | --- | --- | --- | --- |
| `metadata` | object | true | 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 |
| --- | --- | --- | --- |
| `not-yet-verified` | component | Styling contract not yet verified | Use Detailed API reference for component-specific styling notes. |

## 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-material-searchable-select",
  "metadata": {
    "name": "status",
    "label": "Status",
    "controlType": "select",
    "selectOptions": [
      {
        "value": "A",
        "text": "Ativo"
      },
      {
        "value": "I",
        "text": "Inativo"
      }
    ]
  },
  "readonlyMode": false
}
```

### Common setup

```json
{
  "componentId": "pdx-material-searchable-select",
  "metadata": {
    "name": "status",
    "label": "Status",
    "controlType": "select",
    "selectOptions": [
      {
        "value": "A",
        "text": "Ativo"
      },
      {
        "value": "I",
        "text": "Inativo"
      }
    ]
  },
  "readonlyMode": true
}
```

### Advanced setup

```json
{
  "componentId": "pdx-material-searchable-select",
  "metadata": {
    "name": "status",
    "label": "Status",
    "controlType": "select",
    "selectOptions": [
      {
        "value": "A",
        "text": "Ativo"
      },
      {
        "value": "I",
        "text": "Inativo"
      }
    ]
  },
  "readonlyMode": false,
  "disabledMode": false
}
```

### Enterprise scenario

```json
{
  "componentId": "pdx-material-searchable-select",
  "metadata": {
    "name": "status",
    "label": "Status",
    "controlType": "select",
    "selectOptions": [
      {
        "value": "A",
        "text": "Ativo"
      },
      {
        "value": "I",
        "text": "Inativo"
      }
    ]
  },
  "presentationMode": true,
  "visible": true
}
```

## Compatibility and migration notes (recomendado)

| Concern | Affected versions | Migration action | Deadline | Notes |
| --- | --- | --- | --- | --- |
| Legacy aliases coexist with canonical paths | Active consumers using legacy JSON keys | Keep canonical paths for new usage and map aliases in migration backlog | not-yet-defined | Track via component-level migration issue |

## Known limitations and mismatches (recomendado)

| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
| --- | --- | --- | --- | --- | --- |
| Canonical contract parity | No confirmed mismatch in this revision; runtime linkage verified for core flows and governed states (2026-04-27), with editor/tooling coverage pending | Keep runtime/schema/editor alignment evidence updated | 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 |
| --- | --- | --- | --- | --- |
| schema-metadata | projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.metadata.ts | Primary source of truth for contract and behavior. | 2026-04-27 | verified-path |
| runtime-code | projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.component.ts | Primary source of truth for contract and behavior. | 2026-04-27 | 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-04-27 | verified-path |
| schema-types | projects/praxis-core/src/lib/models/material-field-metadata.interface.ts | Primary source of truth for contract and behavior. | 2026-04-27 | verified-path |
