@praxisui/dynamic-fields 9.0.0-beta.8 → 9.0.0-beta.81

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.
Files changed (28) hide show
  1. package/README.md +10 -2
  2. package/ai/component-registry.json +273462 -0
  3. package/docs/date-range-rust-host-integration.md +474 -0
  4. package/docs/dynamic-fields-field-catalog.md +3 -4
  5. package/docs/dynamic-fields-field-selection-guide.md +27 -3
  6. package/docs/dynamic-fields-inline-components-guide.md +30 -7
  7. package/docs/dynamic-fields-inline-filter-catalog.md +18 -1
  8. package/docs/dynamic-fields-inline-filter-runtime-contract.md +11 -0
  9. package/fesm2022/praxisui-dynamic-fields.mjs +3529 -1453
  10. package/package.json +8 -4
  11. package/src/lib/base/pdx-base-input-runtime-contract.json-api.md +16 -0
  12. package/src/lib/components/field-shell/praxis-field-shell.json-api.md +33 -3
  13. package/src/lib/components/inline-async-select/pdx-inline-async-select.json-api.md +6 -2
  14. package/src/lib/components/inline-date/pdx-inline-date.json-api.md +1 -1
  15. package/src/lib/components/inline-date-range/pdx-inline-date-range.json-api.md +30 -9
  16. package/src/lib/components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md +27 -9
  17. package/src/lib/components/inline-number/pdx-inline-number.json-api.md +1 -0
  18. package/src/lib/components/inline-rating/pdx-inline-rating.json-api.md +2 -0
  19. package/src/lib/components/inline-relative-period/pdx-inline-relative-period.json-api.md +2 -2
  20. package/src/lib/components/inline-searchable-select/pdx-inline-searchable-select.json-api.md +6 -1
  21. package/src/lib/components/inline-time-range/pdx-inline-time-range.json-api.md +2 -2
  22. package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +21 -6
  23. package/src/lib/components/material-checkbox-group/pdx-material-checkbox-group.json-api.md +5 -3
  24. package/src/lib/components/material-date-range/pdx-material-date-range.json-api.md +20 -2
  25. package/src/lib/components/material-file-upload/pdx-material-file-upload.json-api.md +58 -27
  26. package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +15 -4
  27. package/src/lib/components/material-textarea/pdx-material-textarea.json-api.md +1 -1
  28. package/types/praxisui-dynamic-fields.d.ts +171 -11
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-fields",
3
- "version": "9.0.0-beta.8",
3
+ "version": "9.0.0-beta.81",
4
4
  "description": "Angular Material-based dynamic form fields for Praxis UI with lazy loading and metadata-driven rendering.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -11,8 +11,8 @@
11
11
  "@angular/platform-browser": "^21.0.0",
12
12
  "@angular/router": "^21.0.0",
13
13
  "rxjs": "^7.8.0",
14
- "@praxisui/core": "^9.0.0-beta.8",
15
- "@praxisui/cron-builder": "^9.0.0-beta.8"
14
+ "@praxisui/core": "^9.0.0-beta.81",
15
+ "@praxisui/cron-builder": "^9.0.0-beta.81"
16
16
  },
17
17
  "dependencies": {
18
18
  "libphonenumber-js": "^1.12.41",
@@ -26,6 +26,7 @@
26
26
  "keywords": [
27
27
  "angular",
28
28
  "praxisui",
29
+ "praxis",
29
30
  "dynamic-fields",
30
31
  "material",
31
32
  "metadata-driven",
@@ -42,7 +43,10 @@
42
43
  ".": {
43
44
  "types": "./types/praxisui-dynamic-fields.d.ts",
44
45
  "default": "./fesm2022/praxisui-dynamic-fields.mjs"
46
+ },
47
+ "./ai/component-registry.json": {
48
+ "default": "./ai/component-registry.json"
45
49
  }
46
50
  },
47
51
  "type": "module"
48
- }
52
+ }
@@ -349,6 +349,9 @@ Limites:
349
349
  | `metadata.validators.showInlineErrors` | `boolean` | Active | Forca/desliga exibicao inline de erros. |
350
350
  | `metadata.errorStateMatcher` | enum | Active | Estrategia de estado de erro usada pelo matcher utilitario. |
351
351
  | `metadata.hint` | `string` | Active | Exibe dica quando nao ha erro. |
352
+ | `metadata.helpText` | `string` | Active | Texto de ajuda semantica publicado por DTO/schema; usado como fallback quando `hint` nao foi informado. |
353
+ | `metadata.helpDisplay` | `'auto' \| 'inline' \| 'popover' \| 'hidden'` | Active | Politica efetiva de apresentacao de `hint`/`helpText`; normalmente materializada pelo host `praxis-dynamic-form` a partir de `FormConfig.helpPresentation`. |
354
+ | `metadata.helpInlineMaxLength` | `number` | Active | Limite local usado quando `metadata.helpDisplay` e `auto`; textos acima do limite migram para affordance de ajuda. |
352
355
  | `metadata.hintAlign` | `'start' \| 'end'` | Active | Alinhamento da dica. |
353
356
  | `metadata.materialDesign.appearance` | `'fill' \| 'outline'` | Active | Aparencia do `mat-form-field`. |
354
357
  | `metadata.materialDesign.color` | `'primary' \| 'accent' \| 'warn'` | Active | Cor do `mat-form-field`. |
@@ -373,6 +376,19 @@ Limites:
373
376
  | `metadata.ariaDescribedby` | `string` | Active | `aria-describedby` no elemento nativo. |
374
377
  | `metadata.ariaLabelledby` | `string` | Active | `aria-labelledby` no elemento nativo. |
375
378
 
379
+ #### Ajuda contextual em migracoes corporativas
380
+
381
+ `metadata.helpText` pertence ao DTO/schema quando descreve semantica de negocio, impacto operacional ou criterio de decisao do campo. Ele nao deve ser gerado a partir de label, nome tecnico ou heuristica local.
382
+
383
+ Use `metadata.helpDisplay` para excecoes por campo:
384
+
385
+ - `inline`: texto curto que deve permanecer visivel para evitar erro operacional;
386
+ - `popover`: texto longo, raro ou de apoio decisorio;
387
+ - `hidden`: ajuda publicada mas inadequada para a superficie atual;
388
+ - `auto`: delega a politica do host e ao limite `helpInlineMaxLength`.
389
+
390
+ Em formularios densos, o host deve preferir uma politica global como `FormConfig.helpPresentation.display = "auto"` e mover textos longos para a affordance de ajuda. Mensagens de validacao continuam no canal de erro do campo e nao devem ser convertidas em `helpText`.
391
+
376
392
  #### Politica de label com prefixos e sufixos
377
393
 
378
394
  Quando um campo usa `metadata.prefixIcon`, `metadata.suffixIcon`, `clearButton`,
@@ -22,8 +22,9 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/utils/field-state.util.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/utils/format-display.util.ts"
24
24
  - "projects/praxis-core/src/lib/models/component-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-05-18"
26
- last_updated: "2026-05-18"
25
+ - "projects/praxis-core/src/lib/models/field-presentation.model.ts"
26
+ source_of_truth_last_verified: "2026-06-25"
27
+ last_updated: "2026-06-25"
27
28
  toc: true
