@praxisui/dynamic-fields 1.0.0-beta.5 → 1.0.0-beta.53

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.
package/README.md CHANGED
@@ -1,10 +1,63 @@
1
+ ---
2
+ title: "Dynamic Fields"
3
+ slug: "dynamic-fields-overview"
4
+ description: "Visao geral do @praxisui/dynamic-fields com renderizacao metadata-driven, registro lazy de componentes, tokens M3 e campos enterprise."
5
+ doc_type: "reference"
6
+ document_kind: "component-overview"
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
+ - "metadata"
19
+ - "forms"
20
+ - "runtime"
21
+ - "material"
22
+ order: 32
23
+ icon: "toc"
24
+ toc: true
25
+ sidebar: true
26
+ search_boost: 1.0
27
+ reading_time: 16
28
+ estimated_setup_time: 25
29
+ version: "1.0"
30
+ related_docs:
31
+ - "dynamic-fields-field-catalog"
32
+ - "dynamic-fields-field-selection-guide"
33
+ - "dynamic-fields-host-custom-field-guide"
34
+ - "dynamic-fields-host-custom-field-troubleshooting"
35
+ - "dynamic-fields-inline-filter-catalog"
36
+ - "dynamic-fields-filter-inline-components-guide"
37
+ - "host-integration-guide"
38
+ - "consumer-integration-quickstart"
39
+ keywords:
40
+ - "dynamic field loader"
41
+ - "metadata-driven fields"
42
+ - "material controls"
43
+ - "runtime registry"
44
+ last_updated: "2026-03-07"
45
+ ---
46
+
1
47
  # @praxisui/dynamic-fields — Dynamic Form Fields
2
48
 
49
+ ## 🔰 Exemplos / Quickstart
50
+
51
+ Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
52
+
53
+ - Repositório: https://github.com/codexrodrigues/praxis-ui-quickstart
54
+ - O Quickstart demonstra a integração das bibliotecas `@praxisui/*` em um app Angular, incluindo instalação, configuração e uso em telas reais.
55
+
3
56
  ### Concept Usage
4
57
 
5
- - [Dynamic Component Rendering](../../../../docs/concepts/dynamic-component-rendering.md)
6
- - [Headless UI & Design Systems](../../../../docs/concepts/headless-ui-and-design-systems.md)
7
- - [Data Driven Forms](../../../../docs/concepts/data-driven-forms.md)
58
+ - Dynamic component rendering
59
+ - Headless UI and design systems
60
+ - Data-driven forms
8
61
 
9
62
  Biblioteca de campos dinâmicos para aplicações Angular (v20+) com Material Design. Renderiza campos a partir de metadados, com carregamento lazy e integração com Reactive Forms.
10
63
 
@@ -14,6 +67,37 @@ Biblioteca de campos dinâmicos para aplicações Angular (v20+) com Material De
14
67
  npm install @praxisui/dynamic-fields
