@praxisui/dynamic-fields 8.0.0-beta.19 → 8.0.0-beta.20

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 (91) hide show
  1. package/docs/dynamic-fields-field-catalog.md +217 -0
  2. package/docs/dynamic-fields-field-selection-guide.md +181 -0
  3. package/docs/dynamic-fields-host-custom-field-guide.md +252 -0
  4. package/docs/dynamic-fields-host-custom-field-troubleshooting.md +160 -0
  5. package/docs/dynamic-fields-inline-components-guide.md +580 -0
  6. package/docs/dynamic-fields-inline-filter-catalog.md +497 -0
  7. package/docs/dynamic-fields-inline-filter-custom-component-guide.md +241 -0
  8. package/docs/dynamic-fields-inline-filter-inventory.md +247 -0
  9. package/docs/dynamic-fields-inline-filter-runtime-contract.md +367 -0
  10. package/docs/dynamic-fields-inline-filter-selection-guide.md +419 -0
  11. package/docs/dynamic-fields-inline-filter-troubleshooting.md +201 -0
  12. package/docs/dynamic-fields-inventory.md +206 -0
  13. package/docs/dynamic-fields-playground-catalog-plan.md +243 -0
  14. package/docs/generic-crud-service.md +152 -0
  15. package/fesm2022/praxisui-dynamic-fields-index-CrHhyUMO.mjs +1 -0
  16. package/fesm2022/praxisui-dynamic-fields.mjs +6343 -673
  17. package/index.d.ts +564 -36
  18. package/package.json +4 -4
  19. package/src/lib/base/pdx-base-input-runtime-contract.json-api.md +497 -0
  20. package/src/lib/base/pdx-base-select-runtime-contract.json-api.md +474 -0
  21. package/src/lib/components/color-input/pdx-color-input.json-api.md +573 -0
  22. package/src/lib/components/color-picker/pdx-color-picker.json-api.md +686 -0
  23. package/src/lib/components/date-input/pdx-date-input.json-api.md +581 -0
  24. package/src/lib/components/datetime-local-input/pdx-datetime-local-input.json-api.md +560 -0
  25. package/src/lib/components/email-input/pdx-email-input.json-api.md +546 -0
  26. package/src/lib/components/field-shell/praxis-field-shell.json-api.md +522 -0
  27. package/src/lib/components/inline-async-select/pdx-inline-async-select.json-api.md +566 -0
  28. package/src/lib/components/inline-autocomplete/pdx-inline-autocomplete.json-api.md +554 -0
  29. package/src/lib/components/inline-color-label/pdx-inline-color-label.json-api.md +615 -0
  30. package/src/lib/components/inline-currency/pdx-inline-currency.json-api.md +542 -0
  31. package/src/lib/components/inline-currency-range/pdx-inline-currency-range.json-api.md +630 -0
  32. package/src/lib/components/inline-date/pdx-inline-date.json-api.md +529 -0
  33. package/src/lib/components/inline-date-range/pdx-inline-date-range.json-api.md +589 -0
  34. package/src/lib/components/inline-distance-radius/pdx-inline-distance-radius.json-api.md +649 -0
  35. package/src/lib/components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md +617 -0
  36. package/src/lib/components/inline-input/pdx-inline-input.json-api.md +538 -0
  37. package/src/lib/components/inline-multi-select/pdx-inline-multi-select.json-api.md +566 -0
  38. package/src/lib/components/inline-number/pdx-inline-number.json-api.md +533 -0
  39. package/src/lib/components/inline-pipeline-status/pdx-inline-pipeline-status.json-api.md +619 -0
  40. package/src/lib/components/inline-range-slider/pdx-inline-range-slider.json-api.md +605 -0
  41. package/src/lib/components/inline-rating/pdx-inline-rating.json-api.md +594 -0
  42. package/src/lib/components/inline-relative-period/pdx-inline-relative-period.json-api.md +623 -0
  43. package/src/lib/components/inline-score-priority/pdx-inline-score-priority.json-api.md +632 -0
  44. package/src/lib/components/inline-searchable-select/pdx-inline-searchable-select.json-api.md +564 -0
  45. package/src/lib/components/inline-select/pdx-inline-select.json-api.md +571 -0
  46. package/src/lib/components/inline-sentiment/pdx-inline-sentiment.json-api.md +661 -0
  47. package/src/lib/components/inline-time/pdx-inline-time.json-api.md +573 -0
  48. package/src/lib/components/inline-time-range/pdx-inline-time-range.json-api.md +635 -0
  49. package/src/lib/components/inline-toggle/pdx-inline-toggle.json-api.md +516 -0
  50. package/src/lib/components/inline-tree-select/pdx-inline-tree-select.json-api.md +637 -0
  51. package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +566 -0
  52. package/src/lib/components/material-autocomplete/pdx-material-autocomplete.json-api.md +561 -0
  53. package/src/lib/components/material-avatar/pdx-material-avatar.json-api.md +666 -0
  54. package/src/lib/components/material-button/pdx-material-button.json-api.md +572 -0
  55. package/src/lib/components/material-button-toggle/pdx-material-button-toggle.json-api.md +577 -0
  56. package/src/lib/components/material-checkbox-group/pdx-material-checkbox-group.json-api.md +611 -0
  57. package/src/lib/components/material-chips/pdx-material-chips.json-api.md +601 -0
  58. package/src/lib/components/material-colorpicker/pdx-material-colorpicker.json-api.md +545 -0
  59. package/src/lib/components/material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md +531 -0
  60. package/src/lib/components/material-currency/pdx-material-currency.json-api.md +569 -0
  61. package/src/lib/components/material-date-range/pdx-material-date-range.json-api.md +623 -0
  62. package/src/lib/components/material-datepicker/pdx-material-datepicker.json-api.md +537 -0
  63. package/src/lib/components/material-file-upload/pdx-material-file-upload.json-api.md +511 -0
  64. package/src/lib/components/material-multi-select/pdx-material-multi-select.json-api.md +596 -0
  65. package/src/lib/components/material-multi-select-tree/pdx-material-multi-select-tree.json-api.md +623 -0
  66. package/src/lib/components/material-price-range/pdx-material-price-range.json-api.md +616 -0
  67. package/src/lib/components/material-radio-group/pdx-material-radio-group.json-api.md +585 -0
  68. package/src/lib/components/material-range-slider/pdx-material-range-slider.json-api.md +664 -0
  69. package/src/lib/components/material-rating/pdx-material-rating.json-api.md +551 -0
  70. package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +602 -0
  71. package/src/lib/components/material-select/pdx-material-select.json-api.md +601 -0
  72. package/src/lib/components/material-selection-list/pdx-material-selection-list.json-api.md +607 -0
  73. package/src/lib/components/material-slide-toggle/pdx-material-slide-toggle.json-api.md +522 -0
  74. package/src/lib/components/material-slider/pdx-material-slider.json-api.md +602 -0
  75. package/src/lib/components/material-textarea/pdx-material-textarea.json-api.md +598 -0
  76. package/src/lib/components/material-timepicker/pdx-material-timepicker.json-api.md +554 -0
  77. package/src/lib/components/material-transfer-list/pdx-material-transfer-list.json-api.md +614 -0
  78. package/src/lib/components/material-tree-select/pdx-material-tree-select.json-api.md +649 -0
  79. package/src/lib/components/month-input/pdx-month-input.json-api.md +527 -0
  80. package/src/lib/components/number-input/pdx-number-input.json-api.md +594 -0
  81. package/src/lib/components/password-input/pdx-password-input.json-api.md +574 -0
  82. package/src/lib/components/pdx-material-time-range/pdx-material-time-range.json-api.md +592 -0
  83. package/src/lib/components/pdx-year-input/pdx-year-input.json-api.md +543 -0
  84. package/src/lib/components/phone-input/pdx-phone-input.json-api.md +583 -0
  85. package/src/lib/components/preload-status/pdx-preload-status.json-api.md +455 -0
  86. package/src/lib/components/search-input/pdx-search-input.json-api.md +536 -0
  87. package/src/lib/components/text-input/pdx-text-input.json-api.md +600 -0
  88. package/src/lib/components/time-input/pdx-time-input.json-api.md +546 -0
  89. package/src/lib/components/url-input/pdx-url-input.json-api.md +542 -0
  90. package/src/lib/components/week-input/pdx-week-input.json-api.md +533 -0
  91. package/fesm2022/praxisui-dynamic-fields-index-CIk5K3rF.mjs +0 -1
@@ -0,0 +1,217 @@
1
+ ---
2
+ title: "Dynamic Fields Field Catalog"
3
+ slug: "dynamic-fields-field-catalog"
4
+ description: "Catalogo principal dos fields padrao registrados em @praxisui/dynamic-fields para formularios metadata-driven."
5
+ doc_type: "reference"
6
+ document_kind: "governance-reference"
7
+ component: "dynamic-fields"
8
+ category: "components"
9
+ audience:
10
+ - "frontend"
11
+ - "host"
12
+ - "architect"
13
+ level: "intermediate"
14
+ status: "active"
15
+ owner: "praxis-ui"
16
+ tags:
17
+ - "dynamic-fields"
18
+ - "catalog"
19
+ - "controlType"
20
+ - "forms"
21
+ order: 34
22
+ icon: "toc"
23
+ toc: true
24
+ sidebar: true
25
+ search_boost: 1.05
26
+ reading_time: 24
27
+ estimated_setup_time: 30
28
+ version: "1.0"
29
+ related_docs:
30
+ - "dynamic-fields-overview"
31
+ - "dynamic-fields-inventory"
32
+ - "dynamic-fields-field-selection-guide"
33
+ - "dynamic-fields-host-custom-field-guide"
34
+ - "dynamic-fields-inline-filter-catalog"
35
+ keywords:
36
+ - "field catalog"
37
+ - "which field to use"
38
+ - "controlType"
39
+ - "metadata snippet"
40
+ last_updated: "2026-03-26"
41
+ ---
42
+
43
+ # Dynamic Fields Field Catalog
44
+
45
+ ## Overview
46
+
47
+ Este catalogo cobre os fields padrao registrados por default para formularios dinamicos comuns.
48
+
49
+ Nao entram aqui:
50
+
51
+ - aliases de compatibilidade (`dateTime`, `treeView`);
52
+ - fields inline especializados de filtro.
53
+
54
+ Para auditoria completa do runtime, consulte [Dynamic Fields Inventory](./dynamic-fields-inventory.md). Para inline filter controls, consulte [Dynamic Fields Inline Filter Catalog](./dynamic-fields-inline-filter-catalog.md).
55
+
56
+ ## Published surface for hosts
57
+
58
+ Este markdown continua sendo a referencia governada de narrativa, recomendacoes de uso e snippets curtos.
59
+
60
+ Para consumo operacional por hosts oficiais, a superficie canonica e o catalogo exportado pela lib em `src/lib/catalog/dynamic-fields-playground.catalog.ts`, reexportado pelo `public-api` de `@praxisui/dynamic-fields`.
61
+
62
+ Regra de uso:
63
+
64
+ - host, landing e playground consomem o catalogo exportado;
65
+ - este documento explica quando usar, quando evitar e para onde navegar;
66
+ - mudancas de runtime ou descoberta devem nascer primeiro na lib canonica, nao em listas locais do host.
67
+
68
+ ## Canonical editorial source
69
+
70
+ Para os controls ja cobertos pela trilha editorial/i18n canonica, este catalogo nao e a fonte primaria de `friendlyName`, `description` ou `icon`.
71
+
72
+ Regra de governanca:
73
+
74
+ - descriptor em `src/lib/editorial/**`: fonte canonica da semantica editorial;
75
+ - `ComponentDocMeta`: artefato derivado da mesma semantica para builders/registry;
76
+ - catalogo playground/showcase: artefato derivado para discovery e narrativa de uso;
77
+ - `dynamic-form`: consumidor do resolver canonico, sem mapa editorial local.
78
+
79
+ Se um novo field precisar entrar neste catalogo com copy governada, ele deve primeiro entrar na trilha canonica da lib. Nao e aceitavel publicar copy nova apenas aqui.
80
+
81
+ ## How to read this catalog
82
+
83
+ - `quando usar`: caso de uso preferencial;
84
+ - `quando evitar`: quando outro field entrega UX melhor;
85
+ - `valor esperado`: shape mental do valor no form;
86
+ - `snippet`: exemplo curto de metadata, focado no `controlType`.
87
+
88
+ ## Published discovery semantics
89
+
90
+ O catalogo exportado por `@praxisui/dynamic-fields` agora publica semantica de descoberta para hosts oficiais:
91
+
92
+ - `track`: separa `primary-form` de `inline-filter`;
93
+ - `family`: agrupa a taxonomia funcional do field;
94
+ - `interactionPattern`: resume o padrao dominante de uso, como `single-value`, `lookup`, `range`, `visual` ou `trigger`;
95
+ - `icon.key` + `icon.tone`: entregam identidade visual canonica para menus, vitrines e playgrounds.
96
+
97
+ Regra editorial:
98
+
99
+ - este markdown continua explicando `quando usar` e `quando evitar`;
100
+ - landing, playground e outros hosts devem derivar navegacao, cues e mini-cards do catalogo exportado da lib;
101
+ - a documentacao nao deve manter uma tabela paralela de icones ou interaction patterns fora da fonte canonica.
102
+
103
+ ## Texto
104
+
105
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
106
+ | -------------- | --------------------------------------------- | ---------------------------- | ------------------------------------ | -------------- | ----------------------------------------------------- | ----------------------------------------- |
107
+ | Text input | <span id="input"></span>`input` | texto livre curto | quando ha formato fechado | `string` | `{ name: 'fullName', controlType: 'input' }` | `pdx-text-input.json-api.md` |
108
+ | Email input | <span id="email"></span>`email` | email validado | se o campo aceita qualquer texto | `string` | `{ name: 'email', controlType: 'email' }` | `pdx-email-input.json-api.md` |
109
+ | Password input | <span id="password"></span>`password` | segredo/senha | quando o valor precisa ficar legivel | `string` | `{ name: 'password', controlType: 'password' }` | `pdx-password-input.json-api.md` |
110
+ | Textarea | <span id="textarea"></span>`textarea` | descricao longa, observacoes | conteudo curto de uma linha | `string` | `{ name: 'notes', controlType: 'textarea', rows: 4 }` | `pdx-material-textarea.json-api.md` |
111
+ | Search input | <span id="search"></span>`search` | busca textual dedicada | entrada comum sem semantica de busca | `string` | `{ name: 'query', controlType: 'search' }` | `pdx-search-input.json-api.md` |
112
+ | Phone input | <span id="phone"></span>`phone` | telefone | se o dominio nao usa telefone | `string` | `{ name: 'phone', controlType: 'phone' }` | `pdx-phone-input.json-api.md` |
113
+ | URL input | <span id="url"></span>`url` | links/URLs | strings livres sem validacao de URL | `string` | `{ name: 'website', controlType: 'url' }` | `pdx-url-input.json-api.md` |
114
+ | CPF/CNPJ input | <span id="cpfcnpjinput"></span>`cpfCnpjInput` | documento brasileiro | dominio internacional/generalista | `string` | `{ name: 'document', controlType: 'cpfCnpjInput' }` | `pdx-material-cpf-cnpj-input.json-api.md` |
115
+
116
+ ## Numero, moeda e range
117
+
118
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
119
+ | -------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------ | --------------- | -------------------------------------------------------------------------------------------------- | --------------------------------------- |
120
+ | Number input | <span id="numerictextbox"></span>`numericTextBox` | numero simples | intervalo guiado por slider | `number` | `{ name: 'age', controlType: 'numericTextBox' }` | `pdx-number-input.json-api.md` |
121
+ | Currency input | <span id="currency"></span>`currency` | valor monetario unico | faixa monetaria | `number` | `{ name: 'budget', controlType: 'currency' }` | `pdx-material-currency.json-api.md` |
122
+ | Slider | <span id="slider"></span>`slider` | valor unico em faixa continua, com marks, value label, bandas semanticas e histograma responsivo ao valor | campos financeiros complexos | `number` | `{ name: 'score', controlType: 'slider', min: 0, max: 10, valueLabelDisplay: 'on' }` | `pdx-material-slider.json-api.md` |
123
+ | Range slider | <span id="rangeslider"></span>`rangeSlider` | faixa numerica com marks, inputs opcionais, distancia min/max, bandas e distribuicao responsiva ao range | datas/horarios | `{ start,end }` | `{ name: 'range', controlType: 'rangeSlider', mode: 'range', min: 0, max: 100, showInputs: true }` | `pdx-material-range-slider.json-api.md` |
124
+ | Price range | <span id="pricerange"></span>`priceRange` | faixa monetaria | uma moeda unica | `{ min,max }` | `{ name: 'priceBand', controlType: 'priceRange' }` | `pdx-material-price-range.json-api.md` |
125
+ | Rating | <span id="rating"></span>`rating` | nota/avaliacao visual | quando precisao numerica e dominante | `number` | `{ name: 'satisfaction', controlType: 'rating' }` | `pdx-material-rating.json-api.md` |
126
+
127
+ ### Contrato de preview do catalogo jogavel
128
+
129
+ `previewRecipe.presets[].initialValue` define a semente padrao do preset apos aplicar o metadata do estado ativo. Quando um preset precisa que um estado especifico tenha valor proprio, use `previewRecipe.presets[].stateInitialValues`.
130
+
131
+ Precedencia da semente no playground:
132
+
133
+ 1. `preset.stateInitialValues[state]`
134
+ 2. `state.initialValue`
135
+ 3. `preset.initialValue`
136
+ 4. `defaultState.initialValue`
137
+ 5. fallback gerado pelo runtime do playground
138
+
139
+ Use `stateInitialValues` apenas quando o valor do preset precisa continuar coerente com a semantica daquele estado, como `Currency + Filled` em `rangeSlider`.
140
+
141
+ ## Data e tempo
142
+
143
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
144
+ | -------------- | ----------------------------------------------- | ----------------------------- | ----------------------------------------------- | ----------------------- | ------------------------------------------------------- | -------------------------------------- |
145
+ | Date input | <span id="dateinput"></span>`dateInput` | integracao com input nativo | quando o host precisa UX Material forte | `string \| Date` | `{ name: 'birthDate', controlType: 'dateInput' }` | `pdx-date-input.json-api.md` |
146
+ | Date picker | <span id="date"></span>`date` | selecao de data no formulario | se o fluxo pede intervalo | `Date \| string` | `{ name: 'startDate', controlType: 'date' }` | `pdx-material-datepicker.json-api.md` |
147
+ | Date range | <span id="daterange"></span>`dateRange` | intervalo de datas | data unica | `{ startDate,endDate }` | `{ name: 'period', controlType: 'dateRange' }` | `pdx-material-date-range.json-api.md` |
148
+ | Datetime local | <span id="datetimelocal"></span>`dateTimeLocal` | data + hora local em um campo | quando o fluxo precisa seletor dedicado de hora | `string` | `{ name: 'appointment', controlType: 'dateTimeLocal' }` | `pdx-datetime-local-input.json-api.md` |
149
+ | Month input | <span id="month"></span>`month` | mes/ano | datas completas | `string` | `{ name: 'competence', controlType: 'month' }` | `pdx-month-input.json-api.md` |
150
+ | Time input | <span id="time"></span>`time` | hora simples | intervalo de horario | `string` | `{ name: 'startAt', controlType: 'time' }` | `pdx-time-input.json-api.md` |
151
+ | Time picker | <span id="timepicker"></span>`timePicker` | seletor de horario Material | campo simples sem picker | `string` | `{ name: 'slot', controlType: 'timePicker' }` | `pdx-material-timepicker.json-api.md` |
152
+ | Time range | <span id="timerange"></span>`timeRange` | janela de horario | apenas uma hora | `{ start,end }` | `{ name: 'window', controlType: 'timeRange' }` | `pdx-material-time-range.json-api.md` |
153
+ | Week input | <span id="week"></span>`week` | semana ISO | quando o negocio trabalha por data convencional | `string` | `{ name: 'weekRef', controlType: 'week' }` | `pdx-week-input.json-api.md` |
154
+ | Year input | <span id="year"></span>`year` | ano isolado | mes/ano ou data completa | `number \| string` | `{ name: 'fiscalYear', controlType: 'year' }` | `pdx-year-input.json-api.md` |
155
+
156
+ ## Selecao
157
+
158
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
159
+ | ----------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------- |
160
+ | Select | <span id="select"></span>`select` | lista fechada simples | bases muito grandes sem busca | `string \| number \| object` | `{ name: 'status', controlType: 'select', options: [...] }` | `pdx-material-select.json-api.md` |
161
+ | Searchable select | <span id="searchable-select"></span>`searchable-select` | lista maior com busca | consultas remotas pesadas | `string \| number \| object` | `{ name: 'department', controlType: 'searchable-select' }` | `pdx-material-searchable-select.json-api.md` |
162
+ | Async select | <span id="async-select"></span>`async-select` | opcoes remotas | lista pequena local | `string \| number \| object` | `{ name: 'city', controlType: 'async-select', resourcePath: 'cities' }` | `pdx-material-async-select.json-api.md` |
163
+ | Entity lookup | <span id="entitylookup"></span>`entityLookup` | entidade corporativa com identidade, status, reidratacao e politica de selecao | opcoes simples sem semantica de entidade | `entity id \| EntityRef` | `{ name: 'supplierId', controlType: 'entityLookup', optionSource: { key: 'suppliers', type: 'RESOURCE_ENTITY' } }` | `pdx-inline-entity-lookup.json-api.md` |
164
+ | Autocomplete | <span id="autocomplete"></span>`autoComplete` | busca progressiva com sugestoes | quando o usuario deve escolher so de lista fechada simples | `string \| number \| object` | `{ name: 'role', controlType: 'autoComplete' }` | `pdx-material-autocomplete.json-api.md` |
165
+ | Multi select | <span id="multiselect"></span>`multiSelect` | multiplas escolhas | se o usuario so pode escolher uma opcao | `unknown[]` | `{ name: 'tags', controlType: 'multiSelect' }` | `pdx-material-multi-select.json-api.md` |
166
+
167
+ ## Arvores e listas
168
+
169
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
170
+ | ------------------- | --------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------- |
171
+ | Multi select tree | <span id="multiselecttree"></span>`multiSelectTree` | hierarquia com multiplas selecoes | lista plana pequena | `unknown[]` | `{ name: 'permissions', controlType: 'multiSelectTree' }` | `pdx-material-multi-select-tree.json-api.md` |
172
+ | Tree select | <span id="treeselect"></span>`treeSelect` | hierarquia com selecao simples | multiplas selecoes | `string \| number \| object` | `{ name: 'category', controlType: 'treeSelect' }` | `pdx-material-tree-select.json-api.md` |
173
+ | Editable collection | <span id="array"></span>`array` | lista repetivel de objetos com subcampos metadata-driven | uma entidade unica ou selecao simples de opcoes | `Array<Record<string, unknown>>` | `{ name: 'contacts', controlType: 'array', array: { itemSchema: { fields: [...] } } }` | `pdx-editable-collection` |
174
+ | Selection list | <span id="selectionlist"></span>`selectionList` | lista grande com affordance de lista | layouts que pedem dropdown compacto | `unknown[]` | `{ name: 'channels', controlType: 'selectionList' }` | `pdx-material-selection-list.json-api.md` |
175
+ | Transfer list | <span id="transferlist"></span>`transferList` | mover itens entre disponivel/selecionado | selecoes simples | `unknown[]` | `{ name: 'members', controlType: 'transferList' }` | `pdx-material-transfer-list.json-api.md` |
176
+ | Chip input | <span id="chipinput"></span>`chipInput` | lista textual editavel | se ordem/edicao nao importam | `string[]` | `{ name: 'emails', controlType: 'chipInput' }` | `pdx-material-chips.json-api.md` |
177
+ | Chip list | <span id="chiplist"></span>`chipList` | exibicao/edicao em chips | entrada de valor unico | `string[]` | `{ name: 'labels', controlType: 'chipList' }` | `pdx-material-chips.json-api.md` |
178
+
179
+ ## Toggle e choice
180
+
181
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
182
+ | ------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------- |
183
+ | Checkbox | <span id="checkbox"></span>`checkbox` | booleano simples com `selectionMode: 'boolean'` ou multiplas escolhas com `selectionMode: 'multiple'` | contrato novo sem `selectionMode`; escolha unica | `boolean \| unknown[]` | `{ name: 'privacyConsent', controlType: 'checkbox', selectionMode: 'boolean' }` | `pdx-material-checkbox-group.json-api.md` |
184
+ | Radio group | <span id="radio"></span>`radio` | escolha unica explicita com `selectionMode: 'single'` | muitas opcoes/espaco restrito | `string \| number \| boolean` | `{ name: 'priority', controlType: 'radio', selectionMode: 'single' }` | `pdx-material-radio-group.json-api.md` |
185
+ | Toggle | <span id="toggle"></span>`toggle` | booleano binario | multiplos estados | `boolean` | `{ name: 'active', controlType: 'toggle' }` | `pdx-material-slide-toggle.json-api.md` |
186
+ | Button toggle | <span id="buttontoggle"></span>`buttonToggle` | escolha segmentada curta | listas longas | `string \| number` | `{ name: 'mode', controlType: 'buttonToggle' }` | `pdx-material-button-toggle.json-api.md` |
187
+
188
+ ## Upload
189
+
190
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
191
+ | ----------- | --------------------------------- | ------------------- | -------------------------------- | ---------------------------- | ----------------------------------------------- | -------------------------------------- |
192
+ | File upload | <span id="upload"></span>`upload` | anexos e documentos | quando o fluxo nao exige arquivo | `File \| File[] \| metadata` | `{ name: 'attachment', controlType: 'upload' }` | `pdx-material-file-upload.json-api.md` |
193
+
194
+ ## Cor
195
+
196
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
197
+ | ------------ | ------------------------------------------- | ----------------------------- | ------------------------- | -------------- | ------------------------------------------------ | ------------------------------ |
198
+ | Color input | <span id="color"></span>`color` | cor simples por valor textual | UX rica de paleta | `string` | `{ name: 'brandColor', controlType: 'color' }` | `pdx-color-input.json-api.md` |
199
+ | Color picker | <span id="colorpicker"></span>`colorPicker` | paleta, presets, selecao rica | entrada rapida sem picker | `string` | `{ name: 'accent', controlType: 'colorPicker' }` | `pdx-color-picker.json-api.md` |
200
+
201
+ ## Visual e acao
202
+
203
+ | Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
204
+ | ------------ | ------------------------------------------- | ---------------------------------------- | ------------------------------ | ------------------ | -------------------------------------------------------------------------------- | --------------------------------- |
205
+ | Avatar | <span id="avatar"></span>`avatar` | representacao visual de usuario/entidade | captura de dado textual | `string \| object` | `{ name: 'ownerAvatar', controlType: 'avatar' }` | `pdx-material-avatar.json-api.md` |
206
+ | Button | <span id="button"></span>`button` | acao auxiliar dentro do layout | submit/cancel padrao do form | n/a | `{ name: 'validateBtn', controlType: 'button', action: 'validateCustomerData' }` | `pdx-material-button.json-api.md` |
207
+ | Cron builder | <span id="cronbuilder"></span>`cronBuilder` | agenda/expressao cron | datas simples ou ranges comuns | `string` | `{ name: 'schedule', controlType: 'cronBuilder' }` | `@praxisui/cron-builder` |
208
+
209
+ ## Notes for enterprise use
210
+
211
+ - prefira `select`/`searchable-select`/`async-select` conforme o tamanho e a origem dos dados;
212
+ - prefira `entityLookup` quando o valor representa uma entidade real do dominio e precisa de `RESOURCE_ENTITY`, reidratacao por id, status, permissao de selecao ou dependencias;
213
+ - prefira `array` quando o usuario precisa editar uma colecao repetivel de objetos, como contatos, linhas de pedido ou itens de contrato;
214
+ - prefira `date` sobre `dateInput` quando o design system precisa consistencia Material;
215
+ - trate `button`, `avatar` e `cronBuilder` como controls especializados, nao como default;
216
+ - para trilha de filtros compactos, use o catalogo separado de inline filters;
217
+ - para vitrine jogavel e descoberta entre squads, prefira derivar categorias, tags, snippets, `interactionPattern` e `icon` a partir do catalogo exportado da lib.
@@ -0,0 +1,181 @@
1
+ ---
2
+ title: "Dynamic Fields Field Selection Guide"
3
+ slug: "dynamic-fields-field-selection-guide"
4
+ description: "Guia para escolher o field certo em @praxisui/dynamic-fields, considerando UX, contrato, origem dos dados e extensao no host."
5
+ doc_type: "guide"
6
+ document_kind: "governance-reference"
7
+ component: "dynamic-fields"
8
+ category: "components"
9
+ audience:
10
+ - "frontend"
11
+ - "host"
12
+ - "architect"
13
+ level: "intermediate"
14
+ status: "active"
15
+ owner: "praxis-ui"
16
+ tags:
17
+ - "dynamic-fields"
18
+ - "decision guide"
19
+ - "controlType"
20
+ - "ux"
21
+ order: 35
22
+ icon: "rule"
23
+ toc: true
24
+ sidebar: true
25
+ search_boost: 1.08
26
+ reading_time: 14
27
+ estimated_setup_time: 20
28
+ version: "1.0"
29
+ related_docs:
30
+ - "dynamic-fields-field-catalog"
31
+ - "dynamic-fields-inventory"
32
+ - "dynamic-fields-host-custom-field-guide"
33
+ - "dynamic-fields-inline-filter-catalog"
34
+ - "dynamic-fields-inline-components-guide"
35
+ keywords:
36
+ - "choose field"
37
+ - "select vs autocomplete"
38
+ - "custom host field"
39
+ - "inline filter"
40
+ last_updated: "2026-03-26"
41
+ ---
42
+
43
+ # Dynamic Fields Field Selection Guide
44
+
45
+ ## Objective
46
+
47
+ Escolher o `controlType` certo nao e apenas um detalhe visual. A decisao afeta:
48
+
49
+ - clareza de UX;
50
+ - shape do valor no contrato;
51
+ - performance do runtime;
52
+ - chance de hot update funcionar sem refresh estrutural;
53
+ - custo de manutencao no host.
54
+
55
+ ## Fonte canonica para descoberta
56
+
57
+ Para decisao humana, este guia e o field catalog continuam sendo a referencia editorial principal.
58
+
59
+ Para descoberta operacional em landing pages, playgrounds e outros hosts oficiais, use o catalogo exportado por `@praxisui/dynamic-fields`. Ele centraliza `controlType`, trilha (`primary-form` ou `inline-filter`), categorias, `interactionPattern`, semantica de `icon`, estados relevantes, snippets e links oficiais, com validacao de paridade contra o runtime.
60
+
61
+ Regra pratica para hosts:
62
+
63
+ - use `interactionPattern` para comunicar como o field decide ou captura valor;
64
+ - use `dataSourceKind` para deixar claro se o caso e local, remoto, misto ou especializado;
65
+ - use `icon.key` e `icon.tone` apenas como projecao visual do catalogo canonico, nunca como regra inventada no host.
66
+
67
+ ## 1. Texto livre vs selecao
68
+
69
+ ### Use `input` / `textarea` quando
70
+
71
+ - o usuario realmente precisa escrever;
72
+ - o dominio aceita grande variacao lexical;
73
+ - nao existe catalogo confiavel de opcoes.
74
+
75
+ ### Use `select` / `searchable-select` / `async-select` / `autoComplete` quando
76
+
77
+ - o valor deve vir de um conjunto governado;
78
+ - o backend precisa consistencia sem normalizacao extra;
79
+ - a opcao precisa carregar label + id de forma previsivel.
80
+
81
+ ### Sinal de erro de escolha
82
+
83
+ Se o schema usa `input` para algo que depois exige validacao pesada, busca semantica ou reconciliacao contra catalogo, provavelmente deveria ser selecao.
84
+
85
+ ## 2. Local vs remoto
86
+
87
+ | Scenario | Prefer | Why |
88
+ | --- | --- | --- |
89
+ | poucas opcoes estaveis | `select` | simples, previsivel, barato |
90
+ | lista media/grande com busca local | `searchable-select` | reduz carga visual |
91
+ | lista remota/paginada | `async-select` | evita preload caro |
92
+ | entidade de negocio remota com status, permissao, reidratacao ou dependencias | `entityLookup` | preserva identidade de entidade e usa contrato `RESOURCE_ENTITY` em vez de tratar entidade como opcao simples |
93
+ | busca incremental com semantica de sugestao | `autoComplete` | boa UX para descoberta |
94
+
95
+ ## 3. Simples vs range
96
+
97
+ | Need | Prefer | Avoid |
98
+ | --- | --- | --- |
99
+ | um numero | `numericTextBox` | `rangeSlider` |
100
+ | um valor monetario | `currency` | `priceRange` |
101
+ | uma data | `date` | `dateRange` |
102
+ | uma hora | `time` ou `timePicker` | `timeRange` |
103
+ | faixa numerica | `rangeSlider` | dois `numericTextBox` desconectados |
104
+ | faixa monetaria | `priceRange` | dois `currency` soltos |
105
+ | faixa temporal | `dateRange` ou `timeRange` | dois campos sem semantica de range |
106
+ | lista repetivel de objetos | `array` | varios grupos duplicados manualmente |
107
+
108
+ ## 4. Padrao vs custom host
109
+
110
+ ### Fique no catalogo padrao quando
111
+
112
+ - o field ja esta registrado por default;
113
+ - a diferenca e apenas visual ou de metadata;
114
+ - o comportamento cabe em inputs/props do componente existente;
115
+ - o runtime ja cobre CVA, hot update e editor metadata.
116
+
117
+ ### Crie field custom no host quando
118
+
119
+ - o dominio pede interacao especializada que nao cabe no catalogo;
120
+ - o componente precisa de semantica propria no editor;
121
+ - o contrato precisa de `controlType` exclusivo e governado pelo host.
122
+
123
+ Antes de criar, consulte [Dynamic Fields Host Custom Field Guide](./dynamic-fields-host-custom-field-guide.md).
124
+
125
+ ## 5. Form field vs inline filter field
126
+
127
+ Nao misture as duas narrativas:
128
+
129
+ - formulario comum: use `input`, `select`, `date`, `upload`, `toggle`, etc.;
130
+ - filtro inline compacto: use `inline*` apenas em trilhas de filtro.
131
+
132
+ Se o caso e filtro corporativo compacto, consulte:
133
+
134
+ - [Dynamic Fields Inline Filter Catalog](./dynamic-fields-inline-filter-catalog.md)
135
+ - [Dynamic Fields Inline Components Guide](./dynamic-fields-inline-components-guide.md)
136
+
137
+ ## 6. Decision table
138
+
139
+ | Question | Prefer |
140
+ | --- | --- |
141
+ | o usuario escreve texto curto? | `input` |
142
+ | o usuario escreve texto longo? | `textarea` |
143
+ | o usuario escolhe 1 opcao de lista pequena? | `select` |
144
+ | o usuario escolhe 1 opcao de lista grande? | `searchable-select` |
145
+ | a lista vem do backend sob demanda? | `async-select` |
146
+ | o usuario escolhe entidade real do dominio? | `entityLookup` |
147
+ | a UX parece busca com sugestoes? | `autoComplete` |
148
+ | o valor e monetario? | `currency` / `priceRange` |
149
+ | o valor e data? | `date` / `dateRange` |
150
+ | o valor e horario? | `time` / `timePicker` / `timeRange` |
151
+ | o padrao e lookup governado com busca? | `entityLookup` quando houver identidade/status/politica; `searchable-select` / `async-select` / `autoComplete` para opcoes simples |
152
+ | o padrao e range com semantica propria? | `priceRange` / `dateRange` / `timeRange` / `inlineDateRange` |
153
+ | o padrao e visual semantico? | `rating` / `inlinePipelineStatus` / `inlineSentiment` / `inlineColorLabel` |
154
+ | o valor e booleano? | `toggle` |
155
+ | a escolha unica precisa ser muito explicita? | `radio` ou `buttonToggle` |
156
+ | ha multiplas escolhas discretas? | `checkbox` ou `multiSelect` |
157
+ | ha hierarquia? | `treeSelect` / `multiSelectTree` |
158
+ | ha uma colecao repetivel de objetos? | `array` |
159
+ | ha anexos? | `upload` |
160
+ | o controle e acao, nao dado? | `button` |
161
+ | nada do catalogo resolve sem gambiarra? | field custom do host |
162
+
163
+ ## 7. Enterprise recommendations
164
+
165
+ - prefira nomes canonicos de `controlType`; deixe aliases apenas para compatibilidade;
166
+ - nao use inline filter controls em formularios normais para “economizar espaco”;
167
+ - para campos remotos, explicite origem de dados e comportamento de busca;
168
+ - para entidades de negocio, use `entityLookup` com `optionSource.type = RESOURCE_ENTITY`, `byIds`, `dependsOn`, `dependencyFilterMap` e `selectionPolicy` quando a selecao depender de status, permissao ou contexto;
169
+ - para colecoes repetiveis, use `array` com `array.itemSchema.fields` em vez de criar campos numerados como `item1`, `item2`, `item3`;
170
+ - para custom fields, alinhe runtime registry + metadata registry + hot update desde o inicio.
171
+
172
+ ## Nota de governanca para hosts
173
+
174
+ Se um host precisar montar vitrine, filtros ou snippets jogaveis, derive isso do catalogo exportado da lib em vez de manter listas autorais locais.
175
+
176
+ Isso inclui explicitamente:
177
+
178
+ - cues de decisao;
179
+ - navegacao por tipo de interacao;
180
+ - iconografia de cards e menus;
181
+ - agrupamentos por track/family para descoberta operacional.
@@ -0,0 +1,252 @@
1
+ ---
2
+ title: "Dynamic Fields Host Custom Field Guide"
3
+ slug: "dynamic-fields-host-custom-field-guide"
4
+ description: "Guia enterprise para criar, registrar e operar fields custom no host usando @praxisui/dynamic-fields."
5
+ doc_type: "guide"
6
+ document_kind: "host-guide"
7
+ component: "dynamic-fields"
8
+ category: "components"
9
+ audience:
10
+ - "host"
11
+ - "frontend"
12
+ - "architect"
13
+ level: "advanced"
14
+ status: "active"
15
+ owner: "praxis-ui"
16
+ tags:
17
+ - "dynamic-fields"
18
+ - "host extension"
19
+ - "custom field"
20
+ - "environment initializer"
21
+ order: 36
22
+ icon: "extension"
23
+ toc: true
24
+ sidebar: true
25
+ search_boost: 1.1
26
+ reading_time: 20
27
+ estimated_setup_time: 35
28
+ version: "1.0"
29
+ related_docs:
30
+ - "dynamic-fields-field-catalog"
31
+ - "dynamic-fields-field-selection-guide"
32
+ - "dynamic-fields-host-custom-field-troubleshooting"
33
+ - "dynamic-fields-inventory"
34
+ - "dynamic-form-overview"
35
+ keywords:
36
+ - "ComponentRegistryService.register"
37
+ - "ComponentMetadataRegistry.register"
38
+ - "ENVIRONMENT_INITIALIZER"
39
+ - "custom controlType"
40
+ last_updated: "2026-03-07"
41
+ ---
42
+
43
+ # Dynamic Fields Host Custom Field Guide
44
+
45
+ ## Objetivo
46
+
47
+ Permitir que times host criem novos fields sem forkar `@praxisui/dynamic-fields` ou `@praxisui/dynamic-form`.
48
+
49
+ ## Pre-requisitos
50
+
51
+ - Host Angular com `ApplicationConfig` ou bootstrap equivalente.
52
+ - `@praxisui/dynamic-fields` instalado com providers ativos.
53
+ - Familiaridade basica com `FieldMetadata`, `controlType` e Angular Forms.
54
+
55
+ ## Contract for a good custom field
56
+
57
+ Um field custom enterprise precisa atender quatro camadas:
58
+
59
+ 1. `runtime render`: o registry precisa saber qual componente carregar para o `controlType`.
60
+ 2. `forms integration`: o componente precisa funcionar com `ControlValueAccessor` e/ou `[formControl]`.
61
+ 3. `metadata editor`: o editor precisa saber nome amigavel, icone e metadados do componente.
62
+ 4. `hot metadata`: o componente precisa responder a patches sem rebuild global sempre que possivel.
63
+
64
+ ## Runtime registry vs metadata registry
65
+
66
+ ### Runtime registry
67
+
68
+ Responsavel por renderizar o componente no loader:
69
+
70
+ ```ts
71
+ ComponentRegistryService.register('my-custom', () =>
72
+ import('./my-custom-field.component').then((m) => m.MyCustomFieldComponent),
73
+ );
74
+ ```
75
+
76
+ ### Metadata registry
77
+
78
+ Responsavel por:
79
+
80
+ - nome amigavel no editor;
81
+ - icone;
82
+ - superficie editorial associada ao `controlType`.
83
+
84
+ O `ComponentDocMeta.id` precisa bater com o `controlType` de runtime.
85
+
86
+ ## Canonical package-owned fields vs host custom fields
87
+
88
+ Regra de fronteira:
89
+
90
+ - fields mantidos por `@praxisui/dynamic-fields` devem entrar pela trilha canonica da lib: descriptor editorial + metadata derivado + catalogo derivado;
91
+ - fields custom do host continuam suportados via `ComponentMetadataRegistry.register(ComponentDocMeta)`;
92
+ - o host nao precisa copiar a trilha inteira da lib para continuar funcionando no `dynamic-form`;
93
+ - se o host quiser semantica editorial propria, ela deve nascer no seu proprio registry/contrato, nao por override local de catalogo ou patch no `dynamic-form`.
94
+
95
+ Na pratica, o `dynamic-form` tenta primeiro a resolucao canonica editorial e, se ela nao existir para um `controlType` do host, usa o `ComponentDocMeta` registrado pelo proprio host como fallback tecnico controlado.
96
+
97
+ ## Minimal component requirements
98
+
99
+ ### Forms compatibility
100
+
101
+ O componente host deve:
102
+
103
+ - implementar `ControlValueAccessor`, ou
104
+ - aceitar `[formControl]`/`formControlName` de forma correta.
105
+
106
+ Sem isso, o field pode ate renderizar, mas quebra integracao com o formulario dinamico.
107
+
108
+ ### Hot metadata compatibility
109
+
110
+ Com base no runtime documentado em `hot-metadata-updates.md`, prefira:
111
+
112
+ - `setInputMetadata(metadata)` no componente, ou
113
+ - um `WritableSignal` para metadata.
114
+
115
+ Isso permite que o dynamic form reaplique metadata viva sem rebuild estrutural sempre que a mudanca nao for estrutural.
116
+ Use como referencia operacional governada o arquivo `projects/praxis-dynamic-form/docs/hot-metadata-updates.md`.
117
+
118
+ ## Example: ApplicationConfig with ENVIRONMENT_INITIALIZER
119
+
120
+ ```ts
121
+ import { ApplicationConfig, ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
122
+ import { providePraxisDynamicFields } from '@praxisui/dynamic-fields';
123
+ import { ComponentRegistryService } from '@praxisui/dynamic-fields';
124
+ import { ComponentMetadataRegistry, type ComponentDocMeta } from '@praxisui/core';
125
+
126
+ const myCustomMeta: ComponentDocMeta = {
127
+ id: 'my-custom',
128
+ title: 'My Custom Field',
129
+ icon: 'extension',
130
+ category: 'host-fields',
131
+ description: 'Field custom do host para selecionar SLA operacional.',
132
+ };
133
+
134
+ export const appConfig: ApplicationConfig = {
135
+ providers: [
136
+ ...providePraxisDynamicFields(),
137
+ {
138
+ provide: ENVIRONMENT_INITIALIZER,
139
+ multi: true,
140
+ useValue: () => {
141
+ const registry = inject(ComponentRegistryService);
142
+ registry.register('my-custom', () =>
143
+ import('./fields/my-custom-field.component').then((m) => m.MyCustomFieldComponent),
144
+ );
145
+ },
146
+ },
147
+ {
148
+ provide: ENVIRONMENT_INITIALIZER,
149
+ multi: true,
150
+ useValue: () => {
151
+ const metadataRegistry = inject(ComponentMetadataRegistry);
152
+ metadataRegistry.register(myCustomMeta);
153
+ },
154
+ },
155
+ ],
156
+ };
157
+ ```
158
+
159
+ ## Example: component skeleton
160
+
161
+ ```ts
162
+ import { Component, input, signal } from '@angular/core';
163
+ import { ControlValueAccessor, NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule } from '@angular/forms';
164
+ import type { FieldMetadata } from '@praxisui/core';
165
+
166
+ @Component({
167
+ selector: 'app-my-custom-field',
168
+ standalone: true,
169
+ imports: [ReactiveFormsModule],
170
+ providers: [
171
+ {
172
+ provide: NG_VALUE_ACCESSOR,
173
+ multi: true,
174
+ useExisting: MyCustomFieldComponent,
175
+ },
176
+ ],
177
+ template: `
178
+ <input [formControl]="control" />
179
+ `,
180
+ })
181
+ export class MyCustomFieldComponent implements ControlValueAccessor {
182
+ readonly control = new FormControl('');
183
+ readonly metadata = signal<FieldMetadata | null>(null);
184
+
185
+ setInputMetadata(metadata: FieldMetadata): void {
186
+ this.metadata.set(metadata);
187
+ }
188
+
189
+ writeValue(value: unknown): void {
190
+ this.control.setValue(value, { emitEvent: false });
191
+ }
192
+
193
+ registerOnChange(fn: (value: unknown) => void): void {
194
+ this.control.valueChanges.subscribe(fn);
195
+ }
196
+
197
+ registerOnTouched(fn: () => void): void {
198
+ // ligue ao blur/touch do host
199
+ }
200
+
201
+ setDisabledState(disabled: boolean): void {
202
+ disabled ? this.control.disable({ emitEvent: false }) : this.control.enable({ emitEvent: false });
203
+ }
204
+ }
205
+ ```
206
+
207
+ ## Using the custom field in form contract
208
+
209
+ ```ts
210
+ const fieldMetadata = [
211
+ {
212
+ name: 'sla',
213
+ label: 'SLA operacional',
214
+ controlType: 'my-custom',
215
+ },
216
+ ];
217
+ ```
218
+
219
+ ## Provider defaults vs no-defaults
220
+
221
+ ### `providePraxisDynamicFields()`
222
+
223
+ - registra providers core;
224
+ - inclui defaults do selector registry;
225
+ - e a escolha comum para host app padrao.
226
+
227
+ ### `providePraxisDynamicFieldsNoDefaults()`
228
+
229
+ - desabilita o mapa default de selector -> controlType;
230
+ - use apenas quando o host quer governar totalmente o mapa base.
231
+
232
+ ## Selector registry / aliases
233
+
234
+ Nao confunda:
235
+
236
+ - `ComponentRegistryService.register(...)`: carrega o componente Angular real.
237
+ - `ComponentMetadataRegistry.register(...)`: registra nome/icone/superficie editorial.
238
+ - `FieldSelectorRegistry` / aliases: resolve seletor/roteamento complementar em modo config-first.
239
+
240
+ Em cenarios enterprise:
241
+
242
+ - prefira `controlType` estavel e unico;
243
+ - use aliases apenas quando um programa de migracao exigir compatibilidade.
244
+
245
+ ## Checklist for host teams
246
+
247
+ - `runtime registra`: `ComponentRegistryService.register(...)`.
248
+ - `metadata registra`: `ComponentMetadataRegistry.register(...)`.
249
+ - `controlType alinhado`: o mesmo id em runtime e metadata.
250
+ - `forms compatível`: CVA ou `[formControl]`.
251
+ - `hot update compatível`: `setInputMetadata` e/ou signal metadata.
252
+ - `tema/tokens`: sem quebrar contraste, estados e largura no host.