@praxisui/table 9.0.0-beta.9 → 9.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,9 +37,9 @@ source_of_truth:
37
37
  - "projects/praxis-core/src/lib/tokens/global-action.catalog.ts"
38
38
  - "projects/praxis-core/src/lib/models/global-action.model.ts"
39
39
  - "projects/praxis-core/src/lib/actions/global-action-ui.ts"
40
- source_of_truth_last_verified: "2026-06-16"
40
+ source_of_truth_last_verified: "2026-06-24"
41
41
  publish_source_of_truth: false
42
- last_updated: "2026-06-16"
42
+ last_updated: "2026-06-24"
43
43
  toc: true
44
44
  sidebar: true
45
45
  tags:
@@ -92,6 +92,13 @@ Este documento e a referencia canonica da API JSON de praxis-table.
92
92
  - Para exportar apenas a selecao, combine `behavior.selection.enabled`, `config.export.general.scope: "selected"` e uma bulk action visivel apenas quando `selectedCount > 0`.
93
93
  - Quando `config.export.general.scope` e `"selected"`, a exportacao sem linhas selecionadas e bloqueada com feedback de usuario em vez de gerar um arquivo vazio.
94
94
 
95
+ ## AI assistant entrypoint
96
+
97
+ - `config.ai.assistant.enabled` controla a visibilidade e o acionamento do assistente de IA embarcado na tabela.
98
+ - Ausencia do campo equivale ao comportamento historico: o entrypoint continua disponivel quando o adapter de IA da tabela estiver carregado.
99
+ - Use `false` para surfaces em que o host precisa remover a acao de IA por contrato publico, sem CSS contra classes internas da tabela ou do Angular Material.
100
+ - Ao mudar para `false`, a tabela fecha o assistente e remove a sessao contextual da tabela no registry compartilhado de IA.
101
+
95
102
  ## Columns visibility dropdown
96
103
 
97
104
  - `config.toolbar.columnsVisibility.enabled` controla a exibição do botão de visibilidade de colunas na barra de ferramentas.
@@ -326,13 +333,25 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
326
333
  | `behavior.expansion.interaction.motion` | object | No | runtime-defaults | preset-driven | Presets controlados (`none`, `subtle-slide`, `accordion`, `fade-scale`) com respeito a `prefers-reduced-motion`; `durationMs` aceita `0` para desabilitar motion temporal. |
327
334
  | `appearance.responsive` | object | No | component-defaults | numeric-breakpoint | Breakpoint móvel inválido é normalizado para `768`. |
328
335
  | `toolbar.actions[]` | array | No | `[]` | action-contract | Ações de toolbar com roteamento para `toolbarAction`/`bulkAction`. |
329
- | `toolbar.appearance` | object | No | Material 3 fallback | token-contract | Governa variante, densidade, forma, divisores e tokens públicos da toolbar sem alterar a semântica das ações. |
336
+ | `toolbar.appearance` | object | No | Material 3 fallback | token-contract | Governa preset, variante, densidade, forma, divisores e tokens públicos da toolbar sem alterar a semântica das ações. |
330
337
  | `actions.row.actions[].recordSurface` | object | No | none | `ResourceSurfaceCatalogItem` | Preserva a identidade canônica da superfície relacionada aberta por uma ação de linha, mantendo `actions.row.actions[].id` como identidade do botão. |
331
338
  | `actions.row.discovery.enabled` | boolean | No | `true` | row-action-discovery | Controla se row actions podem ser enriquecidas por HATEOAS/capabilities. Configure `false` para manter somente ações declaradas em `actions.row.actions[]`. |
332
339
  | `columns[].renderer` | object | No | field-type-driven | renderer-contract | Renderers condicionais, payload expr e ações interativas. |
333
340
 
341
+ Quando `actions.row.discovery.enabled` esta ativo e o item publica
342
+ capabilities CRUD canonicas, `PraxisTable` pode sintetizar entradas
343
+ contextuais `view`, `edit` e `delete`. Quando o backend publica
344
+ explicitamente `operations["duplicate-draft"]`, a tabela tambem materializa
345
+ `duplicate-draft` como operacao estendida de item. Essas entradas continuam
346
+ sendo capabilities, nao workflow actions: o clique emite `rowAction` com
347
+ `actionConfig` apontando para a capability, para que um contexto CRUD ou
348
+ host composto materialize a operacao.
349
+
334
350
  Renderer defaults:
