@praxisui/dynamic-fields 8.0.0-beta.6 → 8.0.0-beta.60

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 (97) hide show
  1. package/README.md +19 -0
  2. package/docs/dynamic-fields-field-catalog.md +217 -0
  3. package/docs/dynamic-fields-field-selection-guide.md +204 -0
  4. package/docs/dynamic-fields-host-custom-field-guide.md +252 -0
  5. package/docs/dynamic-fields-host-custom-field-troubleshooting.md +160 -0
  6. package/docs/dynamic-fields-inline-components-guide.md +582 -0
  7. package/docs/dynamic-fields-inline-filter-catalog.md +502 -0
  8. package/docs/dynamic-fields-inline-filter-custom-component-guide.md +241 -0
  9. package/docs/dynamic-fields-inline-filter-inventory.md +247 -0
  10. package/docs/dynamic-fields-inline-filter-runtime-contract.md +391 -0
  11. package/docs/dynamic-fields-inline-filter-selection-guide.md +419 -0
  12. package/docs/dynamic-fields-inline-filter-troubleshooting.md +201 -0
  13. package/docs/dynamic-fields-inventory.md +206 -0
  14. package/docs/dynamic-fields-playground-catalog-plan.md +243 -0
  15. package/docs/generic-crud-service.md +152 -0
  16. package/fesm2022/praxisui-dynamic-fields-index-CBogy3si.mjs +1 -0
  17. package/fesm2022/praxisui-dynamic-fields-index-CWPZdn1Y.mjs +6 -0
  18. package/fesm2022/praxisui-dynamic-fields-index-CrHhyUMO.mjs +1 -0
  19. package/fesm2022/praxisui-dynamic-fields-index-DhGo5In4.mjs +6 -0
  20. package/fesm2022/praxisui-dynamic-fields.mjs +19551 -10669
  21. package/package.json +14 -13
  22. package/src/lib/base/pdx-base-input-runtime-contract.json-api.md +526 -0
  23. package/src/lib/base/pdx-base-select-runtime-contract.json-api.md +474 -0
  24. package/src/lib/components/color-input/pdx-color-input.json-api.md +573 -0
  25. package/src/lib/components/color-picker/pdx-color-picker.json-api.md +686 -0
  26. package/src/lib/components/date-input/pdx-date-input.json-api.md +581 -0
  27. package/src/lib/components/datetime-local-input/pdx-datetime-local-input.json-api.md +560 -0
  28. package/src/lib/components/email-input/pdx-email-input.json-api.md +546 -0
  29. package/src/lib/components/field-shell/praxis-field-shell.json-api.md +523 -0
  30. package/src/lib/components/inline-async-select/pdx-inline-async-select.json-api.md +566 -0
  31. package/src/lib/components/inline-autocomplete/pdx-inline-autocomplete.json-api.md +554 -0
  32. package/src/lib/components/inline-color-label/pdx-inline-color-label.json-api.md +615 -0
  33. package/src/lib/components/inline-currency/pdx-inline-currency.json-api.md +542 -0
  34. package/src/lib/components/inline-currency-range/pdx-inline-currency-range.json-api.md +630 -0
  35. package/src/lib/components/inline-date/pdx-inline-date.json-api.md +529 -0
  36. package/src/lib/components/inline-date-range/pdx-inline-date-range.json-api.md +592 -0
  37. package/src/lib/components/inline-distance-radius/pdx-inline-distance-radius.json-api.md +649 -0
  38. package/src/lib/components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md +656 -0
  39. package/src/lib/components/inline-input/pdx-inline-input.json-api.md +538 -0
  40. package/src/lib/components/inline-multi-select/pdx-inline-multi-select.json-api.md +566 -0
  41. package/src/lib/components/inline-number/pdx-inline-number.json-api.md +533 -0
  42. package/src/lib/components/inline-pipeline-status/pdx-inline-pipeline-status.json-api.md +619 -0
  43. package/src/lib/components/inline-range-slider/pdx-inline-range-slider.json-api.md +605 -0
  44. package/src/lib/components/inline-rating/pdx-inline-rating.json-api.md +594 -0
  45. package/src/lib/components/inline-relative-period/pdx-inline-relative-period.json-api.md +623 -0
  46. package/src/lib/components/inline-score-priority/pdx-inline-score-priority.json-api.md +632 -0
  47. package/src/lib/components/inline-searchable-select/pdx-inline-searchable-select.json-api.md +564 -0
  48. package/src/lib/components/inline-select/pdx-inline-select.json-api.md +571 -0
  49. package/src/lib/components/inline-sentiment/pdx-inline-sentiment.json-api.md +661 -0
  50. package/src/lib/components/inline-time/pdx-inline-time.json-api.md +573 -0
  51. package/src/lib/components/inline-time-range/pdx-inline-time-range.json-api.md +635 -0
  52. package/src/lib/components/inline-toggle/pdx-inline-toggle.json-api.md +516 -0
  53. package/src/lib/components/inline-tree-select/pdx-inline-tree-select.json-api.md +637 -0
  54. package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +566 -0
  55. package/src/lib/components/material-autocomplete/pdx-material-autocomplete.json-api.md +561 -0
  56. package/src/lib/components/material-avatar/pdx-material-avatar.json-api.md +670 -0
  57. package/src/lib/components/material-button/pdx-material-button.json-api.md +572 -0
  58. package/src/lib/components/material-button-toggle/pdx-material-button-toggle.json-api.md +577 -0
  59. package/src/lib/components/material-checkbox-group/pdx-material-checkbox-group.json-api.md +611 -0
  60. package/src/lib/components/material-chips/pdx-material-chips.json-api.md +601 -0
  61. package/src/lib/components/material-colorpicker/pdx-material-colorpicker.json-api.md +545 -0
  62. package/src/lib/components/material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md +531 -0
  63. package/src/lib/components/material-currency/pdx-material-currency.json-api.md +569 -0
  64. package/src/lib/components/material-date-range/pdx-material-date-range.json-api.md +636 -0
  65. package/src/lib/components/material-datepicker/pdx-material-datepicker.json-api.md +551 -0
  66. package/src/lib/components/material-file-upload/pdx-material-file-upload.json-api.md +511 -0
  67. package/src/lib/components/material-multi-select/pdx-material-multi-select.json-api.md +596 -0
  68. package/src/lib/components/material-multi-select-tree/pdx-material-multi-select-tree.json-api.md +623 -0
  69. package/src/lib/components/material-price-range/pdx-material-price-range.json-api.md +619 -0
  70. package/src/lib/components/material-radio-group/pdx-material-radio-group.json-api.md +585 -0
  71. package/src/lib/components/material-range-slider/pdx-material-range-slider.json-api.md +664 -0
  72. package/src/lib/components/material-rating/pdx-material-rating.json-api.md +551 -0
  73. package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +602 -0
  74. package/src/lib/components/material-select/pdx-material-select.json-api.md +601 -0
  75. package/src/lib/components/material-selection-list/pdx-material-selection-list.json-api.md +607 -0
  76. package/src/lib/components/material-slide-toggle/pdx-material-slide-toggle.json-api.md +522 -0
  77. package/src/lib/components/material-slider/pdx-material-slider.json-api.md +602 -0
  78. package/src/lib/components/material-textarea/pdx-material-textarea.json-api.md +598 -0
  79. package/src/lib/components/material-timepicker/pdx-material-timepicker.json-api.md +554 -0
  80. package/src/lib/components/material-transfer-list/pdx-material-transfer-list.json-api.md +614 -0
  81. package/src/lib/components/material-tree-select/pdx-material-tree-select.json-api.md +649 -0
  82. package/src/lib/components/month-input/pdx-month-input.json-api.md +527 -0
  83. package/src/lib/components/number-input/pdx-number-input.json-api.md +594 -0
  84. package/src/lib/components/password-input/pdx-password-input.json-api.md +574 -0
  85. package/src/lib/components/pdx-material-time-range/pdx-material-time-range.json-api.md +592 -0
  86. package/src/lib/components/pdx-year-input/pdx-year-input.json-api.md +543 -0
  87. package/src/lib/components/phone-input/pdx-phone-input.json-api.md +583 -0
  88. package/src/lib/components/preload-status/pdx-preload-status.json-api.md +455 -0
  89. package/src/lib/components/search-input/pdx-search-input.json-api.md +536 -0
  90. package/src/lib/components/text-input/pdx-text-input.json-api.md +600 -0
  91. package/src/lib/components/time-input/pdx-time-input.json-api.md +546 -0
  92. package/src/lib/components/url-input/pdx-url-input.json-api.md +542 -0
  93. package/src/lib/components/week-input/pdx-week-input.json-api.md +533 -0
  94. package/{index.d.ts → types/praxisui-dynamic-fields.d.ts} +874 -440
  95. package/fesm2022/praxisui-dynamic-fields-index-C9IUU4lo.mjs +0 -1
  96. package/fesm2022/praxisui-dynamic-fields-index-GJtthzkD.mjs +0 -1
  97. package/fesm2022/praxisui-dynamic-fields-index-XvVS6lAQ.mjs +0 -1
