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 do praxis-list e o vocabulario compartilhado 1.0 de rich content em @praxisui/core.
  • O subconjunto promovido nesta fase e intencionalmente pequeno: text, icon, image, chip -> badge, metric e compose.
  • Tipos como component, slot, html, rating, currency e date continuam list-owned e fora do contrato compartilhado 1.0 ate 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

  1. contrato recebido em @Input() config ou documento vindo do editor runtime
  2. hidratação opcional de config persistida (ASYNC_CONFIG_STORAGE)
  3. parse do payload para ListAuthoringDocument
  4. projeção para PraxisListConfig via buildListApplyPlan(...)
  5. 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() config e @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 saved persiste e reaplica; applied reaplica sem persistir obrigatoriamente.
  • quando listId ausente, 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 PraxisListConfig aceito hoje;
  • separar com clareza o que esta Active, Partial e Declared-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

praxis-list e um runtime schema-driven para listas visuais em tres variantes:

  1. list
  2. cards
  3. tiles

O comportamento de runtime continua projetado a partir de PraxisListConfig, mas a autoria canônica e governada por ListAuthoringDocument.

Fluxo simplificado:

  1. Recebe config.
  2. Resolve origem de dados (local ou remota).
  3. Aplica skin (classes + CSS vars + inline style sanitizado).
  4. Renderiza slots de templating (leading, primary, meta, etc.).
  5. 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:

  1. Documento de autoria (ListAuthoringDocument): envelope persistivel e canônico para editor visual, editor JSON, host runtime e fluxos futuros de IA/playground.
  2. Config canônica projetada (PraxisListConfig): dados, layout, skin, selecao, templating, acoes e UI.
  3. Inputs externos: listId, componentInstanceId, form e enableCustomization.
  4. Outputs: itemClick, actionClick, selectionChange, exportAction, configPatchChange.
  5. 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 listId estavel por tela.
  • Em multi-instancia, defina componentInstanceId.
  • Se remoto: valide resourcePath; o fallback /filter -> getAll existe 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 showIf como 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():

  1. Se dataSource.data existe, usa modo local.
  2. Senao, se dataSource.resourcePath e GenericCrudService existem, usa modo remoto.
  3. Senao, retorna vazio.

Regras operacionais:

  • Local tem precedencia sobre remoto quando ambos estao presentes.
  • Remoto usa filter(query, pageable).
  • Em erro no /filter sem critérios ativos, faz fallback de compatibilidade para getAll() com warning deduplicado.
  • Em erro no /filter com critérios ativos, falha fechado: mantém o contexto de filtro, zera o resultado, publica ListRemoteLoadError em ListDataService.error$ e oferece nova tentativa. Dados sem filtro nunca substituem silenciosamente a consulta solicitada.
  • Busca (ui.showSearch) aplica debounce de 300ms e exige ui.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 quando data local tem precedência sobre resourcePath.
  • Em viewport estreito, layout.rowLayout recompõ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 queryContext são coalescidas antes do acesso HTTP; o backend recebe somente o estado final consistente.
  • ListDataService.error$ é um Observable<ListRemoteLoadError | null> somente leitura; consumidores podem reagir e solicitar refresh(), mas não publicar estados de erro no serviço.
  • Quando nao ha dataSource.data nem dataSource.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 data e resourcePath ao mesmo tempo, o runtime usa data (modo local).
  • Se a intencao for remoto obrigatorio, nao envie data no mesmo payload.

Persistencia e identidade

  • Chave persistida: praxis-list-config-${componentKeyId}.
  • componentKeyId deriva de:
    • componentType='praxis-list'
    • listId
    • componentInstanceId
    • 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=true e selection.mode !== 'none', o runtime canonico coerces interaction.expandTrigger para icon;
  • 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.expandable nao estiver ativo, a normalizacao nao deve materializar expandTrigger nem expandMode.

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-expansion fixa variant = list, lines = 2 e selection.mode = none para 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.resourcePath existe, 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/email ou cpf/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/status nao sao promovidos para meta por 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-expanded e aria-controls ficam no owner real do trigger (row ou icon);
  • 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[].itemsExpr pode 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' com document/documentExpr; a lista hospeda o contrato canonico RichContentDocument em vez de criar DSL visual paralela;
  • ações dentro de seções rich-content são mediadas por hostCapabilities da própria lista, reemitidas em actionClick com payload? e source='rich-content', e confirmMessage usa o mesmo GLOBAL_DIALOG_SERVICE das ações nativas;
  • a V1 nao suporta markup arbitrario nem detail builders livres;
  • cards e tiles permanecem fora de escopo.
  • o scenario executive-expansion da doc page e uma composicao editorial canonica de validacao visual; campos como balanceDisplay, limitDisplay, usageLabel, riskDisplay e riskLabel pertencem ao dataset de exemplo, nao ao contrato base de PraxisListConfig.

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:

  1. valida confirmacao (quando configurada);
  2. quando action='surface.open', exige recordOpen, extrai somente o sourceIdentityField declarado, reconsulta o recurso e a surface contextual do principal corrente e falha fechado se qualquer identidade/availability divergir;
  3. fora desse fluxo, executa acao global estruturada (se globalAction estiver presente), incluindo navigation.openRoute para abrir rotas internas com contexto do item;
  4. remove loading;
  5. emite actionClick conforme regra emitLocal; uma intencao recordOpen nao 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 bool no 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() abre PraxisListConfigEditor;
  • applied$ e saved$ aplicam config em runtime;
  • saved$ persiste no storage quando chave valida existe.

AI:

  • ListAgenticAuthoringTurnFlow envia 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:

  1. classes de host (skin-*, density-*, model-*, lines-*, skin.class);
  2. CSS vars geradas por ListSkinService.toCssVars;
  3. CSS inline opcional (skin.inlineStyle) sanitizado e escopado por instancia.

Recomendacao corporativa:

  • prefira skin.* estruturado para padrao multiplataforma;
  • use inlineStyle apenas 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