335
351
  - `columns[].renderer.type = "avatar"` aplica `columns[].align = "center"` quando a coluna não declara alinhamento explícito. Esse default governa header e célula para manter foto/avatar centralizados em colunas dedicadas, preservando `align`, `width` e demais overrides declarados pelo host.
352
+ - `columns[].renderer.type = "microVisualization"` renderiza a visualização compacta declarada em `renderer.microVisualization.visualization`. O caminho preferencial é metadata-driven: campos de schema com `presentation.presenter = "microVisualization"` e `presentation.visualization.surface = "table-cell"` são convertidos automaticamente para esse renderer quando o tipo é seguro para tabela. O contrato visual e a normalização pertencem a `@praxisui/core` (`PraxisPresentationVisualizationConfig`); a tabela apenas hospeda o HTML compacto em célula, compose item ou renderer condicional.
353
+
354
+ - Em tabela, campos `*Expr` da visualizacao, como `valueExpr`, `targetExpr`, `segmentsExpr`, `toneExpr` e `fallbackTextExpr`, sao resolvidos contra o contexto da linha antes de renderizar. Strings simples sao caminhos (`row.slaAtual`) e objetos seguem Json Logic. Para `kind = "comparison"`, use `points`/`pointsExpr`; `items` fica reservado para visualizacoes orientadas a itens/etapas.
336
355
 
337
356
  ### Toolbar contract
338
357
 
@@ -344,6 +363,7 @@ Renderer defaults:
344
363
  - O bloco `toolbar` continua parte do contrato público principal.
345
364
  - Use `toolbar.actions[]` para quick actions e `toolbar.search` para busca quando o host não injeta shell própria.
346
365
  - Use `toolbar.appearance` para personalizar o chrome da toolbar por contrato governado. O runtime materializa `variant`, `density`, `shape`, `divider` e `tokens` como classes e CSS custom properties públicas; o host pode trocar aparência sem redefinir intenção, capability ou roteamento.
366
+ - Use `toolbar.appearance.preset = "table-integrated"` para compor toolbar e tabela como um unico bloco visual com tokens públicos estáveis, evitando CSS do host sobre classes internas como `praxis-toolbar-stack-top` ou `table-stack-top`.
347
367
  - Tokens públicos suportados em `toolbar.appearance.tokens`: `bg`, `fg`, `borderColor`, `borderWidth`, `radius`, `shadow`, `paddingBlock`, `paddingInline`, `minHeight`, `gap`, `actionsGap`, `dividerColor`, `actionSize`, `actionRadius`, `actionBg`, `actionFg`, `actionHoverBg`, `actionActiveBg`, `actionFocusRing`, `aiAccentColor`, `statusFg`, `titleFg`, `subtitleFg`, `iconFg`, `titleFontSize`, `subtitleFontSize`, `titleFontWeight`, `identityGap`, `identityFilterGap`, `identityMinHeight`, `identityMarginBottom`, `identityIconSize` e `identityIconRadius`.
348
368
  - Para localizar paths específicos de toolbar, complemente a leitura com o `Appendix: JSON path index`.
349
369
 
@@ -368,7 +388,7 @@ Renderer defaults:
368
388
  | `icon` | `string` | No | component-input | host-surface passthrough | Ícone opcional usado em affordances auxiliares do runtime. |
369
389
  | `autoDelete` | `boolean` | No | component-input | boolean coercion | Ativa deleção automática quando o host delega esse fluxo ao runtime. |
370
390
  | `enableCustomization` | `boolean` | No | component-input | boolean coercion | Controla entrada em editor/configuração; default canônico `false`. |
371
- | `dense` | `boolean` | No | component-input | boolean coercion | Força modo compacto quando o host precisa sobrepor densidade do contrato. |
391
+ | `dense` | `boolean` | No | component-input | boolean coercion | Entrada legada de compactação. Equivale a `appearance.density="compact"` apenas quando o contrato não informa `appearance.density`. |
372
392
  | `notifyIfOutdated` | `'inline' \| 'snackbar' \| 'both' \| 'none'` | No | component-input | enum validation + prefs fallback | Política de aviso de drift de schema; o host escolhe banner inline, snackbar, ambos ou silêncio explícito. |
373
393
  | `snoozeMs` | `number` | No | component-input | numeric fallback + prefs fallback | Janela de snooze para avisos de drift; default do input é `86400000` (24h) e políticas globais podem complementar. |
374
394
  | `autoOpenSettingsOnOutdated` | `boolean` | No | component-input | schema-prefs resolution | Abre automaticamente o settings panel quando drift de schema é detectado. |
@@ -416,13 +436,14 @@ degraded filter.
416
436
  | `rowClick` | `{ row, index }` | Clique em linha. | Partial | Preservado da documentação anterior. |
417
437
  | `rowDoubleClick` | `{ action, row }` | Duplo clique quando habilitado. | Partial | Preservado da documentação anterior. |
418
438
  | `rowExpansionChange` | `RowExpansionChangeEvent` | Evento canônico para expand/collapse de detail row no runtime P0A (caminho não virtualizado), com payload discriminado por política de exposição (`allowRawExposure` + `eventExposureDefault`). | Partial | Preservado da documentação anterior. |
419
- | `rowAction` | `{ action, row, payload?, actionConfig?, localMode?, preventedHttp? }` | Acao de linha (coluna `_actions` ou renderer interativo). `payload` e emitido quando houver `payloadExpr` em renderer interativo. Quando `actionConfig.globalAction` aponta para `navigation.openRoute`, o runtime resolve templates como `${row.id}` antes de executar a navegação interna. Para actions como `surface.open`, `payload.*` continua sendo o envelope canônico do evento entregue ao destino. | Partial | Preservado da documentação anterior. |
420
- | `toolbarAction` | `{ action, actionConfig? }` | Acao clicada em `toolbar.actions[]` que nao foi roteada para fluxo bulk; `actionConfig` carrega o objeto da acao quando disponivel. | Partial | Preservado da documentação anterior. |
439
+ | `rowAction` | `{ action, row, payload?, actionConfig?, localMode?, preventedHttp? }` | Acao de linha (coluna `_actions`, renderer interativo ou CRUD capability sintetizada). `payload` e emitido quando houver `payloadExpr` em renderer interativo. Quando `actionConfig.globalAction` aponta para `navigation.openRoute`, o runtime resolve templates como `${row.id}` antes de executar a navegação interna. Para actions como `surface.open`, `payload.*` continua sendo o envelope canônico do evento entregue ao destino. Para `view/edit/delete/duplicate-draft` vindos de capabilities, `actionConfig` carrega a operacao canonica e o host composto deve encaminhar ao contexto CRUD apropriado. | Partial | Preservado da documentação anterior. |
440
+ | `toolbarAction` | `{ action, actionConfig? }` | Acao clicada em `toolbar.actions[]` que nao foi roteada para fluxo bulk; `actionConfig` carrega o objeto da acao quando disponivel. A acao `create` de colecao pode ser materializada automaticamente a partir de `_links.create`, rel `capabilities`, surfaces e `CrudOperationResolutionService`; quando `surface.open` esta disponivel, o runtime abre a surface de criacao antes de emitir fallback. | Partial | Preservado da documentação anterior com materializacao CRUD de colecao. |
421
441
  | `exportAction` | `{ format, request?, result?, error?, tableId? }` | Acao de exportacao acionada pelo menu `export.formats[]`; `request` segue `PraxisCollectionExportRequest`. | Active | Usa o contrato canonico de Collection Export em `@praxisui/core`. |
422
442
  | `exportAction` | `{ format, request?, result?, error?, tableId? }` | Acao de exportacao acionada pelo menu `export.formats[]`; `request` segue `PraxisCollectionExportRequest`. | Active | Usa o contrato canonico de Collection Export em `@praxisui/core`. |
423
443
  | `bulkAction` | `{ action, rows, actionConfig? }` | Acao em lote; `actionConfig` carrega a configuracao da acao quando disponivel. | Partial | Preservado da documentação anterior. |
424
444
  | `columnReorder` | `ColumnReorderEvent` | Reordenação de coluna concluída (drag/keyboard). | Partial | Inclui metadados de origem, destino e operação. |
425
445
  | `columnReorderAttempt` | `ColumnReorderAttemptEvent` | Tentativa bloqueada por política de drop-zone. | Partial | Evento diagnóstico para observabilidade e auditoria. |
446
+ | `columnResize` | `{ action: 'columnResize', trigger: 'pointer' \| 'keyboard', tableId, field, header, previousWidth, currentWidth, persisted }` | Redimensionamento de coluna concluido pelo separador do header. | Partial | Usa `behavior.resizing.enabled`, respeita `columns[].resizable !== false` e persiste `columns[].width` em px quando `persistWidths !== false`. Em modo `px`, altera a largura da coluna e a largura interna do conteudo rolavel; o viewport/card externo permanece estavel. |
426
447
  | `beforeDelete` | `row` | Antes de delete de linha. | Partial | Preservado da documentação anterior. |
427
448
  | `afterDelete` | `row` | Depois de delete com sucesso. | Partial | Preservado da documentação anterior. |
428
449
  | `deleteError` | `{ row, error }` | Erro no delete de linha. | Partial | Preservado da documentação anterior. |
@@ -931,6 +952,7 @@ row selection through table affordances.
931
952
  | `bulkAction` | `{ action, rows, actionConfig? }` | Acao em lote; `actionConfig` carrega a configuracao da acao quando disponivel. | Partial | Preservado da documentação anterior. |
932
953
  | `columnReorder` | `{ action, trigger: 'drag' \ | 'keyboard' \ | Partial | Preservado da documentação anterior. |
933
954
  | `columnReorderAttempt` | `{ action: 'columnReorderAttempt', trigger: 'drag' \ | 'keyboard', operationId, tableId, sourceField, targetField, previousIndex, currentIndex, sourceZone, targetZone, result: 'blocked', reasonCode: 'drop-zone-policy-blocked', configuredColumnDropZones[] }` | Partial | Preservado da documentação anterior. |
955
+ | `columnResize` | `{ action: 'columnResize', trigger: 'pointer' \| 'keyboard', tableId, field, header, previousWidth, currentWidth, persisted }` | Separador de resize no header. | Partial | Mutacao visual/runtime de largura; nao redefine schema nem dados. Em modo `px`, nao redistribui colunas vizinhas; o conteudo interno pode ficar maior que o viewport e usar scroll horizontal. |
934
956
  | `beforeDelete` | `row` | Antes de delete de linha. | Partial | Preservado da documentação anterior. |
935
957
  | `afterDelete` | `row` | Depois de delete com sucesso. | Partial | Preservado da documentação anterior. |
936
958
  | `deleteError` | `{ row, error }` | Erro no delete de linha. | Partial | Preservado da documentação anterior. |
@@ -947,28 +969,31 @@ row selection through table affordances.
947
969
  | `--p-table-row-even-bg` | zebra row |
948
970
  | `--p-table-row-hover-bg` | hover row |
949
971
  | `--p-table-row-selected-bg` | row selecionada |
972
+ | `--p-table-row-height` | altura da linha; sobrescreve o default do preset de densidade |
973
+ | `--p-table-header-height` | altura do header; sobrescreve o default do preset de densidade |
974
+ | `--p-table-column-resize-hit-area` | area clicavel do separador de resize |
975
+ | `--p-table-column-resize-separator-color` | cor base da divisoria de resize |
976
+ | `--p-table-column-resize-separator-hover-color` | cor da divisoria em hover/focus |
977
+ | `--p-table-column-resize-active-color` | cor da divisoria durante resize |
950
978
  | `--p-header-padding` | padding do header |
979
+ | `--p-cell-padding` | padding das células; sobrescreve o default do preset de densidade |
951
980
  | `--p-header-font-size` | fonte do header |
952
981
  | `--p-header-font-weight` | peso do header |
953
982
  | `--p-header-letter-spacing` | tracking do header |
954
983
  | `--p-header-text-transform` | caixa do texto do header |
955
- | `--p-table-drag-handle-size` | tamanho do handle de drag (preset padrao do runtime) |
956
- | `--p-table-drag-handle-color` | cor do handle de drag |
957
- | `--p-table-drag-handle-base-opacity` | opacidade base do handle em repouso |
958
- | `--p-table-drag-handle-idle-bg` | fundo base do handle em repouso |
959
- | `--p-table-drag-handle-idle-border` | borda base do handle em repouso |
960
- | `--p-table-drag-handle-hover-bg` | fundo do handle em hover/focus |
961
- | `--p-table-drag-handle-hover-border` | borda do handle em hover/focus |
962
- | `--p-table-drag-handle-active-bg` | fundo do handle em estado ativo |
963
- | `--p-table-drag-handle-active-border` | borda do handle em estado ativo |
964
- | `--p-table-drag-handle-focus-ring` | cor do anel de foco do handle |
965
- | `--p-table-drag-handle-transition-duration` | duracao das transicoes do handle |
966
984
  | `--p-table-reorder-transition-duration` | duracao da animacao de reorder das colunas |
967
985
  | `--p-table-drag-preview-scale` | escala visual do preview durante drag |
968
986
  | `--p-table-drag-preview-shadow` | sombra do preview durante drag |
969
987
  | `--p-table-drag-status-enter-duration` | duracao da entrada da mensagem visual de reorder |
970
- | `--p-actions-btn-size` | tamanho de botoes de acao |
971
- | `--p-actions-icon-size` | tamanho de icones de acao |
988
+ | `--p-actions-btn-size` | tamanho da superfície visível dos botões de ação; o alvo interativo permanece em 44px |
989
+ | `--p-actions-icon-size` | tamanho dos ícones de ação dentro da superfície canônica |
990
+ | `--p-table-paginator-container-min-height` | altura minima do paginator |
991
+ | `--p-table-paginator-container-padding` | padding do paginator |
992
+ | `--p-table-paginator-container-gap` | espaçamento entre controles do paginator |
993
+ | `--p-table-paginator-action-size` | tamanho dos botoes de navegacao do paginator |
994
+ | `--p-table-paginator-select-width` | largura do seletor de tamanho de pagina |
995
+ | `--p-table-paginator-select-height` | altura do seletor de tamanho de pagina |
996
+ | `--p-table-paginator-select-padding-inline` | padding horizontal do seletor de tamanho de pagina |
972
997
  | `--p-table-state-success-*` | tokens de estado success |
973
998
  | `--p-table-state-warning-*` | tokens de estado warning |
974
999
  | `--p-table-state-danger-*` | tokens de estado danger |
@@ -984,6 +1009,10 @@ row selection through table affordances.
984
1009
  | `col-borders` | bordas verticais entre colunas |
985
1010
  | `pfx-column-drag-enabled` | habilita layout base de DnD de colunas |
986
1011
  | `pfx-column-drag-indicator` | habilita indicador visual de drag |
1012
+ | `pfx-column-resize-enabled` | habilita separadores de resize no header |
1013
+ | `pfx-column-resizing` | estado ativo enquanto uma coluna esta sendo redimensionada |
1014
+
1015
+ `appearance.density` seleciona apenas o preset de defaults. `appearance.spacing.*` e defaults globais também alimentam tokens `*-default`. Hosts podem redefinir livremente os tokens finais sem depender de seletores internos, por exemplo `--p-table-row-height`, `--p-table-header-height`, `--p-cell-padding`, `--p-actions-btn-size` e `--p-table-paginator-select-height`. Em virtualização sem `itemHeight` explícito, o runtime deriva a altura da densidade efetiva.
987
1016
 
988
1017
  #### DnD classes (globais)
989
1018
  | Classe CSS | Escopo | Efeito |
@@ -1000,7 +1029,16 @@ A superficie usa `horizontalScroll` com classes:
1000
1029
  #### Row/cell conditional styling
1001
1030
  - `rowConditionalStyles` aplica classes/estilo por linha.
1002
1031
  - `columns[].conditionalStyles` aplica por celula.
1003
- - Presets uteis no SCSS: `row--success`, `row--warning`, `row--danger`, `row--highlight`, `row--muted`.
1032
+ - Para intenções semânticas cobertas pelo catálogo oficial, use `surfacePresetRef`, por exemplo `{ "id": "warning", "catalogVersion": "0.2.0" }`. A versão `0.2.0` oferece `success`, `warning`, `danger` e `highlight` nos escopos de linha e célula.
1033
+ - Fundo sólido determinístico sem `color` usa foreground acessível derivado no runtime; a cor derivada não é persistida no `TableConfig`.
1034
+ - `color` explícito continua sendo intenção autorada e deve atingir contraste WCAG AA (`4.5:1`) contra o fundo sólido efetivo.
1035
+ - O authoring bloqueia pares explícitos abaixo de AA. Para configuração legada ou manual que bypassou esse gate, o runtime substitui apenas o foreground renderizado por um fallback acessível e preserva o documento original para diagnóstico/correção governada.
1036
+ - Hover e zebra não apagam uma superfície condicional. Seleção possui precedência explícita com seu próprio par `--p-table-row-selected-bg`/`--p-table-row-selected-fg`.
1037
+ - Alpha, `var(...)`, `cssClass` externa, gradiente e shorthand não determinístico exigem preview contextual e não devem ser declarados acessíveis apenas por validação estrutural. O fundo contextual fica adiado no HTML inicial. Após o render, o runtime aplica fundo e foreground no mesmo frame e emite evidência DOM `derived-contextual` somente quando uma transparência ou variável CSS puder ser composta até uma base opaca e reduzida a uma única cor sólida. Gradientes, imagens e composições sem base opaca permanecem `unresolved-suppressed`, sem pintar o fundo inseguro.
1038
+ - Em CSP estrito, estilos condicionais inline são desativados e o runtime não faz reparos via CSSOM. Apenas um `surfacePresetRef` válido é convertido na classe privada correspondente; `cssClass` arbitrária falha fechado. Os nomes dessas classes são detalhe interno e não fazem parte do contrato de authoring.
1039
+ - A observação runtime publica `affordances.visualMaterialization.inlineStyle`, `governedClass` e `surfacePresetCatalog` (ID, versão, tema, modo, escopos e presets instalados), sem expor nonce ou a política CSP bruta. O backend usa essa evidência somente para restringir o preview: estilos inline exigem `inlineStyle=supported`; presets exigem instalação compatível comprovada. Capability ausente, `unknown`, versão/escopo/preset divergente ou modo de tema ainda não certificado falham fechado.
1040
+ - `muted` não integra o catálogo acessível: opacidade aplicada à linha pode compor com descendentes e invalidar o contraste. O modo `high-contrast` é observado pelo runtime, mas permanece não aplicável pelo authoring até ter evidência visual certificada; o catálogo `0.2.0` está certificado para `light` e `dark`.
1041
+ - Quando a cor comunicar estado ou classificação de negócio, materialize também uma pista visível independente de cor, como marcador lateral, ícone ou label.
1004
1042
 
1005
1043
  ### Examples
1006
1044
 
@@ -1193,8 +1231,10 @@ A superficie usa `horizontalScroll` com classes:
1193
1231
 
1194
1232
  ## Appendix: Events summary
1195
1233
 
1196
- `selectionChange` emits `{ trigger, row?, selectedRows, selectedCount, tableId? }`
1197
- for row selection changes initiated by the user.
1234
+ `selectionChange` emits `{ trigger, row?, selectedRows, selectedCount, tableId?, resourceIdentity? }`
1235
+ for row selection changes initiated by the user and with `trigger: "data-reconcile"`
1236
+ when a data update removes identities from the effective selection. Rehydrating the
1237
+ same identities does not emit a new selection event.
1198
1238
 
1199
1239
  Assistant turns can also receive the selected-row digest as context; textual
1200
1240
  matching on row values must not decide primary intent.
@@ -1217,6 +1257,7 @@ matching on row values must not decide primary intent.
1217
1257
  | `density-compact` / `density-comfortable` / `density-spacious` | host classes | controle de densidade visual | Derivadas de `appearance.density`. |
1218
1258
  | `.pfx-column-drag-enabled` | host class | habilita feedback visual de reordenacao | Ativada quando contrato de reorder esta habilitado. |
1219
1259
  | `.pfx-column-drag-indicator` | host class | indicador visual durante drag/drop | Integrada ao runtime de `columnReorder`. |
1260
+ | `.praxis-header-sort-trigger` | internal header zone | zona dedicada de sort no header | Recebe `mat-sort-header`; reorder por drag continua implicito no header cell. |
1220
1261
 
1221
1262
  ### Fallback global de aparencia
1222
1263