15
68
  ```
16
69
 
70
+ ### Estilos e tokens (opcional)
71
+
72
+ - Largura dos campos: quando o host usa `providePraxisDynamicFields()`, a lib injeta um estilo escopado que garante `mat-form-field { width: 100% }` dentro dos componentes. Não é necessário repetir no app.
73
+ - Gradiente de marca (se desejar): o host pode definir um gradiente para detalhes visuais da lib (ex.: toolbar de edição):
74
+
75
+ ```scss
76
+ :root {
77
+ --p-primary-gradient: linear-gradient(90deg, #1f8a8a, #6c63ff);
78
+ }
79
+ ```
80
+
81
+ Sem essa variável, o toolbar usa fallback sólido em `--md-sys-color-primary`.
82
+
83
+ Tema e escopo (host)
84
+ - A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
85
+
86
+ ### Tokens M3 obrigatórios (host)
87
+
88
+ Para que os componentes reflitam corretamente o tema do app host, garanta no mínimo:
89
+
90
+ - Superfícies: `--md-sys-color-surface`, `--md-sys-color-surface-variant`, `--md-sys-color-surface-container-*`
91
+ - Texto/contorno: `--md-sys-color-on-surface`, `--md-sys-color-on-surface-variant`, `--md-sys-color-outline`, `--md-sys-color-outline-variant`
92
+ - Semânticos: `--md-sys-color-primary`, `--md-sys-color-on-primary`, `--md-sys-color-secondary`, `--md-sys-color-on-secondary`, `--md-sys-color-tertiary`, `--md-sys-color-on-tertiary`, `--md-sys-color-error`, `--md-sys-color-on-error`
93
+ - Containers: `--md-sys-color-primary-container`, `--md-sys-color-on-primary-container`, `--md-sys-color-secondary-container`, `--md-sys-color-on-secondary-container`, `--md-sys-color-tertiary-container`, `--md-sys-color-on-tertiary-container`, `--md-sys-color-error-container`, `--md-sys-color-on-error-container`
94
+ - Elevação: `--md-sys-elevation-level1`–`--md-sys-elevation-level3`
95
+
96
+ Notas:
97
+ - Color pickers agora derivam paletas por padrão de tokens M3. Se quiser cores específicas, use `paletteColors`/`paletteSettings`.
98
+ - A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
99
+ - Datepicker usa `panelClass="pdx-datepicker-panel"`; personalize o overlay via essa classe no tema do host.
100
+
17
101
  Peers (instale no app host):
18
102
  - `@angular/core` `^20.1.0`, `@angular/common` `^20.1.0`, `@angular/forms` `^20.1.0`
19
103
  - `@angular/material` `^20.1.0`, `@angular/cdk` `^20.1.0`, `@angular/router` `^20.1.0`
@@ -47,32 +131,34 @@ const component = await registry.getComponent(FieldControlType.INPUT);
47
131
  const isRegistered = registry.isRegistered(FieldControlType.INPUT);
48
132
  ```
49
133
 
134
+ ## 📄 Documentacao Tecnica da Lib
135
+
136
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inventory.md`
137
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-field-catalog.md`
138
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-field-selection-guide.md`
139
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-guide.md`
140
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-troubleshooting.md`
141
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-inventory.md`
142
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-catalog.md`
143
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-selection-guide.md`
144
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-runtime-contract.md`
145
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-custom-component-guide.md`
146
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-troubleshooting.md`
147
+ - `projects/praxis-dynamic-fields/docs/filter-inline-components-guide.md` (slug: `dynamic-fields-filter-inline-components-guide`)
148
+ - `projects/praxis-dynamic-fields/docs/generic-crud-service.md`
149
+
50
150
  ### Componentes Suportados
51
151
 
52
- O sistema usa as constantes do `@praxisui/core` para garantir consistência:
53
-
54
- - `FieldControlType.INPUT` - Campo de texto Material Design
55
- - `FieldControlType.TEXTAREA` - Área de texto Material Design
56
- - `FieldControlType.SELECT` - Campo de seleção Material Design
57
- - `FieldControlType.CHECKBOX` - Caixa de seleção Material Design
58
- - `FieldControlType.RADIO` - Botão de rádio Material Design
59
- - `FieldControlType.DATE_PICKER` - Seletor de data Material Design
60
- - `FieldControlType.EMAIL_INPUT` - Campo de email
61
- - `FieldControlType.PASSWORD` - Campo de senha
62
- - `FieldControlType.CURRENCY_INPUT` - Campo monetário
63
- - `FieldControlType.NUMERIC_TEXT_BOX` - Campo numérico
64
- - `FieldControlType.MULTI_SELECT` - Seleção múltipla
65
- - `FieldControlType.AUTO_COMPLETE` - Auto completar (busca habilitada por padrão)
66
- - `FieldControlType.DATE_TIME_PICKER` - Data e hora
67
- - `FieldControlType.DATE_RANGE` - Intervalo de datas
68
- - `FieldControlType.FILE_UPLOAD` - Upload de arquivos
69
- - `FieldControlType.TOGGLE` - Interruptor Material Design
70
- - `FieldControlType.SLIDER` - Slider Material Design
71
- - `FieldControlType.TIME_PICKER` - Seletor de horário
72
- - `FieldControlType.RATING` - Classificação por estrelas
73
- - `FieldControlType.COLOR_PICKER` - Seletor de cores
74
-
75
- Campos com `FieldControlType.AUTO_COMPLETE` utilizam internamente o `MaterialSearchableSelectComponent`, habilitando busca automaticamente.
152
+ A fonte de verdade do suporte default e o `ComponentRegistryService`.
153
+
154
+ Use os documentos governados abaixo em vez de manter listas textuais soltas:
155
+
156
+ - inventario auditavel do runtime: `dynamic-fields-inventory.md`
157
+ - catalogo principal de fields de formulario: `dynamic-fields-field-catalog.md`
158
+ - guia de escolha do field correto: `dynamic-fields-field-selection-guide.md`
159
+ - extensao do host: `dynamic-fields-host-custom-field-guide.md`
160
+ - troubleshooting de extensao: `dynamic-fields-host-custom-field-troubleshooting.md`
161
+ - trilha especializada de filtros compactos: `dynamic-fields-inline-filter-catalog.md`
76
162
 
77
163
  ## 🧩 MaterialSelectComponent
78
164
 
@@ -101,6 +187,44 @@ Grupo de botões de rádio que consome metadados ou dados remotos para criar sel
101
187
  - **Carregamento Dinâmico**: mesmas chaves de configuração de `MaterialSelectComponent` para buscar opções.
102
188
  - **Layout Flexível**: configuração de orientação, `labelPosition` e `color` segundo a [documentação oficial](https://material.angular.dev/components/radio/overview).
103
189
 
190
+ ## 🧩 Avatar Field
191
+
192
+ Componente visual para exibir representação de usuário/entidade/estado, com prioridade de conteúdo:
193
+
194
+ - imageSrc > icon > initials > ng-content
195
+
196
+ Propriedades principais: `themeColor`, `rounded`, `size`, `fillMode`, `border`, `tooltip`, `ariaLabel`.
197
+
198
+ Exemplos:
199
+
200
+ ```html
201
+ <pdx-material-avatar [imageSrc]="user.img" size="large" themeColor="tertiary"></pdx-material-avatar>
202
+ <pdx-material-avatar initials="MB" themeColor="secondary"></pdx-material-avatar>
203
+ <pdx-material-avatar icon="person" fillMode="outline"></pdx-material-avatar>
204
+ <pdx-material-avatar><app-status-badge></app-status-badge></pdx-material-avatar>
205
+ ```
206
+
207
+ Uso em formulários dinâmicos (via metadata):
208
+
209
+ ```ts
210
+ import { FieldControlType, type FieldMetadata } from '@praxisui/core';
211
+
212
+ const fields: FieldMetadata[] = [
213
+ {
214
+ name: 'avatar',
215
+ label: 'Avatar',
216
+ controlType: FieldControlType.AVATAR,
217
+ // opções específicas via `extra` (quando aplicável)
218
+ extra: { imageSrc: 'https://example.com/u/42.png', size: 'large' }
219
+ }
220
+ ];
221
+ ```
222
+
223
+ Tokens M3 aplicados:
224
+
225
+ - `--pfx-avatar-bg`, `--pfx-avatar-fg`, `--pfx-avatar-border-color`, `--pfx-avatar-border-w`
226
+ - `--pfx-avatar-size`, `--pfx-avatar-radius-[full|lg|md|sm]`
227
+
104
228
  ## 📦 Instalação
105
229
 
106
230
  ```bash
@@ -309,6 +433,18 @@ _Sistema desenvolvido seguindo diretrizes de simplicidade e foco no essencial._
309
433
 
310
434
  ## 🔌 Extensão pelo App Host (registrando seu próprio componente)
311
435
 
436
+ Resumo executivo:
437
+
438
+ - `ComponentRegistryService.register(...)`: registra o componente que o runtime carrega.
439
+ - `ComponentMetadataRegistry.register(...)`: registra nome/ícone/superfície editorial.
440
+ - `controlType` do contrato deve bater com `ComponentDocMeta.id`.
441
+ - Hot metadata funciona melhor quando o componente expõe `setInputMetadata(...)` e/ou signal de metadata.
442
+
443
+ Para o guia governado completo, consulte:
444
+
445
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-guide.md`
446
+ - `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-troubleshooting.md`
447
+
312
448
  Aplicações host podem registrar componentes próprios para uso no DynamicFieldLoader e expor metadados para título/ícone amigáveis no editor.
313
449
 
314
450
  ### 1) Registrar o componente no runtime (DynamicFieldLoader)
@@ -395,3 +531,67 @@ const field: FieldMetadata = {
395
531
  - Suporta `setInputMetadata` ou signal `metadata` com `.set(...)` para hot updates.
396
532
  - Opcional: aceita `[readonlyMode]`, `[disabledMode]`, `[visible]`, `[presentationMode]`.
397
533
  - O `controlType` do campo coincide com o `id` do `ComponentDocMeta` (para resolver título/ícone no editor).
534
+
535
+ ### 🧼 Botão de limpar (clearButton)
536
+
537
+ Muitos campos suportam um botão de limpar configurável via metadata. Ele aparece como um `mat-icon-button` no suffix do `mat-form-field` e respeita `readonly`, `disabled` e `presentationMode`.
538
+
539
+ Exemplo de uso:
540
+
541
+ ```ts
542
+ const field: FieldMetadata = {
543
+ name: 'search',
544
+ label: 'Buscar',
545
+ controlType: FieldControlType.INPUT,
546
+ clearButton: {
547
+ enabled: true,
548
+ icon: 'mi:clear',
549
+ iconColor: 'primary', // ou cor CSS (#496ddb, rgb(73,109,219), red)
550
+ tooltip: 'Limpar',
551
+ ariaLabel: 'Limpar busca',
552
+ showOnlyWhenFilled: true,
553
+ },
554
+ };
555
+ ```
556
+
557
+ Observações:
558
+ - `iconColor` aceita tokens de tema (`primary`, `accent`, `warn`) ou cores CSS.
559
+ - Em campos com comportamentos especializados (ex.: currency), o clear também limpa o valor visual.
560
+ - `clearButton` também aceita boolean (`true/false`) por compatibilidade retroativa.
561
+ - No `pdx-color-picker`, o clear é exibido no menu interno, mas aceita `clearButton` como boolean ou objeto (ícone/cor/tooltip).
562
+
563
+ ### ⭐ Filter Inline Rating (faixa)
564
+
565
+ Use `controlType: 'filter-rating-inline'` quando o filtro de avaliação precisar trabalhar com intervalo no toolbar.
566
+
567
+ Contrato de valor (payload):
568
+ - `null` => sem filtro aplicado
569
+ - `{ start: number | null, end: number | null }` => faixa de avaliação
570
+
571
+ Exemplo:
572
+
573
+ ```ts
574
+ const ratingRangeField: FieldMetadata = {
575
+ name: 'ratingRange',
576
+ label: 'Avaliação',
577
+ controlType: 'filter-rating-inline',
578
+ min: 1,
579
+ max: 5,
580
+ allowHalf: true,
581
+ ratingToneLowColor: '#ef4444',
582
+ ratingToneMidColor: '#f59e0b',
583
+ ratingToneHighColor: '#22a45d',
584
+ ratingBadgeColor: '#f59e0b',
585
+ clearButton: { enabled: true, showOnlyWhenFilled: true },
586
+ };
587
+ ```
588
+
589
+ Compatibilidade corporativa:
590
+ - `FieldControlType.RATING` continua sendo valor único (ex.: `4`).
591
+ - A conversão para faixa ocorre apenas com `controlType` explícito de inline rating (`filter-rating-inline` ou aliases inline).
592
+ - Para permitir meia estrela, use `allowHalf: true` (ou `step: 0.5` quando precisar de controle manual).
593
+ - Cores das estrelas no popover podem ser definidas por:
594
+ - `ratingToneLowColor`
595
+ - `ratingToneMidColor`
596
+ - `ratingToneHighColor`
597
+ - `ratingBadgeColor`