praxis-list
Este documento e a referencia canonica da API JSON de praxis-list.
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 herdado: Referencia canonica da JSON API do
praxis-list, com foco em:
Scope and positioning
- Escopo: contrato JSON publico e limites de comportamento observavel.
- Fora de escopo: tutorial de adocao e walkthrough operacional detalhado.
- Posicionamento: referencia canonicamente governada para consumidores, arquitetos e mantenedores.
Source of truth
| Source | Kind | Notes |
|---|---|---|
| projects/praxis-list/src/lib/models/list-config.model.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/components/praxis-list.component.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/components/praxis-list.component.html | template-style | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/components/praxis-list.component.scss | template-style | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/services/list-data.service.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/services/list-skin.service.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/utils/template-evaluator.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/utils/selection-adapter.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/editors/list-config-editor.component.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/ai/list-ai.adapter.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/ai/list-ai-capabilities.ts | runtime-code | Source de implementacao declarado no repositorio. |
| projects/praxis-list/src/lib/ai/list-context-pack.ts | runtime-code | Source de implementacao declarado no repositorio. |
Rich content convergence
mapListTemplateToRichContentP0(...)e a ponte publica e restrita entre a taxonomia atual de templating dopraxis-liste o vocabulario compartilhado1.0de rich content em@praxisui/core.- O subconjunto promovido nesta fase e intencionalmente pequeno:
text,icon,image,chip -> badge,metricecompose. - Tipos como
component,slot,html,rating,currencyedatecontinuam list-owned e fora do contrato compartilhado1.0ate uma promocao semantica explicita.
Support legend
- Active: suportado e observado no runtime atual.
- Partial: suporte parcial, com restricoes conhecidas.
- Declared-only: declarado em tipos/schema sem ligacao runtime confirmada.
- Schema-only: presente em schema/modelo sem confirmacao de execucao.
- Deprecated: mantido por compatibilidade legada com migracao prevista.
Contract classification
Canonical paths (public contract)
| Path | Type | Required | Default | Status | Notes |
|---|---|---|---|---|---|
id |
not-specified | not-specified | n/a | Declared-only | preservado no contrato, sem efeito direto |
dataSource |
not-specified | not-specified | n/a | Active | origem de dados, query e sort |
layout |
not-specified | not-specified | n/a | Partial | maioria ativa; stickySectionHeader e virtualScroll sem binding funcional |
skin |
not-specified | not-specified | n/a | Active | classes + css vars + inline style sanitizado |
selection |
not-specified | not-specified | n/a | Active | binding e shape do payload de selecao |
templating |
not-specified | not-specified | n/a | Partial | quase completo; type='slot' sem renderer |
actions |
not-specified | not-specified | n/a | Partial | quase completo; emitPayload sem consumo no runtime |
i18n |
not-specified | not-specified | n/a | Active | locale/currency para date/currency |
ui |
not-specified | not-specified | n/a | Active | busca/sort/range |
export |
not-specified | not-specified | n/a | Active | contrato compartilhado de exportação de coleções |
a11y |
not-specified | not-specified | n/a | Partial | aria ativos; highContrast/reduceMotion sem efeito |
events |
not-specified | not-specified | n/a | Declared-only | mapeamentos declarados sem roteamento runtime |
Supported legacy paths
Nenhum path legado suportado foi identificado nesta revisão baseada em evidência textual preservada.
Internal-only paths
| Path | Internal consumer | Runtime presence | Public support | Notes |
|---|---|---|---|---|
praxis-list-config-{componentKey} |
persistência interna (ASYNC_CONFIG_STORAGE) |
Yes | No | Chave derivada de listId/componentInstanceId/route. |
skinScopeId |
isolamento de CSS por instância | Yes | No | Gerado no runtime para escopo de estilos. |
Experimental paths
Nenhum path experimental permanece ativo nesta revisão. templating.features[] materializa o mesmo conjunto de TemplateDef dos slots principais, preservando também o formato legado { icon, expr, class, style }.
Overview
Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecnico existente. O conteudo detalhado anterior foi preservado para manter rastreabilidade historica e reduzir perda de contexto.
Public contract surface
Top-level configuration blocks
| Block | Purpose | Required | Merge strategy | Notes |
|---|---|---|---|---|
dataSource |
Origem de dados, query, sort e paginação | Yes | deep-merge | Base para ListDataService. |
layout |
Modelo visual e paginação do componente | No | deep-merge | virtualScroll e stickySectionHeader com cobertura parcial. |
skin |
Tema visual com classes, css vars e style inline | No | replace-block | Processado por ListSkinService. |
selection |
Estratégia de seleção e integração com formulário | No | deep-merge | Normaliza modo single/multiple e payload de retorno. |
templating |
Slots primário/secundário/meta/trailing | No | deep-merge | Avaliação por template engine + inferência opcional. |
actions |
Ações locais e globais por item | No | replace-array | Inclui confirmação opcional e loading por ação. |
i18n |
Locale/currency para renderizadores date/currency |
No | deep-merge | Aplica fallback de locale/currency quando ausente. |
ui |
Busca, ordenação e elementos auxiliares de UX | No | deep-merge | Conecta com stream de pesquisa e estado de página. |
Nested configuration blocks
| Path | Type | Required | Default | Constraints | Notes |
|---|---|---|---|---|---|
id |
not-specified | not-specified | n/a | component-defined | preservado no contrato, sem efeito direto |
dataSource |
not-specified | not-specified | n/a | component-defined | origem de dados, query e sort |
layout |
not-specified | not-specified | n/a | component-defined | maioria ativa; stickySectionHeader e virtualScroll sem binding funcional |
skin |
not-specified | not-specified | n/a | component-defined | classes + css vars + inline style sanitizado |
selection |
not-specified | not-specified | n/a | component-defined | binding e shape do payload de selecao |
templating |
not-specified | not-specified | n/a | component-defined | quase completo; type='slot' sem renderer |
actions |
not-specified | not-specified | n/a | component-defined | quase completo; emitPayload sem consumo no runtime |
i18n |
not-specified | not-specified | n/a | component-defined | locale/currency para date/currency |
ui |
not-specified | not-specified | n/a | component-defined | busca/sort/range |
a11y |
not-specified | not-specified | n/a | component-defined | aria ativos; highContrast/reduceMotion sem efeito |
Input bindings
| Binding/Path | Type | Required | Source | Runtime normalization | Notes |
|---|---|---|---|---|---|
config |
PraxisListConfig |
Yes (logical) | component-input | convertido para ListAuthoringDocument antes do apply plan |
Config projetada de runtime; a autoria canônica é ListAuthoringDocument. |
configPersistenceStrategy |
'local-first' | 'input-first' | 'volatile' |
No | component-input | volatile elimina a chave de storage |
Use volatile em previews efêmeros que não podem ler nem gravar configuração. |
listId |
string |
Yes | component-input | component key builder | Necessário para escopo de persistência. |
componentInstanceId |
string | undefined |
No | component-input | component key scoping | Evita colisão entre instâncias da mesma lista. |
form |
FormGroup | null | undefined |
No | component-input | selection adapter | Integra seleção com controle externo quando configurado. |
enableCustomization |
boolean |
No | component-input | boolean coercion | Input canônico para habilitar editor/configuração visual em runtime. |
Output events
| Event | Payload | Trigger | Stability | Notes |
|---|---|---|---|---|
itemClick |
ListItemEvent |
clique (mouse/teclado) em item | Partial | Preservado da documentação anterior. |
actionClick |
ListActionEvent |
acao local de item, global com emitLocal=true ou acao de rich-content hospedado |
Partial | rich-content inclui payload? e source='rich-content'. |
selectionChange |
ListSelectionEvent |
alteração pelo controle explícito de seleção da linha | Partial | Preserva binding e payload; a superfície usa checkbox/radio. |
exportAction |
any |
resultado ou erro de exportacao de colecao | Active | Usa PraxisCollectionExportService. |
configPatchChange |
{ inputPatch: { config: PraxisListConfig } } |
Apply/Save válido do editor nativo ou authoring por adapter | Active | Atualiza a página autorada; não emite hidratação, inferência, filtros ou seleção runtime. |
External side channels
| Channel | Direction | Contract | Failure mode | Notes |
|---|---|---|---|---|
ASYNC_CONFIG_STORAGE |
bidirectional | loadConfig/saveConfig |
fail-open | Persistência de configuração por listId/instância. |
SettingsPanelService |
bidirectional | open(...).applied$/saved$ |
fail-open | Canal de edição runtime para PraxisListConfigEditor. |
GlobalActionService |
outbound action | executeRef(globalAction, context) |
fail-soft | Opcional; ausência gera warning e segue fluxo local. |
GLOBAL_DIALOG_SERVICE |
bidirectional | confirmação de ação | fail-open | Opcional; sem serviço, ação segue sem modal central. |
PRAXIS_COLLECTION_EXPORT_PROVIDER |
outbound export | exportCollection(request) |
fail-fast | Necessário para escopos remotos filtered/all e formatos avançados. |
Host/runtime dependencies
| Dependency | Required | Environment | Purpose | Notes |
|---|---|---|---|---|
ListDataService |
Yes | browser/dev/prod/ssr | fluxo de dados | Stream de itens, seção, loading e paginação. |
ListSkinService |
Yes | browser/dev/prod | skin runtime | Gera classes/estilos sanitizados por instância. |
ASYNC_CONFIG_STORAGE |
Yes | browser/dev/prod | persistência | Salva e restaura config de lista. |
SettingsPanelService |
Yes | browser/dev/prod | editor runtime | Abre editor de configuração com preview/apply/save. |
GenericCrudService |
Optional | browser/dev/prod | inferência de schema | Usado para inferência de templating quando resourcePath existe. |
ComponentKeyService |
Yes | browser/dev/prod/ssr | chave de escopo | Determina namespace de persistência e isolamento. |
Coverage matrix
| Surface | Verified | Coverage status | Evidence | Notes |
|---|---|---|---|---|
| Runtime | false | Partial | source_of_truth + conteudo preservado | Revisao estrutural concluida; validacao comportamental fina pode exigir follow-up. |
| Schema/Types | true | Partial | interfaces/modelos citados | Mapeamento formal de todos os campos ainda pode requerer refinamento. |
| Editor/Tooling | false | Partial | secoes de editor quando presentes | Cobertura de editor/tooling nem sempre confirmada por evidencia direta. |
Runtime coverage boundaries
- Cobertura consolidada com base em documentacao existente e source of truth declarado.
- Comportamentos fora de evidencia direta foram marcados como not-yet-verified ou Partial.
- Compatibilidade legada, quando detectada, foi separada em classificacao explicita.
Resolution model
Merge order
- contrato recebido em
@Input() configou documento vindo do editor runtime - hidratação opcional de config persistida (
ASYNC_CONFIG_STORAGE) - parse do payload para
ListAuthoringDocument - projeção para
PraxisListConfigviabuildListApplyPlan(...) - executor runtime fino para data, seleção, skin, persistência e inferência
Fallback order
config explícita -> config persistida por chave -> config corrente em memória -> comportamento seguro sem persistência.
Override points
@Input() confige@Input() form- editor runtime (
openConfigEditor, apply plan) - persistência por host (
ASYNC_CONFIG_STORAGE)
Runtime normalization
applyAuthoringPayload()faz parse, validação, apply plan e executor runtime sem recriar componente.buildListApplyPlan(...)também carrega a decisão explícita de inferência de schema; o host só executa essa etapa fina sem inferir a partir de estado runtime arbitrário.setupSelectionBinding()adapta shape de seleção para retorno declarativo.executeSchemaInferenceForPlan()infere templates quando faltantes ou quando slots de demonstracao nao estao aterrados nos campos publicados pelo schema do recurso.
Precedence rules
- config externa mais recente tem precedência sobre hidratação tardia de storage.
- editor
savedpersiste e reaplica;appliedreaplica sem persistir obrigatoriamente. - quando
listIdausente, runtime segue sem persistencia e sem warning operacional; a lista continua renderizando e editando normalmente.
Validation and error semantics
Validation model
| Path/Rule | Validation phase | Behavior on fail | Error code / warning | Notes |
|---|---|---|---|---|
listId para persistência |
init/runtime | disable persistence silently | n/a | Lista continua funcional sem restore/save. |
Json Logic showIf inválido |
runtime evaluate | warning + fallback false | praxis-list:invalid-show-if |
Evita render incorreto por condição malformada. |
GlobalActionService indisponível |
runtime action dispatch | warning + skip comando global | praxis-list:global-command-unavailable |
Não interrompe ações locais/emissão de eventos. |
| inferência de schema falha | startup/runtime | ignore error | n/a | Mantém configuração original sem inferência. |
Error semantics
A maior parte das falhas opera em modo fail-open (persistência, inferência, comandos globais opcionais). O componente prioriza continuidade de renderização e emissão de eventos locais.
Fail-open / fail-closed behavior
| Condition | Mode | Runtime behavior | Consumer impact |
|---|---|---|---|
Falha em loadConfig/saveConfig |
fail-open | ignora persistência e mantém config ativa | sem perda de renderização |
showIf invalido |
fail-closed | item/acao e ocultado com warning | evita renderizacao indevida |
| comando global não disponível | fail-open | ação global não executa; fluxo local continua | comportamento parcial, sem crash |
| contrato de seleção inconsistente | fail-soft | adapter normaliza payload para formato suportado | pode reduzir fidelidade do payload |
Invalid or unknown field handling
- Campos desconhecidos: comportamento depende da estrategia do componente (ignore, warn ou reject).
- Campos invalidos: podem gerar fallback, warning ou falha conforme implementacao.
- Registrar divergencias observadas em Known limitations and mismatches.
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 |
Detailed API
Preserved technical reference (normalized from previous revision)
Referencia canonica da JSON API do praxis-list, com foco em:
- cobrir 100% do contrato
PraxisListConfigaceito hoje; - separar com clareza o que esta
Active,PartialeDeclared-only; - explicar como a lista interage com o ecossistema Praxis (data, skin, settings panel, AI e acoes globais).
Legenda de suporte:
Active: ligado e observavel no runtime atual.Partial: parcialmente ligado (subconjunto funcional).Declared-only: existe no contrato, sem consumo direto no runtime atual.
Table of contents
- Overview
- API
- Component inputs
- Component outputs
- Data mode and flow
- Persistencia e identidade
- PraxisListConfig top-level
- JSON coverage matrix (top-level)
- DataSource API
- Layout API
- Skin API
- Selection API
- Templating API (deep dive)
- Actions API
- UI, i18n, a11y e events
- Expressoes suportadas (
expreshowIf) - Settings Panel e AI assistant
- Complete JSON path index (cobertura total)
- Styling
- Examples
- Known limitations and mismatches
- Source references
Overview
praxis-list e um runtime schema-driven para listas visuais em tres variantes:
listcardstiles
O comportamento de runtime continua projetado a partir de PraxisListConfig, mas a autoria canônica e governada por ListAuthoringDocument.
Fluxo simplificado:
- Recebe
config. - Resolve origem de dados (local ou remota).
- Aplica skin (classes + CSS vars + inline style sanitizado).
- Renderiza slots de templating (
leading,primary,meta, etc.). - Executa acoes por item (local/global) e emite eventos para host.
Porque este componente e diferente
praxis-list combina render declarativo e operacao de dados real no mesmo contrato:
- suporta local e remoto com pipeline unico;
- possui sistema de templating por slot com tipos visuais;
- integra skin tokenizada, editor runtime e assistente AI;
- permite acoes globais via catalogo do host sem acoplamento direto da lista.
Pitch de 30 segundos (valor)
Uma lista que funciona como plataforma de experiencia: layout, estilo, templating, dados e acoes ficam no JSON, e o runtime adapta list/cards/tiles com o mesmo contrato.
- Entrega rapida: altera UX por configuracao.
- Padrao corporativo: mesmo contrato em telas diferentes.
- Escalavel: composicao com actions globais, editor e AI sem fork de componente.
Mapa de contrato e superficies
Quatro superficies governam o componente:
- Documento de autoria (
ListAuthoringDocument): envelope persistivel e canônico para editor visual, editor JSON, host runtime e fluxos futuros de IA/playground. - Config canônica projetada (
PraxisListConfig): dados, layout, skin, selecao, templating, acoes e UI. - Inputs externos:
listId,componentInstanceId,formeenableCustomization. - Outputs:
itemClick,actionClick,selectionChange,exportAction,configPatchChange. - Side channels: persistencia assinc, settings panel, global action bus e AI adapter.
Integracao com ecossistema Praxis
| Componente/Servico | Papel | Como se conecta |
|---|---|---|
ListDataService |
pipeline de dados local/remoto | dataSource.data/resourcePath/query/sort |
ListSkinService |
classes e CSS dinamico | skin.* + layout.density/itemSpacing/model/lines |
SettingsPanelService |
edicao runtime | openConfigEditor() com PraxisListConfigEditor retornando ListAuthoringDocument |
PraxisListConfigEditor |
autoria visual do documento | tabs visuais + aba JSON canônica |
GlobalActionService |
acoes globais estruturadas | actions[].globalAction |
GLOBAL_DIALOG_SERVICE |
confirmacao de acao | actions[].confirmation |
ASYNC_CONFIG_STORAGE |
persistencia de config | praxis-list-config-${componentKeyId} |
ComponentKeyService |
identidade de instancia | listId + componentInstanceId + route |
PraxisCollectionExportService |
exportação de coleção | CSV/JSON local; provider para export remoto/formatos avançados |
PraxisAiAssistantShellComponent + ListAgenticAuthoringTurnFlow + ListAiAdapter |
copiloto semantico governado | ativo com enableCustomization=true; rejeita patch JSON livre e exige componentEditPlan manifest-backed antes de apply local |
GenericCrudService |
dados remotos e inferencia de schema | /filter + fallback getAll apenas sem critérios ativos + getSchema |
Checklist corporativo pre-flight
Antes de liberar para producao:
- Defina
listIdestavel por tela. - Em multi-instancia, defina
componentInstanceId. - Se remoto: valide
resourcePath; o fallback/filter->getAllexiste apenas para consulta sem critérios ativos. - Em
actions[].globalAction, aplique governanca de acoes globais no host. - Para
type='html', mantenha origem confiavel do conteudo. - Nao trate
showIfcomo autorizacao; backend continua soberano.
API
Component inputs
| Input | Tipo | Required | Default | O que controla | Runtime |
|---|---|---|---|---|---|
config |
PraxisListConfig |
Yes (logico) | sem default seguro | Contrato principal | Active |
listId |
string |
Yes | sem default | identidade de persistencia | Active |
componentInstanceId |
string | undefined |
No | undefined |
isolamento de instancias | Active |
queryContext |
PraxisDataQueryContext | null |
No | undefined |
filtros/sort/página runtime | Active |
form |
FormGroup | null | undefined |
No | undefined |
binding de selecao externa | Active |
enableCustomization |
boolean |
No | false |
editor + AI assistant | Active |
Component outputs
| Output | Payload | Quando dispara |
|---|---|---|
itemClick |
ListItemEvent |
clique (mouse/teclado) em item |
actionClick |
ListActionEvent |
acao local de item (ou global com emitLocal=true) |
selectionChange |
ListSelectionEvent |
alteração pelo checkbox/radio explícito da linha |
exportAction |
any |
exportacao concluida, delegada ou com erro |
configPatchChange |
{ inputPatch: { config: PraxisListConfig } } |
Apply/Save válido ou authoring por adapter; snapshot independente para o host |
O editor hospedado oferece Origem da configuração para o input existente configPersistenceStrategy: Configuração da página (input-first), Preferências individuais da lista (local-first) e Configuração temporária (volatile). Para páginas compostas, escolha input-first para evitar que preferências antigas sobreponham o documento salvo da página. Apply, Save e Reset preservam essa escolha e os demais inputs.
Data mode and flow
Resolucao do modo de dados em ListDataService.stream():
- Se
dataSource.dataexiste, usa modo local. - Senao, se
dataSource.resourcePatheGenericCrudServiceexistem, usa modo remoto. - Senao, retorna vazio.
Regras operacionais:
- Local tem precedencia sobre remoto quando ambos estao presentes.
- Remoto usa
filter(query, pageable). - Em erro no
/filtersem critérios ativos, faz fallback de compatibilidade paragetAll()com warning deduplicado. - Em erro no
/filtercom critérios ativos, falha fechado: mantém o contexto de filtro, zera o resultado, publicaListRemoteLoadErroremListDataService.error$e oferece nova tentativa. Dados sem filtro nunca substituem silenciosamente a consulta solicitada. - Busca (
ui.showSearch) aplica debounce de300mse exigeui.searchField. - Busca, ordenação e exportação compartilham a toolbar superior da coleção; paginação permanece no footer. Busca, ordenação e paginação remotas aparecem apenas quando o modo resolvido é
remote, nunca quandodatalocal tem precedência sobreresourcePath. - Em viewport estreito,
layout.rowLayoutrecompõe os slots semânticos canônicos (leading,primary,secondary,meta,trailing) em linhas ordenadas sem sobreposição; slots operacionais estendidos são empilhados no owner da lista, sem CSS corretivo no host. - Atualizações síncronas de query, ordenação e página materializadas pelo mesmo
queryContextsão coalescidas antes do acesso HTTP; o backend recebe somente o estado final consistente. ListDataService.error$é umObservable<ListRemoteLoadError | null>somente leitura; consumidores podem reagir e solicitarrefresh(), mas não publicar estados de erro no serviço.- Quando nao ha
dataSource.datanemdataSource.resourcePath, o runtime renderiza um empty state operacional orientando a conexao da lista a um recurso.
Matriz de decisao (runtime atual):
dataSource.data |
dataSource.resourcePath |
Modo resolvido | Superficie principal | Pipeline efetivo |
|---|---|---|---|---|
array |
qualquer valor | local |
lista/cards/tiles | local (data em memoria) |
null/undefined |
preenchido | remote |
lista/cards/tiles + toolbar e paginação | filter(query, pageable); fallback getAll() somente sem critérios ativos |
null/undefined |
vazio/ausente | empty |
empty state | sem pipeline de dados |
Regra critica de autoria:
- Se o host enviar
dataeresourcePathao mesmo tempo, o runtime usadata(modo local). - Se a intencao for remoto obrigatorio, nao envie
datano mesmo payload.
Persistencia e identidade
- Chave persistida:
praxis-list-config-${componentKeyId}. componentKeyIdderiva de:componentType='praxis-list'listIdcomponentInstanceId- contexto de rota.
Sem listId valido:
- persistencia e ignorada;
- nao ha warning; hosts de authoring dinamico podem renderizar e editar sem identidade persistente.
PraxisListConfig top-level
interface PraxisListConfig {
id?: string;
dataSource?: {...};
layout?: {...};
skin?: {...};
selection?: {...};
interaction?: {...};
templating?: {...};
expansion?: {...};
actions?: Array<...>;
i18n?: {
locale?: string;
currency?: string;
};
ui?: {...};
export?: {...};
a11y?: {...};
events?: {...};
}
JSON coverage matrix (top-level)
| JSON path | Status | Runtime notes |
|---|---|---|
id |
Declared-only | preservado no contrato, sem efeito direto |
dataSource |
Active | origem de dados, query e sort |
layout |
Partial | maioria ativa; stickySectionHeader e virtualScroll sem binding funcional |
skin |
Active | classes + css vars + inline style sanitizado |
selection |
Active | binding e shape do payload de selecao |
interaction |
Partial | expansao inline V1; apenas variant=list |
templating |
Partial | quase completo; type='slot' sem renderer |
expansion |
Partial | detail row tipada da V1 |
actions |
Partial | quase completo; emitPayload sem consumo no runtime |
i18n |
Active | locale/currency para date/currency |
ui |
Active | busca/sort/range |
export |
Active | exportação via contrato compartilhado de coleções |
a11y |
Partial | aria ativos; highContrast/reduceMotion sem efeito |
events |
Declared-only | mapeamentos declarados sem roteamento runtime |
DataSource API
| Caminho | Status | Observacao |
|---|---|---|
dataSource.data |
Active | modo local, total = tamanho do array |
dataSource.resourcePath |
Active | modo remoto |
dataSource.query |
Active | query inicial + base da busca |
dataSource.sort |
Active | sort inicial do pageable remoto |
Layout API
| Caminho | Status | Observacao |
|---|---|---|
layout.variant |
Active | list/cards/tiles |
layout.density |
Active | classe density-* |
layout.itemSpacing |
Active | classe item-spacing-* |
layout.lines |
Active | linhas de texto + classe lines-* |
layout.dividers |
Active | divisores no modo list |
layout.model |
Active | classe model-* |
layout.groupBy |
Active | agrupamento em sections$ |
layout.pageSize |
Active | page size inicial |
layout.stickySectionHeader |
Declared-only | sem sticky runtime |
layout.virtualScroll |
Declared-only | sem virtual scroll runtime |
Skin API
| Caminho | Status | Observacao |
|---|---|---|
skin.type |
Active | classe skin-* |
skin.gradient.from |
Active | css var |
skin.gradient.to |
Active | css var |
skin.gradient.angle |
Active | css var |
skin.radius |
Active | css var |
skin.shadow |
Active | css var |
skin.border |
Active | css var |
skin.backdropBlur |
Active | css var |
skin.class |
Active | classe extra no host |
skin.inlineStyle |
Active | css inline com sanitizacao + escopo |
Notas de seguranca:
- sanitizacao remove
url(,@import,expression(,behavior:e comentarios CSS; - regras sao escopadas ao seletor da instancia para reduzir vazamento de estilo.
Selection API
| Caminho | Status | Observacao |
|---|---|---|
selection.mode |
Active | none/single/multiple |
selection.formControlName |
Active | binding em form externo |
selection.formControlPath |
Active | binding em path do form externo |
selection.compareBy |
Active | igualdade de seleção e geração de ids |
selection.return |
Active | value/item/id no payload selectionChange.value |
A identidade de renderização é independente da identidade escolhida para a
seleção. Registros HATEOAS usam prioritariamente _links.self.href, evitando
colisões quando o mesmo identificador de domínio aparece em competências ou
projeções diferentes. Na ausência de self link, a lista aplica sua cadeia de
identidade estável baseada nos identificadores e discriminadores presentes no
registro; selection.compareBy continua restrito ao contrato de seleção.
Na variante list, a materialização acessível usa um mat-list neutro. Cada
linha expõe checkbox (multiple) ou radio (single), ação principal, ações
secundárias e expansão como alvos de teclado irmãos. Isso elimina controles
interativos aninhados sem alterar PraxisListConfig, o FormControl, o formato
de ListSelectionEvent ou a precedência de selection.compareBy.
Export API
| Caminho | Status | Observacao |
|---|---|---|
export.enabled |
Active | Renderiza menu de exportação da lista. |
export.formats |
Active | csv/json/excel/pdf/print; CSV/JSON têm fallback local. |
export.general.scope |
Active | auto/selected/filtered/currentPage/all; auto prioriza seleção. |
export.general.includeHeaders |
Active | Controla cabeçalho em exportações tabulares. |
export.general.maxRows |
Active | Limita linhas no fallback local. |
export.general.defaultFileName |
Active | Nome base do arquivo gerado. |
export.general.includeFields |
Active | Lista de paths exportáveis ou all para inferência por chaves. |
export.general.applyFormatting |
Active | Mantido para paridade com o contrato compartilhado. |
Escopos remotos filtered/all e formatos excel/pdf/print exigem provider em @praxisui/core.
Nota critica de integridade:
- quando
interaction.expandable=trueeselection.mode !== 'none', o runtime canonico coercesinteraction.expandTriggerparaicon; - essa coercao e aplicada na normalizacao do contrato antes do runtime para eliminar ambiguidade entre selecionar e expandir a mesma linha;
- a combinacao evita ambiguidade operacional entre selecionar linha e expandir detail row.
- quando
interaction.expandablenao estiver ativo, a normalizacao nao deve materializarexpandTriggernemexpandMode.
Interaction API
| Caminho | Status | Observacao |
|---|---|---|
interaction.expandable |
Active | habilita expansao inline V1 |
interaction.expandTrigger |
Partial | row/icon/row+icon; com selecao ativa, a normalizacao canonica o converte para icon |
interaction.expandMode |
Active | single/multiple |
Escopo normativo da V1:
- suportado apenas quando
layout.variant = 'list'; - fora de
list, o authoring gera diagnostico de erro e o runtime nao materializa detail row. - no exemplo oficial da lib, o cenario
executive-expansionfixavariant = list,lines = 2eselection.mode = nonepara manter aderencia a referencia visual e evitar controles inertes.
Templating API (deep dive)
Slots suportados:
leading,primary,secondary,meta,trailing,sectionHeader,emptyState.
Tipos funcionais no runtime:
text,icon,image,chip,rating,currency,date,html,metric,compose,component.
Inferencia opcional:
- Quando
dataSource.resourcePathexiste,GenericCrudService.getSchema()retorna campos e o runtime pode inferir uma materializacao inicial sem alterar o contrato canonico. - A inferencia prioriza identidade (
nomeCompleto/name), avatar (foto/avatar/photo/image), contato (telefone/emailoucpf/email), agrupamento organizacional (departamento/area/time) e status (status/ativo) usando os slots existentes. - Slots de demonstracao que referenciam campos ausentes no schema do recurso sao descartados antes da inferencia. Campos tecnicos ou numericos como
id,idade,age,ativo/statusnao sao promovidos parametapor inferencia.
Tipo declarado sem renderer dedicado:
slot.
| Caminho | Status | Observacao |
|---|---|---|
templating.<slot>.type |
Partial | slot sem renderer dedicado |
templating.<slot>.expr |
Active | avaliado por evaluateTemplate/evalSlot |
templating.<slot>.class |
Active | classes por slot |
templating.<slot>.style |
Active | estilo inline por slot |
templating.<slot>.color |
Active | chip/icon/rating |
templating.<slot>.variant |
Active | chip filled/outlined |
templating.<slot>.props.rating.max |
Active | limite de estrelas |
templating.<slot>.props.rating.size |
Active | tamanho de icone |
templating.<slot>.props.rating.color |
Active | cor rating |
templating.<slot>.imageAlt |
Active | alt de imagem |
templating.<slot>.badge.expr |
Active | badge em template de imagem |
templating.<slot>.badge.color |
Active | cor badge |
templating.<slot>.badge.variant |
Active | variante badge |
templating.metaPlacement |
Active | side/line |
templating.metaPrefixIcon |
Active | icone prefixado em meta textual |
templating.statusPosition |
Active | inline/top-right em cards/tiles |
templating.chipColorMap |
Active | valor -> cor |
templating.chipLabelMap |
Active | valor -> label |
templating.iconColorMap |
Active | status/icone -> cor |
templating.features |
Active | linha de features |
templating.featuresVisible |
Active | mostra/oculta features |
templating.featuresMode |
Active | icons+labels/icons-only/labels-only |
templating.skeleton.count |
Active | skeleton durante loading |
Expansion API
| Caminho | Status | Observacao |
|---|---|---|
expansion.sections |
Active | array de secoes da detail row |
expansion.sections[].id |
Active | identidade da secao |
expansion.sections[].title |
Active | titulo visivel da secao |
expansion.sections[].type |
Active | info-list/chip-list/timeline/key-value/metadata/component/rich-content |
expansion.sections[].itemsExpr |
Active | expr de colecao/objeto por item |
expansion.sections[].document |
Active | RichContentDocument canonico para secoes rich-content |
expansion.sections[].documentExpr |
Active | expr que resolve um RichContentDocument por item |
expansion.sections[].emptyLabel |
Active | mensagem vazia por secao |
expansion.rendering.shell |
Active | variante visual attached/detached/modal |
expansion.rendering.columns |
Active | uma, duas ou tres colunas materializadas no grid |
expansion.rendering.gap |
Active | espacamento governado entre secoes |
expansion.rendering.padding |
Active | espacamento interno governado |
expansion.rendering.class |
Active | classe adicional no shell |
expansion.rendering.style |
Active | declaracoes CSS adicionais sanitizadas pelo binding Angular |
Notas de UX/WCAG:
aria-expandedearia-controlsficam no owner real do trigger (rowouicon);- com
selection.mode !== 'none', a seleção é acionada pelo checkbox/radio explícito e a expansão permanece em um botão irmão, acionado apenas pelo ícone; expansion.sections[].itemsExprpode resolver arrays/objetos JSON com placeholders; o runtime materializa a estrutura em vez de exibir JSON cru;- para detalhes editoriais avancados, use
type='rich-content'comdocument/documentExpr; a lista hospeda o contrato canonicoRichContentDocumentem vez de criar DSL visual paralela; - ações dentro de seções
rich-contentsão mediadas porhostCapabilitiesda própria lista, reemitidas emactionClickcompayload?esource='rich-content', econfirmMessageusa o mesmoGLOBAL_DIALOG_SERVICEdas ações nativas; - a V1 nao suporta markup arbitrario nem detail builders livres;
cardsetilespermanecem fora de escopo.- o scenario
executive-expansionda doc page e uma composicao editorial canonica de validacao visual; campos comobalanceDisplay,limitDisplay,usageLabel,riskDisplayeriskLabelpertencem ao dataset de exemplo, nao ao contrato base dePraxisListConfig.
Actions API
| Caminho | Status | Observacao |
|---|---|---|
actions[].id |
Active | identificador da acao |
actions[].icon |
Active | icone |
actions[].label |
Active | label/aria-label |
actions[].color |
Active | tema/cor custom |
actions[].kind |
Active | icon ou button |
actions[].buttonVariant |
Active | stroked/raised/flat |
actions[].showIf |
Active | condição Json Logic avaliada no contexto row |
actions[].emitPayload |
Declared-only | sem uso no payload de ações nativas; ações rich-content hospedadas podem emitir payload? próprio |
actions[].action |
Active | surface.open identifica a execução contextual governada quando acompanhada de recordOpen |
actions[].recordOpen |
Active | referência mínima { sourceIdentityField, target: { resourceKey, surfaceId } }; o runtime reconsulta catálogo, item e _links.surfaces antes de materializar |
actions[].globalAction |
Active | integra com GlobalActionService.executeRef; suporta navigation.openRoute para navegação interna canônica |
actions[].globalAction.actionId |
Active | identificador canonico da acao global |
actions[].globalAction.payload |
Active | template/JSON resolvido recursivamente, inclusive item.id em rotas internas |
actions[].globalAction.payloadExpr |
Active | escape avancado de GlobalActionRef; quando nao ha payload, o runtime nao injeta payload sintetico |
actions[].emitLocal |
Active | emite actionClick mesmo com acao global |
actions[].showLoading |
Active | spinner + disable durante execucao |
actions[].confirmation.title |
Active | dialogo de confirmacao |
actions[].confirmation.message |
Active | dialogo de confirmacao |
actions[].confirmation.type |
Active | danger/warning/info |
Semantica de execucao:
- valida confirmacao (quando configurada);
- quando
action='surface.open', exigerecordOpen, extrai somente osourceIdentityFielddeclarado, reconsulta o recurso e a surface contextual do principal corrente e falha fechado se qualquer identidade/availability divergir; - fora desse fluxo, executa acao global estruturada (se
globalActionestiver presente), incluindonavigation.openRoutepara abrir rotas internas com contexto do item; - remove loading;
- emite
actionClickconforme regraemitLocal; uma intencaorecordOpennao cai em emissao local por default quando a resolucao falha.
recordOpen e materializacao governada de runtime e round-trip. O editor visual e o manifesto AI local nao authoram esse campo livremente; a fonte e a projection validada por Metadata/Config.
UI, i18n, a11y e events
| Caminho | Status | Observacao |
|---|---|---|
ui.showSearch |
Active | busca na toolbar superior (somente remoto) |
ui.searchField |
Active | campo da query de busca |
ui.searchPlaceholder |
Active | label do input |
ui.showSort |
Active | ordenação na toolbar superior (somente remoto) |
ui.sortOptions |
Active | string ou {label,value} |
ui.showRange |
Active | range X-Y de total |
i18n.locale |
Active | formatacao date/number |
i18n.currency |
Active | formatacao currency |
a11y.ariaLabel |
Active | aria-label do root |
a11y.ariaLabelledBy |
Active | aria-labelledby do root |
a11y.highContrast |
Declared-only | sem binding funcional |
a11y.reduceMotion |
Declared-only | sem binding funcional |
events.itemClick |
Declared-only | sem roteamento dinamico |
events.actionClick |
Declared-only | sem roteamento dinamico |
events.selectionChange |
Declared-only | sem roteamento dinamico |
events.exportAction |
Declared-only | sem roteamento dinamico |
events.loaded |
Declared-only | sem roteamento dinamico |
Superfícies de expressão (expr e showIf)
templating.*.expr
Suporte principal:
- placeholders:
${item.campo}; - pipes em placeholder:
bool,date,map,number; - pipe top-level
boolno expr completo.
Exemplos validos:
${item.active|bool:Ativo:Inativo}${item.createdAt|date:pt-BR:short}${item.status|map:done=Concluido;pending=Pendente}${item.total|number:pt-BR:compact}
actions[].showIf
Usa Json Logic canônico com contexto row.
Exemplos válidos:
{"==":[{"var":"row.status"},"done"]}{"and":[{"var":"row.active"},{"!":{"var":"row.archived"}}]}
Política de erro:
- fail-closed (ação fica oculta);
- warning apenas em dev mode, deduplicado.
Settings Panel e AI assistant
Quando enableCustomization=true:
- componente exibe botao de edicao + shell governada
PraxisAiAssistantShellComponent; openConfigEditor()abrePraxisListConfigEditor;applied$esaved$aplicam config em runtime;saved$persiste no storage quando chave valida existe.
AI:
ListAgenticAuthoringTurnFlowenvia contexto seguro para o backend e bloqueia patch livre;- capability/context packs orientam mudancas por contrato governado, nao por patch JSON local.
Complete JSON path index (cobertura total)
| JSON path | Status | Observacao |
|---|---|---|
id |
Declared-only | sem binding direto |
dataSource |
Active | bloco de dados |
dataSource.data |
Active | local mode |
dataSource.resourcePath |
Active | remote mode |
dataSource.query |
Active | query remota |
dataSource.sort |
Active | sort remoto |
layout |
Partial | bloco visual/estrutura |
layout.variant |
Active | list/cards/tiles |
layout.density |
Active | classe host |
layout.itemSpacing |
Active | gap vertical entre itens + classe host |
layout.lines |
Active | linhas + classe |
layout.dividers |
Active | divisor no list |
layout.model |
Active | classe host |
layout.groupBy |
Active | agrupamento |
layout.stickySectionHeader |
Declared-only | sem sticky runtime |
layout.virtualScroll |
Declared-only | sem virtual runtime |
layout.pageSize |
Active | pagina remota |
skin |
Active | bloco de skin |
skin.type |
Active | classe skin |
skin.gradient |
Active | vars gradiente |
skin.gradient.from |
Active | var |
skin.gradient.to |
Active | var |
skin.gradient.angle |
Active | var |
skin.radius |
Active | var |
skin.shadow |
Active | var |
skin.border |
Active | var |
skin.backdropBlur |
Active | var |
skin.class |
Active | classe extra |
skin.inlineStyle |
Active | css inline sanitizado |
selection |
Active | bloco de selecao |
selection.mode |
Active | none/single/multiple |
selection.formControlName |
Active | binding form |
selection.formControlPath |
Active | binding form |
selection.compareBy |
Active | igualdade de seleção e ids |
selection.return |
Active | value/item/id |
interaction |
Partial | bloco de expansao inline V1 |
interaction.expandable |
Active | toggle da expansao |
interaction.expandTrigger |
Partial | coerced para icon quando ha selecao |
interaction.expandMode |
Active | single/multiple |
templating |
Partial | bloco de slots |
templating.leading |
Active | slot |
templating.primary |
Active | slot |
templating.secondary |
Active | slot |
templating.meta |
Active | slot |
templating.trailing |
Active | slot |
templating.sectionHeader |
Active | slot |
templating.emptyState |
Active | slot |
templating.<slot>.type |
Partial | slot sem renderer |
templating.<slot>.expr |
Active | avaliador |
templating.<slot>.class |
Active | estilo |
templating.<slot>.style |
Active | estilo |
templating.<slot>.color |
Active | chip/icon/rating |
templating.<slot>.variant |
Active | chip variant |
templating.<slot>.props.rating.max |
Active | rating |
templating.<slot>.props.rating.size |
Active | rating |
templating.<slot>.props.rating.color |
Active | rating |
templating.<slot>.imageAlt |
Active | alt imagem |
templating.<slot>.badge.expr |
Active | badge |
templating.<slot>.badge.color |
Active | badge |
templating.<slot>.badge.variant |
Active | badge |
templating.metaPlacement |
Active | side/line |
templating.metaPrefixIcon |
Active | prefix icon |
templating.statusPosition |
Active | inline/top-right |
templating.chipColorMap |
Active | map cor |
templating.chipLabelMap |
Active | map label |
templating.iconColorMap |
Active | map cor icon |
templating.features |
Active | features row |
templating.features[].type |
Active | renderer tipado de TemplateDef |
templating.features[].icon |
Active | feature icon |
templating.features[].expr |
Active | feature expr |
templating.features[].class |
Active | feature class |
templating.features[].style |
Active | feature style |
templating.featuresVisible |
Active | toggle features |
templating.featuresMode |
Active | icons+labels/icons-only/labels-only |
templating.skeleton |
Active | skeleton bloco |
templating.skeleton.count |
Active | skeleton count |
expansion |
Partial | detail row governada |
expansion.sections |
Active | secoes do detail row |
expansion.sections[].id |
Active | id |
expansion.sections[].title |
Active | title |
expansion.sections[].type |
Active | info-list/chip-list/timeline/key-value/metadata/component/rich-content |
expansion.sections[].itemsExpr |
Active | expr |
expansion.sections[].document |
Active | RichContentDocument para rich-content |
expansion.sections[].documentExpr |
Active | expr que resolve RichContentDocument |
expansion.sections[].emptyLabel |
Active | empty state da secao |
expansion.rendering.shell |
Active | attached/detached/modal |
expansion.rendering.columns |
Active | 1/2/3 colunas |
expansion.rendering.gap |
Active | gap entre secoes |
expansion.rendering.padding |
Active | padding do shell |
expansion.rendering.class |
Active | classe do shell |
expansion.rendering.style |
Active | estilo adicional |
actions |
Partial | bloco de acoes |
actions[].id |
Active | id |
actions[].icon |
Active | icon |
actions[].label |
Active | label |
actions[].color |
Active | color |
actions[].kind |
Active | icon/button |
actions[].buttonVariant |
Active | raised/flat/stroked |
actions[].showIf |
Active | visibilidade |
actions[].emitPayload |
Declared-only | sem efeito runtime |
actions[].action |
Active | surface.open contextual governado |
actions[].recordOpen |
Active | identidade mínima resolvida por catálogo e HATEOAS |
actions[].globalAction |
Active | acao global estruturada |
actions[].globalAction.actionId |
Active | identificador canonico da acao global |
actions[].globalAction.payload |
Active | payload template/json |
actions[].emitLocal |
Active | emissao local |
actions[].showLoading |
Active | spinner/desabilita |
actions[].confirmation |
Active | confirmacao |
actions[].confirmation.title |
Active | confirmacao |
actions[].confirmation.message |
Active | confirmacao |
actions[].confirmation.type |
Active | danger/warning/info |
i18n |
Active | bloco i18n |
i18n.locale |
Active | locale |
i18n.currency |
Active | currency |
ui |
Active | bloco ui |
ui.showSearch |
Active | input busca |
ui.searchField |
Active | query field |
ui.searchPlaceholder |
Active | label busca |
ui.showSort |
Active | select sort |
ui.sortOptions |
Active | opcoes sort |
ui.showRange |
Active | range/total |
a11y |
Partial | acessibilidade |
a11y.ariaLabel |
Active | aria-label |
a11y.ariaLabelledBy |
Active | aria-labelledby |
a11y.highContrast |
Declared-only | sem binding |
a11y.reduceMotion |
Declared-only | sem binding |
events |
Declared-only | declarativo |
events.itemClick |
Declared-only | sem roteamento runtime |
events.actionClick |
Declared-only | sem roteamento runtime |
events.selectionChange |
Declared-only | sem roteamento runtime |
events.exportAction |
Declared-only | sem roteamento runtime |
events.loaded |
Declared-only | sem roteamento runtime |
Styling
Camadas de estilo no runtime:
- classes de host (
skin-*,density-*,model-*,lines-*,skin.class); - CSS vars geradas por
ListSkinService.toCssVars; - CSS inline opcional (
skin.inlineStyle) sanitizado e escopado por instancia.
Recomendacao corporativa:
- prefira
skin.*estruturado para padrao multiplataforma; - use
inlineStyleapenas para excecoes auditadas.
Examples
Minimal valid
{}
Typical/common
{}
Advanced
{}
Enterprise scenario
{}
Known limitations and mismatches
| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
|---|---|---|---|---|---|
| coverage/mapping | Evidência textual preservada indica itens Partial/Declared-only. | Cobertura confirmada por evidência runtime + schema + editor. | Pode gerar uso de paths não totalmente ligados. | to-be-linked | next-doc-cycle |
Compatibility and migration notes
| Concern | Affected versions | Migration action | Deadline | Notes |
|---|---|---|---|---|
| legacy aliases and mixed status vocabulary | pre-canonical docs | unificar para taxonomia canonica (Active/Partial/Declared-only/...) | next-doc-cycle | manter backward compatibility documentada |
Source references
| Source type | Path/URL | Why it is source of truth | Last verified (YYYY-MM-DD) | Notes |
|---|---|---|---|---|
| local-file | projects/praxis-list/src/lib/models/list-config.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/components/praxis-list.component.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/components/praxis-list.component.html | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/components/praxis-list.component.scss | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/services/list-data.service.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/services/list-skin.service.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/utils/template-evaluator.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/utils/selection-adapter.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/editors/list-config-editor.component.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/ai/list-ai.adapter.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/ai/list-ai-capabilities.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
| local-file | projects/praxis-list/src/lib/ai/list-context-pack.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |