@praxisui/dynamic-fields 8.0.0-beta.9 → 8.0.0-beta.90

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 (98) 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 +518 -0
  8. package/docs/dynamic-fields-inline-filter-custom-component-guide.md +241 -0
  9. package/docs/dynamic-fields-inline-filter-inventory.md +250 -0
  10. package/docs/dynamic-fields-inline-filter-runtime-contract.md +394 -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 +207 -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-BYVmv78m.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 +14500 -5745
  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 +556 -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} +848 -445
  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
  98. package/fesm2022/praxisui-dynamic-fields-index-iIeaA6ko.mjs +0 -1
@@ -0,0 +1,394 @@
1
+ ---
2
+ title: "Dynamic Fields Inline Filter Runtime Contract"
3
+ slug: "dynamic-fields-inline-filter-runtime-contract"
4
+ description: "Contrato runtime-first dos inline filters, cobrindo schema, promocao no praxis-filter, shape de valor, ranges e alinhamento com backend."
5
+ doc_type: "reference"
6
+ document_kind: "host-guide"
7
+ component: "dynamic-fields"
8
+ category: "integration"
9
+ audience:
10
+ - "frontend"
11
+ - "host"
12
+ - "backend"
13
+ - "architect"
14
+ level: "advanced"
15
+ status: "active"
16
+ owner: "praxis-ui"
17
+ tags:
18
+ - "dynamic-fields"
19
+ - "dynamic-filter"
20
+ - "runtime"
21
+ - "payload"
22
+ - "contract"
23
+ order: 44
24
+ icon: "account_tree"
25
+ toc: true
26
+ sidebar: true
27
+ search_boost: 1.2
28
+ reading_time: 22
29
+ estimated_setup_time: 25
30
+ version: "1.0"
31
+ related_docs:
32
+ - "dynamic-fields-inline-filter-inventory"
33
+ - "dynamic-fields-inline-filter-catalog"
34
+ - "dynamic-filter-payload-contract"
35
+ - "dynamic-filter-range-filters-guide"
36
+ - "dynamic-filter-backend-contract-cheatsheet"
37
+ keywords:
38
+ - "controlType"
39
+ - "inlinePhone"
40
+ - "range payload"
41
+ - "praxis-filter"
42
+ - "metadata-starter"
43
+ last_updated: "2026-05-26"
44
+ ---
45
+
46
+ # Dynamic Fields Inline Filter Runtime Contract
47
+
48
+ ## Objetivo
49
+
50
+ Explicar como um inline filter component participa da pipeline completa:
51
+
52
+ - schema e metadata
53
+ - resolucao de `controlType`
54
+ - runtime do `praxis-filter`
55
+ - valor emitido pelo front
56
+ - integracao com backend
57
+
58
+ ## Pre-requisitos
59
+
60
+ - Conhecimento basico de `PraxisFilter`, `GenericFilterDTO` e serializacao do host
61
+ - Leitura recomendada dos guias de payload e range da trilha de `table`
62
+
63
+ ## Pipeline completa
64
+
65
+ 1. schema define `controlType` e metadata do campo
66
+ 2. `praxis-filter` decide se o campo vai para toolbar compacta
67
+ 3. `praxis-filter` pode promover um control generico para variante inline
68
+ 4. `DynamicFieldLoader` pede o componente ao `ComponentRegistryService`
69
+ 5. componente inline produz o valor no `FormGroup`
70
+ 6. `PraxisFilter` emite `change` e `submit`
71
+ 7. host envia DTO ao backend
72
+ 8. starter normaliza ranges quando aplicavel
73
+
74
+ ```mermaid
75
+ sequenceDiagram
76
+ participant Schema
77
+ participant Filter as praxis-filter
78
+ participant Loader as DynamicFieldLoader
79
+ participant Inline as inline component
80
+ participant Host
81
+ participant Backend as metadata-starter
82
+
83
+ Schema->>Filter: controlType and metadata
84
+ Filter->>Loader: resolve inline variant
85
+ Loader->>Inline: instantiate component
86
+ Inline-->>Filter: form value
87
+ Filter-->>Host: change / submit
88
+ Host->>Backend: send DTO
89
+ Backend-->>Host: normalize ranges and process payload
90
+ ```
91
+
92
+ ## Camada 1. `controlType` canonico
93
+
94
+ Para novos contratos, o canone e:
95
+
96
+ - `inline*`
97
+
98
+ Fonte de verdade:
99
+
100
+ - `projects/praxis-core/src/lib/utils/inline-filter-controls.util.ts`
101
+
102
+ ## Camada 2. contrato publicado
103
+
104
+ O contrato publicado do runtime usa apenas `controlType` canônico `inline*`.
105
+
106
+ Regra:
107
+
108
+ - novos schemas persistem somente o nome canônico `inline*`
109
+ - documentacao, exemplos, testes e hosts devem usar apenas o nome canônico
110
+
111
+ ## Camada 3. fallback quando o schema nao vem com inline explicito
112
+
113
+ O `PraxisFilter` consegue promover alguns controls genericos para inline.
114
+
115
+ Exemplos:
116
+
117
+ - `select` -> `inlineSelect`
118
+ - `phone`/`tel` -> `inlinePhone`; preserva `type="tel"`, mascara de telefone e valor cru em digitos quando a metadata carregar semantica telefonica
119
+ - `searchable-select` -> `inlineSearchableSelect` por padrao; use `useInlineSearchableSelectVariant = false` para opt-out
120
+ - `async-select` -> `inlineAsyncSelect` por padrao; use a mesma flag em `false` para opt-out
121
+ - `dateRange` -> `inlineDateRange` por padrao; use `useInlineDateRangeVariant = false` para opt-out
122
+ - `year + mode=range` -> `inlinePeriodRange` com `granularity: "year"` por padrao; use `controlType` explicito quando quiser garantir o comportamento
123
+ - `month + mode=range` -> `inlinePeriodRange` com `granularity: "month"` por padrao; use `controlType` explicito quando quiser garantir o comportamento
124
+
125
+ Conclusao importante:
126
+
127
+ - `dynamic-fields` publica todos os componentes
128
+ - `table` decide quando cada um entra na jornada do filtro
129
+
130
+ ## Camada 4. shape do valor no front
131
+
132
+ ### Valores simples
133
+
134
+ - texto: `string`
135
+ - telefone inline: `string` com valor cru preservado, normalmente digitos; a mascara visual nao deve alterar o valor emitido
136
+ - numero/moeda: `number`
137
+ - toggle: `boolean | null`
138
+ - time: **canonico recomendado** `HH:mm`; o runtime tambem aceita `HH:mm:ss` e `Date`
139
+ - presets relativos: `string`
140
+
141
+ ### Valores de selecao
142
+
143
+ - select simples: valor simples
144
+ - variantes remotas: valor simples ou option object, conforme metadata e source
145
+ - multiselect: array
146
+
147
+ ### Valores de range
148
+
149
+ - range generico em modo simples: `number`
150
+ - range generico em `mode: "range"`: `{ start?, end? }`
151
+ - year range inline: `[startYear, endYear]` ou `{ start?, end? }`, mantendo valores numericos
152
+ - month range inline: `[startMonth, endMonth]` ou `{ start?, end? }`, com meses numericos de `1..12`
153
+ - currency range: `{ minPrice?, maxPrice?, currency? }`
154
+ - date range: `{ startDate?, endDate? }`
155
+ - time range: **canonico recomendado** `{ start?, end? }` com strings `HH:mm`; o runtime tambem aceita segundos e numeros em minutos para compatibilidade interna
156
+
157
+ ## Normalizacao de range
158
+
159
+ O componente inline nao normaliza para o formato final do backend sozinho.
160
+
161
+ Ele apenas produz um shape coerente para o form.
162
+
163
+ Depois:
164
+
165
+ - o host envia o DTO
166
+ - `FilterRequestBodyAdvice` intercepta
167
+ - `RangePayloadNormalizer` canonicaliza quando preciso
168
+
169
+ Por isso:
170
+
171
+ - nao documente o valor interno do componente como se fosse o contrato HTTP final
172
+ - alinhe sempre com `dynamic-filter-range-filters-guide.md`
173
+ - para operacoes Java de range, payload escalar nao e contrato valido; use objeto/lista canonica publicada pelo backend
174
+
175
+ ## Compatibilidade com backend
176
+
177
+ ### O que precisa bater
178
+
179
+ - nome do campo do DTO
180
+ - tipo esperado pelo backend
181
+ - shape de ranges
182
+ - serializacao de data/hora
183
+
184
+ ### O que nao vai para o backend
185
+
186
+ - `clearButton`
187
+ - `inlineAutoSize`
188
+ - `materialDesign.*`
189
+ - `tooltip`
190
+ - `aria*`
191
+
192
+ Esses campos sao de renderizacao.
193
+
194
+ ### Politica de `materialDesign` em filtros
195
+
196
+ Filtros inline e filtros avancados frequentemente usam icones de prefixo,
197
+ sufixos funcionais, `clearButton`, datepicker toggle ou simbolos de unidade. Em
198
+ campos Material `fill`/`outline`, esses adornos podem conflitar com o label
199
+ quando `floatLabel` fica em `auto`.
200
+
201
+ A politica recomendada para metadata de filtro e:
202
+
203
+ ```json
204
+ {
205
+ "materialDesign": {
206
+ "floatLabel": "always",
207
+ "subscriptSizing": "dynamic"
208
+ }
209
+ }
210
+ ```
211
+
212
+ O `praxis-filter` aplica essa politica aos campos promovidos para a barra
213
+ compacta e ao `FormConfig` do formulario avancado. Hosts que fornecem metadata
214
+ propria ou overrides devem preservar essa regra globalmente na metadata de
215
+ filtro, especialmente quando o schema publica `prefixIcon`, `suffixIcon`,
216
+ `clearButton`, campos de data, moeda ou cor.
217
+
218
+ ## Estados de interacao
219
+
220
+ Regra canonica da plataforma:
221
+
222
+ - `FormControl.disabled` continua sendo a fonte de verdade do estado `disabled` no DOM do controle nativo/Material
223
+ - `disabledMode` e `readonlyMode` bloqueiam interacao no `FieldShell`, sem obrigar o runtime a injetar `disabled` diretamente em componentes como `mat-select`
224
+ - `presentationMode` vence os dois estados acima e remove overlays de bloqueio
225
+
226
+ Implicacao pratica:
227
+
228
+ - nao use binding local de `[disabled]` como substituto para `disabledMode`
229
+ - componentes inline e nao-inline devem deixar o shell controlar bloqueio visual/interativo e deixar o `FormControl` controlar o estado semantico nativo
230
+
231
+ ## Fallback quando o schema chega sem `controlType`
232
+
233
+ Nao existe fallback magico para inline especializado sem pista suficiente.
234
+
235
+ O que existe:
236
+
237
+ - promocao de controls genericos conhecida pelo `praxis-filter`
238
+ - defaults do editor/settings do filtro
239
+
240
+ Para specialized controls como:
241
+
242
+ - `inlineRating`
243
+ - `inlineDistanceRadius`
244
+ - `inlinePipelineStatus`
245
+ - `inlineRelativePeriod`
246
+ - `inlineSentiment`
247
+ - `inlineColorLabel`
248
+ - `inlinePeriodRange`
249
+ - `inlineYearRange` (alias compativel)
250
+ - `inlineMonthRange` (alias compativel)
251
+
252
+ use `controlType` explicito.
253
+
254
+ Regra adicional de produto/plataforma:
255
+
256
+ - `inlinePipelineStatus`, `inlineRelativePeriod`, `inlineRating`, `inlineDistanceRadius`,
257
+ `inlineScorePriority`, `inlineSentiment` e `inlineColorLabel` pertencem a trilha `graphic specialized`
258
+ - esses componentes sao `opt-in` explicito
259
+ - eles nao devem ser inferidos ou promovidos automaticamente a partir de `select`, `enum`, `status` ou outros controles genericos
260
+
261
+ ## Relacao com `metadata-starter`
262
+
263
+ `metadata-starter` nao conhece a UX do componente.
264
+ Ele conhece o DTO e a normalizacao de payload.
265
+
266
+ Portanto:
267
+
268
+ - `dynamic-fields` define como o controle funciona
269
+ - `table` define como ele entra na jornada do filtro
270
+ - `metadata-starter` define como o payload eh tratado no backend
271
+
272
+ ## Exemplos curtos
273
+
274
+ ### Select remoto inline
275
+
276
+ ```json
277
+ {
278
+ "name": "departmentId",
279
+ "controlType": "inlineSearchableSelect",
280
+ "resourcePath": "/departments/options",
281
+ "optionLabelKey": "label",
282
+ "optionValueKey": "id"
283
+ }
284
+ ```
285
+
286
+ ### Range monetario inline
287
+
288
+ ```json
289
+ {
290
+ "name": "salaryRange",
291
+ "controlType": "inlineCurrencyRange",
292
+ "currency": "BRL"
293
+ }
294
+ ```
295
+
296
+ ### Range numerico inline
297
+
298
+ ```json
299
+ {
300
+ "name": "scoreRange",
301
+ "controlType": "inlineRange",
302
+ "min": 0,
303
+ "max": 100,
304
+ "mode": "range"
305
+ }
306
+ ```
307
+
308
+ Valor do form:
309
+
310
+ ```json
311
+ {
312
+ "scoreRange": {
313
+ "start": 10,
314
+ "end": 80
315
+ }
316
+ }
317
+ ```
318
+
319
+ Na trilha Java canonica, o backend publica `mode: "range"` para ranges numericos e canonicaliza esse objeto para a lista esperada pelo `GenericFilterDTO`.
320
+
321
+ ### Faixa anual inline
322
+
323
+ ```json
324
+ {
325
+ "name": "anoBetween",
326
+ "controlType": "inlinePeriodRange",
327
+ "granularity": "year",
328
+ "min": 2020,
329
+ "max": 2026,
330
+ "mode": "range"
331
+ }
332
+ ```
333
+
334
+ ### Faixa mensal inline
335
+
336
+ ```json
337
+ {
338
+ "name": "mesBetween",
339
+ "controlType": "inlinePeriodRange",
340
+ "granularity": "month",
341
+ "mode": "range"
342
+ }
343
+ ```
344
+
345
+ Valor do form:
346
+
347
+ ```json
348
+ {
349
+ "salaryRange": {
350
+ "minPrice": 6500,
351
+ "maxPrice": 15000,
352
+ "currency": "BRL"
353
+ }
354
+ }
355
+ ```
356
+
357
+ ### Periodo relativo
358
+
359
+ ```json
360
+ {
361
+ "name": "periodPreset",
362
+ "controlType": "inlineRelativePeriod"
363
+ }
364
+ ```
365
+
366
+ Valor do form:
367
+
368
+ ```json
369
+ {
370
+ "periodPreset": "last7"
371
+ }
372
+ ```
373
+
374
+ Na trilha canonica com `praxis-metadata-starter`, esse preset e normalizado automaticamente antes da desserializacao do DTO para um dos contratos primitivos ja suportados pelo backend:
375
+
376
+ - `today` e `yesterday` -> `onDate`
377
+ - `last7` e `last30` -> `lastDays`
378
+ - `thisMonth`, `lastMonth`, `thisQuarter`, `thisYear` -> `between`
379
+
380
+ Timezone de referencia:
381
+
382
+ - por padrao, o starter usa `UTC`
383
+ - a API pode sobrescrever isso com `praxis.filter.relative-period.zone-id`
384
+
385
+ Se a API nao usa essa trilha canonica, o host/backend precisa fornecer semantica equivalente antes de tratar o valor como contrato HTTP final.
386
+
387
+ ## Regras operacionais
388
+
389
+ 1. Nao invente `controlType`.
390
+ 2. Use sempre o `controlType` canônico `inline*`.
391
+ 3. Distinga `shape canonico recomendado` de ajustes internos de runtime.
392
+ 4. Nao trate valor do componente como contrato HTTP final sem passar pela trilha de `table`.
393
+ 5. Se o filtro for de range, valide o shape no backend cheatsheet.
394
+ 6. Se o controle depende de lista remota, valide `resourcePath`, auth e latencia como parte da feature.