@@ -0,0 +1,582 @@
1
+ ---
2
+ title: "Dynamic Fields Inline Components Guide"
3
+ slug: "dynamic-fields-inline-components-guide"
4
+ description: "Hub tecnico da trilha especializada de inline filter components, conectando catalogo, selecao, contrato runtime, extensao de host e troubleshooting."
5
+ doc_type: "reference"
6
+ document_kind: "host-guide"
7
+ category: "components"
8
+ audience:
9
+ - "host"
10
+ - "frontend"
11
+ level: "advanced"
12
+ status: "active"
13
+ owner: "praxis-ui"
14
+ tags:
15
+ - "filter"
16
+ - "inline"
17
+ - "praxis-table"
18
+ - "dynamic-fields"
19
+ - "a11y"
20
+ order: 40
21
+ icon: "tune"
22
+ toc: true
23
+ sidebar: true
24
+ search_boost: 1.05
25
+ reading_time: 20
26
+ estimated_setup_time: 30
27
+ version: "1.1"
28
+ deprecated_paths:
29
+ - "filter-inline-components-guide.md"
30
+ deprecated_slugs:
31
+ - "dynamic-fields-filter-inline-components-guide"
32
+ related_docs:
33
+ - "dynamic-fields-inline-filter-inventory"
34
+ - "dynamic-fields-inline-filter-catalog"
35
+ - "dynamic-fields-inline-filter-selection-guide"
36
+ - "dynamic-fields-inline-filter-runtime-contract"
37
+ - "dynamic-fields-inline-filter-custom-component-guide"
38
+ - "dynamic-fields-inline-filter-troubleshooting"
39
+ - "dynamic-filter-payload-contract"
40
+ - "dynamic-filter-range-filters-guide"
41
+ - "dynamic-inline-filter-catalog"
42
+ keywords:
43
+ - "controlType"
44
+ - "inline*"
45
+ - "alwaysVisibleFields"
46
+ - "clearButton"
47
+ last_updated: "2026-03-07"
48
+ ---
49
+
50
+ # Dynamic Fields Inline Components Guide
51
+
52
+ ## Objetivo
53
+
54
+ Padronizar componentes compactos do filtro dinâmico para uso corporativo, com alta legibilidade, acessibilidade e previsibilidade de comportamento.
55
+
56
+ Este documento agora funciona como **hub tecnico** da trilha especializada de inline filters.
57
+
58
+ Use a suite abaixo para a leitura canonica:
59
+
60
+ - inventario runtime: `dynamic-fields-inline-filter-inventory.md`
61
+ - catalogo especializado: `dynamic-fields-inline-filter-catalog.md`
62
+ - guia de selecao: `dynamic-fields-inline-filter-selection-guide.md`
63
+ - runtime contract: `dynamic-fields-inline-filter-runtime-contract.md`
64
+ - custom component guide: `dynamic-fields-inline-filter-custom-component-guide.md`
65
+ - troubleshooting: `dynamic-fields-inline-filter-troubleshooting.md`
66
+
67
+ Regra editorial:
68
+
69
+ - `praxis-table` documenta a **feature de filtro**
70
+ - `praxis-dynamic-fields` documenta os **componentes inline** que a feature consome
71
+
72
+ As secoes detalhadas abaixo continuam como referencia de UX/metadata, mas a trilha governada passa a ser a suite acima.
73
+
74
+ ## Pré-requisitos
75
+
76
+ - Host Angular com `praxis-filter` e `@praxisui/dynamic-fields` integrados.
77
+ - Conhecimento basico de `controlType`, metadata de campos e requisitos de acessibilidade.
78
+
79
+ ## Padrões obrigatórios
80
+
81
+ 1. Estados visuais consistentes:
82
+ - `empty`: label do campo exibido no próprio pill (nunca texto cru).
83
+ - `filled`: valor exibido com hierarquia visual clara.
84
+ - `focus`: foco acompanha o shape do pill.
85
+ - `disabled/readonly`: contraste e interação coerentes.
86
+
87
+ 2. Layout:
88
+ - Campos compactos (`inline*`, formato canônico) ficam na faixa `compact-fields` (flex).
89
+ - Campos não compactos seguem na `fields-grid`.
90
+ - Evitar largura fixa em componentes compactos; usar `min/max` responsivos.
91
+
92
+ 3. Overlay/Popover:
93
+ - Arredondamento superior e inferior preservado.
94
+ - `overflow: hidden` no painel e no `overlay-pane` quando necessário.
95
+ - Largura controlada por `min/max` para não ficar “full-width”.
96
+ - Ao fechar, limpar termo de busca temporário do popover para evitar “lista vazia” na reabertura.
97
+
98
+ - Controles inline package-owned devem preservar contraste via tokens internos
99
+ `--pdx-inline-field-*` e `--pdx-inline-panel-*`, evitando depender de overrides
100
+ globais de `.mat-mdc-form-field` ou `.mat-mdc-select-panel` do host.
101
+
102
+ 4. Fonte de label:
103
+ - Prioridade: `label` -> `metadata.label` -> `placeholder` -> `metadata.placeholder` -> `name` humanizado -> fallback.
104
+
105
+ 5. Acessibilidade:
106
+ - `aria-label` sempre disponível.
107
+ - Placeholder visual custom deve ser `aria-hidden`.
108
+ - Botões de limpar com `aria-label`.
109
+ - Foco visual visível em dark/light theme.
110
+
111
+ 6. Regra de clear button (corporativo):
112
+ - Controles inline respeitam `metadata.clearButton` (`enabled`, `showOnlyWhenFilled`).
113
+ - Para manter UX de pill compacta sem configuração manual em cada schema, o `praxis-filter` aplica default `clearButton={ enabled: true, showOnlyWhenFilled: true }` para:
114
+ `inlineSelect`, `inlineSearchableSelect`, `inlineAsyncSelect`, `inlineEntityLookup`,
115
+ `inlineAutocomplete`, `inlineMultiSelect`, `inlineInput`, `inlineNumber`,
116
+ `inlineCurrency`, `inlineCurrencyRange`, `inlineToggle`, `inlineRange`,
117
+ `inlinePeriodRange`, `inlineYearRange`, `inlineMonthRange`,
118
+ `inlineDate`, `inlineDateRange`, `inlineTime`, `inlineTimeRange`,
119
+ `inlineTreeSelect`, `inlineRating`, `inlineDistanceRadius`,
120
+ `inlinePipelineStatus`, `inlineScorePriority`.
121
+ - Para `inlineRelativePeriod`, `inlineSentiment` e `inlineColorLabel`, defina
122
+ `metadata.clearButton` explicitamente quando quiser quick clear.
123
+ - Fora da lista acima, o default corporativo de quick clear não é aplicado automaticamente.
124
+
125
+ Exemplo mínimo (quick clear explícito para os 3 inline especiais):
126
+
127
+ ```json
128
+ {
129
+ "controlType": "inlineRelativePeriod",
130
+ "clearButton": {
131
+ "enabled": true,
132
+ "showOnlyWhenFilled": true
133
+ }
134
+ }
135
+ ```
136
+
137
+ 7. Tooltip contextual (corporativo):
138
+ - Quando `validators.errorPosition = "tooltip"` e existe erro, o tooltip mostra a mensagem de validação.
139
+ - Sem erro, campos inline preenchidos exibem contexto no formato `Campo: valor`.
140
+ - É possível desabilitar por campo com `inlineContextTooltip: false` (ou `{ "enabled": false }`).
141
+
142
+ ## Mapa atual
143
+
144
+ - `inlineSelect`: listas compactas em pill + popover.
145
+ - `inlineSearchableSelect`: variante inline dedicada para `searchable-select`, mantendo preload de selecionados, busca remota e paginação.
146
+ - `inlineAsyncSelect`: variante inline dedicada para `async-select`, com busca remota, cursor/paginação e placeholder em pill quando vazio.
147
+ - Quando a fonte remota vier de `x-ui.optionSource.type = CATEGORICAL_BUCKET`, o runtime passa a assumir `loadOn = "init"` e esconde a busca por padrão, mantendo opt-in explícito via `metadata.searchable = true` quando o host realmente precisar de pesquisa textual.
148
+ - `inlineEntityLookup`: variante inline corporativa para lookup de entidades (`id + descrição`), com busca por id/descrição e atalho de reset no popover.
149
+ - `inlineAutocomplete`: autocomplete compacto em pill, com busca incremental e lista em popover arredondado.
150
+ - `inlineNumber`: número compacto em pill, com validação `min/max`, clear e largura adaptativa. Em `numericFormat/format = percent`, renderiza sufixo `%` e defaults corporativos (`min=0`, `max=100`, `step=0.01`) quando não informados. O visual gráfico enriquecido fica sob opt-in explícito com `inlineVisualStyle = "graphic"`, preservando o modo compacto como padrão corporativo.
151
+ - `inlineCurrency`: moeda compacta em pill, com máscara, locale/moeda configuráveis e clear.
152
+ - `inlineCurrencyRange`: faixa monetária compacta em pill, com slider duplo em popover e resumo `min-max`.
153
+ - `inlineMultiSelect`: listas múltiplas compactas em pill + popover, exibindo tokens selecionados com overflow `+N` e seção de selecionados no painel.
154
+ - `inlineInput`: texto compacto com ícone de busca, clear, largura adaptativa e mascara de
155
+ display para campos textuais semanticamente conhecidos (CPF/CNPJ, telefone BR/E.164 e CEP),
156
+ preservando o valor cru enviado ao filtro.
157
+ - `inlineToggle`: toggle booleano compacto em pill, com `clear` para voltar a estado neutro (`null`).
158
+ - `inlineRange`: chip compacto + popover com slider, suportando `rangeSlider` em modo `single` e `range`, inputs numéricos opcionais (`showInputs`), labels/marks declarativos, value labels, histograma/distribuição e presets rápidos (`quickPresets` / `quickPresetsAuto`).
159
+ - `inlinePeriodRange`: faixa temporal compacta por granularidade, cobrindo `month`, `quarter`, `year` e `fiscal-year` com chip e presets específicos por período.
160
+ - `inlineYearRange`: alias compatível para `inlinePeriodRange` com `granularity: 'year'`.
161
+ - `inlineMonthRange`: alias compatível para `inlinePeriodRange` com `granularity: 'month'`.
162
+ - `inlineDate`: datepicker compacto em pill, com largura automática por conteúdo e placeholder inline.
163
+ - `inlineDateRange`: intervalo de datas compacto em pill, com largura adaptativa por conteúdo.
164
+ - `inlineTime`: timepicker compacto em pill, com largura adaptativa por conteúdo e modos `list|columns|auto`.
165
+ - `inlineTimeRange`: intervalo de horário compacto em pill, com validações de faixa reutilizando o componente base.
166
+ - `inlineTreeSelect`: tree select compacto em pill, com busca no popover e seleção hierárquica de nó único.
167
+ - `inlineRating`: rating inline (explícito por `controlType`) com escala e tons configuráveis.
168
+ - `inlineDistanceRadius`: distância/raio inline (explícito por `controlType`) com unidade e anéis.
169
+ - `inlinePipelineStatus`: status de pipeline inline (explícito por `controlType`) com cards e barra segmentada.
170
+ - `inlineScorePriority`: score/prioridade inline (explícito por `controlType`) com bandas e escala.
171
+ - `inlineRelativePeriod`: período relativo inline (explícito por `controlType`) com presets e progresso.
172
+ - `inlineSentiment`: sentimento inline (explícito por `controlType`) com paleta e seleção rápida.
173
+ - `inlineColorLabel`: etiquetas por cor inline (explícito por `controlType`) com badges e seleção.
174
+
175
+ Compatibilidade de mapeamento no `praxis-filter`:
176
+
177
+ - Para novos schemas, use `controlType` no formato canônico `inline*`.
178
+ - `select` -> `inlineSelect`.
179
+ - `searchable-select` -> `inlineSearchableSelect` por padrão (desative via `useInlineSearchableSelectVariant=false` quando o host precisar do renderer dedicado).
180
+ - `async-select` -> `inlineAsyncSelect` por padrão com a mesma regra de opt-out: `useInlineSearchableSelectVariant=false`.
181
+ - `entityLookup` -> `inlineEntityLookup` por configuração explícita no `controlType`.
182
+ - `autoComplete` / `autocomplete` -> `inlineAutocomplete` por padrão com a mesma regra de opt-out: `useInlineSearchableSelectVariant=false`.
183
+ - `numericTextBox` -> `inlineNumber`.
184
+ - `currency` -> `inlineCurrency`.
185
+ - `priceRange` -> `inlineCurrencyRange`.
186
+ - `year + mode=range` -> `inlinePeriodRange` com `granularity: 'year'` por padrão quando a toolbar compacta estiver ativa.
187
+ - `month + mode=range` -> `inlinePeriodRange` com `granularity: 'month'` por padrão quando a toolbar compacta estiver ativa.
188
+ - `multiSelect` -> `inlineMultiSelect`.
189
+ - `date/dateInput/datepicker` -> `inlineDate` por padrão (desative via `useInlineDateVariant=false`).
190
+ - `dateRange/daterange` -> `inlineDateRange` por padrão (desative via `useInlineDateRangeVariant=false`).
191
+ - `time/timeInput/timePicker` -> `inlineTime` por padrão (desative via `useInlineTimeVariant=false`).
192
+ - `timeRange` -> `inlineTimeRange` por padrão (desative via `useInlineTimeRangeVariant=false`).
193
+ - `treeSelect` -> `inlineTreeSelect` por padrão (desative via `useInlineTreeSelectVariant=false`).
194
+ - `inlineRating`, `inlineDistanceRadius`, `inlinePipelineStatus`, `inlineScorePriority`,
195
+ `inlineRelativePeriod`, `inlineSentiment`, `inlineColorLabel` ficam inline por `controlType` explícito.
196
+ - `multiSelectTree` permanece no componente dedicado para preservar semântica de seleção múltipla.
197
+
198
+ Observação técnica importante:
199
+
200
+ - No `mat-select`, o `mat-select-trigger` customizado não é renderizado quando o campo está vazio.
201
+ - Por isso, o estado `empty` do `inlineSelect` e do `inlineSearchableSelect` deve ser estilizado no branch de placeholder do Material (`.mat-mdc-select-placeholder`) para manter o visual de badge/pill.
202
+
203
+ Regra de curadoria enterprise:
204
+
205
+ - componentes da familia `graphic specialized` sao `opt-in` explicito por schema
206
+ - eles nunca devem virar default implicito por promocao automatica do `praxis-filter`
207
+ - a promocao automatica deve ficar restrita a controles universais e previsiveis, como select, input, date e range
208
+
209
+ Critério visual e acessível para `graphic specialized`:
210
+
211
+ - A metáfora gráfica só deve ser usada quando reduz esforço de decisão: fluxo operacional real, severidade, prioridade, distribuição, tendência ou faixa com significado de negócio.
212
+ - Se a visualização apenas deixa um enum mais decorativo, use `inlineSelect`, `inlineMultiSelect`, `inlineRange` ou `inlineCurrencyRange`.
213
+ - O chip preenchido deve mostrar texto suficiente para leitura sem abrir o popover. O padrão esperado é `label + value`, por exemplo `Pipeline Qualified +1` ou `Risco Critical +1`.
214
+ - Cor, ícone, estrela, emoji, barra ou banda nunca podem ser o único canal de significado. Toda opção precisa de label textual, `aria-label` coerente e contraste AA.
215
+ - O painel deve oferecer modo compacto legível: quantidade controlada de opções, wrap previsível, foco visível e seleção identificável sem depender apenas de cor.
216
+ - Em `inlinePipelineStatus`, a barra segmentada precisa representar etapas reais do processo. Quando o usuário precisa comparar apenas rótulos, use o modo text-first (`pipelineShowBar=false`).
217
+ - Em `inlineColorLabel`, `inlineSentiment`, `inlineScorePriority` e `inlineRating`, mantenha texto visível no resumo e nas opções; use paleta apenas como reforço semântico.
218
+ - Para dashboards corporativos com muitas colunas ou toolbar densa, documente um preset ou metadata de fallback: `density`, `inlineAutoSize`, `colorLabelColumns`, `pipelineChipMaxVisible`, `pipelineShowBar=false` ou clear button explícito.
219
+
220
+ Tiers de densidade recomendados:
221
+
222
+ - `core compact`: `inlineInput`, `inlineSelect`, `inlineSearchableSelect`, `inlineAsyncSelect`, `inlineEntityLookup`, `inlineAutocomplete`, `inlineNumber`, `inlineCurrency`, `inlineRange`, `inlineCurrencyRange`, `inlineDate`, `inlineDateRange`, `inlineTime`, `inlineTimeRange`, `inlineToggle`, `inlinePeriodRange`
223
+ - `advanced compact`: `inlineMultiSelect`, `inlineTreeSelect`
224
+ - `graphic specialized`: `inlinePipelineStatus`, `inlineRelativePeriod`, `inlineRating`, `inlineDistanceRadius`, `inlineScorePriority`, `inlineSentiment`, `inlineColorLabel`
225
+
226
+ Heuristicas de curadoria:
227
+
228
+ - `inlineTreeSelect` continua suportado como promocao inline, mas deve ser usado apenas para arvores rasas, selecao de no unico e leitura final curta
229
+ - quando o usuario precisa explorar varios ramos para descobrir o valor correto, a experiencia apropriada deixa de ser a toolbar compacta
230
+ - `inlineRelativePeriod` so deve ser escolhido quando a API e a trilha metadata-driven normalizam presets relativos de forma canonica; caso contrario, prefira `inlineDateRange`
231
+ - a familia `graphic specialized` deve entrar por decisao consciente de produto, nao por entusiasmo visual ou disponibilidade do componente
232
+
233
+ ## Matriz de contrato inline (enterprise)
234
+
235
+ Esta seção formaliza o contrato único de metadata para todos os inline do `praxis-filter`:
236
+
237
+ - `campo`: nome da propriedade de metadata.
238
+ - `tipo`: `editorType` definido no metadata editor (`text`, `number`, `checkbox`, `select`, `textarea`, `color`).
239
+ - `default`: valor aplicado em runtime quando o campo não vem no payload.
240
+ - `runtime support`: componentes que efetivamente consomem o campo.
241
+
242
+ ### Guia de uso da matriz
243
+
244
+ 1. Escolha o `controlType` inline.
245
+ 2. Use a coluna `Matriz base` para os campos compartilhados.
246
+ 3. Aplique os campos da coluna `Extensões específicas` quando o inline for especializado.
247
+ 4. Para ícones de painel/opção, use os campos de `Ícones` da matriz correspondente (todos metadata-driven).
248
+ 5. Para novos contratos, prefira sempre `controlType` canônico (`inline*`).
249
+
250
+ ### Matriz por inline (base + extensão)
251
+
252
+ | Inline / ControlType | Matriz base | Extensões específicas | Default runtime | Runtime support |
253
+ | ------------------------ | ------------------------ | ------------------------------------------ | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
254
+ | `inlineSelect` | `select.config.ts` | — | label/placeholder com fallback para `name`; busca opcional; clear respeita `clearButton` | `registrado por default no runtime inline` |
255
+ | `inlineSearchableSelect` | `select.config.ts` | — | busca local/remota e paginação | `registrado por default no runtime inline` |
256
+ | `inlineAsyncSelect` | `select.config.ts` | — | busca remota sob demanda + paginação | `registrado por default no runtime inline` |
257
+ | `inlineEntityLookup` | `select.config.ts` | — | modo lookup com reset no painel | `registrado por default no runtime inline` |
258
+ | `inlineAutocomplete` | `select.config.ts` | — | comportamento de select-like inline | `registrado por default no runtime inline` |
259
+ | `inlineMultiSelect` | `select.config.ts` | — | seleção múltipla com tokens compactos, overflow `+N` e selecionados no painel | `registrado por default no runtime inline` |
260
+ | `inlineInput` | `input.config.ts` | — | auto width por conteúdo | `registrado por default no runtime inline` |
261
+ | `inlineNumber` | `number.config.ts` | — | formatação numérica e `%` quando configurado | `registrado por default no runtime inline` |
262
+ | `inlineCurrency` | `currency.config.ts` | — | máscara monetária por locale | `registrado por default no runtime inline` |
263
+ | `inlineCurrencyRange` | `price-range.config.ts` | — | slider + inputs + resumo monetário | `registrado por default no runtime inline` |
264
+ | `inlineToggle` | `toggle.config.ts` | — | estado neutro com clear opcional | `registrado por default no runtime inline` |
265
+ | `inlineRange` | `range-slider.config.ts` | — | single/range com presets | `registrado por default no runtime inline` |
266
+ | `inlinePeriodRange` | `range-slider.config.ts` | `extensão temporal genérica co-localizada` | granularidades `month`, `quarter`, `year`, `fiscal-year` | `registrado por default no runtime inline` |
267
+ | `inlineYearRange` | `range-slider.config.ts` | `alias compatível de inlinePeriodRange` | converte para `granularity: 'year'` | `compatível; prefira inlinePeriodRange em contratos novos` |
268
+ | `inlineMonthRange` | `range-slider.config.ts` | `alias compatível de inlinePeriodRange` | converte para `granularity: 'month'` | `compatível; prefira inlinePeriodRange em contratos novos` |
269
+ | `inlineDate` | `date.config.ts` | — | datepicker inline com auto width | `registrado por default no runtime inline` |
270
+ | `inlineDateRange` | `date-range.config.ts` | — | presets + modo `auto/confirm` | `registrado por default no runtime inline` |
271
+ | `inlineTime` | `time-picker.config.ts` | — | modo `auto/list/columns`; toggle e selected icon metadata-driven | `registrado por default no runtime inline` |
272
+ | `inlineTimeRange` | `time-range.config.ts` | — | faixa de horário com validações | `registrado por default no runtime inline` |
273
+ | `inlineTreeSelect` | `tree-select.config.ts` | — | busca em árvore + seleção de nó | `registrado por default no runtime inline` |
274
+ | `inlineRating` | `range-slider.config.ts` | `extensão especializada co-localizada` | rating por faixa com tons e ícones de badge/estrelas metadata-driven | `registrado por default no runtime inline` |
275
+ | `inlineDistanceRadius` | `range-slider.config.ts` | `extensão especializada co-localizada` | distância com unidade e anéis | `registrado por default no runtime inline` |
276
+ | `inlinePipelineStatus` | `select.config.ts` | `extensão especializada co-localizada` | cards + barra segmentada + busca | `registrado por default no runtime inline` |
277
+ | `inlineScorePriority` | `range-slider.config.ts` | `extensão especializada co-localizada` | score bands e escala | `registrado por default no runtime inline` |
278
+ | `inlineRelativePeriod` | `select.config.ts` | `extensão especializada co-localizada` | presets de período com progresso | `registrado por default no runtime inline` |
279
+ | `inlineSentiment` | `select.config.ts` | `extensão especializada co-localizada` | opções de sentimento com palette | `registrado por default no runtime inline` |
280
+ | `inlineColorLabel` | `select.config.ts` | `extensão especializada co-localizada` | etiquetas por cor com badges | `registrado por default no runtime inline` |
281
+
282
+ ### Campos completos por matriz (todos os campos inline)
283
+
284
+ Fonte de verdade: `projects/praxis-metadata-editor/src/lib/config/*.config.ts`.
285
+
286
+ ### Matriz de ícones inline (campo, tipo, default, aliases reconhecidos, runtime support)
287
+
288
+ | Campo | Tipo | Default runtime | Aliases reconhecidos | Runtime support |
289
+ | --------------------------------- | ------- | -------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
290
+ | `panelSearchIcon` | `text` | `search` | `searchIcon`, `inlineSearchIcon` | `inlineSelect`, `inlineSearchableSelect`, `inlineAsyncSelect`, `inlineMultiSelect`, `inlineEntityLookup`, `inlineTreeSelect` |
291
+ | `panelSearchIconColor` | `color` | `undefined` | `searchIconColor`, `inlineSearchIconColor` | mesmos componentes acima |
292
+ | `panelResetIcon` | `text` | `restart_alt` | `resetIcon`, `inlineResetIcon` | `inlineEntityLookup` |
293
+ | `panelResetIconColor` | `color` | `undefined` | `resetIconColor`, `inlineResetIconColor` | `inlineEntityLookup` |
294
+ | `optionSelectedIcon` | `text` | `done` (`check` no `inlineTime`) | `selectedIcon`, `checkIcon` | `inlineTime`, `inlineColorLabel`, `inlineRelativePeriod` |
295
+ | `optionSelectedIconColor` | `color` | `undefined` | `selectedIconColor`, `checkIconColor` | `inlineTime`, `inlineColorLabel`, `inlineRelativePeriod` |
296
+ | `panelToggleOpenIcon` | `text` | `expand_less` | `toggleOpenIcon` | `inlineTime`, `inlineTreeSelect` |
297
+ | `panelToggleCloseIcon` | `text` | `expand_more` | `panelToggleClosedIcon`, `toggleCloseIcon` | `inlineTime`, `inlineTreeSelect` |
298
+ | `panelToggleIconColor` | `color` | `undefined` | `toggleIconColor` | `inlineTime`, `inlineTreeSelect` |
299
+ | `treeNodeExpandedIcon` | `text` | `expand_more` | `nodeExpandedIcon` | `inlineTreeSelect` |
300
+ | `treeNodeCollapsedIcon` | `text` | `chevron_right` | `nodeCollapsedIcon` | `inlineTreeSelect` |
301
+ | `treeNodeIconColor` | `color` | `undefined` | `nodeToggleIconColor` | `inlineTreeSelect` |
302
+ | `pipelineSearchIcon` | `text` | `search` | `panelSearchIcon`, `searchIcon`, `inlineSearchIcon` | `inlinePipelineStatus` |
303
+ | `pipelineSearchIconColor` | `color` | `undefined` | `panelSearchIconColor`, `searchIconColor`, `inlineSearchIconColor` | `inlinePipelineStatus` |
304
+ | `colorLabelSelectedIcon` | `text` | `done` | `optionSelectedIcon`, `selectedIcon`, `checkIcon` | `inlineColorLabel` |
305
+ | `colorLabelSelectedIconColor` | `color` | `undefined` | `optionSelectedIconColor`, `selectedIconColor`, `checkIconColor` | `inlineColorLabel` |
306
+ | `relativePeriodSelectedIcon` | `text` | `done` | `optionSelectedIcon`, `selectedIcon`, `checkIcon` | `inlineRelativePeriod` |
307
+ | `relativePeriodSelectedIconColor` | `color` | `undefined` | `optionSelectedIconColor`, `selectedIconColor`, `checkIconColor` | `inlineRelativePeriod` |
308
+
309
+ #### `select.config.ts`
310
+
311
+ `label, defaultValue, placeholder, hint, prefix, suffix, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, panelSearchIcon, panelSearchIconColor, panelResetIcon, panelResetIconColor, optionSelectedIcon, optionSelectedIconColor, options, emptyOptionText, multiple, optionLabelKey, optionValueKey, lookupIdKey, lookupLabelKey, lookupSubtitleKey, resourcePath, loadOn, filterCriteria, dependencyFields, resetOnDependentChange, enableDependencyCascade, dependencyFilterMap, dependencyValuePath, dependencyMergeStrategy, dependencyDebounceMs, dependencyLoadOnChange, selectAll, searchable, searchPlaceholder, maxSelections, required, validators.requiredMessage, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, materialDesign.appearance, materialDesign.color, materialDesign.floatLabel, materialDesign.subscriptSizing, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, materialDesign.hideRequiredMarker, errorStateMatcher, ariaLabel, ariaDescribedby, ariaLabelledby, tabIndex, dataAttributes`
312
+
313
+ #### `input.config.ts`
314
+
315
+ `label, placeholder, hint, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, prefix, suffix, showCharacterCount, required, minLength, maxLength, pattern, validators.requiredMessage, validators.minLengthMessage, validators.maxLengthMessage, validators.patternMessage, mask, textTransform, textTransformApply, autocomplete, spellcheck, disabled, readonly, inputMode, autoFocus, inputType, validators.validationTrigger, validators.validationDebounce, validators.showInlineErrors, validators.errorPosition, materialDesign.appearance, materialDesign.color, materialDesign.floatLabel, materialDesign.subscriptSizing, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, materialDesign.hideRequiredMarker, errorStateMatcher, disabledInteractive, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, ariaLabel, ariaDescribedby, ariaLabelledby, tabIndex, dataAttributes, defaultValue`
316
+
317
+ #### `number.config.ts`
318
+
319
+ `label, placeholder, defaultValue, hint, prefix, suffix, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, step, numberFormat.decimalPlaces, showGrouping, inputMode, autocomplete, spellcheck, readonly, disabled, autoFocus, validators.validationTrigger, validators.validationDebounce, validators.showInlineErrors, validators.errorPosition, required, min, max, validators.requiredMessage, validators.minMessage, validators.maxMessage, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, materialDesign.appearance, materialDesign.color, materialDesign.floatLabel, materialDesign.subscriptSizing, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, materialDesign.hideRequiredMarker, errorStateMatcher, ariaLabel, ariaDescribedby, ariaLabelledby, tabIndex, dataAttributes`
320
+
321
+ #### `currency.config.ts`
322
+
323
+ `label, defaultValue, placeholder, hint, prefix, suffix, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, currency, currencyPosition, decimalPlaces, locale, allowNegative, thousandsSeparator, decimalSeparator, readonly, disabled, autoFocus, required, min, max, validators.requiredMessage, validators.minMessage, validators.maxMessage, materialDesign.appearance, materialDesign.color, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, ariaLabel, ariaDescribedby, ariaLabelledby, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled`
324
+
325
+ #### `date.config.ts`
326
+
327
+ `label, defaultValue, placeholder, hint, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, prefix, suffix, required, minDate, maxDate, validators.requiredMessage, validators.minMessage, validators.maxMessage, startView, startAt, touchUi, closeOnSelect, materialDesign.appearance, materialDesign.color, materialDesign.floatLabel, materialDesign.subscriptSizing, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, materialDesign.hideRequiredMarker, errorStateMatcher, ariaLabel, ariaDescribedby, ariaLabelledby, tabIndex, dataAttributes, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled`
328
+
329
+ #### `date-range.config.ts`
330
+
331
+ `label, hint, startPlaceholder, endPlaceholder, defaultValue.startDate, defaultValue.endDate, prefixIcon, prefixIconColor, suffixIconColor, suffixIcon, startView, startAt, touchUi, required, minDate, maxDate, validators.requiredMessage, materialDesign.appearance, materialDesign.color, materialDesign.floatLabel, materialDesign.subscriptSizing, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, materialDesign.hideRequiredMarker, errorStateMatcher, startAriaLabel, endAriaLabel, tabIndex, dataAttributes, showShortcuts, shortcutsPosition, applyOnShortcutClick, shortcuts, inlineQuickPresets.enabled, inlineQuickPresets.maxVisible, inlineQuickPresetsAriaLabel, inlineQuickPresetsApplyMode, inlineQuickPresetsCancelLabel, inlineQuickPresetsCancelAriaLabel, inlineQuickPresetsApplyLabel, inlineQuickPresetsApplyAriaLabel, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled`
332
+
333
+ #### `time-picker.config.ts`
334
+
335
+ `label, defaultValue, hint, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, panelToggleCloseIcon, panelToggleOpenIcon, panelToggleIconColor, optionSelectedIcon, optionSelectedIconColor, timeOptions, interval, inlineTimeMode, inlineListMaxOptions, openOnClick, touchUi, format, showSeconds, stepMinute, stepSecond, timeFilter, inlineTexts.hourLabel, inlineTexts.minuteLabel, inlineTexts.secondLabel, inlineTexts.emptyStateLabel, inlineTexts.openPanelAriaLabel, inlineTexts.closePanelAriaLabel, required, min, max, validators.requiredMessage, materialDesign.appearance, materialDesign.color, materialDesign.density, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, ariaLabel, ariaDescribedby, ariaLabelledby, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled`
336
+
337
+ #### `time-range.config.ts`
338
+
339
+ `label, inlinePanelTitle, startLabel, endLabel, defaultValue.start, defaultValue.end, hint, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, step, stepMinute, minTime, maxTime, showTicks, inlineTimeQuickPresets, inlineTimeTrackShifts, touchUi, readonly, disabled, autoFocus, required, min, max, validators.requiredMessage, materialDesign.appearance, materialDesign.color, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, ariaLabel, ariaDescribedby, ariaLabelledby, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled`
340
+
341
+ #### `tree-select.config.ts`
342
+
343
+ `label, hint, prefixIcon, prefixIconColor, panelSearchIcon, panelSearchIconColor, panelToggleCloseIcon, panelToggleOpenIcon, panelToggleIconColor, treeNodeExpandedIcon, treeNodeCollapsedIcon, treeNodeIconColor, options, searchable, searchPlaceholder, emptyStateText, leafOnly, autoExpandOnSearch, returnPath, returnObject, required, validators.requiredMessage, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, ariaLabel, ariaDescribedby, ariaLabelledby, tabIndex, dataAttributes`
344
+
345
+ #### `toggle.config.ts`
346
+
347
+ `label, defaultValue, hint, labelPosition, inlineLabelVisible, hideIcon, disableRipple, readonly, disabled, autoFocus, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, requiredTrue, validators.requiredTrueMessage, color, ariaLabel, ariaDescribedby, ariaLabelledby`
348
+
349
+ #### `range-slider.config.ts`
350
+
351
+ `label, hint, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, mode, step, thumbLabel, showTicks, discrete, vertical, invert, displayWith, showInputs, quickPresets, quickPresetsAuto, quickPresetsLabels, inlineTexts, min, max, minDistance, maxDistance, validators.minMessage, validators.maxMessage, validators.rangeMessage, validators.distanceMessage, required, validators.requiredMessage, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, color, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, inlineAutoSize.panelMinWidth, inlineAutoSize.panelMaxWidth, inlineAutoSize.panelMinWidthMobile, inlineAutoSize.panelMaxWidthMobile, ariaLabel, ariaDescribedby, ariaLabelledby, tabIndex`
352
+
353
+ #### `price-range.config.ts`
354
+
355
+ `label, hint, tooltip, inlinePanelTitle, startLabel, endLabel, prefixIcon, prefixIconColor, suffixIcon, suffixIconColor, startPlaceholder, endPlaceholder, defaultValue.minPrice, defaultValue.maxPrice, hideSubLabels, layout, gap, clearButtonPlacement, required, readonly, disabled, hidden, min, max, startMin, startMax, startMinMessage, startMaxMessage, endMin, endMax, endMinMessage, endMaxMessage, endMinOffset, endMinOffsetMessage, startMaxOffset, startMaxOffsetMessage, step, showTicks, currency, currencyPosition, decimalPlaces, locale, thousandsSeparator, decimalSeparator, allowNegative, clearButton.enabled, clearButton.icon, clearButton.iconColor, clearButton.tooltip, clearButton.ariaLabel, clearButton.showOnlyWhenFilled, materialDesign.appearance, materialDesign.color, inlineAutoSize.minWidth, inlineAutoSize.maxWidth, inlineAutoSize.minWidthMobile, inlineAutoSize.maxWidthMobile, inlineAutoSize.panelMinWidth, inlineAutoSize.panelMaxWidth, ariaLabel, ariaDescribedby, ariaLabelledby`
356
+
357
+ #### Matrizes especializadas (incrementais)
358
+
359
+ - `inlineRating`:
360
+ `ratingIcon, allowHalf, ratingAllowHalf, ratingPrecision, precision, ratingToneLowColor, ratingToneMidColor, ratingToneHighColor, ratingBadgeColor, ratingBadgeIcon, ratingBadgeIconColor, ratingActiveIcon, ratingInactiveIcon, ratingToneColors, ratingColors, starColors, ratingLowColor, ratingMidColor, ratingHighColor, ratingIndicatorColor, ratingMin, ratingMax, itemsCount, ratingStep, materialDesign.density`
361
+ - `inlineDistanceRadius`:
362
+ `distanceIcon, distanceSubtitle, distanceUnit, distanceBaseUnit, distanceAllowUnitToggle, distanceUnits, distanceUnitLabels.km, distanceUnitLabels.mi, distanceDisplayDecimals, distancePresets, distanceRadialRings, distanceAccentColor, distanceRingColor, distanceTrackColor, distanceGlowColor, materialDesign.density`
363
+ - `inlinePipelineStatus`:
364
+ `pipelineSubtitle, pipelineOptions, pipelineSearchable, pipelineSearchPlaceholder, pipelineOptionSubtitleKey, pipelineOptionWeightKey, pipelineOptionColorKey, pipelineShowBar, pipelineShowSelectionPills, pipelineShowSelectAll, pipelineSelectAllText, pipelineShowClearAction, pipelineClearActionText, pipelineChipMaxVisible, pipelineColors, pipelineEmptyStateText, pipelineSelectionActionsAriaLabel, pipelineOptionsGroupAriaLabelMultiple, pipelineOptionsGroupAriaLabelSingle, pipelineSelectionPillsAriaLabel, pipelineBarAriaLabelEmpty, pipelineBarAriaLabelSelected, pipelineTexts, pipelineIcon, pipelineSearchIcon, pipelineSearchIconColor, inlineAutoSize.panelMinWidth, inlineAutoSize.panelMaxWidth, inlineAutoSize.panelMinWidthMobile, inlineAutoSize.panelMaxWidthMobile`
365
+ - `inlineScorePriority`:
366
+ `scoreSubtitle, scoreBands, scoreUnit, scoreDisplayDecimals, scoreShowScaleLabels, scoreShowBandChips, scoreRangeSeparator, scorePalette, scoreValueFallbackColor, scoreEmptyGradient, scoreIcon, scoreBandsAriaLabel, scoreBandAriaLabelTemplate, scoreTexts, scoreMin, scoreMax, scoreStep, priorityBands, severityBands, materialDesign.density`
367
+ - `inlineRelativePeriod`:
368
+ `relativePeriodSubtitle, relativePeriodOptions, relativePeriodPresets, relativePeriodShowProgress, relativePeriodColumns, relativePeriodCloseOnSelect, relativePeriodMultiple, relativePeriodSearchable, relativePeriodIcon, relativePeriodIconKey, relativePeriodSubtitleKey, relativePeriodOptionsAriaLabel, relativePeriodProgressEmptyLabel, relativePeriodEmptyStateText, relativePeriodTexts, inlineAutoSize.panelMinWidth, inlineAutoSize.panelMaxWidth, inlineAutoSize.panelMinWidthMobile, inlineAutoSize.panelMaxWidthMobile`
369
+ - `inlineSentiment`:
370
+ `sentimentSubtitle, sentimentOptions, sentimentPalette, sentimentShowBar, sentimentAnimatedEmoji, sentimentCloseOnSelect, sentimentMultiple, sentimentShowSelectionPills, sentimentIcon, sentimentColorKey, sentimentEmojiKey, sentimentOptionsAriaLabel, sentimentSelectionPillsAriaLabel, sentimentEmptyStateText, sentimentTexts, inlineAutoSize.panelMinWidth, inlineAutoSize.panelMaxWidth, inlineAutoSize.panelMinWidthMobile, inlineAutoSize.panelMaxWidthMobile`
371
+ - `inlineColorLabel`:
372
+ `colorLabelSubtitle, colorLabelOptions, colorLabelPalette, colorLabelMultiple, colorLabelColumns, colorLabelShowSelectedBadges, colorLabelCloseOnSelect, colorLabelSelectionTitle, colorLabelIcon, colorLabelBadgeRemoveIcon, colorLabelBadgeRemoveIconColor, colorLabelColorKey, colorLabelOptionsAriaLabel, colorLabelSelectionBadgesAriaLabel, colorLabelRemoveSelectionAriaLabel, colorLabelEmptyStateText, colorLabelTexts, inlineAutoSize.panelMinWidth, inlineAutoSize.panelMaxWidth, inlineAutoSize.panelMinWidthMobile, inlineAutoSize.panelMaxWidthMobile`
373
+
374
+ ## Auto Width (input inline)
375
+
376
+ `inlineInput` agora redimensiona por conteúdo (valor atual ou label quando vazio), com limites por densidade:
377
+
378
+ - `compact`: menor largura mínima, foco em economia de espaço.
379
+ - `comfortable`: padrão mais amplo.
380
+ - `dense`: ainda mais compacto para cenários de alta densidade.
381
+
382
+ Override opcional por metadata:
383
+
384
+ ```json
385
+ {
386
+ "controlType": "inlineInput",
387
+ "density": "compact",
388
+ "inlineAutoSize": {
389
+ "minWidth": 112,
390
+ "maxWidth": 300,
391
+ "minWidthMobile": 104,
392
+ "maxWidthMobile": 236
393
+ }
394
+ }
395
+ ```
396
+
397
+ `inlineSelect` usa o mesmo envelope de min/max por densidade/viewport (pill vazio e preenchido), mantendo largura por conteúdo para o texto selecionado.
398
+ `inlineAsyncSelect` segue o mesmo envelope adaptativo de largura e mantém label como placeholder visual quando vazio.
399
+ `inlineAutocomplete` também usa auto-width por conteúdo (valor/label), mantendo foco no shape pill e clear alinhado.
400
+ `inlineNumber` segue o mesmo envelope adaptativo de largura, usando valor numérico atual ou label como fallback quando vazio.
401
+ No modo percentual (`numericFormat` ou `format` com valor `percent`), mantém o mesmo layout inline e exibe sufixo `%`, preservando overrides explícitos de `min/max/step`.
402
+ `inlineCurrency` segue envelope adaptativo (`inlineAutoSize`) com máscara de moeda e símbolo antes/depois conforme metadata (`currencyPosition`).
403
+ `inlineCurrencyRange` segue envelope adaptativo (`inlineAutoSize`) no chip e popover, com escala e resumo monetário formatados.
404
+ `inlineEntityLookup` usa envelope adaptativo (`inlineAutoSize`) com faixa padrão maior para comportar `id + descrição`.
405
+ `inlineRange` usa envelope adaptativo de largura (`inlineAutoSize`) no chip e no popover para evitar bloco fixo largo quando usado na barra compacta.
406
+ `inlineDate` também usa envelope adaptativo (`inlineAutoSize`) e calcula a largura pelo valor exibido ou label do campo quando vazio.
407
+ `inlineDateRange` segue o mesmo princípio (`inlineAutoSize`) e usa o resumo do período para calcular largura.
408
+ `inlineTime` usa envelope adaptativo (`inlineAutoSize`) e calcula a largura com base no horário exibido.
409
+ No modo `inlineTimeMode: "auto"`:
410
+
411
+ - usa `list` quando o conjunto de horários é pequeno (ou `timeOptions` explícitas);
412
+ - usa `columns` para cenários de alta densidade/precisão (ex.: segundos).
413
+
414
+ Convenções importantes para contrato corporativo:
415
+
416
+ - `interval` numérico é tratado em **segundos**.
417
+ - para minutos/horas, prefira string com unidade (`"15m"`, `"1h"`).
418
+ - Exemplo rápido de equivalência:
419
+ - `{ "controlType": "inlineTime", "interval": 900 }` -> 900s (15 minutos)
420
+ - `{ "controlType": "inlineTime", "interval": "15m" }` -> equivalente (recomendado por legibilidade)
421
+ - para i18n do inline, use `inlineTexts.*` (`hourLabel`, `minuteLabel`, `secondLabel`, `emptyStateLabel`, labels aria).
422
+ `inlineTimeRange` usa envelope adaptativo (`inlineAutoSize`) e calcula a largura pelo resumo `inicio - fim`.
423
+ `inlineTreeSelect` usa envelope adaptativo (`inlineAutoSize`) com faixa maior para rótulos hierárquicos.
424
+ Para `inlineDateRange`, `inlineQuickPresetsApplyMode` define o contrato:
425
+ - `auto`: preset aplica imediatamente e fecha overlay.
426
+ - `confirm`: preset fica em rascunho no overlay; só `Aplicar` comita no valor final e `Cancelar` descarta.
427
+
428
+ Exemplo rápido para `inlineRange` com presets automáticos:
429
+
430
+ ```json
431
+ {
432
+ "controlType": "inlineRange",
433
+ "mode": "range",
434
+ "min": 0,
435
+ "max": 15000,
436
+ "step": 500,
437
+ "showInputs": true,
438
+ "quickPresetsAuto": true,
439
+ "quickPresetsLabels": {
440
+ "uptoMid": "Faixa baixa",
441
+ "fromMid": "Faixa alta",
442
+ "full": "Faixa completa"
443
+ },
444
+ "inlineTexts": {
445
+ "minLabel": "De",
446
+ "maxLabel": "Até",
447
+ "quickPresetsLabel": "Sugestões"
448
+ }
449
+ }
450
+ ```
451
+
452
+ ## Diretriz corporativa (catálogos remotos)
453
+
454
+ - Catálogo pequeno/médio: pode usar `inlineSelect` com busca local.
455
+ - Catálogo grande/remoto: prefira `searchable-select` dedicado (load sob demanda, paginação, preload de selecionados).
456
+ - Catálogo grande/remoto com UX de toolbar compacta: `inlineAsyncSelect` agora é o padrão; faça opt-out via `useInlineSearchableSelectVariant=false` se o host precisar preservar o renderer dedicado após validação de performance.
457
+ - Em cenários corporativos com paginação remota, latência alta ou busca pesada, trate `useInlineSearchableSelectVariant=false` como escape hatch suportado, não como exceção ad hoc.
458
+ - Quando habilitado, o componente inline dedicado limpa o termo de busca ao fechar o popover e reabre com estado consistente.
459
+
460
+ ## Backlog enterprise recomendado
461
+
462
+ Prioridade alta (próximo ciclo):
463
+
464
+ - Hardening de teclado/a11y no `inlineTreeSelect` para fluxos avançados.
465
+ - Monitorar via testes a consistência dos recipes AI inline e do catálogo canônico (`INLINE_FILTER_CONTROL_TYPES`).
466
+
467
+ ## Checklist de design review
468
+
469
+ Antes de aprovar um inline novo na toolbar, confirme:
470
+
471
+ - o estado vazio usa label semantico do campo, nao copy generica
472
+ - o estado preenchido continua inteligivel sem abrir o popover
473
+ - a escolha do componente reduz interacoes, nao apenas enriquece o visual
474
+ - o DTO final do backend continua obvio para frontend, QA e observabilidade
475
+ - existe plano de fallback para filtro avancado quando a densidade real da interacao crescer
476
+
477
+ Checklist especifico para `advanced compact` e `graphic specialized`:
478
+
479
+ - `inlineTreeSelect`: a arvore e rasa, a selecao e unica e o rotulo final cabe na toolbar
480
+ - `inlineRelativePeriod`: a trilha metadata-driven normaliza presets relativos para payload canonicamente auditavel
481
+ - `inlinePipelineStatus`: a metafora de pipeline representa um fluxo operacional real, nao um enum ornamental
482
+ - `inlineColorLabel`, `inlineSentiment`, `inlineRating`, `inlineScorePriority`: a leitura final nao depende apenas de cor, icone ou estilo grafico
483
+
484
+ ## Overrides de metadata para `alwaysVisibleFields`
485
+
486
+ Para cenários corporativos em que o mesmo campo precisa de comportamento diferente no modo inline (sempre visível), use:
487
+
488
+ - `advancedFilters.settings.alwaysVisibleFieldMetadataOverrides`
489
+ - Chave: `name` do campo no DTO de filtro
490
+ - Valor: patch parcial de metadata aplicado **após** os defaults inline do `praxis-filter`
491
+
492
+ Exemplo:
493
+
494
+ ```json
495
+ {
496
+ "behavior": {
497
+ "filtering": {
498
+ "advancedFilters": {
499
+ "enabled": true,
500
+ "settings": {
501
+ "alwaysVisibleFields": ["status", "recompensa"],
502
+ "alwaysVisibleFieldMetadataOverrides": {
503
+ "status": {
504
+ "label": "Situação",
505
+ "clearButton": { "enabled": false }
506
+ },
507
+ "recompensa": {
508
+ "controlType": "inlineRange",
509
+ "inlineAutoSize": { "minWidth": 188, "maxWidth": 280 },
510
+ "min": 0,
511
+ "max": 5000,
512
+ "step": 50
513
+ }
514
+ }
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
520
+ ```
521
+
522
+ Precedência efetiva:
523
+
524
+ - DTO de filtro (backend) -> defaults inline do `praxis-filter` -> `alwaysVisibleFieldMetadataOverrides`
525
+
526
+ Fallback corporativo para DTO sem `controlType`:
527
+
528
+ - O `praxis-filter` agora infere tipo mínimo para renderização de always-visible:
529
+ - `options` -> `select`/`multiSelect`
530
+ - `dataType=boolean` -> `toggle`
531
+ - demais casos -> `input`
532
+ - Isso evita perda de renderização quando o backend envia schema com `type`, mas sem `x-ui.controlType`.
533
+
534
+ UX no editor de tabela:
535
+
536
+ - Na aba `Filtros -> Sempre Visíveis`, há um editor visual por campo sempre visível (abrindo o `FieldMetadataEditor` da plataforma).
537
+ - Cada card exibe tipo de controle efetivo, status de override e resumo das propriedades customizadas.
538
+ - O modo JSON continua disponível para ajustes em lote e propriedades avançadas.
539
+ - As ações de JSON são locais ao editor (`Validar e carregar no editor` / `Carregar JSON no formulário`) e não persistem sozinhas.
540
+ - Persistência final acontece no rodapé do painel (`Salvar & Fechar`).
541
+ - A ordenação de campos sempre visíveis usa um **layout composer** com 3 faixas alinhadas ao runtime:
542
+ - `Faixa de ações` (toggles quando `placeBooleansInActions=true`)
543
+ - `Barra inline` (pills compactas com wrap)
544
+ - `Grid de campos` (controles não compactos)
545
+ - O composer inclui simulação de viewport (`Desktop`, `Tablet`, `Mobile`) para prever quebras reais de linha no toolbar.
546
+ - Reordenação ocorre por faixa com drag-and-drop e fallback de teclado (`Alt/Ctrl + setas`), sem mistura entre faixas.
547
+ - Navegação rápida (`Ordem`, `Metadados`, `JSON`) destaca automaticamente a seção ativa durante rolagem/foco e usa `aria-current="location"` para leitores de tela.
548
+ - As seções possuem `scroll-margin-top` para não ficarem ocultas atrás do bloco sticky de contexto.
549
+ - Motion segue WCAG/Nielsen: entrada suave por seção em ambiente padrão e fallback sem animação para `prefers-reduced-motion`.
550
+
551
+ ## Contrato do Showcase Inline (filtro + tabela local)
552
+
553
+ No exemplo `Showcase inline com metadados estáticos` (`/filter-demo`), o contrato de filtro local foi consolidado para uso enterprise:
554
+
555
+ - Salário:
556
+ - `salarioMinimo` filtra pelo campo `row.salarioMinimo` (limite inferior).
557
+ - `salarioPretendido` filtra pelo campo `row.salarioPretendido` (limite superior).
558
+ - Janela de atendimento:
559
+ - `janelaAtendimento` usa sobreposição de intervalo (`[start,end]` do filtro vs `[start,end]` da linha), não igualdade com `horarioEntrada`.
560
+ - Datas:
561
+ - strings `YYYY-MM-DD` são parseadas em calendário local para evitar deslocamento de dia por timezone.
562
+ - A11y/WCAG:
563
+ - contador visual de linhas/filtros não usa `role=status` contínuo.
564
+ - live region dedicada (sr-only, `aria-live="polite"`) anuncia resultado somente após submissão.
565
+ - conflito temporal (`periodoRelativo` combinado com data/período absoluto) exibe aviso explícito.
566
+
567
+ Para E2E visual em CI, a configuração Playwright do filtro suporta servidor gerenciado:
568
+
569
+ - `PLAYWRIGHT_USE_WEB_SERVER=1` habilita `webServer` no config.
570
+ - `PLAYWRIGHT_WEB_SERVER_COMMAND` permite sobrescrever o comando de subida.
571
+ - `PLAYWRIGHT_BASE_URL` define URL alvo do teste.
572
+
573
+ ## Definition of Done (DoD)
574
+
575
+ - Typecheck sem erros.
576
+ - Estado vazio mostra label no pill.
577
+ - Foco segue o shape do componente.
578
+ - Popover mantém bordas arredondadas top/bottom.
579
+ - Componente não cria gaps horizontais excessivos na barra.
580
+ - Teste de registro no `ComponentRegistryService`.
581
+ - Campos com `hidden/formHidden` não podem reservar espaço no layout (host colapsado).
582
+ - `Aplicar` no filtro avançado deve usar o estado atual do `FormGroup`, mesmo sem evento `valueChange`.