28
29
  sidebar: true
29
30
  tags:
@@ -78,6 +79,7 @@ Este documento e a referencia canonica da API JSON de praxis-field-shell.
78
79
  | projects/praxis-dynamic-fields/src/lib/utils/field-state.util.ts | runtime-code | Arquivo presente no repositorio e usado como evidencia de contrato. |
79
80
  | projects/praxis-dynamic-fields/src/lib/utils/format-display.util.ts | runtime-code | Arquivo presente no repositorio e usado como evidencia de contrato. |
80
81
  | projects/praxis-core/src/lib/models/component-metadata.interface.ts | schema-types | Arquivo presente no repositorio e usado como evidencia de contrato. |
82
+ | projects/praxis-core/src/lib/models/field-presentation.model.ts | schema-types/runtime-helper | Resolve `presentation` e `presentationRules` para presentationMode sem mutar valores. |
81
83
 
82
84
  ## Support legend
83
85
 
@@ -157,6 +159,9 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
157
159
  | `field.controlType` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
158
160
  | `field.controlType='avatar'` | unknown | false | n/a | component-defined | Partial; verify per source_of_truth. |
159
161
  | `field.transformDisplayValue` | unknown | false | n/a | component-defined | Partial; verify per source_of_truth. |
162
+ | `field.valuePresentation` | object | false | n/a | component-defined | Canonical value formatter for readonly/display surfaces. |
163
+ | `field.presentation` | object | false | n/a | component-defined | Semantic readonly/display presentation state. |
164
+ | `field.presentationRules` | array | false | n/a | component-defined | Ordered Json Logic rules that override semantic presentation state. |
160
165
 
161
166
  ### Input bindings (inbound data)
162
167
 
@@ -321,6 +326,8 @@ Resumo de composicao deste componente:
321
326
  ### 4. Mapeamento de Comportamento
322
327
  - Sempre cria o `insertionPoint` (`vc`) para o componente real do campo.
323
328
  - Em modo apresentacao sem excecao de tipo, esconde conteudo editavel e mostra bloco textual.
329
+ - Em modo apresentacao, `field.valuePresentation` formata o valor e `field.presentation`/`field.presentationRules` ajustam presenter, tone, icon, label, badge, tooltip e appearance por semantica declarativa.
330
+ - `presentationRules` sao avaliadas com Json Logic contra o contexto do campo. Regras invalidas falham fechadas e nao alteram o `FormControl`.
324
331
  - `readonlyMode` aplica overlay bloqueando interacao, mantendo controle habilitado.
325
332
  - `canvasMode` injeta semantica de evento para editores visuais.
326
333
 
@@ -346,7 +353,24 @@ Uso: shell padrao para um campo dinamico simples.
346
353
  "name": "approvalStatus",
347
354
  "label": "Aprovacao",
348
355
  "controlType": "select",
349
- "readOnly": true
356
+ "readOnly": true,
357
+ "presentation": {
358
+ "presenter": "status",
359
+ "tone": "neutral",
360
+ "icon": "schedule",
361
+ "label": "Em analise"
362
+ },
363
+ "presentationRules": [
364
+ {
365
+ "when": { "===": [{ "var": "value" }, "BLOQUEADO"] },
366
+ "set": {
367
+ "tone": "danger",
368
+ "icon": "lock",
369
+ "label": "Bloqueado",
370
+ "appearance": "filled"
371
+ }
372
+ }
373
+ ]
350
374
  },
351
375
  "readonlyMode": false,
352
376
  "presentationMode": true,
@@ -374,6 +398,9 @@ Correcao: garantir `canvasMode=true`.
374
398
  5. Valor mostrado em apresentacao esta incorreto.
375
399
  Correcao: revisar `transformDisplayValue` e formato do valor no `control`.
376
400
 
401
+ 6. Regra de apresentacao nao muda o visual.
402
+ Correcao: validar o Json Logic em `field.presentationRules[].when`; o contexto minimo expoe `value`, `rawValue`, `fieldName` e o nome do campo.
403
+
377
404
  ### 8. Cross-links
378
405
  - `projects/praxis-dynamic-fields/src/lib/utils/field-state.util.ts`
379
406
  - `projects/praxis-dynamic-fields/src/lib/utils/format-display.util.ts`
@@ -403,6 +430,9 @@ Correcao: revisar `transformDisplayValue` e formato do valor no `control`.
403
430
  | `field.controlType` | string | false | n/a | Partial | See Detailed API reference. |
404
431
  | `field.controlType='avatar'` | unknown | false | n/a | Partial | See Detailed API reference. |
405
432
  | `field.transformDisplayValue` | unknown | false | n/a | Partial | See Detailed API reference. |
433
+ | `field.valuePresentation` | object | false | n/a | Active | Formats values in presentation mode. |
434
+ | `field.presentation` | object | false | n/a | Active | Semantic state for presentation mode. |
435
+ | `field.presentationRules` | array | false | n/a | Active | Json Logic conditional presentation state. |
406
436
  | `presentationMode` | boolean | false | n/a | Partial | See Detailed API reference. |
407
437
  | `readonlyMode` | boolean | false | n/a | Partial | See Detailed API reference. |
408
438
  | `disabledMode` | boolean | false | n/a | Partial | See Detailed API reference. |
@@ -311,7 +311,7 @@ Resumo de composicao deste componente:
311
311
 
312
312
  ### 4. Mapeamento de Comportamento
313
313
  - Trigger em pill + badge de quantidade quando multiplo.
314
- - Painel com busca em tempo real (termControl) e acoes `Carregar mais`/`Fim de lista`.
314
+ - Painel com busca em tempo real (`termControl`) e rodape compartilhado: o rodape e materializado como irmao do `listbox` no overlay, nunca como opcao. `Carregar mais` e um botao real de largura total e alvo minimo de 44 px; durante a paginacao ele permanece visivel, ocupado e desabilitado. `Tab` transfere o foco da busca para a primeira acao habilitada; `Fim de lista` e um status, fora da semantica de opcoes.
315
315
  - Se `resourcePath` ausente, busca opera sobre snapshot local.
316
316
 
317
317
  ### 5. Exemplo Minimo (JSON + Uso)
@@ -416,7 +416,11 @@ Correcao: ajustar limites em `inlineAutoSize`.
416
416
 
417
417
  | Token/Class | Scope | Purpose | Notes |
418
418
  | --- | --- | --- | --- |
419
- | `not-yet-verified` | component | Styling contract not yet verified | Use Detailed API reference for component-specific styling notes. |
419
+ | `--pdx-select-panel-actions-surface` / `--pdx-select-panel-actions-on-surface` / `--pdx-select-panel-actions-muted` | overlay footer | Superficie, texto principal e texto secundario | Definir na classe de tema que alcanca o CDK Overlay. Tokens inline e `--pdx-overlay-*` continuam como fallbacks compativeis. |
420
+ | `--pdx-select-panel-actions-outline` / `--pdx-select-panel-actions-accent` | overlay footer | Separador, bordas e cor de acao/foco | Fallbacks Material: divider/outline e primary. |
421
+ | `--pdx-select-panel-action-hover-surface` / `--pdx-select-panel-action-focus-ring` | overlay footer | Estados hover e foco visivel | O host deve preservar contraste AA em temas claro e escuro. |
422
+ | `--pdx-select-panel-load-more-surface` / `--pdx-select-panel-load-more-outline` | overlay footer | Tratamento do botao `Carregar mais` | Permite distinguir a acao sem acoplamento a internals MDC. |
423
+ | `--pdx-select-panel-actions-gap` / `--pdx-select-panel-actions-padding` / `--pdx-select-panel-action-min-height` / `--pdx-select-panel-action-padding` / `--pdx-select-panel-action-radius` / `--pdx-select-panel-action-disabled-opacity` | overlay footer | Densidade, geometria e estado desabilitado | Altura default de 44 px preserva alvo corporativo acessivel. |
420
424
 
421
425
  ## Examples (obrigatorio)
422
426
 
@@ -154,7 +154,7 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
154
154
  | `metadata.touchUi` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
155
155
  | `metadata.clearButton` | object | false | n/a | component-defined | Partial; verify per source_of_truth. |
156
156
  | `metadata.inlineAutoSize.*` | object | false | n/a | component-defined | Partial; verify per source_of_truth. |
157
- | `metadata.inlineOverlay.applyMode` | string | false | `auto` | `auto`, `explicit`, `confirm` | Shared inline overlay commit mode; `confirm` is accepted as explicit compatibility. |
157
+ | `metadata.inlineOverlay.applyMode` | string | false | `auto` | `auto`, `explicit` | Shared inline overlay commit mode. |
158
158
  | `metadata.inlineOverlay.actions.apply` | object | false | n/a | component-defined | Theme-aware Apply action metadata. |
159
159
  | `metadata.inlineOverlay.actions.cancel` | object | false | n/a | component-defined | Theme-aware Cancel action metadata. |
160
160
  | `metadata.ariaLabel` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
@@ -40,6 +40,8 @@ related_components:
40
40
  - "praxis-table"
41
41
  - "pdx-material-date-range"
42
42
  - "pdx-base-input-runtime-contract"
43
+ related_docs:
44
+ - "date-range-rust-host-integration"
43
45
  ---
44
46
 
45
47
  # pdx-inline-date-range
@@ -296,7 +298,8 @@ Use quando precisar:
296
298
  | `metadata.inlineAutoSize.*` | `object` | Ativo | Autoajuste de largura da pill. |
297
299
  | `metadata.inlineChipDisplay` | `"value" \| "label-value"` | Ativo | Exibicao compacta do chip preenchido: somente valor ou label + valor. |
298
300
  | `metadata.clearButton` | `boolean \| object` | Ativo | Botao de limpeza rapida no trigger. |
299
- | `metadata.inlineQuickPresets*` | `object/array` | Ativo | Presets/acoes especificos do date-range. `inlineQuickPresetsApplyMode` permanece como compatibilidade quando `inlineOverlay.applyMode` nao e declarado. |
301
+ | `metadata.inlineQuickPresets` | `boolean \| { enabled?: boolean; maxVisible?: number; position?: "auto" \| "footer" \| "start" \| "end" }` | Ativo | Controla atalhos inline. `position` usa posicoes logicas, com fallback para `footer` em viewport estreito/touch. |
302
+ | `metadata.shortcuts` | `Array<string \| DateRangePreset \| StaticDateRangePreset>` | Ativo | Mesmo catalogo do `pdx-material-date-range`: built-ins, presets TypeScript e periodos corporativos estaticos serializaveis publicados pelo backend/dominio. |
300
303
  | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit"` | Ativo | Contrato compartilhado de commit do overlay: automatico ou rascunho ate Aplicar. |
301
304
  | `metadata.inlineOverlay.actions.apply.*` | `object` | Ativo | Label, aria, appearance e colorRole canonicos do botao Aplicar. |
302
305
  | `metadata.inlineOverlay.actions.cancel.*` | `object` | Ativo | Label, aria, appearance e colorRole canonicos do botao Cancelar. |
@@ -316,12 +319,16 @@ Resumo de composicao deste componente:
316
319
  - Trigger em pill mostra estado vazio, parcial ou completo do intervalo.
317
320
  - Clicar em qualquer area acionavel da pill, incluindo os inputs internos de inicio/fim, abre o calendario; apenas o botao de limpeza rapida fica isolado para limpar sem abrir o overlay.
318
321
  - Overlay de calendario inclui presets e botoes de aplicar/cancelar.
322
+ - `inlineQuickPresets.position: "footer"` renderiza atalhos acima das acoes; `"start"` e `"end"` materializam uma rail logica ao lado do calendario quando ha espaco; `"auto"` escolhe rail em desktop e cai para rodape quando necessario.
323
+ - Em modo explicito/confirmacao, selecionar um preset mostra um resumo antes de `Aplicar` com label, descricao quando publicada, inicio, fim e intervalo resolvido. Esse resumo e apenas confirmacao visual/acessivel do rascunho; nao altera o payload canonico.
319
324
  - Entrada manual em ambos os campos sincroniza com o valor consolidado do range.
320
325
  - Em `inlineOverlay.applyMode: "auto"`, selecao manual no calendario aplica pendencias imediatamente para manter o valor do chip inline sincronizado.
321
326
  - Em `inlineOverlay.applyMode: "explicit"`, o chip inline mostra o intervalo em rascunho enquanto o overlay esta aberto; o commit de negocio continua ocorrendo apenas em `Aplicar`, enquanto `Cancelar`, `Esc` ou fechamento externo restauram o valor confirmado.
322
327
  - O rodape `Aplicar`/`Cancelar` e materializado pelo contrato `inlineOverlay` mesmo quando nao ha `inlineQuickPresets`, para que confirmacao explicita nao dependa de atalhos rapidos.
323
328
  - `inlineQuickPresetsApplyMode: "auto" | "confirm"` continua suportado como fallback legado especifico do `inlineDateRange`.
324
329
  - Labels, aria, `appearance` e `colorRole` dos botoes do rodape devem ser authorados em `inlineOverlay.actions.apply` e `inlineOverlay.actions.cancel`; os campos `inlineQuickPresets*Label` sao fallback legado.
330
+ - Atalhos corporativos estaticos nunca executam codigo vindo de JSON; regras fiscais, legais, eleitorais, feriados e dias contaveis permanecem responsabilidade do backend/dominio.
331
+ - Hosts Rust que publicam metadata devem seguir o guia `date-range-rust-host-integration` para DTOs `serde`, validacao de timezone, seguranca e testes de consumidor.
325
332
 
326
333
  ### 5. Exemplo Minimo (JSON + Uso)
