@praxisui/dynamic-form 1.0.0-beta.3 → 1.0.0-beta.30

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
@@ -2,6 +2,13 @@
2
2
 
3
3
  > Standalone dynamic form component with schema-driven UI, native field cascades, settings integration, and a built-in configuration editor.
4
4
 
5
+ ## 🔰 Exemplos / Quickstart
6
+
7
+ Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
8
+
9
+ - Repositório: https://github.com/codexrodrigues/praxis-ui-quickstart
10
+ - O Quickstart demonstra a integração das bibliotecas `@praxisui/*` em um app Angular, incluindo instalação, configuração e uso em telas reais.
11
+
5
12
  ## Install
6
13
 
7
14
  ```bash
@@ -106,6 +113,101 @@ Alternatively, when `editModeEnabled` is true, `praxis-dynamic-form` renders a g
106
113
 
107
114
  See public exports: `projects/praxis-dynamic-form/src/public-api.ts`.
108
115
 
116
+ ## Layout padrão (sem FormConfig)
117
+
118
+ Quando o componente não recebe uma `FormConfig` prévia (primeira execução), ele gera um layout padrão a partir do metadata do backend:
119
+
120
+ - Linhas/colunas: 2 campos por linha (padrão). Em telas pequenas (xs/sm) os campos empilham (1 por linha), e a partir de md ficam lado a lado.
121
+ - Responsividade do grid (12 colunas):
122
+ - xs: 12, sm: 12, md: 6, lg: 6, xl: 6 (para 2 por linha). Para outros valores, a regra é `base = floor(12 / fieldsPerRow)`.
123
+ - Largura dos campos: `mat-form-field { width: 100% }` dentro do `praxis-dynamic-form`, garantindo que o campo ocupe toda a coluna.
124
+ - Editor de Configuração: ao abrir a aba “Layout”, o editor reflete esse layout padrão; ao aplicar/salvar, persiste a `FormConfig` no storage do host.
125
+ - Personalização: você pode ajustar o layout pelo Editor (arrastar/seções/linhas/colunas, alterar spans) ou fornecer uma `FormConfig` completa via `[config]`.
126
+
127
+ ## Form Actions — Layout & Styling
128
+
129
+ A barra de ações (onde ficam "ENVIAR", "Cancelar", etc.) é configurável via `config.actions` e pelo Editor (aba "Ações").
130
+
131
+ Defaults
132
+ - Rótulo do botão principal: `ENVIAR`.
133
+ - Posição estrutural: `afterSections` (renderiza abaixo da última seção).
134
+ - Alinhamento: `right`.
135
+ - Orientação: `horizontal`.
136
+ - Espaçamento: `normal`.
137
+ - Background: sem cor por padrão (herda da superfície). Configure via `containerStyles` ou `containerClassName` se desejar uma superfície própria.
138
+
139
+ Estrutura (parcial)
140
+ ```ts
141
+ interface FormActionsLayout {
142
+ submit: FormActionButton; // id, label, color, type, variant, shortcut, etc.
143
+ cancel: FormActionButton;
144
+ reset: FormActionButton;
145
+ custom?: FormActionButton[]; // botões extras
146
+
147
+ // Layout/posicionamento
148
+ placement?: 'afterSections' | 'insideLastSection' | 'top';
149
+ position?: 'left' | 'center' | 'right' | 'justified' | 'split';
150
+ orientation?: 'horizontal' | 'vertical';
151
+ spacing?: 'compact' | 'normal' | 'spacious';
152
+ sticky?: boolean; // fixa a barra (bottom)
153
+
154
+ // Estilização do container
155
+ containerClassName?: string; // adiciona classe ao container
156
+ containerStyles?: { [k: string]: any }; // estilos inline (camelCase)
157
+
158
+ // Mobile
159
+ mobile?: { position?: 'left'|'center'|'right'|'justified'; orientation?: 'horizontal'|'vertical'; collapseToMenu?: boolean };
160
+ }
161
+ ```
162
+
163
+ Exemplo (config)
164
+ ```ts
165
+ config.actions = {
166
+ submit: { visible: true, label: 'ENVIAR', type: 'submit', color: 'primary', variant: 'raised', shortcut: 'ctrl+s' },
167
+ cancel: { visible: true, label: 'Cancelar', type: 'button', color: 'basic' },
168
+ reset: { visible: false, label: 'Reset' },
169
+ placement: 'afterSections',
170
+ position: 'right',
171
+ orientation: 'horizontal',
172
+ spacing: 'normal',
173
+ sticky: false,
174
+ containerClassName: 'my-form-actions',
175
+ containerStyles: {
176
+ background: 'var(--md-sys-color-surface-container)',
177
+ border: '1px solid var(--md-sys-color-outline-variant)',
178
+ borderRadius: '12px',
179
+ padding: '12px 16px'
180
+ },
181
+ mobile: { collapseToMenu: true }
182
+ };
183
+ ```
184
+
185
+ CSS por classe (opcional)
186
+ ```scss
187
+ .my-form-actions {
188
+ background: var(--md-sys-color-surface-container);
189
+ border: 1px solid var(--md-sys-color-outline-variant);
190
+ border-radius: 12px;
191
+ padding: 12px 16px;
192
+ }
193
+ ```
194
+
195
+ Dicas
196
+ - Cores do botão: use `color` = `primary|accent|warn|basic` (respeitam o tema Material).
197
+ - Tokens M3: prefira `--mat-sys-*` / `--md-sys-*` para cores/superfícies.
198
+ - Mobile: ative `collapseToMenu` para colapsar botões extras em menu nas telas pequenas.
199
+
200
+ ## Section titles — espaçamento global
201
+
202
+ O título de seção usa por padrão `margin: 0 0 6px 0`. Você pode ajustar globalmente via CSS var:
203
+
204
+ ```scss
205
+ /* Global (app host) */
206
+ :root { --pfx-section-title-mb: 10px; } // ex.: 10px abaixo do título
207
+ ```
208
+
209
+ Ou por seção, via metadado `titleGapBottom` (em pixels), que aplica inline somente naquela seção.
210
+
109
211
  ## Compatibility
110
212
 
111
213
  - `@praxisui/dynamic-form` `0.0.x` → Angular `20.x`
@@ -164,3 +266,9 @@ Apache-2.0 – see the `LICENSE` packaged with this library or the repository ro
164
266
  - 200 → atualiza `serverHash/lastVerifiedAt`, define `schemaOutdated = editModeEnabled && hadBase`, emite `schemaStatusChange`. Não aplica schema automaticamente.
165
267
  - Primeira vez (sem base): baixa o corpo do schema para gerar o layout; persiste `form-schema-meta:{formId}`.
166
268
  - Notificações respeitam preferências e são one‑shot por hash; o banner/snackbar oferecem ações para Reconciliar, Lembrar depois (snooze) e Ignorar.
269
+
270
+ ### URL da API (absoluto vs relativo)
271
+
272
+ - Quando `API_URL.default.baseUrl` for relativo (ex.: `'/api'`), a lib resolve a origem a partir de `location.origin` no browser. Isso cobre o cenário comum com proxy de dev (`/api`, `/schemas`).
273
+ - Em SSR (sem `location.origin`), configure `baseUrl` absoluto (ex.: `https://api.acme.com/api`) para evitar erros do tipo “Invalid URL” ao construir chamadas de `/schemas/filtered`.
274
+ - O `GenericCrudService.getSchemasFilteredBaseUrl()` retorna sempre uma URL absoluta; o `SchemaMetadataClient` também aceita `baseUrl` relativo quando há origin disponível.