@praxisui/dynamic-fields 9.0.0-rc.1 → 9.0.0-rc.3

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-24T21:07:35.880Z",
3
+ "generatedAt": "2026-07-25T01:22:20.531Z",
4
4
  "packageName": "@praxisui/dynamic-fields",
5
- "packageVersion": "9.0.0-rc.1",
5
+ "packageVersion": "9.0.0-rc.3",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 76,
@@ -122379,7 +122379,7 @@
122379
122379
  },
122380
122380
  "pdx-material-async-select": {
122381
122381
  "id": "pdx-material-async-select",
122382
- "description": "Select com carregamento assíncrono de opções.",
122382
+ "description": "Combobox de selecao com busca e carregamento assincrono de opcoes.",
122383
122383
  "inputs": [
122384
122384
  {
122385
122385
  "name": "metadata",
@@ -122425,6 +122425,8 @@
122425
122425
  "widget",
122426
122426
  "field",
122427
122427
  "select",
122428
+ "combobox",
122429
+ "search",
122428
122430
  "async",
122429
122431
  "material"
122430
122432
  ],
@@ -125752,9 +125754,9 @@
125752
125754
  {
125753
125755
  "chunkIndex": 0,
125754
125756
  "chunkKind": "summary",
125755
- "content": "Component ID: pdx-material-async-select\nSelector: pdx-material-async-select\nFriendly Name: Async Select (Material)\nDescription: Select com carregamento assíncrono de opções.\nLib/Package: @praxisui/dynamic-fields\nTags: widget, field, select, async, material\nInputs:\n - metadata (MaterialSelectMetadata)\n - readonlyMode (boolean)\n - disabledMode (boolean)\n - visible (boolean)\n - presentationMode (boolean)\n",
125757
+ "content": "Component ID: pdx-material-async-select\nSelector: pdx-material-async-select\nFriendly Name: Async Select (Material)\nDescription: Combobox de selecao com busca e carregamento assincrono de opcoes.\nLib/Package: @praxisui/dynamic-fields\nTags: widget, field, select, combobox, search, async, material\nInputs:\n - metadata (MaterialSelectMetadata)\n - readonlyMode (boolean)\n - disabledMode (boolean)\n - visible (boolean)\n - presentationMode (boolean)\n",
125756
125758
  "sourcePointer": "projects/praxis-dynamic-fields/src/lib/components/material-async-select/material-async-select.metadata.ts",
125757
- "contentHash": "84ed8baf0ed74946d0a602a53e3d9bcdf8f35ee9a1f0a21e72d2a4e3d0fb9af0",
125759
+ "contentHash": "7771e7b327e31fabf9c121de968d212af0238a36009945ef750c9ae0cc06ca5a",
125758
125760
  "sourceKind": "component_definition",
125759
125761
  "sourceId": "pdx-material-async-select",
125760
125762
  "corpusVersion": "1.0.0"
@@ -87,11 +87,6 @@ campos, nao de CSS local. O Angular Material documenta que, em campos
87
87
  `fill`/`outline`, prefixos/sufixos nao se alinham bem com labels em repouso; por
88
88
  isso a recomendacao oficial e manter o label sempre flutuante nesses cenarios.
89
89
 
90
- O runtime usa `subscriptSizing: 'dynamic'` como padrao seguro: hints e erros
91
- multiline participam do fluxo vertical e nao podem invadir o proximo campo.
92
- Use `'fixed'` somente como opt-in explicito quando o conteudo do subscript for
93
- comprovadamente limitado a uma linha.
94
-
95
90
  ## 1. Texto livre vs selecao
96
91
 
97
92
  ### Use `input` / `textarea` quando
@@ -120,21 +115,26 @@ Se o schema usa `input` para algo que depois exige validacao pesada, busca seman
120
115
  | entidade de negocio remota com status, permissao, reidratacao ou dependencias | `entityLookup` | preserva identidade de entidade e usa contrato `RESOURCE_ENTITY` em vez de tratar entidade como opcao simples |
121
116
  | busca incremental com semantica de sugestao | `autoComplete` | boa UX para descoberta |
122
117
 
123
- ### Bootstrap assíncrono de seleção
118
+ ### Invariante de UX para selecao pesquisavel
124
119
 
125
- O valor selecionado e as options podem chegar em momentos diferentes. Para
126
- options locais, o host deve manter o `FormControl` vazio até a option canonica
127
- estar disponível. Caso o valor persistido já tenha chegado, o
128
- `inlineEntityLookup` o preserva como pendente: não o apresenta como seleção
129
- ativa nem emite evento de seleção até encontrar a option correspondente.
120
+ Uma selecao simples pesquisavel deve ocupar um unico campo visual. O runtime
121
+ pode manter dois estados internos, mas eles nao podem ser confundidos:
130
122
 
131
- Para fonte remota ou `RESOURCE_ENTITY`, preserve o ID e use a reidratação
132
- canônica por by-ids. Não substitua esse fluxo por uma lista local e não limpe
133
- silenciosamente um valor que ainda está sendo reidratado.
123
+ - o controle de exibicao recebe o texto digitado e apresenta o label;
124
+ - o `FormControl` de negocio preserva somente o valor canonico da opcao;
125
+ - digitar, apagar ou abandonar uma pesquisa nao altera o valor persistido;
126
+ - somente selecionar uma opcao ou acionar o comando explicito de limpar muda o
127
+ valor de negocio;
128
+ - ao perder foco sem selecao, o campo restaura o label da opcao vigente;
129
+ - busca, lista de resultados, loading, vazio e paginacao formam um unico
130
+ combobox acessivel, sem um segundo input empilhado sobre um select.
131
+ - limpar, indicador de abertura e ajuda permanecem agrupados em uma unica faixa
132
+ de sufixo, sem aumentar a altura do campo em layouts estreitos.
134
133
 
135
- Em ambos os casos, teste valor antes das options, options antes do valor, ID
136
- ausente e mudança de contexto durante a carga. A reconciliação não é uma ação
137
- do usuário e não deve emitir `selectionChange` nem disparar refresh da rota.
134
+ Em `async-select`, `searchable=true` e `multiple=false` materializam esse
135
+ combobox unico. Nao insira input, botao, toolbar ou footer interativo dentro de
136
+ `mat-select`; para resultados remotos, a carga incremental do combobox ocorre
137
+ automaticamente ao aproximar-se do fim da lista.
138
138
 
139
139
  ### Promocao oficial de exemplos `entityLookup`
140
140
 
@@ -267,6 +267,55 @@ Use `rich-content` quando:
267
267
  - para colecoes repetiveis, use `array` com `array.itemSchema.fields` em vez de criar campos numerados como `item1`, `item2`, `item3`;
268
268
  - para custom fields, alinhe runtime registry + metadata registry + hot update desde o inicio.
269
269
 
270
+ ### Composicao segura de selects
271
+
272
+ `MatSelect` implementa um combobox cujo painel e um listbox gerenciado pelo CDK.
273
+ Por isso, o conteudo projetado em `mat-select` deve se limitar a opcoes,
274
+ optgroups e elementos estritamente apresentacionais suportados pelo controle.
275
+
276
+ Regras obrigatorias:
277
+
278
+ - toolbar, footer, paginacao, limpar selecao e demais botoes ficam fora de
279
+ `mat-select`, como irmaos declarativos no template;
280
+ - `SelectPanelActionsComponent` e apresentacional: nao injeta `MatSelect`, nao
281
+ assina `openedChange`, nao move o proprio host e nao manipula o CDK overlay;
282
+ - `mat-select-trigger` exibe somente valor, label, status ou icone
283
+ apresentacional; acoes interativas ficam fora do trigger;
284
+ - nao use `ElementRef`, `DOCUMENT`, `append`, `insertBefore` ou placeholders
285
+ para transportar uma view Angular entre a arvore declarada e o overlay;
286
+ - preserve o fluxo nativo de teclado. Um helper visual nao deve interceptar
287
+ `Tab`, `Shift+Tab` ou `Escape` para simular um composite control.
288
+ - um controle declarado como irmao pertence ao fluxo da pagina; ele nao deve
289
+ ser apresentado como footer do overlay. Para busca/paginacao remota rica,
290
+ prefira o dialog/drawer de `entityLookup`, um autocomplete/composite overlay
291
+ proprio ou carregamento automatico nao interativo.
292
+
293
+ O gate `node tools/check-mat-select-content-model.mjs` falha quando:
294
+
295
+ - `pdx-select-panel-actions` volta a aparecer dentro de `mat-select`;
296
+ - marcadores conhecidos de relocacao de DOM reaparecem;
297
+ - um novo componente introduz `input` dentro do painel ou `button` dentro do
298
+ trigger sem que a arquitetura seja corrigida.
299
+
300
+ Os warnings atuais identificam divida legada, nao autorizacao para copiar o
301
+ padrao. A baseline so pode diminuir.
302
+
303
+ ### Contextos globais corporativos
304
+
305
+ Seletores globais de empresa, tenant, unidade ou ambiente sao controles de
306
+ seguranca e contexto, nao filtros opcionais:
307
+
308
+ - o valor precisa pertencer a lista autorizada carregada para a sessao;
309
+ - valor nulo, desconhecido ou injetado programaticamente deve ser rejeitado e
310
+ restaurado sem emitir uma nova troca;
311
+ - o contexto anterior permanece autoritativo ate o backend confirmar a mudanca;
312
+ - falha de troca deve manter a tela operavel e apresentar feedback recuperavel;
313
+ - metadados locais podem controlar apresentacao, mas nao substituir
314
+ autorizacao, escopo ou identidade publicados pelo backend.
315
+ - listas globais pequenas devem ser carregadas integralmente e usar typeahead
316
+ nativo; nao habilite busca remota/paginacao apenas para imitar um seletor
317
+ simples de empresa ou tenant.
318
+
270
319
  ## Nota de governanca para hosts
271
320
 
272
321
  Se um host precisar montar vitrine, filtros ou snippets jogaveis, derive isso do catalogo exportado da lib em vez de manter listas autorais locais.