@praxisui/dynamic-fields 1.0.0-beta.4 → 1.0.0-beta.40

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,5 +1,12 @@
1
1
  # @praxisui/dynamic-fields — Dynamic Form Fields
2
2
 
3
+ ## 🔰 Exemplos / Quickstart
4
+
5
+ Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
6
+
7
+ - Repositório: https://github.com/codexrodrigues/praxis-ui-quickstart
8
+ - O Quickstart demonstra a integração das bibliotecas `@praxisui/*` em um app Angular, incluindo instalação, configuração e uso em telas reais.
9
+
3
10
  ### Concept Usage
4
11
 
5
12
  - [Dynamic Component Rendering](../../../../docs/concepts/dynamic-component-rendering.md)
@@ -14,6 +21,38 @@ Biblioteca de campos dinâmicos para aplicações Angular (v20+) com Material De
14
21
  npm install @praxisui/dynamic-fields
15
22
  ```
16
23
 
24
+ ### Estilos e tokens (opcional)
25
+
26
+ - 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.
27
+ - Gradiente de inputs/toolbar (se desejar): o host pode definir um gradiente de marca que alguns detalhes visuais consomem (ex.: inputs com gradiente configurado e toolbars de edição):
28
+
29
+ ```scss
30
+ :root {
31
+ --p-primary-gradient: linear-gradient(90deg, #1f8a8a, #6c63ff);
32
+ --p-input-gradient: var(--p-primary-gradient);
33
+ }
34
+ ```
35
+
36
+ Sem essas variáveis, a aparência deriva do tema M3 (tokens `--md-sys-*`).
37
+
38
+ Tema e escopo (host)
39
+ - A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
40
+
41
+ ### Tokens M3 obrigatórios (host)
42
+
43
+ Para que os componentes reflitam corretamente o tema do app host, garanta no mínimo:
44
+
45
+ - Superfícies: `--md-sys-color-surface`, `--md-sys-color-surface-variant`, `--md-sys-color-surface-container-*`
46
+ - Texto/contorno: `--md-sys-color-on-surface`, `--md-sys-color-on-surface-variant`, `--md-sys-color-outline`, `--md-sys-color-outline-variant`
47
+ - Semânticos: `--md-sys-color-primary`, `--md-sys-color-secondary`, `--md-sys-color-tertiary`, `--md-sys-color-error`
48
+ - Containers: `--md-sys-color-primary-container`, `--md-sys-color-secondary-container`, `--md-sys-color-tertiary-container`, `--md-sys-color-error-container`
49
+ - Elevação: `--md-sys-elevation-level1`–`--md-sys-elevation-level3`
50
+
51
+ Notas:
52
+ - Color pickers agora derivam paletas por padrão de tokens M3. Se quiser cores específicas, use `paletteColors`/`paletteSettings`.
53
+ - A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
54
+ - Datepicker usa `panelClass="pdx-datepicker-panel"`; personalize o overlay via essa classe no tema do host.
55
+
17
56
  Peers (instale no app host):
18
57
  - `@angular/core` `^20.1.0`, `@angular/common` `^20.1.0`, `@angular/forms` `^20.1.0`
19
58
  - `@angular/material` `^20.1.0`, `@angular/cdk` `^20.1.0`, `@angular/router` `^20.1.0`
@@ -71,6 +110,7 @@ O sistema usa as constantes do `@praxisui/core` para garantir consistência:
71
110
  - `FieldControlType.TIME_PICKER` - Seletor de horário
72
111
  - `FieldControlType.RATING` - Classificação por estrelas
73
112
  - `FieldControlType.COLOR_PICKER` - Seletor de cores
113
+ - `FieldControlType.AVATAR` - Avatar visual (imagem/ícone/iniciais)
74
114
 
75
115
  Campos com `FieldControlType.AUTO_COMPLETE` utilizam internamente o `MaterialSearchableSelectComponent`, habilitando busca automaticamente.
76
116
 
@@ -101,6 +141,44 @@ Grupo de botões de rádio que consome metadados ou dados remotos para criar sel
101
141
  - **Carregamento Dinâmico**: mesmas chaves de configuração de `MaterialSelectComponent` para buscar opções.
102
142
  - **Layout Flexível**: configuração de orientação, `labelPosition` e `color` segundo a [documentação oficial](https://material.angular.dev/components/radio/overview).
103
143
 
144
+ ## 🧩 Avatar Field
145
+
146
+ Componente visual para exibir representação de usuário/entidade/estado, com prioridade de conteúdo:
147
+
148
+ - imageSrc > icon > initials > ng-content
149
+
150
+ Propriedades principais: `themeColor`, `rounded`, `size`, `fillMode`, `border`, `tooltip`, `ariaLabel`.
151
+
152
+ Exemplos:
153
+
154
+ ```html
155
+ <pdx-material-avatar [imageSrc]="user.img" size="large" themeColor="tertiary"></pdx-material-avatar>
156
+ <pdx-material-avatar initials="MB" themeColor="secondary"></pdx-material-avatar>
157
+ <pdx-material-avatar icon="person" fillMode="outline"></pdx-material-avatar>
158
+ <pdx-material-avatar><app-status-badge></app-status-badge></pdx-material-avatar>
159
+ ```
160
+
161
+ Uso em formulários dinâmicos (via metadata):
162
+
163
+ ```ts
164
+ import { FieldControlType, type FieldMetadata } from '@praxisui/core';
165
+
166
+ const fields: FieldMetadata[] = [
167
+ {
168
+ name: 'avatar',
169
+ label: 'Avatar',
170
+ controlType: FieldControlType.AVATAR,
171
+ // opções específicas via `extra` (quando aplicável)
172
+ extra: { imageSrc: 'https://example.com/u/42.png', size: 'large' }
173
+ }
174
+ ];
175
+ ```
176
+
177
+ Tokens M3 aplicados:
178
+
179
+ - `--pfx-avatar-bg`, `--pfx-avatar-fg`, `--pfx-avatar-border-color`, `--pfx-avatar-border-w`
180
+ - `--pfx-avatar-size`, `--pfx-avatar-radius-[full|lg|md|sm]`
181
+
104
182
  ## 📦 Instalação
105
183
 
106
184
  ```bash
@@ -395,3 +473,67 @@ const field: FieldMetadata = {
395
473
  - Suporta `setInputMetadata` ou signal `metadata` com `.set(...)` para hot updates.
396
474
  - Opcional: aceita `[readonlyMode]`, `[disabledMode]`, `[visible]`, `[presentationMode]`.
397
475
  - O `controlType` do campo coincide com o `id` do `ComponentDocMeta` (para resolver título/ícone no editor).
476
+
477
+ ### 🧼 Botão de limpar (clearButton)
478
+
479
+ 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`.
480
+
481
+ Exemplo de uso:
482
+
483
+ ```ts
484
+ const field: FieldMetadata = {
485
+ name: 'search',
486
+ label: 'Buscar',
487
+ controlType: FieldControlType.INPUT,
488
+ clearButton: {
489
+ enabled: true,
490
+ icon: 'mi:clear',
491
+ iconColor: 'primary', // ou cor CSS (#496ddb, rgb(73,109,219), red)
492
+ tooltip: 'Limpar',
493
+ ariaLabel: 'Limpar busca',
494
+ showOnlyWhenFilled: true,
495
+ },
496
+ };
497
+ ```
498
+
499
+ Observações:
500
+ - `iconColor` aceita tokens de tema (`primary`, `accent`, `warn`) ou cores CSS.
501
+ - Em campos com comportamentos especializados (ex.: currency), o clear também limpa o valor visual.
502
+ - `clearButton` também aceita boolean (`true/false`) por compatibilidade retroativa.
503
+ - No `pdx-color-picker`, o clear é exibido no menu interno, mas aceita `clearButton` como boolean ou objeto (ícone/cor/tooltip).
504
+
505
+ ### ⭐ Filter Inline Rating (faixa)
506
+
507
+ Use `controlType: 'filter-rating-inline'` quando o filtro de avaliação precisar trabalhar com intervalo no toolbar.
508
+
509
+ Contrato de valor (payload):
510
+ - `null` => sem filtro aplicado
511
+ - `{ start: number | null, end: number | null }` => faixa de avaliação
512
+
513
+ Exemplo:
514
+
515
+ ```ts
516
+ const ratingRangeField: FieldMetadata = {
517
+ name: 'ratingRange',
518
+ label: 'Avaliação',
519
+ controlType: 'filter-rating-inline',
520
+ min: 1,
521
+ max: 5,
522
+ allowHalf: true,
523
+ ratingToneLowColor: '#ef4444',
524
+ ratingToneMidColor: '#f59e0b',
525
+ ratingToneHighColor: '#22a45d',
526
+ ratingBadgeColor: '#f59e0b',
527
+ clearButton: { enabled: true, showOnlyWhenFilled: true },
528
+ };
529
+ ```
530
+
531
+ Compatibilidade corporativa:
532
+ - `FieldControlType.RATING` continua sendo valor único (ex.: `4`).
533
+ - A conversão para faixa ocorre apenas com `controlType` explícito de inline rating (`filter-rating-inline` ou aliases inline).
534
+ - Para permitir meia estrela, use `allowHalf: true` (ou `step: 0.5` quando precisar de controle manual).
535
+ - Cores das estrelas no popover podem ser definidas por:
536
+ - `ratingToneLowColor`
537
+ - `ratingToneMidColor`
538
+ - `ratingToneHighColor`
539
+ - `ratingBadgeColor`