327
334
  ```json
@@ -350,10 +357,21 @@ Uso: filtro inline de intervalo de datas.
350
357
  "endAriaLabel": "Data final do periodo",
351
358
  "inlinePanelTitle": "Selecionar periodo",
352
359
  "inlineAutoSize": { "minWidth": 180, "maxWidth": 420 },
353
- "inlineQuickPresets": [
354
- { "id": "today", "label": "Hoje", "start": "today", "end": "today" },
355
- { "id": "last7", "label": "Ultimos 7 dias", "start": "-7d", "end": "today" }
360
+ "shortcuts": [
361
+ "today",
362
+ "thisMonth",
363
+ {
364
+ "id": "competencia-fiscal-marco",
365
+ "label": "Competencia fiscal de marco",
366
+ "description": "Periodo resolvido pelo dominio fiscal para a competencia de marco.",
367
+ "startDate": "2026-03-01",
368
+ "endDate": "2026-03-31",
369
+ "timeZone": "America/Sao_Paulo",
370
+ "icon": "account_balance",
371
+ "tone": "success"
372
+ }
356
373
  ],
374
+ "inlineQuickPresets": { "enabled": true, "maxVisible": 4, "position": "start" },
357
375
  "inlineOverlay": {
358
376
  "applyMode": "explicit",
359
377
  "actions": {
@@ -377,19 +395,22 @@ Correcao: revisar preenchimento de `startDate/endDate` e parse de input manual.
377
395
  3. Selecao manual nao reflete no chip em modo `auto`.
378
396
  Correcao: garantir que o componente esteja usando a sincronizacao de pendencias do Datepicker (`_applyPendingSelection`) ao clicar em celulas do calendario no overlay.
379
397
 
380
- 4. Botao limpar indisponivel.
398
+ 4. Preset corporativo nao explica o intervalo antes de aplicar.
399
+ Correcao: publicar `description` nos presets estaticos quando o nome nao for autoexplicativo e usar `inlineOverlay.applyMode: "explicit"` para permitir revisao antes do commit. O runtime exibe label, descricao, inicio/fim e intervalo do rascunho no resumo pre-Aplicar.
400
+
401
+ 5. Botao limpar indisponivel.
381
402
  Correcao: verificar `clearButton` e estado readonly/disabled.
382
403
 
383
- 5. Calendario nao abre ao clicar no texto da pill preenchida.
404
+ 6. Calendario nao abre ao clicar no texto da pill preenchida.
384
405
  Correcao: garantir que o clique nos inputs internos de inicio/fim encaminha para `openPicker`; esses inputs ocupam a maior parte da area visual do chip em cenarios densos de toolbar.
385
406
 
386
- 6. Largura do chip estoura em mobile.
407
+ 7. Largura do chip estoura em mobile.
387
408
  Correcao: ajustar limites no bloco `inlineAutoSize`.
388
409
 
389
- 7. ARIA de inicio/fim nao refletida.
410
+ 8. ARIA de inicio/fim nao refletida.
390
411
  Correcao: preencher `startAriaLabel/endAriaLabel` explicitamente.
391
412
 
392
- 8. Layout muda entre apps com densidade diferente.
413
+ 9. Layout muda entre apps com densidade diferente.
393
414
  Correcao: usar `metadata.materialDesign.density` (`dense` ou `default`) e validar no overlay se `gap/padding` foram aplicados no bloco `.mat-datepicker-actions` com classe de densidade `pdx-inline-date-range-overlay-actions-container--*`.
394
415
 
395
416
  ### 8. Cross-links
@@ -324,7 +324,7 @@ Use quando precisar:
324
324
  | `metadata.optionSource.detail.surfaceId` | `string` | Ativo | Id da surface item-level preferida para o detalhe. Quando ausente, o runtime escolhe `detail`, `view` ou a primeira surface item-level de leitura disponivel. |
325
325
  | `metadata.optionSource.detail.presentation` | `"drawer" | "modal"` | Ativo | Apresentacao desejada para `surface.open`. Default vem do preset/host de surface. |
326
326
  | `metadata.optionSource.detail.preferredWidget` / `metadata.optionSource.detail.mode` | `string` | Documental | Hints semanticos para autoria/discovery. A materializacao final vem da surface descoberta e do `ResourceSurfaceOpenAdapterService`. |
327
- | `metadata.optionSource.detail.hrefTemplate` / `metadata.optionSource.detail.routeTemplate` | `string` | Legado | Fallback para abrir detalhe por link quando nao houver contrato de surface ou servico global disponivel. Nao deve ser a fonte primaria em novos lookups de plataforma. |
327
+ | `metadata.optionSource.detail.hrefTemplate` / `metadata.optionSource.detail.routeTemplate` | `string` | Legado | Fallback quando nao houver surface governada. Quando ambos existem, `routeTemplate` tem precedencia por representar a rota navegavel do host. `hrefTemplate` que aponta para `/api/**` e tratado como evidencia de recurso, nao como destino de UX, e nao habilita a acao Detalhe isoladamente. |
328
328
  | `metadata.optionSource.display.preset` | `"compact" | "rich" | "directory" | "status" | "reference" | "hierarchical"` | Ativo | Define a intencao visual canonica. `directory` e recomendado para pessoas/equipes; `reference` para codigo + descricao; `status` para entidades com estado operacional forte. |
329
329
  | `metadata.optionSource.display.usage` | `"form" | "filter" | "table-cell" | "dashboard" | "wizard" | "review"` | Ativo | Indica onde a option-source costuma aparecer. O runtime pode ajustar densidade e acoes sem duplicar regra por host. |
330
330
  | `metadata.optionSource.display.density` | `"compact" | "comfortable" | "rich"` | Ativo | Densidade preferencial. Campos de formulario usam `comfortable`; filtros inline e celulas de tabela tendem a `compact`; revisoes podem usar `rich`. |
@@ -341,11 +341,11 @@ Use quando precisar:
341
341
  | `metadata.showAvatar` | `boolean` | Ativo | Controla exibicao de avatar por iniciais. Default: `true`. |
342
342
  | `metadata.showBadges` | `boolean` | Ativo | Controla exibicao de badges auxiliares vindos de `badges`, `tags`, `riskLevel`, `homologationStatus` ou `badgeKeys`. Default: `true`. |
343
343
  | `metadata.showDisabledReason` | `boolean` | Ativo | Controla exibicao do motivo de bloqueio quando `selectable=false`. Default: `true`. |
344
- | `metadata.showResultCount` | `boolean` | Ativo | Controla contador de resultados no painel de busca. Quando o backend pagina com `totalElements`, mostra o total remoto; em fontes locais/cursor, mostra o total carregado. Default: `true`. |
344
+ | `metadata.showResultCount` | `boolean` | Ativo | Controla contador de resultados no painel de busca. Quando `totalElements` remoto for maior que os itens carregados, mostra `carregados de total` para deixar claro que a lista visivel ainda e uma pagina parcial; em fontes locais/cursor, mostra o total carregado. Default: `true`. |
345
345
  | `metadata.statusToneMap` | `Record<string, "success" | "warning" | "danger" | "neutral">` | Ativo | Permite mapear status de dominio para tom visual governado. |
346
346
  | `metadata.badgeKeys` | `string[]` | Ativo | Chaves adicionais lidas do valor de entidade para compor badges auxiliares. |
347
347
  | `metadata.maxVisibleBadges` | `number` | Ativo | Limita quantidade de badges auxiliares exibidos. Default: `3`. |
348
- | `metadata.actions.showDetail` | `boolean` | Ativo | Controla acao de detalhe quando houver surface canonica ou fallback `detailHref`/`detailRoute`. Default: `true`. |
348
+ | `metadata.actions.showDetail` | `boolean` | Ativo | Controla acao de detalhe quando houver surface canonica, `detailRoute` navegavel ou `detailHref` nao-API. `detailHref` de API nao abre nova aba para evitar link morto em hosts corporativos. Default: `true`. |
349
349
  | `metadata.actions.showChange` | `boolean` | Ativo | Controla acao de troca no cartao selecionado. Default: `true`. |
350
350
  | `metadata.actions.showCopyCode` | `boolean` | Ativo | Controla acao de copiar codigo/id. Default: `true`. |
351
351
  | `metadata.actions.showClear` | `boolean` | Ativo | Controla acao de limpar em conjunto com `clearButton`/clearable herdado. |
@@ -366,8 +366,11 @@ Resumo de composicao deste componente:
366
366
  - `metadata.optionSource.display` e a fonte preferencial de UX para a entidade; campos top-level como `selectedLayout`, `density`, `showAvatar` e `showStatus` funcionam como override local de host.
367
367
  - Opcoes podem mostrar linha secundaria (`subtitle`) para desambiguacao; em `entityLookup`, a linha rica tambem mostra avatar, campos ricos com icones/chips/datas, status visual, badges e motivo de bloqueio.
368
368
  - Com `metadata.optionSource.resourcePath`, busca emite termo no pipeline remoto de option-source; sem endpoint, filtra local.
369
+ - Em uso standalone de shell/topbar autenticado, o componente aceita `FormControl` externo com `initialMetadata` estático e `options` locais. Um valor inicial já selecionado no controle deve materializar o texto da opção local sem bloquear a montagem da rota nem realimentar change detection quando a metadata recebida for semanticamente equivalente.
369
370
  - `metadata.resourcePath` continua aceito como configuracao operacional herdada, mas nao substitui a semantica canonica de entidade publicada em `metadata.optionSource`.
370
- - Opcao de reset limpa filtro sem fechar contexto de trabalho.
371
+ - As acoes de painel ficam em um rodape materializado como irmao do `listbox` no overlay: `Limpar selecao` e uma acao secundaria alinhada ao inicio; `Carregar mais` e uma acao de largura total, com alvo minimo de 44 px, estado ocupado e foco visivel. `Tab` transfere o foco da busca para a primeira acao habilitada. Nenhuma delas participa da navegacao semantica de opcoes.
372
+ - A reidratacao por IDs preserva o valor selecionado, mas nao conta como carga da pagina zero. No primeiro `open`, o runtime consulta a pagina zero antes de habilitar `Carregar mais`; o contador remoto e a lista visivel permanecem coerentes.
373
+ - Durante busca digitada, a lista visivel mostra apenas resultados retornados pela pagina remota filtrada. O selecionado reidratado por ID nao e injetado como falso resultado, embora continue preservado para display fechado e reabertura sem termo.
371
374
  - `OptionDTO.extra.selectable === false` desabilita a opcao e permite exibir `disabledReason` sem remover a entidade da lista ou da reidratacao.
372
375
 
373
376
  ### 5. Exemplo Minimo (JSON + Uso)
@@ -377,7 +380,7 @@ Resumo de composicao deste componente:
377
380
  "metadata": {
378
381
  "name": "employee",
379
382
  "label": "Funcionario",
380
- "controlType": "select",
383
+ "controlType": "inlineEntityLookup",
381
384
  "lookupIdKey": "employeeId",
382
385
  "lookupLabelKey": "fullName",
383
386
  "selectOptions": [
@@ -408,7 +411,7 @@ Uso: lookup simples em lista local.
408
411
  "statusPropertyPath": "status",
409
412
  "detail": {
410
413
  "kind": "surface",
411
- "surfaceId": "view",
414
+ "surfaceId": "detail",
412
415
  "presentation": "drawer",
413
416
  "preferredWidget": "praxis-dynamic-form",
414
417
  "mode": "view"
@@ -506,7 +509,22 @@ Correcao: ajustar `inlineAutoSize.minWidth/maxWidth`.
506
509
 
507
510
  | Token/Class | Scope | Purpose | Notes |
508
511
  | --- | --- | --- | --- |
509
- | `not-yet-verified` | component | Styling contract not yet verified | Use Detailed API reference for component-specific styling notes. |
512
+ | `.pdx-entity-lookup-rich` | trigger | Ativa a geometria de campo corporativo | Preserva label Material, subscript e zona de seta com altura integral. |
513
+ | `.pdx-select-panel-actions` | overlay footer | Agrupa acoes auxiliares fora da lista de opcoes | Primitiva interna compartilhada pela familia de selects; nao deve ser transformada em `mat-option`. |
514
+ | `.pdx-select-panel-action.is-clear` | overlay footer | Limpa a selecao atual | Acao secundaria alinhada ao inicio, alvo minimo de 44 px e foco visivel. |
515
+ | `.pdx-select-panel-action.is-load-more` | overlay footer | Solicita a proxima pagina | Acao de largura total com estados normal, hover, focus e loading/disabled. |
516
+ | `.pdx-select-panel-end` | overlay footer | Comunica fim da paginacao | Estado informativo com `role="status"`; nao e interativo. |
517
+ | `--pdx-inline-panel-surface` / `--pdx-inline-panel-surface-raised` | overlay | Superficie base e superficie de estado/selecionado | Definir globalmente no escopo de tema do host, pois o painel vive no CDK Overlay. Fallbacks: `--md-sys-color-surface-container-highest/high`. |
518
+ | `--pdx-inline-panel-on-surface` / `--pdx-inline-panel-on-surface-muted` | overlay | Texto principal e texto auxiliar | Devem manter contraste nos temas claro e escuro. Fallbacks: `--md-sys-color-on-surface/-variant`. |
519
+ | `--pdx-inline-panel-outline` | overlay | Borda e separadores do painel | Fallback: `--md-sys-color-outline-variant`. |
520
+ | `--pdx-entity-lookup-avatar-size` / `--pdx-entity-lookup-avatar-large-size` / `--pdx-entity-lookup-avatar-compact-size` / `--pdx-entity-lookup-avatar-radius` | trigger/panel | Geometria dos avatares por iniciais | Permite ajustar densidade corporativa sem colar icone/texto ou quebrar alinhamento vertical do select. |
521
+ | `--pdx-entity-lookup-avatar-surface` / `--pdx-entity-lookup-avatar-text` | trigger/panel | Cor de avatar por iniciais | Fallbacks usam primary Material com `color-mix`; hosts podem calibrar claro/escuro por tema. |
522
+ | `--pdx-entity-lookup-selected-compact-padding` / `--pdx-entity-lookup-selected-compact-inline-start` | trigger | Respiro do valor selecionado compacto | Deve manter o avatar afastado da borda esquerda, preservar a zona de seta alinhada ao select Material e respeitar o `inline-size` do container em drawers estreitos. |
523
+ | `--pdx-entity-lookup-success-surface` / `--pdx-entity-lookup-success-text` / `--pdx-entity-lookup-warning-surface` / `--pdx-entity-lookup-warning-text` / `--pdx-entity-lookup-warning-outline` / `--pdx-entity-lookup-danger-surface` / `--pdx-entity-lookup-danger-text` / `--pdx-entity-lookup-danger-outline` | trigger/panel | Tons de status, badges e notas de bloqueio/legado | Fallbacks derivam de tokens Material (`primary`, `tertiary`, `error`) para funcionar em temas claro e escuro; hosts regulados podem substituir todos os tons. |
524
+ | `--pdx-select-panel-actions-surface` / `--pdx-select-panel-actions-on-surface` / `--pdx-select-panel-actions-muted` | overlay footer | Superficie, texto principal e texto secundario do rodape | Contrato canonico; os tokens inline acima sao preservados como fallback e transferidos quando definidos no painel. |
525
+ | `--pdx-select-panel-actions-outline` / `--pdx-select-panel-actions-accent` | overlay footer | Separador, bordas e cor de acao/foco | Fallbacks Material: divider/outline e primary. |
526
+ | `--pdx-select-panel-action-hover-surface` / `--pdx-select-panel-action-focus-ring` / `--pdx-select-panel-load-more-surface` / `--pdx-select-panel-load-more-outline` | overlay footer | Estados interativos de limpar/carregar mais | Customizar na classe de tema que alcanca o CDK Overlay e validar contraste claro/escuro. |
527
+ | `--pdx-select-panel-actions-gap` / `--pdx-select-panel-actions-padding` / `--pdx-select-panel-action-min-height` / `--pdx-select-panel-action-padding` / `--pdx-select-panel-action-radius` / `--pdx-select-panel-action-disabled-opacity` | overlay footer | Densidade, geometria e estado desabilitado | Altura default de 44 px preserva alvo corporativo acessivel. |
510
528
 
511
529
  ## Examples (obrigatorio)
512
530
 
@@ -525,7 +543,7 @@ Correcao: ajustar `inlineAutoSize.minWidth/maxWidth`.
525
543
  "metadata": {
526
544
  "name": "employee",
527
545
  "label": "Funcionario",
528
- "controlType": "select",
546
+ "controlType": "inlineEntityLookup",
529
547
  "lookupIdKey": "employeeId",
530
548
  "lookupLabelKey": "fullName",
531
549
  "selectOptions": [
@@ -548,7 +566,7 @@ Correcao: ajustar `inlineAutoSize.minWidth/maxWidth`.
548
566
  "metadata": {
549
567
  "name": "costCenterOwner",
550
568
  "label": "Responsavel",
551
- "controlType": "select",
569
+ "controlType": "inlineEntityLookup",
552
570
  "resourcePath": "employees/options",
553
571
  "lookupIdKey": "matricula",
554
572
  "lookupLabelKey": "nome",
@@ -301,6 +301,7 @@ Resumo de composicao deste componente:
301
301
 
302
302
  ### 4. Mapeamento de Comportamento
303
303
  - Modo percentual ajusta semantica visual e valores default de faixa/passo.
304
+ - `metadata.inlineVisualStyle = "graphic"` materializa leitura percentual enriquecida, mas o componente suprime gauge/rail decorativos quando esta dentro de `praxis-filter` compacto para manter a barra densa e escaneavel.
304
305
  - Campo recalcula largura com base no conteudo/placeholder e limites configurados.
305
306
  - Validadores `min/max` sao aplicados no control conforme metadata.
306
307
 
@@ -305,6 +305,8 @@ Use quando precisar:
305
305
  | `metadata.inlineOverlay.actions.apply/cancel/clear` | `object` | Ativo | Labels, aria, icones, `appearance` e `colorRole` das acoes do painel, materializados por tokens do tema. |
306
306
  | `metadata.quickPresets` | `array` | Ativo | Presets herdados do range inline para faixa de rating. |
307
307
 
308
+ Quando `allowHalf`/`ratingAllowHalf` ou a precisao de `0.5` estiver ativa, as estrelas do painel tambem aceitam selecao direta: clique na metade esquerda para selecionar o meio ponto anterior e na metade direita para o ponto inteiro. A selecao por estrela cria uma faixa pontual (`start = end`); use o slider para abrir uma faixa. Em `inlineOverlay.applyMode: "explicit"`, a selecao direta permanece em rascunho ate `Aplicar`.
309
+
308
310
  #### 3.2 Campos herdados compartilhados (exaustivo)
309
311
  - `projects/praxis-dynamic-fields/src/lib/components/inlineRange/pdx-inline-range-slider.json-api.md`
310
312
  - `projects/praxis-dynamic-fields/src/lib/components/material-range-slider/pdx-material-range-slider.json-api.md`
@@ -300,7 +300,7 @@ Use quando precisar:
300
300
  | `metadata.relativePeriodIconKey/optionIconKey` | `string` | Ativo | Chave do ícone por opção. |
301
301
  | `metadata.relativePeriodSubtitleKey/optionSubtitleKey` | `string` | Ativo | Chave de subtítulo por opção. |
302
302
  | `metadata.relativePeriodTexts` / `inlineTexts` | `object \| string(JSON)` | Ativo | Textos de labels, empty state e aria; templates canônicos devem usar `{{label}}` e `{{percent}}` quando houver interpolação, com compatibilidade legada para `{...}` em metadata. |
303
- | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit" \| "confirm"` | Ativo | Quando `explicit`/`confirm`, seleções ficam em rascunho até `Aplicar`. |
303
+ | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit"` | Ativo | Quando `explicit`, seleções ficam em rascunho até `Aplicar`. |
304
304
  | `metadata.inlineOverlay.actions.apply.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do commit. |
305
305
  | `metadata.inlineOverlay.actions.cancel.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do descarte. |
306
306
  | `metadata.inlineOverlay.actions.clear.*` | `object` | Ativo | Label, aria, icon, appearance, colorRole e visibilidade da limpeza explícita. |
@@ -319,7 +319,7 @@ Resumo de composição deste componente:
319
319
  - Em single mode, pode fechar automaticamente por `relativePeriodCloseOnSelect`.
320
320
  - Barra de progresso calcula posição da opção selecionada no conjunto.
321
321
  - Busca filtra opções por label/subtítulo antes da seleção.
322
- - Com `inlineOverlay.applyMode: "explicit"` ou `"confirm"`, clique em card altera apenas o rascunho do painel; `Aplicar` comita, enquanto `Cancelar`, `Esc`, detach ou clique externo descartam.
322
+ - Com `inlineOverlay.applyMode: "explicit"`, clique em card altera apenas o rascunho do painel; `Aplicar` comita, enquanto `Cancelar`, `Esc`, detach ou clique externo descartam.
323
323
 
324
324
  ### 5. Exemplo Mínimo (JSON + Uso)
325
325
  ```json
@@ -308,6 +308,7 @@ Resumo de composicao deste componente:
308
308
  - `Extensao de runtime`: `searchPlaceholder` e `inlineAutoSize.*`.
309
309
 
310
310
  ### 4. Mapeamento de Comportamento
311
+ - A paginacao usa o rodape compartilhado da familia de selects, materializado como irmao do `listbox` no overlay: botao `Carregar mais` com alvo minimo de 44 px, estado ocupado sem salto de layout e acesso por `Tab` a partir da busca. A acao nao participa da semantica de opcoes.
311
312
  - Trigger exibe label e, em modo multiplo, badge de quantidade.
312
313
  - Painel contem input de busca e estados de loading/fim de lista.
313
314
  - Quando sem `resourcePath`, usa filtragem local da lista estatica.
@@ -418,7 +419,11 @@ Correcao: quick-clear respeita estados readonly/disabled/presentation.
418
419
 
419
420
  | Token/Class | Scope | Purpose | Notes |
420
421
  | --- | --- | --- | --- |
421
- | `not-yet-verified` | component | Styling contract not yet verified | Use Detailed API reference for component-specific styling notes. |
422
+ | `--pdx-select-panel-actions-surface` / `--pdx-select-panel-actions-on-surface` / `--pdx-select-panel-actions-muted` | overlay footer | Superficie, texto principal e texto secundario | Definir na classe de tema que alcanca o CDK Overlay. Tokens inline e `--pdx-overlay-*` continuam como fallbacks compativeis. |
423
+ | `--pdx-select-panel-actions-outline` / `--pdx-select-panel-actions-accent` | overlay footer | Separador, bordas e cor de acao/foco | Fallbacks Material: divider/outline e primary. |
424
+ | `--pdx-select-panel-action-hover-surface` / `--pdx-select-panel-action-focus-ring` | overlay footer | Estados hover e foco visivel | O host deve preservar contraste AA em temas claro e escuro. |
425
+ | `--pdx-select-panel-load-more-surface` / `--pdx-select-panel-load-more-outline` | overlay footer | Tratamento do botao `Carregar mais` | Permite distinguir a acao sem acoplamento a internals MDC. |
426
+ | `--pdx-select-panel-actions-gap` / `--pdx-select-panel-actions-padding` / `--pdx-select-panel-action-min-height` / `--pdx-select-panel-action-padding` / `--pdx-select-panel-action-radius` / `--pdx-select-panel-action-disabled-opacity` | overlay footer | Densidade, geometria e estado desabilitado | Altura default de 44 px preserva alvo corporativo acessivel. |
422
427
 
423
428
  ## Examples (obrigatorio)
424
429
 
@@ -299,7 +299,7 @@ Use quando precisar:
299
299
  | `metadata.validators.rangeMessage` | `string` | Ativo | Mensagem para erro de ordem do intervalo. |
300
300
  | `metadata.validators.minDistanceMessage` | `string` | Ativo | Mensagem para distancia minima. |
301
301
  | `metadata.validators.maxDistanceMessage` | `string` | Ativo | Mensagem para distancia maxima. |
302
- | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit" \| "confirm"` | Ativo | Quando `explicit`/`confirm`, slider, inputs e presets ficam em rascunho ate `Aplicar`. |
302
+ | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit"` | Ativo | Quando `explicit`, slider, inputs e presets ficam em rascunho ate `Aplicar`. |
303
303
  | `metadata.inlineOverlay.actions.apply.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do commit. |
304
304
  | `metadata.inlineOverlay.actions.cancel.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do descarte. |
305
305
  | `metadata.inlineOverlay.actions.clear.*` | `object` | Ativo | Label, aria, icon, appearance, colorRole e visibilidade da limpeza explicita. |
@@ -318,7 +318,7 @@ Resumo de composicao deste componente:
318
318
  - `quickPresets` podem ser declarados ou gerados por defaults internos.
319
319
  - Slider e inputs textuais permanecem sincronizados (`timeRangeForm` + `sliderRangeForm`).
320
320
  - `timeInputStepSeconds()` deriva de `stepMinute` para entrada `type=time`.
321
- - Com `inlineOverlay.applyMode: "explicit"` ou `"confirm"`, alteracoes no painel nao emitem valor externo ate `Aplicar`; `Cancelar`, `Esc`, detach ou clique externo restauram o valor confirmado anterior.
321
+ - Com `inlineOverlay.applyMode: "explicit"`, alteracoes no painel nao emitem valor externo ate `Aplicar`; `Cancelar`, `Esc`, detach ou clique externo restauram o valor confirmado anterior.
322
322
 
323
323
  ### 5. Exemplo Minimo (JSON + Uso)
324
324
  ```json
@@ -22,8 +22,8 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-async-select/material-async-select.component.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts"
24
24
  - "projects/praxis-core/src/lib/models/material-field-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-03-06"
26
- last_updated: "2026-03-06"
25
+ source_of_truth_last_verified: "2026-07-06"
26
+ last_updated: "2026-07-06"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -318,7 +318,12 @@ Garantias:
318
318
 
319
319
  - input de busca e carga incremental estao habilitados no painel.
320
320
  - `loadOn` controla a primeira carga (`open`, `init`, `none`).
321
+ - Uma falha na carga inicial nao marca o campo como carregado: com `loadOn='open'`, reabrir o painel tenta novamente; somente uma resposta processada com sucesso conclui a carga inicial.
321
322
  - `useCursor` pode trocar estrategia de pagina quando backend suporta cursor.
323
+ - Com `resourcePath` e `loadOn='open'`, o painel abre mesmo antes da primeira pagina remota para disparar a carga inicial; a opcao sentinela usada para isso e interna, invisivel e nao compoe contrato visual publico.
324
+ - `Carregar mais` so aparece depois de uma primeira pagina remota carregada com sucesso e com proxima pagina disponivel; durante a paginacao permanece visivel, ocupado e desabilitado para evitar requisicoes duplicadas e salto de layout. A acao usa o rodape compartilhado, materializado como irmao do `listbox` no overlay, tem alvo minimo de 44 px, recebe foco por `Tab` a partir da busca e nao participa da semantica de opcoes.
325
+ - fontes locais (`selectOptions`/`options`) e `loadOn='none'` antes da primeira carga nao exibem acao de paginacao.
326
+ - em paginacao numerada, o fim usa `totalPages`/`totalElements` quando fornecidos pelo backend; se ausentes, usa `content.length < pageSize` como fallback.
322
327
 
323
328
  Limites:
324
329
 
@@ -351,6 +356,7 @@ Precedencia de comportamento:
351
356
  #### Checklist corporativo
352
357
 
353
358
  - alinhe backend para pesquisa por termo e include de selecionados.
359
+ - retorne `totalPages` e `totalElements` consistentes para evitar chamadas extras de paginacao.
354
360
  - padronize `optionLabelKey`/`optionValueKey` entre dominios.
355
361
  - defina `dependencyLoadOnChange` conforme UX esperada em cascata.
356
362
  - use `maxSelections` quando multi-select exigir limite de negocio.
@@ -393,8 +399,13 @@ Precedencia de comportamento:
393
399
 
394
400
  Notas de runtime:
395
401
 
396
- - em remoto, `loadOptions` usa filtro com include de selecionados na pagina 0.
402
+ - em remoto generico, `loadOptions` pode usar `includeIds` na pagina 0.
403
+ - em `optionSource`, o filtro envia `includeIds` somente quando `optionSource.includeIds=true` e nao ha termo de busca ativo; quando ausente, `false` ou durante busca digitada, valores selecionados sao reidratados por `/option-sources/{sourceKey}/options/by-ids`.
404
+ - durante busca digitada, a lista visivel usa apenas os itens da pagina remota filtrada. Opcoes reidratadas por ID preservam o display fechado, mas nao podem substituir ou inflar o resultado da busca.
405
+ - em `optionSource`, dependencias declaradas por `dependsOn` e `dependencyFilterMap` sao materializadas como filtros estruturados `equals` no envelope canonico de opcoes.
397
406
  - `onSearch` limpa estado local e reinicia pagina para novo termo.
407
+ - `loadMore` nao inicia a primeira carga remota; a primeira pagina respeita `loadOn`, abertura do painel, reload explicito ou mudanca de dependencia.
408
+ - `loadMore` incrementa pagina somente quando ja existe pagina remota carregada e `endReached=false`.
398
409
 
399
410
  Contrato compartilhado completo:
400
411
 
@@ -416,8 +427,8 @@ Correcao: revise `loadOn`, `resourcePath` e permissao de endpoint.
416
427
  3. Filtro remoto usa campo errado.
417
428
  Correcao: alinhe `optionLabelKey` e `optionValueKey` ao payload real.
418
429
 
419
- 4. Item selecionado some apos nova busca.
420
- Correcao: backend deve suportar include de ids selecionados na pagina inicial.
430
+ 4. Item selecionado aparece como unico resultado de uma busca que deveria retornar outro item.
431
+ Correcao: durante busca, nao envie `includeIds` nem force `ensureVisible` do selecionado; a lista deve refletir a pagina remota filtrada. O selecionado continua preservado pela reidratacao `/by-ids` para display fechado e reabertura sem termo.
421
432
 
422
433
  5. Cascata nao atualiza automaticamente.
423
434
  Correcao: use `dependencyLoadOnChange='immediate'` ou dispare recarga no host.
@@ -459,7 +470,11 @@ Correcao: use `dependencyLoadOnChange='immediate'` ou dispare recarga no host.
459
470
 
460
471
  | Token/Class | Scope | Purpose | Notes |
461
472
  | --- | --- | --- | --- |
462
- | `not-yet-verified` | component | Styling contract not yet verified | Use Detailed API reference for component-specific styling notes. |
473
+ | `--pdx-select-panel-actions-surface` / `--pdx-select-panel-actions-on-surface` / `--pdx-select-panel-actions-muted` | overlay footer | Superficie, texto principal e texto secundario | Definir na classe de tema que alcanca o CDK Overlay. Tokens `--pdx-overlay-*` e inline continuam como fallbacks compativeis. |
474
+ | `--pdx-select-panel-actions-outline` / `--pdx-select-panel-actions-accent` | overlay footer | Separador, bordas e cor de acao/foco | Fallbacks Material: divider/outline e primary. |
475
+ | `--pdx-select-panel-action-hover-surface` / `--pdx-select-panel-action-focus-ring` | overlay footer | Estados hover e foco visivel | O host deve preservar contraste AA em temas claro e escuro. |
476
+ | `--pdx-select-panel-load-more-surface` / `--pdx-select-panel-load-more-outline` | overlay footer | Tratamento do botao `Carregar mais` | Permite distinguir a acao sem acoplamento a internals MDC. |
477
+ | `--pdx-select-panel-actions-gap` / `--pdx-select-panel-actions-padding` / `--pdx-select-panel-action-min-height` / `--pdx-select-panel-action-padding` / `--pdx-select-panel-action-radius` / `--pdx-select-panel-action-disabled-opacity` | overlay footer | Densidade, geometria e estado desabilitado | Altura default de 44 px preserva alvo corporativo acessivel. |
463
478
 
464
479
  ## Examples (obrigatorio)
465
480
 
@@ -22,8 +22,8 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.component.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts"
24
24
  - "projects/praxis-core/src/lib/models/material-field-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-04-27"
26
- last_updated: "2026-04-27"
25
+ source_of_truth_last_verified: "2026-06-25"
26
+ last_updated: "2026-06-25"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -133,6 +133,7 @@ Este documento e a referencia canonica da API JSON de pdx-material-checkbox-grou
133
133
  | --- | --- | --- | --- | --- |
134
134
  | `metadata.options` | `metadata.checkboxOptions` | not-yet-defined | accepted for backward compatibility | Alias legado para opcoes do grupo. |
135
135
  | ausencia de `metadata.selectionMode` | `metadata.selectionMode` explicito | not-yet-defined | runtime infere `boolean` sem opcoes e `multiple` com opcoes | Fallback legado preservado para migracao. |
136
+ | valores booleanos legados `S`/`N`, `1`/`0`, `true`/`false` no `FormControl` | `boolean` real | not-yet-defined | em `selectionMode: 'boolean'`, o runtime normaliza antes de renderizar e emitir eventos | Compatibilidade para telas migradas que recebem flags legadas do backend. |
136
137
 
137
138
  ### Internal-only paths
138
139
 
@@ -197,6 +198,7 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
197
198
  ### Runtime semantics addendum
198
199
 
199
200
  - `selectionMode` explicito governa a semantica interna de selecao; heuristica por presenca de opcoes so vale quando `selectionMode` nao e informado.
201
+ - Em `selectionMode: 'boolean'`, o valor de entrada aceita `boolean` real e flags legadas textuais/numéricas (`S`/`N`, `T`/`F`, `1`/`0`, `true`/`false`, `sim`/`não`) e normaliza para `boolean` antes da interação.
200
202
  - `required`/`requiredChecked` propagam sinalizacao acessivel (`aria-required`) para o checkbox renderizado.
201
203
  - No modo boolean, cliques no shell de conteudo tambem emitem `selectionChange` e `optionSelected` para alinhamento operacional com o runtime base de selecao.
202
204
  - Estados governados (`disabledMode`, `readonlyMode`, `presentationMode`, `metadata.readonly` e `FormControl.disabled`) bloqueiam mutacoes em modo boolean, option e select-all.
@@ -224,7 +226,7 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
224
226
 
225
227
  | Surface | Verified | Coverage status | Evidence | Notes |
226
228
  | --- | --- | --- | --- | --- |
227
- | Runtime | `true` | Active | `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.metadata.ts`, `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.component.ts` | Core runtime flows and governed states verified via focused component specs on 2026-04-27; editor/tooling coverage remains independent. |
229
+ | Runtime | `true` | Active | `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.metadata.ts`, `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.component.ts` | Core runtime flows, governed states and legacy boolean value normalization verified via focused component specs on 2026-06-25; editor/tooling coverage remains independent. |
228
230
  | Schema/Types | `true` | Active | source_of_truth + Detailed API reference | Reconcile schema/types with canonical paths during follow-up when needed. |
229
231
  | Editor/Tooling | `false` | Partial | `projects/praxis-core/src/lib/metadata/field-selector-control-type.constants.ts`, `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts` | Selector/control-type tooling linkage verified via default selector map and registry seeding; visual editor end-to-end coverage remains not-yet-verified. |
230
232