@praxisui/dynamic-form 9.0.0-beta.71 → 9.0.0-beta.72

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-11T00:12:06.404Z",
3
+ "generatedAt": "2026-07-12T00:55:35.176Z",
4
4
  "packageName": "@praxisui/dynamic-form",
5
- "packageVersion": "9.0.0-beta.71",
5
+ "packageVersion": "9.0.0-beta.72",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -15,249 +15,323 @@
15
15
  {
16
16
  "name": "resourcePath",
17
17
  "type": "string",
18
- "required": false
18
+ "required": false,
19
+ "description": "Recurso base para CRUD/schemas",
20
+ "label": "Recurso"
19
21
  },
20
22
  {
21
23
  "name": "resourceId",
22
24
  "type": "string | number",
23
- "required": false
25
+ "required": false,
26
+ "description": "Identificador do registro",
27
+ "label": "ID do Registro"
24
28
  },
25
29
  {
26
30
  "name": "initialValue",
27
31
  "type": "Record<string, unknown> | null",
28
- "required": false
32
+ "required": false,
33
+ "description": "Valores iniciais locais aplicados antes da interacao do usuario",
34
+ "label": "Valor inicial"
29
35
  },
30
36
  {
31
37
  "name": "editorialContext",
32
38
  "type": "Record<string, unknown> | null",
33
- "required": false
39
+ "required": false,
40
+ "description": "Contexto compartilhado usado para resolver bindings do rich content hospedado no form",
41
+ "label": "Contexto editorial"
34
42
  },
35
43
  {
36
44
  "name": "mode",
37
45
  "type": "'create' | 'edit' | 'view'",
38
- "required": false
46
+ "required": false,
47
+ "description": "Modo do formulario",
48
+ "label": "Modo",
49
+ "default": "create"
39
50
  },
40
51
  {
41
52
  "name": "config",
42
53
  "type": "FormConfig",
43
- "required": false
54
+ "required": false,
55
+ "description": "Configuracao completa do formulario (layout, metadados, acoes, regras e headers de secao com `sectionHeader` para icone/avatar dinamico e `headerActions` para acoes contextuais).",
56
+ "label": "Configuracao"
44
57
  },
45
58
  {
46
59
  "name": "schemaSource",
47
60
  "type": "'resource' | 'filter'",
48
- "required": false
61
+ "required": false,
62
+ "description": "Fonte do schema de campos",
63
+ "default": "resource"
49
64
  },
50
65
  {
51
66
  "name": "schemaUrl",
52
67
  "type": "string | null",
53
- "required": false
68
+ "required": false,
69
+ "description": "Schema canonico explicito publicado pelo backend (ex.: surfaces/capabilities)"
54
70
  },
55
71
  {
56
72
  "name": "readUrl",
57
73
  "type": "string | null",
58
- "required": false
74
+ "required": false,
75
+ "description": "URL canonica de leitura publicada por surfaces VIEW/READ_PROJECTION"
59
76
  },
60
77
  {
61
78
  "name": "apiEndpointKey",
62
79
  "type": "ApiEndpoint | string | null",
63
- "required": false
80
+ "required": false,
81
+ "description": "Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados"
64
82
  },
65
83
  {
66
84
  "name": "apiUrlEntry",
67
85
  "type": "ApiUrlEntry | null",
68
- "required": false
86
+ "required": false,
87
+ "description": "Entrada de API ja resolvida para hosts destacados que nao herdam o provider de API_URL da rota atual"
69
88
  },
70
89
  {
71
90
  "name": "submitUrl",
72
91
  "type": "string | null",
73
- "required": false
92
+ "required": false,
93
+ "description": "URL canonica de submit publicada pelo backend para forms orientados a surface"
74
94
  },
75
95
  {
76
96
  "name": "submitMethod",
77
97
  "type": "'post' | 'put' | 'patch' | null",
78
- "required": false
98
+ "required": false,
99
+ "description": "Metodo HTTP canonico do submit quando a surface publica operacao explicita"
79
100
  },
80
101
  {
81
102
  "name": "responseSchemaUrl",
82
103
  "type": "string | null",
83
- "required": false
104
+ "required": false,
105
+ "description": "Schema de resposta publicado pelo backend para inspecao diagnostica e follow-up de runtime"
84
106
  },
85
107
  {
86
108
  "name": "enableCustomization",
87
109
  "type": "boolean",
88
- "required": false
110
+ "required": false,
111
+ "description": "Habilita modo de customizacao do layout (canvas)",
112
+ "default": false
89
113
  },
90
114
  {
91
115
  "name": "showAiAssistant",
92
116
  "type": "boolean",
93
- "required": false
117
+ "required": false,
118
+ "description": "Mostra os gatilhos do copiloto semantico Praxis para esta instancia do formulario",
119
+ "default": true
94
120
  },
95
121
  {
96
122
  "name": "formId",
97
123
  "type": "string",
98
- "required": false
124
+ "required": false,
125
+ "description": "Chave para persistencia local da configuracao"
99
126
  },
100
127
  {
101
128
  "name": "componentInstanceId",
102
129
  "type": "string",
103
- "required": false
130
+ "required": false,
131
+ "description": "Identificador estavel para instancias multiplas do formulario"
104
132
  },
105
133
  {
106
134
  "name": "configPersistenceStrategy",
107
135
  "type": "'local-first' | 'input-first'",
108
- "required": false
136
+ "required": false,
137
+ "description": "Define se a configuracao local persistida ou a configuracao recebida por input tem precedencia na hidratacao.",
138
+ "default": "local-first"
109
139
  },
110
140
  {
111
141
  "name": "layout",
112
142
  "type": "FormLayout",
113
- "required": false
143
+ "required": false,
144
+ "description": "Layout opcional em vez do gerado"
114
145
  },
115
146
  {
116
147
  "name": "generatedLayoutPreset",
117
148
  "type": "'default' | 'compactPresentation'",
118
- "required": false
149
+ "required": false,
150
+ "description": "Preset usado apenas ao criar a configuracao inicial a partir de metadata/schema.",
151
+ "default": "default"
119
152
  },
120
153
  {
121
154
  "name": "layoutPolicy",
122
155
  "type": "DynamicFormLayoutPolicy | null",
123
- "required": false
156
+ "required": false,
157
+ "description": "Politica opt-in para materializar layout a partir do schema sem persistir sections geradas por padrao."
124
158
  },
125
159
  {
126
160
  "name": "backConfig",
127
161
  "type": "BackConfig",
128
- "required": false
162
+ "required": false,
163
+ "description": "Configuracao de navegacao/voltar (host CRUD)"
129
164
  },
130
165
  {
131
166
  "name": "hooks",
132
167
  "type": "FormHooksLayout",
133
- "required": false
168
+ "required": false,
169
+ "description": "Declaracoes de hooks de ciclo de vida do formulario"
134
170
  },
135
171
  {
136
172
  "name": "removeEmptyContainersOnSave",
137
173
  "type": "boolean",
138
- "required": false
174
+ "required": false,
175
+ "description": "Remove containers vazios ao salvar configuracao",
176
+ "default": false
139
177
  },
140
178
  {
141
179
  "name": "reactiveValidation",
142
180
  "type": "boolean | null",
143
- "required": false
181
+ "required": false,
182
+ "description": "Ativa afterValidate reativo em valueChanges",
183
+ "default": null
144
184
  },
145
185
  {
146
186
  "name": "reactiveValidationDebounceMs",
147
187
  "type": "number | null",
148
- "required": false
188
+ "required": false,
189
+ "description": "Debounce (ms) para validacao reativa",
190
+ "default": null
149
191
  },
150
192
  {
151
193
  "name": "notifyIfOutdated",
152
194
  "type": "'inline' | 'snackbar' | 'both' | 'none'",
153
- "required": false
195
+ "required": false,
196
+ "description": "Canal de notificacao para schema desatualizado",
197
+ "default": "both"
154
198
  },
155
199
  {
156
200
  "name": "snoozeMs",
157
201
  "type": "number",
158
- "required": false
202
+ "required": false,
203
+ "description": "Duracao do snooze para alertas (ms)",
204
+ "default": "86400000"
159
205
  },
160
206
  {
161
207
  "name": "autoOpenSettingsOnOutdated",
162
208
  "type": "boolean",
163
- "required": false
209
+ "required": false,
210
+ "description": "Abre editor automaticamente quando schema esta desatualizado",
211
+ "default": false
164
212
  },
165
213
  {
166
214
  "name": "readonlyModeGlobal",
167
215
  "type": "boolean | null",
168
- "required": false
216
+ "required": false,
217
+ "description": "Trava global para campos em modo somente-leitura"
169
218
  },
170
219
  {
171
220
  "name": "disabledModeGlobal",
172
221
  "type": "boolean | null",
173
- "required": false
222
+ "required": false,
223
+ "description": "Trava global para desabilitar campos"
174
224
  },
175
225
  {
176
226
  "name": "presentationModeGlobal",
177
227
  "type": "boolean | null",
178
- "required": false
228
+ "required": false,
229
+ "description": "Modo de apresentacao (sem edicao)"
179
230
  },
180
231
  {
181
232
  "name": "fieldIconPolicy",
182
233
  "type": "'all' | 'presentation-only' | 'none'",
183
- "required": false
234
+ "required": false,
235
+ "description": "Controla se icones prefix/suffix de campos aparecem em controles tradicionais ou apenas em apresentacao.",
236
+ "default": "all"
184
237
  },
185
238
  {
186
239
  "name": "visibleGlobal",
187
240
  "type": "boolean | null",
188
- "required": false
241
+ "required": false,
242
+ "description": "Visibilidade global"
189
243
  },
190
244
  {
191
245
  "name": "customEndpoints",
192
246
  "type": "EndpointConfig",
193
- "required": false
247
+ "required": false,
248
+ "description": "Endpoints customizados para operacoes CRUD"
194
249
  }
195
250
  ],
196
251
  "outputs": [
197
252
  {
198
253
  "name": "formSubmit",
199
254
  "type": "FormSubmitEvent",
200
- "required": false
255
+ "required": false,
256
+ "description": "Emite ao submeter o formulario",
257
+ "label": "Submit"
201
258
  },
202
259
  {
203
260
  "name": "formCancel",
204
261
  "type": "void",
205
- "required": false
262
+ "required": false,
263
+ "description": "Emite ao cancelar"
206
264
  },
207
265
  {
208
266
  "name": "formReset",
209
267
  "type": "void",
210
- "required": false
268
+ "required": false,
269
+ "description": "Emite ao resetar"
211
270
  },
212
271
  {
213
272
  "name": "configChange",
214
273
  "type": "FormConfig",
215
- "required": false
274
+ "required": false,
275
+ "description": "Emite quando a configuracao do formulario muda",
276
+ "label": "Configuracao alterada"
216
277
  },
217
278
  {
218
279
  "name": "configPatchChange",
219
280
  "type": "DynamicFormConfigPatchChangeEvent",
220
- "required": false
281
+ "required": false,
282
+ "description": "Emite inputPatch.config quando a configuracao autorada do formulario muda, para hosts persistirem inputs.config sem alterar o payload legado de configChange.",
283
+ "label": "Patch persistivel de configuracao"
221
284
  },
222
285
  {
223
286
  "name": "formReady",
224
287
  "type": "FormReadyEvent",
225
- "required": false
288
+ "required": false,
289
+ "description": "Emite quando o formulario esta pronto",
290
+ "label": "Form pronto"
226
291
  },
227
292
  {
228
293
  "name": "valueChange",
229
294
  "type": "FormValueChangeEvent",
230
- "required": false
295
+ "required": false,
296
+ "description": "Emite quando valores mudam",
297
+ "label": "Valor alterado"
231
298
  },
232
299
  {
233
300
  "name": "syncCompleted",
234
301
  "type": "SyncResult",
235
- "required": false
302
+ "required": false,
303
+ "description": "Emite quando a sincronizacao com metadados do servidor completa"
236
304
  },
237
305
  {
238
306
  "name": "initializationError",
239
307
  "type": "FormInitializationError",
240
- "required": false
308
+ "required": false,
309
+ "description": "Emite erro de inicializacao com contexto"
241
310
  },
242
311
  {
243
312
  "name": "enableCustomizationChange",
244
313
  "type": "boolean",
245
- "required": false
314
+ "required": false,
315
+ "description": "Emite quando o modo de customizacao de layout muda",
316
+ "label": "Customizacao (toggle)"
246
317
  },
247
318
  {
248
319
  "name": "customAction",
249
320
  "type": "FormCustomActionEvent",
250
- "required": false
321
+ "required": false,
322
+ "description": "Emite quando uma acao customizada e executada"
251
323
  },
252
324
  {
253
325
  "name": "actionConfirmation",
254
326
  "type": "FormActionConfirmationEvent",
255
- "required": false
327
+ "required": false,
328
+ "description": "Resultado de confirmacoes de acoes"
256
329
  },
257
330
  {
258
331
  "name": "schemaStatusChange",
259
332
  "type": "{ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string }",
260
- "required": false
333
+ "required": false,
334
+ "description": "Emite quando o status do schema muda"
261
335
  }
262
336
  ],
263
337
  "configSchemaId": "FormConfig",
@@ -272,6 +346,119 @@
272
346
  "stable"
273
347
  ],
274
348
  "lib": "@praxisui/dynamic-form",
349
+ "actions": [
350
+ {
351
+ "id": "submit",
352
+ "label": "Enviar",
353
+ "icon": "send",
354
+ "description": "Emite evento ao submeter o formulario",
355
+ "emit": "formSubmit",
356
+ "payloadSchema": {
357
+ "type": "object",
358
+ "properties": {
359
+ "stage": {
360
+ "type": "string",
361
+ "description": "Etapa do submit"
362
+ },
363
+ "formData": {
364
+ "type": "object",
365
+ "description": "Dados do formulario"
366
+ },
367
+ "isValid": {
368
+ "type": "boolean",
369
+ "description": "Validade do formulario"
370
+ },
371
+ "operation": {
372
+ "type": "string",
373
+ "description": "Operacao executada (create, update ou patch)"
374
+ }
375
+ },
376
+ "required": [
377
+ "stage",
378
+ "formData",
379
+ "isValid",
380
+ "operation"
381
+ ],
382
+ "example": {
383
+ "stage": "after",
384
+ "formData": {},
385
+ "isValid": true,
386
+ "operation": "patch"
387
+ }
388
+ },
389
+ "scope": "toolbar"
390
+ },
391
+ {
392
+ "id": "cancel",
393
+ "label": "Cancelar",
394
+ "icon": "close",
395
+ "description": "Emite evento ao cancelar o formulario",
396
+ "emit": "formCancel",
397
+ "scope": "toolbar"
398
+ },
399
+ {
400
+ "id": "reset",
401
+ "label": "Limpar",
402
+ "icon": "restart_alt",
403
+ "description": "Emite evento ao resetar o formulario",
404
+ "emit": "formReset",
405
+ "scope": "toolbar"
406
+ },
407
+ {
408
+ "id": "custom-action",
409
+ "label": "Acao customizada",
410
+ "icon": "bolt",
411
+ "description": "Emite evento de acao customizada",
412
+ "emit": "customAction",
413
+ "payloadSchema": {
414
+ "type": "object",
415
+ "properties": {
416
+ "actionId": {
417
+ "type": "string",
418
+ "description": "ID da acao customizada"
419
+ },
420
+ "formData": {
421
+ "type": "object",
422
+ "description": "Dados do formulario"
423
+ },
424
+ "isValid": {
425
+ "type": "boolean",
426
+ "description": "Validade do formulario"
427
+ },
428
+ "source": {
429
+ "type": "string",
430
+ "description": "Origem da acao"
431
+ },
432
+ "sectionId": {
433
+ "type": "string",
434
+ "description": "ID da secao quando a acao veio do header de uma secao"
435
+ }
436
+ },
437
+ "required": [
438
+ "actionId",
439
+ "formData",
440
+ "isValid",
441
+ "source"
442
+ ],
443
+ "example": {
444
+ "actionId": "help",
445
+ "formData": {},
446
+ "isValid": true,
447
+ "source": "section-header",
448
+ "sectionId": "identification"
449
+ }
450
+ },
451
+ "scope": "shell"
452
+ }
453
+ ],
454
+ "configEditor": {
455
+ "component": "[ref:PraxisDynamicFormWidgetConfigEditor]",
456
+ "title": "Configurar formulário"
457
+ },
458
+ "authoringManifestRef": {
459
+ "componentId": "praxis-dynamic-form",
460
+ "source": "PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST"
461
+ },
275
462
  "source": "projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.metadata.ts",
276
463
  "exportName": "PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA",
277
464
  "capabilities": [
@@ -8466,7 +8653,7 @@
8466
8653
  "chunkIndex": 0,
8467
8654
  "chunkKind": "summary",
8468
8655
  "content": "Component ID: praxis-dynamic-form\nSelector: praxis-dynamic-form\nFriendly Name: Praxis Dynamic Form\nDescription: Formulario dinamico com layout por secoes/linhas/colunas e campos renderizados por metadados.\nCategory: form\nLib/Package: @praxisui/dynamic-form\nTags: widget, form, configurable, hasWizard, stable\nInputs:\n - resourcePath (string)\n - resourceId (string | number)\n - initialValue (Record<string, unknown> | null)\n - editorialContext (Record<string, unknown> | null)\n - mode ('create' | 'edit' | 'view')\n - config (FormConfig)\n - schemaSource ('resource' | 'filter')\n - schemaUrl (string | null)\n - readUrl (string | null)\n - apiEndpointKey (ApiEndpoint | string | null)\n - apiUrlEntry (ApiUrlEntry | null)\n - submitUrl (string | null)\n - submitMethod ('post' | 'put' | 'patch' | null)\n - responseSchemaUrl (string | null)\n - enableCustomization (boolean)\n - showAiAssistant (boolean)\n - formId (string)\n - componentInstanceId (string)\n - configPersistenceStrategy ('local-first' | 'input-first')\n - layout (FormLayout)\n - generatedLayoutPreset ('default' | 'compactPresentation')\n - layoutPolicy (DynamicFormLayoutPolicy | null)\n - backConfig (BackConfig)\n - hooks (FormHooksLayout)\n - removeEmptyContainersOnSave (boolean)\n - reactiveValidation (boolean | null)\n - reactiveValidationDebounceMs (number | null)\n - notifyIfOutdated ('inline' | 'snackbar' | 'both' | 'none')\n - snoozeMs (number)\n - autoOpenSettingsOnOutdated (boolean)\n - readonlyModeGlobal (boolean | null)\n - disabledModeGlobal (boolean | null)\n - presentationModeGlobal (boolean | null)\n - fieldIconPolicy ('all' | 'presentation-only' | 'none')\n - visibleGlobal (boolean | null)\n - customEndpoints (EndpointConfig)\nOutputs:\n - formSubmit (FormSubmitEvent)\n - formCancel (void)\n - formReset (void)\n - configChange (FormConfig)\n - configPatchChange (DynamicFormConfigPatchChangeEvent)\n - formReady (FormReadyEvent)\n - valueChange (FormValueChangeEvent)\n - syncCompleted (SyncResult)\n - initializationError (FormInitializationError)\n - enableCustomizationChange (boolean)\n - customAction (FormCustomActionEvent)\n - actionConfirmation (FormActionConfirmationEvent)\n - schemaStatusChange ({ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string })\n",
8469
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.metadata.ts",
8656
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.metadata.ts",
8470
8657
  "contentHash": "f699ad0db1bb0625cf759d14b5b7ef61758c72e3aa7b3ae27f6e1ee3bcf52459",
8471
8658
  "sourceKind": "component_definition",
8472
8659
  "sourceId": "praxis-dynamic-form",
@@ -8476,7 +8663,7 @@
8476
8663
  "chunkIndex": 1,
8477
8664
  "chunkKind": "capabilities",
8478
8665
  "content": "Schema Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versão da configuração do formulário para controle de migração.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuração do formulário.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da última atualização da configuração (ISO-8601).\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: ID do schema de origem para reconciliação no servidor.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema usado para compor o formulário.\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema de origem.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operação do schema (ex.: \"get\", \"post\").\n - Path: metadata.schemaContext.schemaType\n Category: metadata\n Kind: enum\n Description: Tipo do schema (response/request).\n - Path: metadata.schemaContext.internal\n Category: metadata\n Kind: boolean\n Description: Indica se o schema é interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema (se aplicável).\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema (se aplicável).\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash dos dados do servidor para detecção de mudanças.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizações manuais aplicadas ao formulário.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Array de metadados dos campos. Usado para referenciar a configuração de campos.\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: helpPresentation\n Category: appearance\n Kind: object\n Description: Politica visual do formulario para exibir hint/helpText dos campos sem alterar a semantica publicada pelos DTOs.\n - Path: helpPresentation.display\n Category: appearance\n Kind: enum\n Description: Define se a ajuda semantica dos campos fica inline, em icone de ajuda, automatica por densidade, ou oculta visualmente.\n - Path: helpPresentation.inlineMaxLength\n Category: appearance\n Kind: number\n Description: Tamanho maximo para manter ajuda inline quando display=\"auto\".\n - Path: helpPresentation.preferPopoverForControls\n Category: appearance\n Kind: array\n Description: Tipos de controle que devem preferir icone de ajuda quando display=\"auto\", como toggle, checkbox ou select.\n - Path: editorialContext\n Category: editorial\n Kind: object\n Description: Contexto editorial compartilhado entre os blocos hospedados antes/depois do formulario.\n - Path: editorialContext.[token]\n Category: editorial\n Kind: string\n Description: Valor simples exposto no contexto editorial.\n - Path: formBlocksBefore\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado antes do formulario.\n - Path: formBlocksBefore.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content.\n - Path: formBlocksBefore.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content editorial.\n - Path: formBlocksBefore.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes do formulario.\n - Path: formBlocksBefore.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes do formulario.\n - Path: formBlocksBefore.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content hospedado antes do formulario.\n - Path: formBlocksBeforeActions\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois das seções e antes da área principal de ações.\n - Path: formBlocksBeforeActions.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes da área principal de ações.\n - Path: formBlocksBeforeActions.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes da área principal de ações.\n - Path: formBlocksBeforeActions.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content antes das ações.\n - Path: formBlocksAfter\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois do formulario inteiro, incluindo a área principal de ações.\n - Path: formBlocksAfter.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content de fechamento.\n - Path: formBlocksAfter.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content de fechamento.\n - Path: formBlocksAfter.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados depois do formulario.\n - Path: formBlocksAfter.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado depois do formulario.\n - Path: formBlocksAfter.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content de fechamento.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID único da seção.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Título exibido para cada seção do formulário.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descrição auxiliar exibida abaixo do título da seção.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Nome do ícone (Material Icons) para o cabeçalho da seção.\n - Path: sections[].sectionHeader\n Category: layout\n Kind: object\n Description: Configuração rica do header visual da seção, com suporte a avatar por imagem, iniciais ou modo automático.\n - Path: sections[].sectionHeader.mode\n Category: layout\n Kind: enum\n Description: Estratégia visual do header da seção.\n - Path: sections[].sectionHeader.sourceField\n Category: layout\n Kind: string\n Description: Campo do formulário usado como origem da imagem do avatar.\n - Path: sections[].sectionHeader.initialsSourceField\n Category: layout\n Kind: string\n Description: Campo textual usado para derivar iniciais do avatar.\n - Path: sections[].sectionHeader.altField\n Category: layout\n Kind: string\n Description: Campo textual usado como texto acessivel do avatar e como fallback textual para iniciais quando initialsSourceField nao estiver definido.\n - Path: sections[].sectionHeader.fallbackIcon\n Category: layout\n Kind: string\n Description: Ícone opcional usado quando o avatar dinâmico estiver vazio ou inválido.\n - Path: sections[].sectionHeader.emptyState\n Category: layout\n Kind: enum\n Description: Comportamento do header quando os campos de origem ainda não possuem valor.\n - Path: sections[].sectionHeader.size\n Category: layout\n Kind: enum\n Description: Tamanho semântico do avatar da seção, materializado pelo runtime via tokens.\n - Path: sections[].sectionHeader.initialsMaxLength\n Category: layout\n Kind: number\n Description: Máximo de letras exibidas no avatar textual.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Define se a seção pode ser colapsada/expandida pelo usuário.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial da seção (colapsada/expandida) quando `collapsible` é true.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após a seção.\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo do título da seção.\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo da descrição da seção.\n - Path: sections[].appearance\n Category: appearance\n Kind: enum\n Description: Preset visual do container/cabeçalho da seção.\n - Path: sections[].stepLabel\n Category: content\n Kind: string\n Description: Rótulo curto do passo exibido antes do título da seção.\n - Path: sections[].titleStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para o título da seção.\n - Path: sections[].descriptionStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para a descrição da seção.\n - Path: sections[].titleColor\n Category: appearance\n Kind: string\n Description: Cor do título da seção (CSS color ou token).\n - Path: sections[].descriptionColor\n Category: appearance\n Kind: string\n Description: Cor da descrição da seção (CSS color ou token).\n - Path: sections[].headerAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento horizontal do conteúdo do cabeçalho da seção.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Texto de tooltip para o cabeçalho da seção.\n - Path: sections[].headerActions\n Category: layout\n Kind: array\n Description: Lista de ações iconográficas renderizadas no canto direito do cabeçalho da seção.\n - Path: sections[].headerActions[].id\n Category: layout\n Kind: string\n Description: ID estável da ação de cabeçalho da seção.\n - Path: sections[].headerActions[].label\n Category: layout\n Kind: string\n Description: Label acessível usada em tooltip e aria-label da ação.\n - Path: sections[].headerActions[].icon\n Category: layout\n Kind: string\n Description: Ícone renderizado na ação do cabeçalho da seção.\n - Path: sections[].headerActions[].action\n Category: layout\n Kind: string\n Description: Nome opcional da ação emitida no customAction; se ausente, o runtime usa o ID.\n - Path: sections[].headerActions[].tooltip\n Category: layout\n Kind: string\n Description: Tooltip opcional da ação; se ausente, o runtime usa a label.\n - Path: sections[].headerActions[].color\n Category: appearance\n Kind: enum\n Description: Tom visual da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].visible\n Category: layout\n Kind: boolean\n Description: Controla a visibilidade da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].disabled\n Category: layout\n Kind: boolean\n Description: Controla o estado desabilitado da ação do cabeçalho da seção.\n - Path: sections[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da seção.\n - Path: sections[].styles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da seção.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID único da linha dentro de uma seção.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Título interno da linha (usado em editores e labels).\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaçamento horizontal (em px) entre colunas nesta linha.\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após esta linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID único da coluna dentro de uma linha.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Título interno da coluna (usado em editores e labels).\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Atributo data-testid aplicado ao container da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Projeção legada/derivada dos itens kind:\"field\" dentro da coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo dentro da projeção legada/derivada da coluna.\n - Path: sections[].rows[].columns[].items\n Category: layout\n Kind: array\n Description: Lista canônica ordenada de itens da coluna: campos e blocos visuais.\n - Path: sections[].rows[].columns[].items[].kind\n Category: layout\n Kind: enum\n Description: Tipo do item de layout da coluna.\n - Path: sections[].rows[].columns[].items[].id\n Category: layout\n Kind: string\n Description: ID estável do item de layout dentro do formulário.\n - Path: sections[].rows[].columns[].items[].fieldName\n Category: layout\n Kind: string\n Description: Nome do campo quando kind é \"field\".\n - Path: sections[].rows[].columns[].items[].document\n Category: editorial\n Kind: object\n Description: RichContentDocument do bloco visual quando kind é \"richContent\".\n - Path: sections[].rows[].columns[].items[].layout\n Category: editorial\n Kind: enum\n Description: Modo de renderização do bloco visual richContent dentro da coluna.\n - Path: sections[].rows[].columns[].items[].rootClassName\n Category: appearance\n Kind: string\n Description: Classe CSS opcional aplicada ao bloco visual richContent.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Largura da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Largura da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Largura da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas médias (md).\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas médias (md).\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento vertical do conteúdo da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding (em px) interno da coluna.\n - Path: sections[].rows[].columns[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada à coluna.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botão de submissão.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de submissão.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de submissão.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de submissão.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botão de submissão.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de submissão.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de submissão.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de submissão.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de submissão.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de submissão.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de submissão.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de submissão.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de submissão.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+s\") para o botão de submissão.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botão de cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botão de cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"esc\") para o botão de cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botão de reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botão de reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+shift+r\") para o botão de reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Lista de botões de ação customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuração de um botão de ação customizado.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID da ação customizada.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade da ação customizada.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Rótulo da ação customizada.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para a ação customizada.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor da ação customizada.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual da ação customizada.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho da ação customizada.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada à ação customizada.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados à ação customizada.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Desabilita a ação customizada.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo do botão da ação customizada.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido na ação customizada.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento na ação customizada.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado para a ação customizada.\n - Path: actions.position\n Category: layout\n Kind: enum\n Description: Posicionamento horizontal da barra de ações.\n - Path: actions.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões dentro da barra de ações (horizontal/vertical).\n - Path: actions.spacing\n Category: layout\n Kind: enum\n Description: Espaçamento entre os botões na barra de ações.\n - Path: actions.sticky\n Category: layout\n Kind: boolean\n Description: Define se a barra de ações deve permanecer visível ao rolar a página.\n - Path: actions.divider\n Category: layout\n Kind: boolean\n Description: Exibe um divisor superior acima da barra de ações.\n - Path: actions.placement\n Category: layout\n Kind: enum\n Description: Localização estrutural da barra de ações no layout.\n - Path: actions.mobile.position\n Category: layout\n Kind: enum\n Description: Posicionamento da barra de ações em dispositivos móveis.\n - Path: actions.mobile.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões em dispositivos móveis.\n - Path: actions.mobile.collapseToMenu\n Category: behavior\n Kind: boolean\n Description: Em mobile, agrupa ações em um menu (se houver muitas).\n - Path: actions.containerClassName\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da barra de ações.\n - Path: actions.containerStyles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da barra de ações.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de submit.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de cancel.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de cancel.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de reset.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Exibe um alerta se o usuário tentar sair com mudanças não salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Habilita rastreamento de histórico para desfazer/refazer (se suportado).\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Ao submeter, foca automaticamente no primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Ao submeter, rola a página para exibir o primeiro erro.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulário após uma submissão bem-sucedida.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: URL para redirecionar após uma submissão bem-sucedida.\n - Path: behavior.reactiveValidation\n Category: validation\n Kind: boolean\n Description: Ativa validação reativa (em tempo real) em `valueChanges`.\n - Path: behavior.reactiveValidationDebounceMs\n Category: validation\n Kind: number\n Description: Debounce (em ms) para a validação reativa.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: URL para onde os dados do formulário serão enviados (POST/PUT/PATCH).\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: URL para buscar dados para popular o formulário (GET).\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Método HTTP para a requisição de salvar.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Tempo limite (em ms) para as requisições API.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Cabeçalhos HTTP personalizados para as requisições API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Nome do campo que representa o ID do registro no payload (para PUT/PATCH).\n - Path: api.beforeSave\n Category: hooks\n Kind: expression\n Description: Hook para pré-processamento de dados antes de enviar para a API.\n - Path: api.afterLoad\n Category: hooks\n Kind: expression\n Description: Hook para pós-processamento de dados após carregar da API.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após atualização de registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após criação de registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após atualização de registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após criação de registro.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de submeter o formulário.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de cancelar.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de resetar o formulário.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para ações customizadas. Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da ação customizada (success/error/confirmation). Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Mensagem de sucesso para a ação customizada.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Mensagem de erro para a ação customizada.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para a ação customizada.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o envio do formulário.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o cancelamento.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o reset do formulário.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem exibida durante a execução de uma ação customizada. Substitua `[actionId]` pelo ID da ação.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID único da regra de layout.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome amigável da regra de layout.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descrição da regra de layout para documentação.\n - Path: formRules[].metadata.origin\n Category: rules\n Kind: enum\n Description: Origem da regra sugerida pela IA.\n - Path: formRules[].metadata.reviewStatus\n Category: rules\n Kind: enum\n Description: Status de revisão humana da regra sugerida pela IA.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo do elemento alvo da regra (campo, seção, ação, linha, coluna ou bloco visual).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra (quando properties não forem informadas).\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: Lista de IDs dos elementos alvo da regra. O tipo do ID depende de `targetType`.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo da regra.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para alvos de campo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formCommandRules\n Category: rules\n Kind: array\n Description: Regras condicionais de comando avaliadas depois que formRules estabilizam valores calculados.\n - Path: formCommandRules[].condition\n Category: rules\n Kind: expression\n Description: Condicao Json Logic avaliada sobre formData estabilizado, incluindo field values calculados.\n - Path: formCommandRules[].effects[].kind\n Category: rules\n Kind: enum\n Description: Tipo do efeito de comando. O primeiro corte suporta apenas global-action.\n - Path: formCommandRules[].effects[].globalAction\n Category: rules\n Kind: object\n Description: GlobalActionRef estruturado executado por GlobalActionService.executeRef quando a regra entra na condicao.\n - Path: formCommandRules[].policy\n Category: rules\n Kind: object\n Description: Politica operacional do comando: trigger, distinct, distinctBy, debounceMs, errorPolicy e runOnInitialEvaluation.\n - Path: formRulesState\n Category: metadata\n Kind: object\n Description: Estado interno do builder visual de regras, gerado apenas para round-trip do editor.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declarações de hooks por estágio do ciclo de vida do formulário.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hints.dataModes.create\n Category: form_config\n Kind: string\n Description: Dica para o modo de criação de dados.\n - Path: hints.dataModes.edit\n Category: form_config\n Kind: string\n Description: Dica para o modo de edição de dados.\n - Path: hints.dataModes.view\n Category: form_config\n Kind: string\n Description: Dica para o modo de visualização de dados.\n - Path: hints.uiModes.presentation\n Category: form_config\n Kind: string\n Description: Dica para o modo de apresentação da UI.\n - Path: hints.uiModes.readonly\n Category: form_config\n Kind: string\n Description: Dica para o modo de somente leitura da UI.\n - Path: hints.uiModes.disabled\n Category: form_config\n Kind: string\n Description: Dica para o modo desabilitado da UI.\n - Path: hints.uiModes.visible\n Category: form_config\n Kind: string\n Description: Dica para o modo de visibilidade da UI.\n - Path: fieldMetadata[].id\n Category: identity\n Kind: string\n Description: Identificador unico da instancia do componente.\n - Path: fieldMetadata[].version\n Category: identity\n Kind: string\n Description: Versao do schema de metadata (migracao).\n - Path: fieldMetadata[].context\n Category: identity\n Kind: enum\n Description: Contexto de uso do componente (form/filter/table/dialog/standalone).\n - Path: fieldMetadata[].createdAt\n Category: misc\n Kind: string\n Description: Timestamp de criacao (ISO).\n - Path: fieldMetadata[].updatedAt\n Category: misc\n Kind: string\n Description: Timestamp de atualizacao (ISO).\n - Path: fieldMetadata[].tags\n Category: identity\n Kind: array\n Description: Tags para categorizacao e busca.\n - Path: fieldMetadata[].cssClass\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao host do componente.\n - Path: fieldMetadata[].style\n Category: appearance\n Kind: object\n Description: Estilos inline (objeto CSS).\n - Path: fieldMetadata[].dataAttributes\n Category: data\n Kind: object\n Description: Data attributes para teste/analytics.\n - Path: fieldMetadata[].name\n Category: identity\n Kind: string\n Description: Identificador único do campo. Essencial para binding.\n - Path: fieldMetadata[].label\n Category: identity\n Kind: string\n Description: Rótulo principal exibido para o usuário.\n - Path: fieldMetadata[].placeholder\n Category: identity\n Kind: string\n Description: Texto temporário exibido quando vazio.\n - Path: fieldMetadata[].hint\n Category: identity\n Kind: string\n Description: Texto de ajuda exibido abaixo do campo.\n - Path: fieldMetadata[].helpText\n Category: identity\n Kind: string\n Description: Texto semântico de ajuda publicado pelo schema/DTO.\n - Path: fieldMetadata[].tooltip\n Category: identity\n Kind: string\n Description: Texto exibido ao passar o mouse.\n - Path: fieldMetadata[].tooltipOnHover\n Category: identity\n Kind: boolean\n Description: Habilita apresentação do tooltip no hover quando suportado pelo renderer.\n - Path: fieldMetadata[].description\n Category: identity\n Kind: string\n Description: Descrição detalhada (usada em documentação ou helps extensos).\n - Path: fieldMetadata[].selectionMode\n Category: behavior\n Kind: enum\n Description: Semântica de seleção explícita para controles de escolha.\n - Path: fieldMetadata[].variant\n Category: appearance\n Kind: string\n Description: Variante visual/semântica do controle.\n - Path: fieldMetadata[].density\n Category: appearance\n Kind: enum\n Description: Densidade visual do shell do controle.\n - Path: fieldMetadata[].links\n Category: identity\n Kind: array\n Description: Links ricos associados ao campo, úteis em consentimentos e conteúdo legal.\n - Path: fieldMetadata[].group\n Category: identity\n Kind: string\n Description: Agrupador lógico do campo.\n - Path: fieldMetadata[].order\n Category: layout\n Kind: number\n Description: Ordem de exibição do campo.\n - Path: fieldMetadata[].width\n Category: layout\n Kind: string\n Description: Largura do campo (ex: 50%, 100px).\n - Path: fieldMetadata[].isFlex\n Category: layout\n Kind: boolean\n Description: Se true, usa flex-grow para preencher espaço.\n - Path: fieldMetadata[].controlType\n Category: behavior\n Kind: enum\n Description: Tipo do componente de UI (input, select, datepicker, etc).\n - Path: fieldMetadata[].dataType\n Category: data\n Kind: enum\n Description: Tipo de dado do campo (text, number, date, etc).\n - Path: fieldMetadata[].source\n Category: data\n Kind: enum\n Description: Origem semântica do campo. Use local para campos do host que não vêm do schema backend.\n - Path: fieldMetadata[].transient\n Category: data\n Kind: boolean\n Description: Marca o campo como temporário/local para preenchimento. O dynamic-form omite do submit por padrão.\n - Path: fieldMetadata[].submitPolicy\n Category: behavior\n Kind: enum\n Description: Política de submit para sobrescrever o padrão de campos locais/transient.\n - Path: fieldMetadata[].materialDesign.appearance\n Category: appearance\n Kind: enum\n Description: Aparência do campo Material (fill/outline).\n - Path: fieldMetadata[].materialDesign.color\n Category: appearance\n Kind: enum\n Description: Tema de cor Material (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.floatLabel\n Category: appearance\n Kind: enum\n Description: Comportamento do rótulo flutuante.\n - Path: fieldMetadata[].materialDesign.subscriptSizing\n Category: appearance\n Kind: enum\n Description: Estratégia de sizing do subscript (erros/hints).\n - Path: fieldMetadata[].materialDesign.hideRequiredMarker\n Category: appearance\n Kind: boolean\n Description: Oculta o asterisco de campo obrigatório.\n - Path: fieldMetadata[].materialDesign.density\n Category: appearance\n Kind: enum\n Description: Densidade do campo Material.\n - Path: fieldMetadata[].materialDesign.disableRipple\n Category: appearance\n Kind: boolean\n Description: Desativa ripple/ondulação em componentes Material.\n - Path: fieldMetadata[].materialDesign.customPalette\n Category: appearance\n Kind: object\n Description: Override de paleta (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.animations\n Category: appearance\n Kind: object\n Description: Configuração de animações (disable, duration, easing).\n - Path: fieldMetadata[].prefixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido antes do valor.\n - Path: fieldMetadata[].suffixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido depois do valor.\n - Path: fieldMetadata[].iconPosition\n Category: appearance\n Kind: enum\n Description: Posição preferencial do ícone principal.\n - Path: fieldMetadata[].iconSize\n Category: appearance\n Kind: enum\n Description: Tamanho do ícone.\n - Path: fieldMetadata[].iconColor\n Category: appearance\n Kind: string\n Description: Cor semântica ou token de cor aplicado ao ícone principal.\n - Path: fieldMetadata[].iconClass\n Category: appearance\n Kind: string\n Description: Classe CSS controlada pelo host para o ícone principal.\n - Path: fieldMetadata[].iconStyle\n Category: appearance\n Kind: string\n Description: Estilo visual semântico do ícone quando o renderer suportar variações.\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\nComponent Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.layoutPolicy\n Category: inputs\n Kind: object\n Description: Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.\n - Path: inputs.layoutPolicy.source\n Category: inputs\n Kind: enum\n Description: Define se o layout vem de configuracao authorada ou do schema.\n - Path: inputs.layoutPolicy.preset\n Category: inputs\n Kind: enum\n Description: Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit.\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n - Path: inputs.layoutPolicy.persistence\n Category: inputs\n Kind: enum\n Description: Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito.\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n - Path: inputs.fieldIconPolicy\n Category: inputs\n Kind: enum\n Description: Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
8479
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
8666
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
8480
8667
  "contentHash": "c05a6371db5ac065bf75223cf06663456383933d63d8fe60f7d4588cffb5ac69",
8481
8668
  "sourceKind": "component_definition",
8482
8669
  "sourceId": "praxis-dynamic-form",
@@ -8486,7 +8673,7 @@
8486
8673
  "chunkIndex": 2,
8487
8674
  "chunkKind": "authoring_manifest",
8488
8675
  "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-dynamic-form\",\n \"ownerPackage\": \"@praxisui/dynamic-form\",\n \"configSchemaId\": \"FormConfig\",\n \"manifestVersion\": \"1.5.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"showAiAssistant\",\n \"type\": \"boolean\",\n \"description\": \"Mostra os gatilhos do copiloto semantico Praxis\"\n },\n {\n \"name\": \"config\",\n \"type\": \"FormConfig\",\n \"description\": \"Configuração do formulário; sections é opcional em forms schema-driven e não deve ser criado como array vazio apenas para satisfazer TypeScript.\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"string\",\n \"description\": \"Caminho do recurso (API)\"\n },\n {\n \"name\": \"readUrl\",\n \"type\": \"string\",\n \"description\": \"Endpoint canonico de leitura para surfaces VIEW/READ_PROJECTION\"\n },\n {\n \"name\": \"mode\",\n \"type\": \"string\",\n \"allowedValues\": [\n \"create\",\n \"edit\",\n \"view\"\n ],\n \"description\": \"Modo de operação\"\n },\n {\n \"name\": \"generatedLayoutPreset\",\n \"type\": \"string\",\n \"allowedValues\": [\n \"default\",\n \"compactPresentation\"\n ],\n \"description\": \"Preset usado apenas ao gerar a configuracao inicial a partir de metadata/schema; nao reprocessa layouts persistidos ou autorados.\"\n },\n {\n \"name\": \"layoutPolicy\",\n \"type\": \"DynamicFormLayoutPolicy\",\n \"description\": \"Politica opt-in para layout schema-driven transient. Use source=schema apenas quando o backend schema for a fonte canonica do agrupamento; use detailSummary para seleção de campos e densidade responsiva do resumo read-only compacto sem FormConfig.sections locais. Quando o resumo precisar vencer x-ui.width publicado para outras surfaces, use detailSummary.widthPrecedence=summary.\"\n },\n {\n \"name\": \"fieldIconPolicy\",\n \"type\": \"string\",\n \"allowedValues\": [\n \"all\",\n \"presentation-only\",\n \"none\"\n ],\n \"description\": \"Politica visual do host para icones prefix/suffix de campos vindos da metadata. Use presentation-only para manter icones decorativos em apresentacao e ocultar em controles tradicionais.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Habilita edição visual\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"description\": \"Campos do formulário (metadados schema-backed ou local; use para ops de propriedade)\"\n },\n {\n \"kind\": \"schemaBackedField\",\n \"resolver\": \"field-by-name-or-label\",\n \"description\": \"Campos com origem no schema do backend; não removíveis via authoring\"\n },\n {\n \"kind\": \"localField\",\n \"resolver\": \"field-by-name\",\n \"description\": \"Campos locais com source:\\\"local\\\"; adicionados/removidos via authoring\"\n },\n {\n \"kind\": \"section\",\n \"resolver\": \"section-by-id-or-title\",\n \"description\": \"Seções de layout identificadas por id estável\"\n },\n {\n \"kind\": \"row\",\n \"resolver\": \"row-by-id-in-section\",\n \"description\": \"Linhas dentro de seções, identificadas por id estável\"\n },\n {\n \"kind\": \"column\",\n \"resolver\": \"column-by-id-in-row\",\n \"description\": \"Colunas dentro de linhas, identificadas por id estável\"\n },\n {\n \"kind\": \"visualBlock\",\n \"resolver\": \"layout-item-by-id\",\n \"description\": \"Blocos visuais richContent em sections[].rows[].columns[].items[]; não participam do payload de submissão\"\n },\n {\n \"kind\": \"layoutPlacement\",\n \"resolver\": \"layout-placement-by-field\",\n \"description\": \"Posicionamento de campo no layout; target para ops de reposicionamento\"\n },\n {\n \"kind\": \"formAction\",\n \"resolver\": \"action-by-id-or-label\",\n \"description\": \"Ações da toolbar (submit, cancel, reset)\"\n },\n {\n \"kind\": \"formRule\",\n \"resolver\": \"rule-by-id-or-name\",\n \"description\": \"Regras de visibilidade e validação\"\n },\n {\n \"kind\": \"message\",\n \"resolver\": \"message-by-id\",\n \"description\": \"Mensagens inline do formulário (info, warning, error); ops em desenvolvimento\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"field.label.set\",\n \"title\": \"Alterar rótulo do campo\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"label\"\n ],\n \"properties\": {\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].label\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.placeholder.set\",\n \"title\": \"Alterar placeholder do campo\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"placeholder\"\n ],\n \"properties\": {\n \"placeholder\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].placeholder\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.required.set\",\n \"title\": \"Definir obrigatoriedade\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"required\"\n ],\n \"properties\": {\n \"required\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].required\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.readOnly.set\",\n \"title\": \"Definir campo como somente leitura\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"readOnly\"\n ],\n \"properties\": {\n \"readOnly\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].readOnly\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.disabled.set\",\n \"title\": \"Definir campo como desabilitado\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"disabled\"\n ],\n \"properties\": {\n \"disabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].disabled\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.hidden.set\",\n \"title\": \"Definir visibilidade inicial\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"hidden\"\n ],\n \"properties\": {\n \"hidden\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].hidden\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.controlType.set\",\n \"title\": \"Alterar tipo de controle\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"controlType\"\n ],\n \"properties\": {\n \"controlType\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"field-exists\",\n \"control-type-compatible\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].controlType\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.optionSource.set\",\n \"title\": \"Definir fonte de opções do campo\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"optionSource\"\n ],\n \"properties\": {\n \"optionSource\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"type\",\n \"resourcePath\"\n ],\n \"properties\": {\n \"key\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"RESOURCE_ENTITY\",\n \"DISTINCT_DIMENSION\",\n \"CATEGORICAL_BUCKET\",\n \"LIGHT_LOOKUP\",\n \"STATIC_CANONICAL\"\n ]\n },\n \"resourcePath\": {\n \"type\": \"string\"\n },\n \"valuePropertyPath\": {\n \"type\": \"string\"\n },\n \"labelPropertyPath\": {\n \"type\": \"string\"\n },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"includeIds\": {\n \"type\": \"boolean\"\n },\n \"capabilities\": {\n \"type\": \"object\",\n \"properties\": {\n \"filter\": {\n \"type\": \"boolean\"\n },\n \"byIds\": {\n \"type\": \"boolean\"\n },\n \"detail\": {\n \"type\": \"boolean\"\n },\n \"create\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"display\": {\n \"type\": \"object\"\n },\n \"selectionPolicy\": {\n \"type\": \"object\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\",\n \"option-source-valid\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].optionSource\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.local.add\",\n \"title\": \"Adicionar campo local\",\n \"scope\": \"global\",\n \"targetKind\": \"localField\",\n \"target\": {\n \"kind\": \"localField\",\n \"resolver\": \"field-by-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"label\",\n \"controlType\",\n \"source\"\n ],\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"controlType\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"const\": \"local\",\n \"description\": \"Obrigatório. Discriminador que distingue campos locais de schema-backed.\"\n },\n \"transient\": {\n \"type\": \"boolean\",\n \"default\": false,\n \"description\": \"Se true, o valor não persiste entre navegações.\"\n },\n \"submitPolicy\": {\n \"enum\": [\n \"omit\",\n \"include\",\n \"includeWhenDirty\"\n ],\n \"default\": \"omit\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-name-unique\",\n \"local-schema-name-no-collision\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[]\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"field.local.remove\",\n \"title\": \"Remover campo local\",\n \"scope\": \"field\",\n \"targetKind\": \"localField\",\n \"target\": {\n \"kind\": \"localField\",\n \"resolver\": \"field-by-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"effects\": [\n {\n \"kind\": \"remove-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n },\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-field-cleanup\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata[].name\",\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"writes\": [\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"identityKeys\": [\n \"fieldMetadata[].name\",\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.name\"\n ],\n \"properties\": {\n \"target.name\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"target-field-not-found\",\n \"target-field-not-local\",\n \"layout-reference-conflict\"\n ],\n \"description\": \"Remove every layout placement that references the removed local field by fieldMetadata[].name.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"field-exists\",\n \"field-is-local\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[]\",\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"field.submitPolicy.set\",\n \"title\": \"Definir política de submissão do campo\",\n \"scope\": \"field\",\n \"targetKind\": \"localField\",\n \"target\": {\n \"kind\": \"localField\",\n \"resolver\": \"field-by-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"submitPolicy\"\n ],\n \"properties\": {\n \"submitPolicy\": {\n \"enum\": [\n \"omit\",\n \"include\",\n \"includeWhenDirty\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"fieldMetadata[]\",\n \"key\": \"name\"\n }\n ],\n \"validators\": [\n \"field-exists\",\n \"field-is-local\",\n \"editor-round-trip-preserve\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata[].submitPolicy\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.section.add\",\n \"title\": \"Adicionar nova seção\",\n \"scope\": \"global\",\n \"targetKind\": \"section\",\n \"target\": {\n \"kind\": \"section\",\n \"resolver\": \"section-by-id-or-title\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"title\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"collapsible\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"sections[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"section-id-unique\"\n ],\n \"affectedPaths\": [\n \"sections[]\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"layout.section.remove\",\n \"title\": \"Remover seção\",\n \"scope\": \"section\",\n \"targetKind\": \"section\",\n \"target\": {\n \"kind\": \"section\",\n \"resolver\": \"section-by-id-or-title\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"effects\": [\n {\n \"kind\": \"remove-by-key\",\n \"path\": \"sections[]\",\n \"key\": \"id\"\n },\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-section-cleanup\",\n \"handlerContract\": {\n \"reads\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"writes\": [\n \"sections[]\"\n ],\n \"identityKeys\": [\n \"sections[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.id\"\n ],\n \"properties\": {\n \"target.id\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"target-section-not-found\",\n \"ambiguous-section-target\"\n ],\n \"description\": \"Removes the target section and its nested rows, columns, and field placements without deleting fieldMetadata records.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"section-exists\"\n ],\n \"affectedPaths\": [\n \"sections[]\",\n \"sections[].rows[]\",\n \"sections[].rows[].columns[]\",\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.row.add\",\n \"title\": \"Adicionar linha numa seção\",\n \"scope\": \"section\",\n \"targetKind\": \"section\",\n \"target\": {\n \"kind\": \"section\",\n \"resolver\": \"section-by-id-or-title\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"columns\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 12,\n \"default\": 1\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"sections[].rows[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"section-exists\",\n \"row-id-unique-in-section\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[]\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.column.add\",\n \"title\": \"Adicionar coluna numa linha\",\n \"scope\": \"row\",\n \"targetKind\": \"row\",\n \"target\": {\n \"kind\": \"row\",\n \"resolver\": \"row-by-id-in-section\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"span\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 12,\n \"default\": 6\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"sections[].rows[].columns[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"row-exists\",\n \"column-id-unique-in-row\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[].columns[]\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.field.move\",\n \"title\": \"Mover campo no layout\",\n \"scope\": \"field\",\n \"targetKind\": \"field\",\n \"target\": {\n \"kind\": \"field\",\n \"resolver\": \"field-by-name-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"targetSectionId\",\n \"targetRowId\",\n \"targetColumnId\"\n ],\n \"properties\": {\n \"targetSectionId\": {\n \"type\": \"string\"\n },\n \"targetRowId\": {\n \"type\": \"string\"\n },\n \"targetColumnId\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-reconciler\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata[].name\",\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"writes\": [\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"identityKeys\": [\n \"fieldMetadata[].name\",\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.name\",\n \"targetSectionId\",\n \"targetRowId\",\n \"targetColumnId\"\n ],\n \"properties\": {\n \"target.name\": {\n \"type\": \"string\"\n },\n \"targetSectionId\": {\n \"type\": \"string\"\n },\n \"targetRowId\": {\n \"type\": \"string\"\n },\n \"targetColumnId\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"target-field-not-found\",\n \"target-layout-location-not-found\",\n \"ambiguous-field-target\",\n \"duplicate-field-placement\"\n ],\n \"description\": \"Moves a field placement by stable section, row, column, and field ids; index is insertion position only.\"\n }\n }\n ],\n \"validators\": [\n \"field-exists\",\n \"layout-target-exists\",\n \"no-index-as-identity\",\n \"field-exists-in-layout\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[].columns[].items\",\n \"sections[].rows[].columns[].fields\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.visualBlock.add\",\n \"title\": \"Adicionar bloco visual\",\n \"scope\": \"column\",\n \"targetKind\": \"column\",\n \"target\": {\n \"kind\": \"column\",\n \"resolver\": \"column-by-id-in-row\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"document\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"document\": {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"version\",\n \"nodes\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"praxis.rich-content\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"nodes\": {\n \"type\": \"array\"\n }\n }\n },\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"default\": \"block\"\n },\n \"rootClassName\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"index\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-visual-block-add\",\n \"handlerContract\": {\n \"reads\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items\"\n ],\n \"writes\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"identityKeys\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.sectionId\",\n \"target.rowId\",\n \"target.columnId\",\n \"id\",\n \"document\"\n ],\n \"properties\": {\n \"target.sectionId\": {\n \"type\": \"string\"\n },\n \"target.rowId\": {\n \"type\": \"string\"\n },\n \"target.columnId\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"document\": {\n \"type\": \"object\"\n },\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"rootClassName\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"index\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"target-layout-location-not-found\",\n \"duplicate-visual-block-id\",\n \"invalid-rich-content-document\"\n ],\n \"description\": \"Adds a richContent layout item into sections[].rows[].columns[].items[] by stable section, row, and column ids.\"\n }\n }\n ],\n \"validators\": [\n \"layout-target-exists\",\n \"visual-block-id-unique\",\n \"rich-content-document-valid\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.visualBlock.update\",\n \"title\": \"Atualizar bloco visual\",\n \"scope\": \"layout\",\n \"targetKind\": \"visualBlock\",\n \"target\": {\n \"kind\": \"visualBlock\",\n \"resolver\": \"layout-item-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"document\": {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"version\",\n \"nodes\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"praxis.rich-content\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"nodes\": {\n \"type\": \"array\"\n }\n }\n },\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"rootClassName\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-visual-block-update\",\n \"handlerContract\": {\n \"reads\": [\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"writes\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"identityKeys\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.itemId\"\n ],\n \"properties\": {\n \"target.itemId\": {\n \"type\": \"string\"\n },\n \"document\": {\n \"type\": \"object\"\n },\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"rootClassName\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"failureModes\": [\n \"target-visual-block-not-found\",\n \"invalid-rich-content-document\"\n ],\n \"description\": \"Updates a richContent layout item by stable layout item id without touching fieldMetadata or form submit payload.\"\n }\n }\n ],\n \"validators\": [\n \"visual-block-exists\",\n \"rich-content-document-valid\",\n \"editor-round-trip-preserve\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.visualBlock.move\",\n \"title\": \"Mover bloco visual\",\n \"scope\": \"layout\",\n \"targetKind\": \"visualBlock\",\n \"target\": {\n \"kind\": \"visualBlock\",\n \"resolver\": \"layout-item-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"targetSectionId\",\n \"targetRowId\",\n \"targetColumnId\"\n ],\n \"properties\": {\n \"targetSectionId\": {\n \"type\": \"string\"\n },\n \"targetRowId\": {\n \"type\": \"string\"\n },\n \"targetColumnId\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-visual-block-move\",\n \"handlerContract\": {\n \"reads\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"writes\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"identityKeys\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.itemId\",\n \"targetSectionId\",\n \"targetRowId\",\n \"targetColumnId\"\n ],\n \"properties\": {\n \"target.itemId\": {\n \"type\": \"string\"\n },\n \"targetSectionId\": {\n \"type\": \"string\"\n },\n \"targetRowId\": {\n \"type\": \"string\"\n },\n \"targetColumnId\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"target-visual-block-not-found\",\n \"target-layout-location-not-found\",\n \"ambiguous-visual-block-target\"\n ],\n \"description\": \"Moves a richContent layout item by stable item, section, row, and column ids; index is insertion position only.\"\n }\n }\n ],\n \"validators\": [\n \"visual-block-exists\",\n \"layout-target-exists\",\n \"no-index-as-identity\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"layout.visualBlock.remove\",\n \"title\": \"Remover bloco visual\",\n \"scope\": \"layout\",\n \"targetKind\": \"visualBlock\",\n \"target\": {\n \"kind\": \"visualBlock\",\n \"resolver\": \"layout-item-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"form-layout-visual-block-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"writes\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"identityKeys\": [\n \"sections[].id\",\n \"sections[].rows[].id\",\n \"sections[].rows[].columns[].id\",\n \"sections[].rows[].columns[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"target.itemId\"\n ],\n \"properties\": {\n \"target.itemId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"target-visual-block-not-found\",\n \"ambiguous-visual-block-target\"\n ],\n \"description\": \"Removes a richContent layout item from sections[].rows[].columns[].items[] without touching fieldMetadata or form submit payload.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"visual-block-exists\"\n ],\n \"affectedPaths\": [\n \"sections[].rows[].columns[].items\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"rule.visibility.add\",\n \"title\": \"Adicionar regra de visibilidade\",\n \"scope\": \"global\",\n \"targetKind\": \"formRule\",\n \"target\": {\n \"kind\": \"formRule\",\n \"resolver\": \"rule-by-id-or-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"type\",\n \"targets\",\n \"condition\",\n \"metadata\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"visibility\",\n \"description\": \"Discriminador de tipo da regra; obrigatório para distinção em formRules[]\"\n },\n \"targetType\": {\n \"enum\": [\n \"field\",\n \"section\",\n \"row\",\n \"column\",\n \"action\",\n \"visualBlock\"\n ],\n \"default\": \"field\"\n },\n \"targets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n \"condition\": {\n \"type\": \"object\",\n \"description\": \"JsonLogic AST. Visual-safe subset: field comparisons with scalar or field operands plus and/or groups. Advanced operators are runtime JSON-only until focused visual round-trip support exists.\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"required\": [\n \"origin\",\n \"reviewStatus\"\n ],\n \"properties\": {\n \"origin\": {\n \"const\": \"llm\",\n \"description\": \"Origem obrigatória para regra sugerida por IA.\"\n },\n \"reviewStatus\": {\n \"const\": \"pending\",\n \"description\": \"Toda regra criada pela IA entra pendente de revisão humana.\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"formRules[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"rule-id-unique\",\n \"rule-target-refs-exist\",\n \"json-logic-valid\"\n ],\n \"affectedPaths\": [\n \"formRules[]\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"rule.validation.add\",\n \"title\": \"Adicionar regra de validação\",\n \"scope\": \"global\",\n \"targetKind\": \"formRule\",\n \"target\": {\n \"kind\": \"formRule\",\n \"resolver\": \"rule-by-id-or-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"type\",\n \"targets\",\n \"condition\",\n \"message\",\n \"metadata\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"validation\",\n \"description\": \"Discriminador de tipo da regra; obrigatório para distinção em formRules[]\"\n },\n \"targetType\": {\n \"enum\": [\n \"field\",\n \"section\",\n \"row\",\n \"column\",\n \"action\",\n \"visualBlock\"\n ],\n \"default\": \"field\"\n },\n \"targets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n \"condition\": {\n \"type\": \"object\",\n \"description\": \"JsonLogic AST; quando true, exibe mensagem de erro. Visual-safe subset: field comparisons with scalar or field operands plus and/or groups. Advanced operators are runtime JSON-only until focused visual round-trip support exists.\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"Mensagem de erro a exibir ao usuário\"\n },\n \"level\": {\n \"enum\": [\n \"error\",\n \"warning\"\n ],\n \"default\": \"error\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"required\": [\n \"origin\",\n \"reviewStatus\"\n ],\n \"properties\": {\n \"origin\": {\n \"const\": \"llm\",\n \"description\": \"Origem obrigatória para regra sugerida por IA.\"\n },\n \"reviewStatus\": {\n \"const\": \"pending\",\n \"description\": \"Toda regra criada pela IA entra pendente de revisão humana.\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"formRules[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"rule-id-unique\",\n \"rule-target-refs-exist\",\n \"json-logic-valid\"\n ],\n \"affectedPaths\": [\n \"formRules[]\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"rule.computedValue.add\",\n \"title\": \"Adicionar regra de valor calculado\",\n \"scope\": \"global\",\n \"targetKind\": \"formRule\",\n \"target\": {\n \"kind\": \"formRule\",\n \"resolver\": \"rule-by-id-or-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"type\",\n \"targets\",\n \"condition\",\n \"value\",\n \"metadata\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"computedValue\",\n \"description\": \"Discriminador de regra que escreve effect.properties.value em formRules[].\"\n },\n \"targetType\": {\n \"const\": \"field\",\n \"description\": \"Valor calculado só é materializado em FormControl de campo.\"\n },\n \"targets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n \"condition\": {\n \"type\": \"object\",\n \"description\": \"JsonLogic AST; quando true aplica value, quando false aplica valueWhenFalse se informado. Computed expressions are runtime JSON-only unless a focused visual round-trip path exists.\"\n },\n \"value\": {\n \"type\": \"object\",\n \"description\": \"Envelope obrigatório e fechado: exatamente { expression: <JsonLogic> } para cálculo ou exatamente { literal: <valor> } para valor literal estruturado.\",\n \"oneOf\": [\n {\n \"required\": [\n \"expression\"\n ],\n \"not\": {\n \"required\": [\n \"literal\"\n ]\n },\n \"additionalProperties\": false\n },\n {\n \"required\": [\n \"literal\"\n ],\n \"not\": {\n \"required\": [\n \"expression\"\n ]\n },\n \"additionalProperties\": false\n }\n ],\n \"properties\": {\n \"expression\": {\n \"type\": \"object\",\n \"description\": \"JsonLogic AST avaliado contra o contexto do formulário.\"\n },\n \"literal\": {\n \"description\": \"Valor literal, inclusive objeto estruturado.\"\n }\n }\n },\n \"valueWhenFalse\": {\n \"type\": \"object\",\n \"description\": \"Envelope opcional e fechado aplicado no ramo falso. Use exatamente { literal: null } para limpar o valor.\",\n \"oneOf\": [\n {\n \"required\": [\n \"expression\"\n ],\n \"not\": {\n \"required\": [\n \"literal\"\n ]\n },\n \"additionalProperties\": false\n },\n {\n \"required\": [\n \"literal\"\n ],\n \"not\": {\n \"required\": [\n \"expression\"\n ]\n },\n \"additionalProperties\": false\n }\n ],\n \"properties\": {\n \"expression\": {\n \"type\": \"object\",\n \"description\": \"JsonLogic AST avaliado contra o contexto do formulário.\"\n },\n \"literal\": {\n \"description\": \"Valor literal, inclusive null.\"\n }\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"required\": [\n \"origin\",\n \"reviewStatus\"\n ],\n \"properties\": {\n \"origin\": {\n \"const\": \"llm\",\n \"description\": \"Origem obrigatória para regra sugerida por IA.\"\n },\n \"reviewStatus\": {\n \"const\": \"pending\",\n \"description\": \"Toda regra criada pela IA entra pendente de revisão humana.\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"formRules[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"rule-id-unique\",\n \"rule-target-refs-exist\",\n \"json-logic-valid\",\n \"computed-value-envelope-valid\"\n ],\n \"affectedPaths\": [\n \"formRules[]\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"rule.visualBlockGuidance.add\",\n \"title\": \"Materializar orientação visual derivada\",\n \"scope\": \"global\",\n \"targetKind\": \"formRule\",\n \"target\": {\n \"kind\": \"formRule\",\n \"resolver\": \"rule-by-id-or-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"type\",\n \"targetType\",\n \"targets\",\n \"condition\",\n \"properties\",\n \"metadata\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"visualBlockGuidance\",\n \"description\": \"Discriminador para regra de orientação visual derivada em formRules[].\"\n },\n \"targetType\": {\n \"const\": \"visualBlock\",\n \"description\": \"Projeções visuais sempre apontam para richContent layout items e não representam a decisão canônica.\"\n },\n \"context\": {\n \"enum\": [\n \"notification\",\n \"style\"\n ],\n \"default\": \"notification\"\n },\n \"targets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n \"condition\": {\n \"type\": \"object\",\n \"description\": \"JsonLogic AST; quando true aplica properties, quando false aplica propertiesWhenFalse. Visual-safe subset: field comparisons with scalar or field operands plus and/or groups. Advanced operators are runtime JSON-only until focused visual round-trip support exists.\"\n },\n \"properties\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"hidden\": {\n \"type\": \"boolean\"\n },\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"className\": {\n \"type\": \"string\"\n },\n \"rootClassName\": {\n \"type\": \"string\"\n },\n \"style\": {\n \"type\": \"object\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"textNodeId\": {\n \"type\": \"string\"\n },\n \"titleNodeId\": {\n \"type\": \"string\"\n },\n \"messageNodeId\": {\n \"type\": \"string\"\n }\n },\n \"description\": \"Use apenas propriedades suportadas por RULE_PROPERTY_SCHEMA.visualBlock; não escreva document, HTML, handlers, dados de payload ou regra de negócio canônica.\"\n },\n \"propertiesWhenFalse\": {\n \"type\": \"object\",\n \"properties\": {\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"hidden\": {\n \"type\": \"boolean\"\n },\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"className\": {\n \"type\": \"string\"\n },\n \"rootClassName\": {\n \"type\": \"string\"\n },\n \"style\": {\n \"type\": \"object\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"textNodeId\": {\n \"type\": \"string\"\n },\n \"titleNodeId\": {\n \"type\": \"string\"\n },\n \"messageNodeId\": {\n \"type\": \"string\"\n }\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"required\": [\n \"origin\",\n \"reviewStatus\"\n ],\n \"properties\": {\n \"origin\": {\n \"const\": \"llm\",\n \"description\": \"Origem obrigatória para regra sugerida por IA.\"\n },\n \"reviewStatus\": {\n \"const\": \"pending\",\n \"description\": \"Toda regra criada pela IA entra pendente de revisão humana.\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"formRules[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"rule-id-unique\",\n \"visual-block-exists\",\n \"json-logic-valid\"\n ],\n \"affectedPaths\": [\n \"formRules[]\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"rule.remove\",\n \"title\": \"Remover regra\",\n \"scope\": \"rule\",\n \"targetKind\": \"formRule\",\n \"target\": {\n \"kind\": \"formRule\",\n \"resolver\": \"rule-by-id-or-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"effects\": [\n {\n \"kind\": \"remove-by-key\",\n \"path\": \"formRules[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"rule-exists\"\n ],\n \"affectedPaths\": [\n \"formRules[]\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-exists\"\n ]\n },\n {\n \"operationId\": \"action.submit.configure\",\n \"title\": \"Configurar botão de envio\",\n \"scope\": \"global\",\n \"targetKind\": \"formAction\",\n \"target\": {\n \"kind\": \"formAction\",\n \"resolver\": \"action-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"color\": {\n \"enum\": [\n \"primary\",\n \"accent\",\n \"warn\",\n \"basic\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"actions.submit\"\n }\n ],\n \"validators\": [\n \"editor-round-trip-preserve\"\n ],\n \"affectedPaths\": [\n \"actions.submit\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"action.cancel.configure\",\n \"title\": \"Configurar botão de cancelar\",\n \"scope\": \"global\",\n \"targetKind\": \"formAction\",\n \"target\": {\n \"kind\": \"formAction\",\n \"resolver\": \"action-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"color\": {\n \"enum\": [\n \"primary\",\n \"accent\",\n \"warn\",\n \"basic\"\n ]\n },\n \"navigateTo\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"actions.cancel\"\n }\n ],\n \"validators\": [\n \"editor-round-trip-preserve\"\n ],\n \"affectedPaths\": [\n \"actions.cancel\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"action.reset.configure\",\n \"title\": \"Configurar botão de reset\",\n \"scope\": \"global\",\n \"targetKind\": \"formAction\",\n \"target\": {\n \"kind\": \"formAction\",\n \"resolver\": \"action-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"color\": {\n \"enum\": [\n \"primary\",\n \"accent\",\n \"warn\",\n \"basic\"\n ]\n },\n \"confirmBeforeReset\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"actions.reset\"\n }\n ],\n \"validators\": [\n \"editor-round-trip-preserve\"\n ],\n \"affectedPaths\": [\n \"actions.reset\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"field-exists\",\n \"level\": \"error\",\n \"code\": \"DF001\",\n \"description\": \"O campo alvo deve existir em fieldMetadata.\"\n },\n {\n \"validatorId\": \"field-name-unique\",\n \"level\": \"error\",\n \"code\": \"DF002\",\n \"description\": \"Nomes de campos devem ser únicos em fieldMetadata.\"\n },\n {\n \"validatorId\": \"section-id-unique\",\n \"level\": \"error\",\n \"code\": \"DF003\",\n \"description\": \"IDs de seções devem ser únicos em sections[].\"\n },\n {\n \"validatorId\": \"section-exists\",\n \"level\": \"error\",\n \"code\": \"DF004\",\n \"description\": \"A seção alvo deve existir em sections[].\"\n },\n {\n \"validatorId\": \"field-exists-in-layout\",\n \"level\": \"warning\",\n \"code\": \"DF005\",\n \"description\": \"Campo definido em fieldMetadata mas ausente no layout.\"\n },\n {\n \"validatorId\": \"local-schema-name-no-collision\",\n \"level\": \"error\",\n \"code\": \"DF006\",\n \"description\": \"Nome de campo local não pode colidir com campo schema-backed existente.\"\n },\n {\n \"validatorId\": \"field-is-local\",\n \"level\": \"error\",\n \"code\": \"DF007\",\n \"description\": \"Operação restrita a campos locais (source:\\\"local\\\"). Campo schema-backed não pode ser removido ou ter submitPolicy alterada.\"\n },\n {\n \"validatorId\": \"rule-id-unique\",\n \"level\": \"error\",\n \"code\": \"DF008\",\n \"description\": \"IDs de regras devem ser únicos em formRules[].\"\n },\n {\n \"validatorId\": \"rule-exists\",\n \"level\": \"error\",\n \"code\": \"DF009\",\n \"description\": \"A regra alvo deve existir em formRules[].\"\n },\n {\n \"validatorId\": \"rule-target-refs-exist\",\n \"level\": \"error\",\n \"code\": \"DF010\",\n \"description\": \"Todos os targets da regra devem referenciar campos, seções, ações ou blocos visuais existentes.\"\n },\n {\n \"validatorId\": \"computed-value-envelope-valid\",\n \"level\": \"error\",\n \"code\": \"DF023\",\n \"description\": \"Valores calculados devem usar envelope explícito e fechado, exatamente { expression: <JsonLogic> } ou exatamente { literal: <valor> }; objetos literais sem envelope ou envelopes com chaves extras são ambíguos.\"\n },\n {\n \"validatorId\": \"json-logic-valid\",\n \"level\": \"error\",\n \"code\": \"DF011\",\n \"description\": \"A expressão JsonLogic deve ser um AST válido (suporte canônico à spec JsonLogic).\"\n },\n {\n \"validatorId\": \"layout-target-exists\",\n \"level\": \"error\",\n \"code\": \"DF012\",\n \"description\": \"A seção/linha/coluna de destino devem existir antes de mover o campo.\"\n },\n {\n \"validatorId\": \"no-index-as-identity\",\n \"level\": \"error\",\n \"code\": \"DF013\",\n \"description\": \"Operações de layout não devem usar índice de array como identidade canônica; use IDs estáveis.\"\n },\n {\n \"validatorId\": \"row-exists\",\n \"level\": \"error\",\n \"code\": \"DF014\",\n \"description\": \"A linha alvo deve existir na seção especificada.\"\n },\n {\n \"validatorId\": \"row-id-unique-in-section\",\n \"level\": \"error\",\n \"code\": \"DF015\",\n \"description\": \"O id da nova linha deve ser único dentro da seção alvo.\"\n },\n {\n \"validatorId\": \"column-id-unique-in-row\",\n \"level\": \"error\",\n \"code\": \"DF016\",\n \"description\": \"O id da nova coluna deve ser único dentro da linha alvo.\"\n },\n {\n \"validatorId\": \"control-type-compatible\",\n \"level\": \"error\",\n \"code\": \"DF017\",\n \"description\": \"O tipo de controle deve ser compatível com o tipo de dado do campo.\"\n },\n {\n \"validatorId\": \"option-source-valid\",\n \"level\": \"error\",\n \"code\": \"DF018\",\n \"description\": \"A fonte de opções deve ser válida para o tipo de controle especificado.\"\n },\n {\n \"validatorId\": \"editor-round-trip-preserve\",\n \"level\": \"error\",\n \"code\": \"DF019\",\n \"description\": \"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"\n },\n {\n \"validatorId\": \"visual-block-exists\",\n \"level\": \"error\",\n \"code\": \"DF020\",\n \"description\": \"O bloco visual alvo deve existir como item kind:\\\"richContent\\\" em sections[].rows[].columns[].items[].\"\n },\n {\n \"validatorId\": \"visual-block-id-unique\",\n \"level\": \"error\",\n \"code\": \"DF021\",\n \"description\": \"IDs de blocos visuais devem ser unicos entre os itens de layout do formulario.\"\n },\n {\n \"validatorId\": \"rich-content-document-valid\",\n \"level\": \"error\",\n \"code\": \"DF022\",\n \"description\": \"O document do bloco visual deve seguir o contrato RichContentDocument canonico.\"\n }\n ],\n \"roundTripRequirements\": [\n \"strip-undefined\",\n \"normalize-json-logic\",\n \"stable-field-order\",\n \"preserve-column-layout-items\",\n \"preserve-local-field-source\",\n \"preserve-section-row-column-ids\"\n ],\n \"examples\": [\n {\n \"id\": \"add-local-transient-field\",\n \"request\": \"Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\n \"operationId\": \"field.local.add\",\n \"params\": {\n \"name\": \"notasInternas\",\n \"label\": \"Notas Internas\",\n \"controlType\": \"textarea\",\n \"source\": \"local\",\n \"transient\": true,\n \"submitPolicy\": \"omit\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"relabel-schema-backed-field\",\n \"request\": \"Mudar o label do campo email para \\\"E-mail Corporativo\\\"\",\n \"operationId\": \"field.label.set\",\n \"target\": \"email\",\n \"params\": {\n \"label\": \"E-mail Corporativo\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-field-to-column\",\n \"request\": \"Mover campo telefone para a primeira coluna da seção de contato\",\n \"operationId\": \"layout.field.move\",\n \"target\": \"telefone\",\n \"params\": {\n \"targetSectionId\": \"secao-contato\",\n \"targetRowId\": \"row-1\",\n \"targetColumnId\": \"col-1\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-visual-block\",\n \"request\": \"Adicionar um aviso visual antes dos campos de contato\",\n \"operationId\": \"layout.visualBlock.add\",\n \"target\": \"col-contato\",\n \"params\": {\n \"id\": \"aviso-contato\",\n \"document\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": [\n {\n \"type\": \"text\",\n \"text\": \"Confira os dados antes de salvar.\"\n }\n ]\n },\n \"layout\": \"block\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-visual-block\",\n \"request\": \"Mover o aviso visual para a segunda coluna da secao de contato\",\n \"operationId\": \"layout.visualBlock.move\",\n \"target\": \"aviso-contato\",\n \"params\": {\n \"targetSectionId\": \"secao-contato\",\n \"targetRowId\": \"row-1\",\n \"targetColumnId\": \"col-2\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-visibility-rule\",\n \"request\": \"Ocultar o campo cpf quando o tipo de pessoa for jurídica\",\n \"operationId\": \"rule.visibility.add\",\n \"params\": {\n \"id\": \"ocultar-cpf-pj\",\n \"name\": \"Ocultar CPF para PJ\",\n \"targetType\": \"field\",\n \"targets\": [\n \"cpf\"\n ],\n \"condition\": {\n \"==\": [\n {\n \"var\": \"tipoPessoa\"\n },\n \"juridica\"\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-computed-value-rule\",\n \"request\": \"Calcular idade a partir da data de nascimento e limpar quando a data estiver vazia\",\n \"operationId\": \"rule.computedValue.add\",\n \"params\": {\n \"id\": \"birth-date-computes-age\",\n \"name\": \"Calcular idade\",\n \"type\": \"computedValue\",\n \"targetType\": \"field\",\n \"targets\": [\n \"age\"\n ],\n \"condition\": {\n \"!\": [\n {\n \"isBlank\": [\n {\n \"var\": \"birthDate\"\n }\n ]\n }\n ]\n },\n \"value\": {\n \"expression\": {\n \"yearsSince\": [\n {\n \"var\": \"birthDate\"\n }\n ]\n }\n },\n \"valueWhenFalse\": {},\n \"metadata\": {\n \"origin\": \"llm\",\n \"reviewStatus\": \"pending\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-visual-block-guidance-rule\",\n \"request\": \"Materializar no aviso visual a decisao governada que exige aprovacao de compliance para fornecedor com risco critico\",\n \"operationId\": \"rule.visualBlockGuidance.add\",\n \"params\": {\n \"id\": \"supplier-risk-guidance\",\n \"name\": \"Supplier risk guidance\",\n \"type\": \"visualBlockGuidance\",\n \"targetType\": \"visualBlock\",\n \"targets\": [\n \"supplier-risk-notice\"\n ],\n \"condition\": {\n \"===\": [\n {\n \"var\": \"riscoFornecedor\"\n },\n \"critico\"\n ]\n },\n \"properties\": {\n \"message\": \"Fornecedor critico exige aprovacao de compliance antes de emitir o pedido.\",\n \"messageNodeId\": \"message\",\n \"className\": \"supplier-risk-notice supplier-risk-notice--critical\"\n },\n \"propertiesWhenFalse\": {\n \"message\": \"Fornecedor sem bloqueios criticos para este pedido.\",\n \"messageNodeId\": \"message\",\n \"className\": \"supplier-risk-notice supplier-risk-notice--neutral\"\n },\n \"metadata\": {\n \"origin\": \"llm\",\n \"reviewStatus\": \"pending\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unknown-field\",\n \"request\": \"Alterar o label do campo \\\"campoInexistente\\\"\",\n \"operationId\": \"field.label.set\",\n \"target\": \"campoInexistente\",\n \"params\": {\n \"label\": \"Novo Label\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"require-confirmation-remove-field\",\n \"request\": \"Remover o campo auxiliar \\\"notasInternas\\\"\",\n \"operationId\": \"field.local.remove\",\n \"target\": \"notasInternas\",\n \"isPositive\": true\n },\n {\n \"id\": \"require-confirmation-remove-section\",\n \"request\": \"Remover a seção \\\"Dados Adicionais\\\"\",\n \"operationId\": \"layout.section.remove\",\n \"target\": \"secao-dados-adicionais\",\n \"isPositive\": true\n },\n {\n \"id\": \"round-trip-no-drift\",\n \"request\": \"Salvar e reabrir o formulário editado sem drift de configuração\",\n \"operationId\": \"field.label.set\",\n \"target\": \"nome\",\n \"params\": {\n \"label\": \"Nome Completo\"\n },\n \"isPositive\": true\n }\n ]\n}",
8489
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
8676
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
8490
8677
  "contentHash": "effb374416943bb3ff473cfefc2022de6e2c6f7ad59f29d22a3986970d38ef3d",
8491
8678
  "sourceKind": "component_definition",
8492
8679
  "sourceId": "praxis-dynamic-form",
@@ -8496,7 +8683,7 @@
8496
8683
  "chunkIndex": 3,
8497
8684
  "chunkKind": "context_pack",
8498
8685
  "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"fieldMetadata[].controlType\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"input\",\n \"label\": \"Input\"\n },\n {\n \"value\": \"textarea\",\n \"label\": \"Textarea\"\n },\n {\n \"value\": \"email\",\n \"label\": \"Email\"\n },\n {\n \"value\": \"password\",\n \"label\": \"Password\"\n },\n {\n \"value\": \"search\",\n \"label\": \"Search\"\n },\n {\n \"value\": \"url\",\n \"label\": \"URL\"\n },\n {\n \"value\": \"phone\",\n \"label\": \"Phone\"\n },\n {\n \"value\": \"cpfCnpjInput\",\n \"label\": \"CPF/CNPJ\"\n },\n {\n \"value\": \"numericTextBox\",\n \"label\": \"Number\"\n },\n {\n \"value\": \"currency\",\n \"label\": \"Currency\"\n },\n {\n \"value\": \"priceRange\",\n \"label\": \"Price range\"\n },\n {\n \"value\": \"date\",\n \"label\": \"Date picker\"\n },\n {\n \"value\": \"dateRange\",\n \"label\": \"Date range\"\n },\n {\n \"value\": \"dateInput\",\n \"label\": \"Date input\"\n },\n {\n \"value\": \"dateTime\",\n \"label\": \"Datetime\"\n },\n {\n \"value\": \"dateTimeRange\",\n \"label\": \"Datetime range\"\n },\n {\n \"value\": \"dateTimeLocal\",\n \"label\": \"Datetime local\"\n },\n {\n \"value\": \"time\",\n \"label\": \"Time input\"\n },\n {\n \"value\": \"timePicker\",\n \"label\": \"Time picker\"\n },\n {\n \"value\": \"timeRange\",\n \"label\": \"Time range\"\n },\n {\n \"value\": \"week\",\n \"label\": \"Week input\"\n },\n {\n \"value\": \"month\",\n \"label\": \"Month input\"\n },\n {\n \"value\": \"year\",\n \"label\": \"Year input\"\n },\n {\n \"value\": \"select\",\n \"label\": \"Select\"\n },\n {\n \"value\": \"multiSelect\",\n \"label\": \"Multi select\"\n },\n {\n \"value\": \"multiSelectTree\",\n \"label\": \"Multi select tree\"\n },\n {\n \"value\": \"treeSelect\",\n \"label\": \"Tree select\"\n },\n {\n \"value\": \"transferList\",\n \"label\": \"Transfer list\"\n },\n {\n \"value\": \"autoComplete\",\n \"label\": \"Autocomplete\"\n },\n {\n \"value\": \"searchable-select\",\n \"label\": \"Searchable select\"\n },\n {\n \"value\": \"async-select\",\n \"label\": \"Async select\"\n },\n {\n \"value\": \"radio\",\n \"label\": \"Radio group\"\n },\n {\n \"value\": \"checkbox\",\n \"label\": \"Checkbox group\"\n },\n {\n \"value\": \"selectionList\",\n \"label\": \"Selection list\"\n },\n {\n \"value\": \"toggle\",\n \"label\": \"Toggle\"\n },\n {\n \"value\": \"buttonToggle\",\n \"label\": \"Button toggle\"\n },\n {\n \"value\": \"slider\",\n \"label\": \"Slider\"\n },\n {\n \"value\": \"rangeSlider\",\n \"label\": \"Range slider\"\n },\n {\n \"value\": \"rating\",\n \"label\": \"Rating\"\n },\n {\n \"value\": \"chipInput\",\n \"label\": \"Chips\"\n },\n {\n \"value\": \"chipList\",\n \"label\": \"Chip list\"\n },\n {\n \"value\": \"upload\",\n \"label\": \"File upload\"\n },\n {\n \"value\": \"color\",\n \"label\": \"Color input\"\n },\n {\n \"value\": \"colorPicker\",\n \"label\": \"Color picker\"\n },\n {\n \"value\": \"cronBuilder\",\n \"label\": \"Cron builder\"\n }\n ]\n },\n \"fieldMetadata[].source\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"schema\",\n \"label\": \"Schema field\"\n },\n {\n \"value\": \"local\",\n \"label\": \"Local field\"\n }\n ]\n },\n \"fieldMetadata[].submitPolicy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"omit\",\n \"label\": \"Omit from submit payload\"\n },\n {\n \"value\": \"include\",\n \"label\": \"Include in submit payload\"\n },\n {\n \"value\": \"includeWhenDirty\",\n \"label\": \"Include only when dirty\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"fill\",\n \"label\": \"Fill\"\n },\n {\n \"value\": \"outline\",\n \"label\": \"Outline\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.floatLabel\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"always\",\n \"label\": \"Always\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.density\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"comfortable\",\n \"label\": \"Comfortable\"\n },\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"dense\",\n \"label\": \"Dense\"\n }\n ]\n },\n \"actions.position\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"left\",\n \"label\": \"Left\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"right\",\n \"label\": \"Right\"\n },\n {\n \"value\": \"justified\",\n \"label\": \"Justified\"\n },\n {\n \"value\": \"split\",\n \"label\": \"Split\"\n }\n ]\n },\n \"actions.orientation\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"horizontal\",\n \"label\": \"Horizontal\"\n },\n {\n \"value\": \"vertical\",\n \"label\": \"Vertical\"\n }\n ]\n },\n \"actions.spacing\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"normal\",\n \"label\": \"Normal\"\n },\n {\n \"value\": \"spacious\",\n \"label\": \"Spacious\"\n }\n ]\n },\n \"actions.placement\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"insideLastSection\",\n \"label\": \"Inside last section\"\n },\n {\n \"value\": \"afterSections\",\n \"label\": \"After sections\"\n },\n {\n \"value\": \"top\",\n \"label\": \"Top\"\n }\n ]\n },\n \"actions.submit.type\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"button\",\n \"label\": \"Button\"\n },\n {\n \"value\": \"submit\",\n \"label\": \"Submit\"\n },\n {\n \"value\": \"reset\",\n \"label\": \"Reset\"\n }\n ]\n },\n \"actions.submit.variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"raised\",\n \"label\": \"Raised\"\n },\n {\n \"value\": \"stroked\",\n \"label\": \"Stroked\"\n },\n {\n \"value\": \"flat\",\n \"label\": \"Flat\"\n },\n {\n \"value\": \"fab\",\n \"label\": \"Fab\"\n }\n ]\n },\n \"actions.submit.size\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"small\",\n \"label\": \"Small\"\n },\n {\n \"value\": \"medium\",\n \"label\": \"Medium\"\n },\n {\n \"value\": \"large\",\n \"label\": \"Large\"\n }\n ]\n },\n \"actions.submit.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n },\n {\n \"value\": \"basic\",\n \"label\": \"Basic\"\n }\n ]\n },\n \"sections[].headerAlign\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n }\n ]\n },\n \"sections[].appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"card\",\n \"label\": \"Card\"\n },\n {\n \"value\": \"plain\",\n \"label\": \"Plain\"\n },\n {\n \"value\": \"step\",\n \"label\": \"Step\"\n }\n ]\n },\n \"sections[].sectionHeader.mode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"icon\",\n \"label\": \"Icon\"\n },\n {\n \"value\": \"avatar-image\",\n \"label\": \"Avatar image\"\n },\n {\n \"value\": \"avatar-initials\",\n \"label\": \"Avatar initials\"\n },\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n }\n ]\n },\n \"sections[].sectionHeader.emptyState\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"placeholder-avatar\",\n \"label\": \"Neutral placeholder\"\n },\n {\n \"value\": \"fallback-icon\",\n \"label\": \"Fallback icon\"\n },\n {\n \"value\": \"none\",\n \"label\": \"None\"\n }\n ]\n },\n \"sections[].sectionHeader.size\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"sm\",\n \"label\": \"Small\"\n },\n {\n \"value\": \"md\",\n \"label\": \"Medium\"\n },\n {\n \"value\": \"lg\",\n \"label\": \"Large\"\n }\n ]\n },\n \"sections[].stepLabel\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"Dados básicos\",\n \"label\": \"Dados básicos\"\n },\n {\n \"value\": \"Detalhes\",\n \"label\": \"Detalhes\"\n },\n {\n \"value\": \"Confirmação\",\n \"label\": \"Confirmação\"\n }\n ]\n },\n \"sections[].titleStyle\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"titleLarge\",\n \"label\": \"Title large\"\n },\n {\n \"value\": \"titleMedium\",\n \"label\": \"Title medium\"\n },\n {\n \"value\": \"titleSmall\",\n \"label\": \"Title small\"\n },\n {\n \"value\": \"headlineSmall\",\n \"label\": \"Headline small\"\n }\n ]\n },\n \"sections[].descriptionStyle\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"bodyLarge\",\n \"label\": \"Body large\"\n },\n {\n \"value\": \"bodyMedium\",\n \"label\": \"Body medium\"\n },\n {\n \"value\": \"bodySmall\",\n \"label\": \"Body small\"\n }\n ]\n },\n \"sections[].rows[].columns[].align\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n },\n {\n \"value\": \"stretch\",\n \"label\": \"Stretch\"\n }\n ]\n },\n \"sections[].rows[].columns[].items[].kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n },\n {\n \"value\": \"richContent\",\n \"label\": \"Rich content\"\n }\n ]\n },\n \"sections[].rows[].columns[].items[].layout\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"block\",\n \"label\": \"Block\"\n },\n {\n \"value\": \"inline\",\n \"label\": \"Inline\"\n }\n ]\n },\n \"formRules[].targetType\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n },\n {\n \"value\": \"section\",\n \"label\": \"Section\"\n },\n {\n \"value\": \"row\",\n \"label\": \"Row\"\n },\n {\n \"value\": \"column\",\n \"label\": \"Column\"\n },\n {\n \"value\": \"action\",\n \"label\": \"Action\"\n },\n {\n \"value\": \"visualBlock\",\n \"label\": \"Visual block\"\n }\n ]\n },\n \"formRules[].context\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"visibility\",\n \"label\": \"Visibility\"\n },\n {\n \"value\": \"readOnly\",\n \"label\": \"Read only\"\n },\n {\n \"value\": \"style\",\n \"label\": \"Style\"\n },\n {\n \"value\": \"validation\",\n \"label\": \"Validation\"\n },\n {\n \"value\": \"notification\",\n \"label\": \"Notification\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"field.visibility.hide\",\n \"intentExamples\": [\n \"hide field\",\n \"ocultar campo\",\n \"esconder campo\",\n \"invisible\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"hidden\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.visibility.show\",\n \"intentExamples\": [\n \"show field\",\n \"mostrar campo\",\n \"exibir campo\",\n \"visible\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"hidden\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.label.set\",\n \"intentExamples\": [\n \"label\",\n \"rename field\",\n \"renomear campo\",\n \"titulo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.placeholder.set\",\n \"intentExamples\": [\n \"placeholder\",\n \"hint text\",\n \"texto de ajuda\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"placeholder\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.required.enable\",\n \"intentExamples\": [\n \"required\",\n \"obrigatorio\",\n \"mandatory\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"required\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.required.disable\",\n \"intentExamples\": [\n \"optional\",\n \"nao obrigatorio\",\n \"opcional\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"required\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.readonly.enable\",\n \"intentExamples\": [\n \"readonly\",\n \"somente leitura\",\n \"read only\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"readOnly\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.readonly.disable\",\n \"intentExamples\": [\n \"editable\",\n \"editavel\",\n \"read write\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"readOnly\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.disabled.enable\",\n \"intentExamples\": [\n \"disable field\",\n \"desabilitar campo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"disabled\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.disabled.disable\",\n \"intentExamples\": [\n \"enable field\",\n \"habilitar campo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"disabled\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.controlType.set\",\n \"intentExamples\": [\n \"control type\",\n \"tipo de campo\",\n \"controlType\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"controlType\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.icon.prefix.set\",\n \"intentExamples\": [\n \"prefix icon\",\n \"icone prefixo\",\n \"icon before\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"prefixIcon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.icon.suffix.set\",\n \"intentExamples\": [\n \"suffix icon\",\n \"icone sufixo\",\n \"icon after\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"suffixIcon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.title.set\",\n \"intentExamples\": [\n \"section title\",\n \"titulo da secao\",\n \"section name\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"title\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.description.set\",\n \"intentExamples\": [\n \"section description\",\n \"descricao da secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"description\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.add\",\n \"intentExamples\": [\n \"add section\",\n \"adicionar secao\",\n \"nova secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{value}}\",\n \"title\": \"{{value}}\",\n \"rows\": []\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da seção é único e relevante.\"\n },\n {\n \"id\": \"section.remove\",\n \"intentExamples\": [\n \"remove section\",\n \"remover secao\",\n \"excluir secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"_delete\": true\n }\n ]\n },\n \"safetyNotes\": \"Remover uma seção é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"section.order.set\",\n \"intentExamples\": [\n \"order section\",\n \"reordenar secao\",\n \"mover secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"_order\": \"{{value}}\"\n }\n ]\n },\n \"safetyNotes\": \"A reordenação de seções é uma operação que deve ser revisada.\"\n },\n {\n \"id\": \"row.add\",\n \"intentExamples\": [\n \"add row\",\n \"adicionar linha\",\n \"nova linha na secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"rows\": [\n {\n \"id\": \"{{value}}\",\n \"columns\": []\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da linha é único e relevante na seção.\"\n },\n {\n \"id\": \"row.remove\",\n \"intentExamples\": [\n \"remove row\",\n \"remover linha\",\n \"excluir linha da secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"rows\": [\n {\n \"id\": \"{{value}}\",\n \"_delete\": true\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover uma linha é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"column.add\",\n \"intentExamples\": [\n \"add column\",\n \"adicionar coluna\",\n \"nova coluna na linha\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{value}}\",\n \"items\": []\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da coluna é único e relevante na linha.\"\n },\n {\n \"id\": \"column.remove\",\n \"intentExamples\": [\n \"remove column\",\n \"remover coluna\",\n \"excluir coluna da linha\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{value}}\",\n \"_delete\": true\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover uma coluna é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"column.field.add\",\n \"intentExamples\": [\n \"add field to column\",\n \"adicionar campo a coluna\",\n \"colocar campo na coluna\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{target.columnId}}\",\n \"items\": [\n {\n \"kind\": \"field\",\n \"id\": \"field-{{value}}\",\n \"fieldName\": \"{{value}}\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico.\"\n },\n {\n \"id\": \"column.field.remove\",\n \"intentExamples\": [\n \"remove field from column\",\n \"remover campo da coluna\",\n \"tirar campo da coluna\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{target.columnId}}\",\n \"items\": [\n {\n \"kind\": \"field\",\n \"fieldName\": \"{{value}}\",\n \"_remove\": true\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover um campo de uma coluna pode alterar o layout do formulário.\"\n },\n {\n \"id\": \"actions.submit.label.set\",\n \"intentExamples\": [\n \"submit label\",\n \"rotulo salvar\",\n \"texto botao enviar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"submit\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.submit.visible.set\",\n \"intentExamples\": [\n \"show submit\",\n \"esconder salvar\",\n \"visibilidade enviar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"submit\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.cancel.label.set\",\n \"intentExamples\": [\n \"cancel label\",\n \"rotulo cancelar\",\n \"texto botao cancelar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"cancel\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.cancel.visible.set\",\n \"intentExamples\": [\n \"show cancel\",\n \"esconder cancelar\",\n \"visibilidade cancelar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"cancel\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.reset.label.set\",\n \"intentExamples\": [\n \"reset label\",\n \"rotulo resetar\",\n \"texto botao limpar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"reset\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.reset.visible.set\",\n \"intentExamples\": [\n \"show reset\",\n \"esconder reset\",\n \"visibilidade limpar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"reset\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"rule.add.visibility\",\n \"intentExamples\": [\n \"add visibility rule\",\n \"regra de visibilidade\",\n \"campo condicional\"\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{value.id}}\",\n \"name\": \"{{value.name}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{target}}\"\n ],\n \"effect\": {\n \"condition\": \"{{value.condition}}\",\n \"properties\": {\n \"hidden\": false\n },\n \"propertiesWhenFalse\": {\n \"hidden\": true\n }\n }\n }\n ]\n },\n \"safetyNotes\": \"Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao.\"\n },\n {\n \"id\": \"rule.remove\",\n \"intentExamples\": [\n \"remove rule\",\n \"excluir regra\",\n \"apagar regra\"\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{target}}\",\n \"_delete\": true\n }\n ]\n },\n \"safetyNotes\": \"Remover regras pode ter efeitos inesperados no comportamento do formulário.\"\n },\n {\n \"id\": \"rule.add.dependency\",\n \"intentExamples\": [\n \"adicionar dependencia\",\n \"campo depende de\",\n \"mostrar se\",\n \"obrigatorio se\",\n \"desabilitar se\",\n \"campo condicional\"\n ],\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"operation\": \"create\",\n \"params\": [\n {\n \"name\": \"triggerField\",\n \"type\": \"STRING\",\n \"description\": \"Campo que controla a regra (ex: tipoPessoa)\"\n },\n {\n \"name\": \"conditionValue\",\n \"type\": \"STRING\",\n \"description\": \"Valor do trigger para ativar a regra (ex: \\\"Jurídica\\\")\"\n },\n {\n \"name\": \"targetField\",\n \"type\": \"STRING\",\n \"description\": \"Campo afetado pela regra (ex: cnpj)\"\n },\n {\n \"name\": \"effectType\",\n \"type\": \"ENUM\",\n \"options\": [\n \"visibility\",\n \"required\",\n \"disabled\"\n ],\n \"description\": \"Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)\"\n }\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"rule_{{params.triggerField}}_{{params.targetField}}\",\n \"name\": \"Dependência: {{params.targetField}} depende de {{params.triggerField}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{params.targetField}}\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"{{params.triggerField}}\"\n },\n \"{{params.conditionValue}}\"\n ]\n },\n \"properties\": {\n \"hidden\": \"{{params.effectType === 'visibility' ? false : undefined}}\",\n \"required\": \"{{params.effectType === 'required' ? true : undefined}}\",\n \"disabled\": \"{{params.effectType === 'disabled' ? true : undefined}}\"\n },\n \"propertiesWhenFalse\": {\n \"hidden\": \"{{params.effectType === 'visibility' ? true : undefined}}\",\n \"required\": \"{{params.effectType === 'required' ? false : undefined}}\",\n \"disabled\": \"{{params.effectType === 'disabled' ? false : undefined}}\"\n }\n }\n }\n ]\n },\n \"safetyNotes\": \"Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples.\"\n },\n {\n \"id\": \"rule.add.custom\",\n \"intentExamples\": [\n \"adicionar regra customizada\",\n \"regra complexa\",\n \"logica de formulario\"\n ],\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"operation\": \"create\",\n \"params\": [\n {\n \"name\": \"id\",\n \"type\": \"STRING\",\n \"description\": \"ID único da regra\"\n },\n {\n \"name\": \"condition\",\n \"type\": \"STRING\",\n \"description\": \"Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \\\"and\\\": [{ \\\">\\\": [{ \\\"var\\\": \\\"idade\\\" }, 18] }, { \\\"==\\\": [{ \\\"var\\\": \\\"possuiHabilitacao\\\" }, true] }] })\"\n },\n {\n \"name\": \"targetField\",\n \"type\": \"STRING\",\n \"description\": \"Campo afetado\"\n },\n {\n \"name\": \"propertyName\",\n \"type\": \"STRING\",\n \"description\": \"Propriedade afetada (hidden, required, disabled, readOnly)\"\n },\n {\n \"name\": \"valueIfTrue\",\n \"type\": \"BOOLEAN\",\n \"description\": \"Valor se a condição for verdadeira\"\n },\n {\n \"name\": \"valueIfFalse\",\n \"type\": \"BOOLEAN\",\n \"description\": \"Valor se a condição for falsa\"\n }\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{params.id}}\",\n \"name\": \"Regra Customizada: {{params.id}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{params.targetField}}\"\n ],\n \"effect\": {\n \"condition\": \"{{params.condition}}\",\n \"properties\": {\n \"{{params.propertyName}}\": \"{{params.valueIfTrue}}\"\n },\n \"propertiesWhenFalse\": {\n \"{{params.propertyName}}\": \"{{params.valueIfFalse}}\"\n }\n }\n }\n ]\n }\n }\n ],\n \"fieldResolvers\": {\n \"fieldMetadata[]\": [\n \"name\",\n \"label\"\n ],\n \"sections[]\": [\n \"id\",\n \"title\"\n ],\n \"sections[].rows[].columns[].items[]\": [\n \"id\",\n \"fieldName\"\n ],\n \"sections[].rows[].columns[].fields[]\": []\n },\n \"hints\": [\n \"Use fieldMetadata[].name as the canonical field id; avoid array indexes.\",\n \"Local fields are real form controls. Create them in fieldMetadata[] with source:\\\"local\\\", usually transient:true and submitPolicy:\\\"omit\\\", then place them as kind:\\\"field\\\" layout items.\",\n \"submitPolicy accepts only \\\"omit\\\", \\\"include\\\", or \\\"includeWhenDirty\\\". If legacy prompt text says \\\"never\\\", normalize it to \\\"omit\\\" before persisting.\",\n \"Visual blocks are not fields. Store them only as kind:\\\"richContent\\\" layout items and never in fieldMetadata[].\",\n \"Use sections[].rows[].columns[].items[] as the canonical mixed layout order. kind:\\\"field\\\" items reference fieldMetadata; kind:\\\"richContent\\\" items are visual blocks outside submit payload.\",\n \"Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.\",\n \"For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.\",\n \"For field formRules that must calculate a FormControl value, use effect.properties.value with the closed envelope { expression: <JSON Logic> }, such as { expression: { yearsSince: [{ var: \\\"birthDate\\\" }] } }. Use the closed envelope { literal: <value> } for structured literal objects; do not add extra keys and do not generate TypeScript functions.\",\n \"For conditional side effects, use formCommandRules with effects[].kind:\\\"global-action\\\" and a structured globalAction ref. The visual editor authors the primary effect and preserves secondary effects from advanced JSON. Do not put alert/modal/navigation commands inside formRules[].effect.properties.\",\n \"LLM-created formRules must include metadata.origin:\\\"llm\\\" and metadata.reviewStatus:\\\"pending\\\"; never write generated formRulesState.\",\n \"Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.\",\n \"For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.\",\n \"Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.\",\n \"When adding sections/rows/columns, provide a unique \\\"id\\\" for each new element.\",\n \"For nested layout changes (column within a row within a section), explicitly define \\\"target.sectionId\\\", \\\"target.rowId\\\", \\\"target.columnId\\\" in user prompt for clarity.\",\n \"DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).\",\n \"DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).\",\n \"DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.\",\n \"DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.\",\n \"DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally.\"\n ]\n }\n}",
8499
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
8686
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
8500
8687
  "contentHash": "fce0638895fb6284d9f1f6c896a2eeb5945f4877b418f942a1872f60b1541c15",
8501
8688
  "sourceKind": "component_definition",
8502
8689
  "sourceId": "praxis-dynamic-form",
@@ -8506,7 +8693,7 @@
8506
8693
  "chunkIndex": 4,
8507
8694
  "chunkKind": "recipe",
8508
8695
  "content": "{\n \"_comment\": \"Official Praxis Dynamic Form recipe for governed conditional command rules.\",\n \"_comment2\": \"Use when a form must execute host-mediated alerts or confirmations from declarative rules after computed values stabilize.\",\n \"templateMeta\": {\n \"variantId\": \"command-rules\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"status\": \"public-example\",\n \"tags\": [\n \"formCommandRules\",\n \"global-action\",\n \"computed-values\",\n \"business-rules\",\n \"llm-authoring\"\n ],\n \"useWhen\": \"Create a metadata-driven form with computed values, conditional required fields and governed alert or confirmation dialogs without TypeScript host logic.\",\n \"examplePrompts\": [\n \"create a dynamic form rule that calculates age from birth date and alerts when a female applicant is under 18\",\n \"ask for confirmation when a vacation range starts on Friday\",\n \"show conditional command rules using dialog.alert and dialog.confirm\"\n ]\n },\n \"platformValue\": {\n \"canonicalRuntime\": \"@praxisui/dynamic-form evaluates formRules first, stabilizes computed values, then evaluates formCommandRules.\",\n \"commandContract\": \"formCommandRules uses PraxisRuntimeConditionalEffectRule<PraxisRuntimeGlobalActionEffect> with effects[].kind = global-action and a structured GlobalActionRef.\",\n \"propertyBoundary\": \"Use formRules for local field/property/value changes. Use formCommandRules for side effects such as alert, confirm, navigation or host-mediated commands.\",\n \"policyBoundary\": \"Use policy for trigger, distinct, distinctBy and runOnInitialEvaluation. Do not encode operational throttling inside Json Logic condition.\",\n \"authoringBoundary\": \"The visual config editor exposes command rules and structured payload fields for the primary effect. JSON remains an advanced escape hatch, not the primary authoring path. payloadExpr is preserved from advanced JSON when no structured payload is authored, but it is not a visual field in this cut. Secondary effects remain advanced JSON-authored and are preserved when the primary effect is edited visually.\"\n },\n \"authoringGuidance\": [\n \"Keep condition as canonical Json Logic, not a string DSL.\",\n \"Use effect.properties.value with { \\\"expression\\\": ... } for computed values and { \\\"literal\\\": ... } for structured literal values.\",\n \"Do not put dialog.alert, dialog.confirm, showAlert, navigate or modal commands inside formRules[].effect.properties.\",\n \"Use formCommandRules[].effects[].globalAction.actionId for the host-mediated command.\",\n \"Use structured payload fields for the primary effect in the visual editor. Keep payloadExpr and secondary effects in advanced JSON for this cut.\",\n \"Use trigger on-condition-enter for side effects by default.\",\n \"Set runOnInitialEvaluation to false unless a command must intentionally run during initial hydration.\",\n \"Set distinct and distinctBy for value-change commands that should not repeat while the same condition/value remains active.\",\n \"For date-range commands, use the committed date range value, such as vacationPeriod.startDate, not transient picker preview state.\"\n ],\n \"teaches\": [\n \"dynamic-form.formRules.computed-value\",\n \"dynamic-form.formCommandRules\",\n \"dynamic-form.formCommandRules.global-action\",\n \"dynamic-form.formCommandRules.policy\",\n \"global-action.dialog.alert\",\n \"global-action.dialog.confirm\",\n \"date-range.committed-value\"\n ],\n \"testScenarios\": [\n {\n \"id\": \"birthDate-age-alert-chain\",\n \"source\": \"business-rules-form-demo\",\n \"input\": {\n \"gender\": \"female\",\n \"birthDate\": \"2012-05-05\"\n },\n \"expects\": [\n \"formRules computes age before formCommandRules evaluate\",\n \"registration:female-underage-alert resolves dialog.alert from stabilized age\",\n \"guardianName remains a local property rule, not a command side effect\"\n ]\n },\n {\n \"id\": \"distinct-age-alert\",\n \"source\": \"business-rules-form-demo\",\n \"input\": {\n \"gender\": \"female\",\n \"birthDate\": \"2012-05-05\"\n },\n \"expects\": [\n \"dialog.alert runs on condition enter\",\n \"the same age does not reopen the modal while the condition remains true\",\n \"distinct memory resets after the condition evaluates false\"\n ]\n },\n {\n \"id\": \"friday-range-confirm\",\n \"source\": \"business-rules-form-demo\",\n \"input\": {\n \"vacationPeriod\": {\n \"startDate\": \"2026-05-01\",\n \"endDate\": \"2026-05-08\"\n }\n },\n \"expects\": [\n \"dialog.confirm evaluates only after startDate and endDate are committed\",\n \"distinctBy uses vacationPeriod.startDate\",\n \"picker preview state is not used as command input\"\n ]\n },\n {\n \"id\": \"editor-preview-is-not-execution\",\n \"source\": \"config-editor\",\n \"input\": {\n \"mode\": \"preview\",\n \"actionId\": \"dialog.alert\"\n },\n \"expects\": [\n \"visual preview reports the command intent\",\n \"preview does not call GlobalActionService.executeRef\",\n \"apply/save must still validate actionId and required payload\"\n ]\n }\n ],\n \"config\": {\n \"fieldMetadata\": [\n {\n \"name\": \"name\",\n \"label\": \"Name\",\n \"controlType\": \"input\",\n \"required\": true\n },\n {\n \"name\": \"gender\",\n \"label\": \"Gender\",\n \"controlType\": \"select\",\n \"required\": true,\n \"options\": [\n { \"label\": \"Female\", \"value\": \"female\" },\n { \"label\": \"Male\", \"value\": \"male\" },\n { \"label\": \"Other\", \"value\": \"other\" }\n ]\n },\n {\n \"name\": \"birthDate\",\n \"label\": \"Birth date\",\n \"controlType\": \"datePicker\",\n \"manualInput\": false,\n \"hint\": \"Select from the calendar to avoid ambiguous date formats.\"\n },\n {\n \"name\": \"age\",\n \"label\": \"Age\",\n \"controlType\": \"numericTextBox\",\n \"required\": true,\n \"readOnly\": true,\n \"min\": 0,\n \"max\": 120\n },\n {\n \"name\": \"guardianName\",\n \"label\": \"Legal guardian\",\n \"controlType\": \"input\",\n \"placeholder\": \"Required for underage applicants\"\n },\n {\n \"name\": \"vacationPeriod\",\n \"label\": \"Vacation period\",\n \"controlType\": \"dateRange\",\n \"required\": true,\n \"minDate\": \"2026-01-01\",\n \"maxDate\": \"2026-12-31\"\n },\n {\n \"name\": \"reason\",\n \"label\": \"Notes\",\n \"controlType\": \"textarea\",\n \"rows\": 3\n }\n ],\n \"sections\": [\n {\n \"id\": \"registration\",\n \"title\": \"Registration\",\n \"appearance\": \"plain\",\n \"rows\": [\n {\n \"id\": \"registration-row\",\n \"columns\": [\n {\n \"id\": \"registration-left\",\n \"span\": { \"xs\": 12, \"md\": 6 },\n \"fields\": [\"name\", \"gender\", \"birthDate\"]\n },\n {\n \"id\": \"registration-right\",\n \"span\": { \"xs\": 12, \"md\": 6 },\n \"fields\": [\"age\", \"guardianName\"]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"vacation\",\n \"title\": \"Vacation\",\n \"appearance\": \"plain\",\n \"rows\": [\n {\n \"id\": \"vacation-row\",\n \"columns\": [\n {\n \"id\": \"vacation-column\",\n \"span\": { \"xs\": 12 },\n \"fields\": [\"vacationPeriod\", \"reason\"]\n }\n ]\n }\n ]\n }\n ],\n \"formRules\": [\n {\n \"id\": \"birth-date-computes-age\",\n \"name\": \"Birth date computes age\",\n \"targetType\": \"field\",\n \"targets\": [\"age\"],\n \"effect\": {\n \"condition\": {\n \"!\": [\n { \"isBlank\": [{ \"var\": \"birthDate\" }] }\n ]\n },\n \"properties\": {\n \"value\": {\n \"expression\": {\n \"yearsSince\": [{ \"var\": \"birthDate\" }]\n }\n },\n \"hint\": \"Calculated from birth date.\"\n },\n \"propertiesWhenFalse\": {\n \"value\": { \"literal\": null },\n \"hint\": \"\"\n }\n }\n },\n {\n \"id\": \"female-underage-requires-guardian\",\n \"name\": \"Female underage applicant requires guardian\",\n \"targetType\": \"field\",\n \"targets\": [\"guardianName\"],\n \"effect\": {\n \"condition\": {\n \"and\": [\n { \"===\": [{ \"var\": \"gender\" }, \"female\"] },\n { \"<\": [{ \"var\": \"age\" }, 18] }\n ]\n },\n \"properties\": {\n \"required\": true,\n \"color\": \"warn\",\n \"hint\": \"Required for female applicants under 18.\"\n },\n \"propertiesWhenFalse\": {\n \"required\": false,\n \"color\": \"primary\",\n \"hint\": \"\"\n }\n }\n }\n ],\n \"formCommandRules\": [\n {\n \"id\": \"registration:female-underage-alert\",\n \"description\": \"Alert when a female applicant is under 18 after age is computed.\",\n \"condition\": {\n \"and\": [\n { \"===\": [{ \"var\": \"gender\" }, \"female\"] },\n { \"!\": [{ \"isBlank\": [{ \"var\": \"age\" }] }] },\n { \"<\": [{ \"var\": \"age\" }, 18] }\n ]\n },\n \"effects\": [\n {\n \"id\": \"minimum-age-alert\",\n \"kind\": \"global-action\",\n \"globalAction\": {\n \"actionId\": \"dialog.alert\",\n \"payload\": {\n \"title\": \"Minimum age\",\n \"message\": \"For female registration, the expected minimum age is 18.\",\n \"okLabel\": \"Understood\",\n \"variant\": \"warning\"\n }\n }\n }\n ],\n \"policy\": {\n \"trigger\": \"on-condition-enter\",\n \"distinct\": true,\n \"distinctBy\": \"age\",\n \"runOnInitialEvaluation\": false\n }\n },\n {\n \"id\": \"vacation:friday-start-confirm\",\n \"description\": \"Confirm when the committed vacation range starts on Friday.\",\n \"condition\": {\n \"and\": [\n { \"!\": [{ \"isBlank\": [{ \"var\": \"vacationPeriod.startDate\" }] }] },\n { \"!\": [{ \"isBlank\": [{ \"var\": \"vacationPeriod.endDate\" }] }] },\n { \"weekdayIn\": [{ \"var\": \"vacationPeriod.startDate\" }, [5]] }\n ]\n },\n \"effects\": [\n {\n \"id\": \"friday-start-confirm\",\n \"kind\": \"global-action\",\n \"globalAction\": {\n \"actionId\": \"dialog.confirm\",\n \"payload\": {\n \"title\": \"Friday start\",\n \"message\": \"The vacation start date falls on a Friday. Do you want to keep this choice?\",\n \"confirmLabel\": \"Keep\",\n \"cancelLabel\": \"Review\",\n \"variant\": \"question\"\n }\n }\n }\n ],\n \"policy\": {\n \"trigger\": \"on-condition-enter\",\n \"distinct\": true,\n \"distinctBy\": \"vacationPeriod.startDate\",\n \"runOnInitialEvaluation\": false\n }\n }\n ],\n \"actions\": {\n \"submit\": {\n \"visible\": true,\n \"label\": \"Submit\",\n \"icon\": \"send\",\n \"color\": \"primary\",\n \"variant\": \"raised\"\n },\n \"cancel\": { \"visible\": false },\n \"reset\": { \"visible\": false }\n }\n },\n \"diagnosticExpectations\": {\n \"computedBeforeCommands\": true,\n \"commandEffectsAreGlobalActions\": true,\n \"commandsAreNotFormRuleProperties\": true,\n \"runOnInitialEvaluationDefault\": false,\n \"committedDateRangeOnly\": true,\n \"previewDoesNotExecuteGlobalAction\": true,\n \"payloadExprAdvancedJsonOnly\": true,\n \"scenarioSource\": \"business-rules-form-demo\"\n }\n}\n",
8509
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.command-rules.json",
8696
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
8510
8697
  "contentHash": "d7528a84ee8ac766f11dfe6edd1cb3c32ef0dc0168b940fe4b9734398e3ca36d",
8511
8698
  "sourceKind": "component_definition",
8512
8699
  "sourceId": "praxis-dynamic-form",
@@ -8516,7 +8703,7 @@
8516
8703
  "chunkIndex": 5,
8517
8704
  "chunkKind": "recipe",
8518
8705
  "content": "{\n \"_comment\": \"Official recipe for the procurement Entity Lookup cascade published by praxis-api-quickstart.\",\n \"_comment2\": \"Use this when agents need a metadata-driven form that selects governed business entities instead of simple option lists.\",\n \"templateMeta\": {\n \"variantId\": \"entity-lookup-procurement\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"status\": \"public-example\",\n \"tags\": [\n \"entity-lookup\",\n \"resource-entity\",\n \"option-source\",\n \"cascading\",\n \"rehydration\",\n \"procurement\",\n \"quickstart\"\n ],\n \"useWhen\": \"Create a purchase order form with real company, supplier, contract and product entity selections.\",\n \"examplePrompts\": [\n \"create a purchase order form with company supplier contract and product lookups\",\n \"generate a form with dependent entityLookup fields backed by optionSource metadata\",\n \"add a governed lookup cascade with status policy and by-ids rehydration\"\n ]\n },\n \"platformValue\": {\n \"canonicalOwner\": \"praxis-metadata-starter publishes x-ui.optionSource with RESOURCE_ENTITY semantics.\",\n \"referenceHost\": \"praxis-api-quickstart exposes the procurement resource and its option-source endpoints.\",\n \"sharedTypes\": \"@praxisui/core owns OptionSourceMetadata and FieldControlType.ENTITY_LOOKUP.\",\n \"runtime\": \"@praxisui/dynamic-fields renders entityLookup and inlineEntityLookup.\",\n \"formIntegration\": \"@praxisui/dynamic-form keeps the submitted payload canonical while the UI rehydrates labels, status and disabled reasons.\",\n \"authoring\": \"@praxisui/metadata-editor exposes the optionSource.* fields used below.\"\n },\n \"backendSurfaces\": [\n \"GET /schemas/filtered?path=/api/procurement/purchase-orders&operation=post&schemaType=request\",\n \"POST /api/procurement/purchase-orders/filter\",\n \"GET /api/procurement/purchase-orders/capabilities\",\n \"POST /api/procurement/companies/option-sources/company/options/filter\",\n \"POST /api/procurement/suppliers/option-sources/supplier/options/filter\",\n \"POST /api/procurement/contracts/option-sources/contract/options/filter\",\n \"POST /api/procurement/products/option-sources/product/options/filter\"\n ],\n \"contractNotes\": [\n \"Persist only stable IDs: companyId, supplierId, contractId and productId.\",\n \"Use x-ui.optionSource.dependsOn for cascades and add dependencyFilterMap only when the UI field differs from the backend filter key.\",\n \"Use selectionPolicy.allowRetainInvalidExistingValue to display historical invalid values while blocking new selections.\",\n \"Use capabilities.byIds=true when edit mode must rehydrate IDs already saved in the resource.\",\n \"Use dependencyLoadOnChange=immediate and resetOnDependentChange when child lookups must refresh and clear stale values as soon as a parent changes.\",\n \"Use detail.hrefTemplate or routeTemplate only as navigation metadata; it must not change the submitted value.\"\n ],\n \"renderingExpectations\": {\n \"inline\": \"Default rendering uses an input-like trigger, search dropdown and rich rows with code, label, description, status and blocked reasons.\",\n \"selectedCard\": \"After selection, show the canonical entity identity with code, label, description, status badges and actions such as detail, change, copy code and clear.\",\n \"readonly\": \"Readonly mode rehydrates the saved ID and renders label, status and disabled reason without allowing changes.\",\n \"compact\": \"Compact mode is intended for table filters and dense forms: preserve label, code and status while reducing secondary text.\",\n \"dialog\": \"Dialog/value-help mode reuses the same optionSource contract and can add table search, column filters, preview panel and selection confirmation.\"\n },\n \"metadata\": {\n \"version\": \"2.0\",\n \"resourcePath\": \"procurement/purchase-orders\",\n \"resourceKey\": \"procurement.purchase-orders\",\n \"operation\": \"create\"\n },\n \"fieldMetadata\": [\n {\n \"name\": \"companyId\",\n \"label\": \"Empresa\",\n \"placeholder\": \"Buscar empresa...\",\n \"controlType\": \"entityLookup\",\n \"required\": true,\n \"endpoint\": \"/api/procurement/companies/option-sources/company/options/filter\",\n \"displayField\": \"label\",\n \"valueField\": \"id\",\n \"optionSource\": {\n \"key\": \"company\",\n \"type\": \"RESOURCE_ENTITY\",\n \"entityKey\": \"company\",\n \"resourcePath\": \"/api/procurement/companies\",\n \"filterField\": \"companyId\",\n \"propertyPath\": \"id\",\n \"valuePropertyPath\": \"id\",\n \"labelPropertyPath\": \"legalName\",\n \"codePropertyPath\": \"code\",\n \"descriptionPropertyPaths\": [\n \"documentNumber\",\n \"city\",\n \"state\"\n ],\n \"statusPropertyPath\": \"status\",\n \"disabledReasonPropertyPath\": \"disabledReason\",\n \"searchPropertyPaths\": [\n \"code\",\n \"legalName\",\n \"documentNumber\"\n ],\n \"searchMode\": \"contains\",\n \"pageSize\": 25,\n \"includeIds\": true,\n \"selectionPolicy\": {\n \"statusPropertyPath\": \"status\",\n \"allowedStatuses\": [\n \"ACTIVE\"\n ],\n \"blockedStatuses\": [\n \"INACTIVE\",\n \"BLOCKED\"\n ],\n \"allowRetainInvalidExistingValue\": true\n },\n \"capabilities\": {\n \"filter\": true,\n \"byIds\": true,\n \"detail\": true,\n \"navigateToDetail\": true,\n \"auditSnapshot\": true\n },\n \"detail\": {\n \"hrefTemplate\": \"/api/procurement/companies/{id}\",\n \"routeTemplate\": \"/procurement/companies/{id}\",\n \"openDetailMode\": \"route\"\n }\n }\n },\n {\n \"name\": \"supplierId\",\n \"label\": \"Fornecedor\",\n \"placeholder\": \"Buscar fornecedor homologado...\",\n \"controlType\": \"entityLookup\",\n \"required\": true,\n \"endpoint\": \"/api/procurement/suppliers/option-sources/supplier/options/filter\",\n \"displayField\": \"label\",\n \"valueField\": \"id\",\n \"dependentField\": \"companyId\",\n \"dependencyLoadOnChange\": \"immediate\",\n \"resetOnDependentChange\": true,\n \"optionSource\": {\n \"key\": \"supplier\",\n \"type\": \"RESOURCE_ENTITY\",\n \"entityKey\": \"supplier\",\n \"resourcePath\": \"/api/procurement/suppliers\",\n \"filterField\": \"supplierId\",\n \"dependsOn\": [\n \"companyId\"\n ],\n \"propertyPath\": \"id\",\n \"valuePropertyPath\": \"id\",\n \"labelPropertyPath\": \"legalName\",\n \"codePropertyPath\": \"code\",\n \"descriptionPropertyPaths\": [\n \"documentNumber\",\n \"homologationStatus\",\n \"riskLevel\"\n ],\n \"statusPropertyPath\": \"status\",\n \"disabledReasonPropertyPath\": \"disabledReason\",\n \"searchPropertyPaths\": [\n \"code\",\n \"legalName\",\n \"documentNumber\"\n ],\n \"searchMode\": \"contains\",\n \"pageSize\": 25,\n \"includeIds\": true,\n \"selectionPolicy\": {\n \"statusPropertyPath\": \"status\",\n \"allowedStatuses\": [\n \"ACTIVE\",\n \"APPROVED\"\n ],\n \"blockedStatuses\": [\n \"INACTIVE\",\n \"BLOCKED\"\n ],\n \"allowRetainInvalidExistingValue\": true\n },\n \"capabilities\": {\n \"filter\": true,\n \"byIds\": true,\n \"detail\": true,\n \"navigateToDetail\": true,\n \"auditSnapshot\": true\n },\n \"detail\": {\n \"hrefTemplate\": \"/api/procurement/suppliers/{id}\",\n \"routeTemplate\": \"/procurement/suppliers/{id}\",\n \"openDetailMode\": \"route\"\n }\n }\n },\n {\n \"name\": \"contractId\",\n \"label\": \"Contrato\",\n \"placeholder\": \"Buscar contrato vigente...\",\n \"controlType\": \"entityLookup\",\n \"endpoint\": \"/api/procurement/contracts/option-sources/contract/options/filter\",\n \"displayField\": \"label\",\n \"valueField\": \"id\",\n \"dependentField\": \"supplierId\",\n \"dependencyLoadOnChange\": \"immediate\",\n \"resetOnDependentChange\": true,\n \"optionSource\": {\n \"key\": \"contract\",\n \"type\": \"RESOURCE_ENTITY\",\n \"entityKey\": \"contract\",\n \"resourcePath\": \"/api/procurement/contracts\",\n \"filterField\": \"contractId\",\n \"dependsOn\": [\n \"companyId\",\n \"supplierId\"\n ],\n \"propertyPath\": \"id\",\n \"valuePropertyPath\": \"id\",\n \"labelPropertyPath\": \"number\",\n \"descriptionPropertyPaths\": [\n \"supplierName\",\n \"validUntil\",\n \"currency\"\n ],\n \"statusPropertyPath\": \"status\",\n \"disabledReasonPropertyPath\": \"disabledReason\",\n \"searchPropertyPaths\": [\n \"number\",\n \"supplierName\",\n \"currency\"\n ],\n \"searchMode\": \"contains\",\n \"pageSize\": 25,\n \"includeIds\": true,\n \"selectionPolicy\": {\n \"statusPropertyPath\": \"status\",\n \"allowedStatuses\": [\n \"ACTIVE\",\n \"SIGNED\"\n ],\n \"blockedStatuses\": [\n \"EXPIRED\",\n \"CANCELLED\"\n ],\n \"allowRetainInvalidExistingValue\": true\n },\n \"capabilities\": {\n \"filter\": true,\n \"byIds\": true,\n \"detail\": true,\n \"navigateToDetail\": true,\n \"auditSnapshot\": true\n },\n \"detail\": {\n \"hrefTemplate\": \"/api/procurement/contracts/{id}\",\n \"routeTemplate\": \"/procurement/contracts/{id}\",\n \"openDetailMode\": \"route\"\n }\n }\n },\n {\n \"name\": \"productId\",\n \"label\": \"Produto\",\n \"placeholder\": \"Buscar produto disponivel...\",\n \"controlType\": \"entityLookup\",\n \"required\": true,\n \"endpoint\": \"/api/procurement/products/option-sources/product/options/filter\",\n \"displayField\": \"label\",\n \"valueField\": \"id\",\n \"dependentField\": \"contractId\",\n \"dependencyLoadOnChange\": \"immediate\",\n \"resetOnDependentChange\": true,\n \"optionSource\": {\n \"key\": \"product\",\n \"type\": \"RESOURCE_ENTITY\",\n \"entityKey\": \"product\",\n \"resourcePath\": \"/api/procurement/products\",\n \"filterField\": \"productId\",\n \"dependsOn\": [\n \"companyId\",\n \"contractId\"\n ],\n \"propertyPath\": \"id\",\n \"valuePropertyPath\": \"id\",\n \"labelPropertyPath\": \"name\",\n \"codePropertyPath\": \"sku\",\n \"descriptionPropertyPaths\": [\n \"categoryName\",\n \"stockAvailable\",\n \"unitOfMeasure\"\n ],\n \"statusPropertyPath\": \"status\",\n \"disabledReasonPropertyPath\": \"disabledReason\",\n \"searchPropertyPaths\": [\n \"sku\",\n \"name\",\n \"categoryName\"\n ],\n \"searchMode\": \"contains\",\n \"pageSize\": 25,\n \"includeIds\": true,\n \"selectionPolicy\": {\n \"statusPropertyPath\": \"status\",\n \"allowedStatuses\": [\n \"ACTIVE\",\n \"AVAILABLE\"\n ],\n \"blockedStatuses\": [\n \"INACTIVE\",\n \"BLOCKED\"\n ],\n \"allowRetainInvalidExistingValue\": true\n },\n \"capabilities\": {\n \"filter\": true,\n \"byIds\": true,\n \"detail\": true,\n \"navigateToDetail\": true,\n \"auditSnapshot\": true\n },\n \"detail\": {\n \"hrefTemplate\": \"/api/procurement/products/{id}\",\n \"routeTemplate\": \"/procurement/products/{id}\",\n \"openDetailMode\": \"route\"\n }\n }\n },\n {\n \"name\": \"orderDate\",\n \"label\": \"Data do pedido\",\n \"controlType\": \"date\"\n },\n {\n \"name\": \"currency\",\n \"label\": \"Moeda\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"label\": \"BRL\",\n \"value\": \"BRL\"\n },\n {\n \"label\": \"USD\",\n \"value\": \"USD\"\n }\n ]\n },\n {\n \"name\": \"quantity\",\n \"label\": \"Quantidade\",\n \"controlType\": \"numericTextBox\",\n \"validators\": {\n \"min\": 1\n }\n }\n ],\n \"sections\": [\n {\n \"id\": \"commercial-context\",\n \"title\": \"Commercial context\",\n \"rows\": [\n {\n \"id\": \"commercial-context-row\",\n \"columns\": [\n {\n \"id\": \"company-column\",\n \"fields\": [\n \"companyId\",\n \"orderDate\"\n ]\n },\n {\n \"id\": \"currency-column\",\n \"fields\": [\n \"currency\",\n \"quantity\"\n ]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"purchase-entities\",\n \"title\": \"Purchase entities\",\n \"rows\": [\n {\n \"id\": \"purchase-entities-row-1\",\n \"columns\": [\n {\n \"id\": \"supplier-column\",\n \"fields\": [\n \"supplierId\"\n ]\n },\n {\n \"id\": \"contract-column\",\n \"fields\": [\n \"contractId\"\n ]\n }\n ]\n },\n {\n \"id\": \"purchase-entities-row-2\",\n \"columns\": [\n {\n \"id\": \"product-column\",\n \"fields\": [\n \"productId\"\n ]\n }\n ]\n }\n ]\n }\n ],\n \"initialData\": {\n \"companyId\": 1,\n \"supplierId\": 10,\n \"contractId\": 20,\n \"productId\": 30,\n \"orderDate\": \"2026-04-15\",\n \"currency\": \"BRL\",\n \"quantity\": 2\n },\n \"expectedLookupRequests\": {\n \"filterSupplier\": {\n \"method\": \"POST\",\n \"url\": \"/api/procurement/suppliers/option-sources/supplier/options/filter\",\n \"body\": {\n \"query\": \"acme\",\n \"filters\": {\n \"companyId\": 1\n },\n \"page\": 0,\n \"size\": 25\n }\n },\n \"filterContract\": {\n \"method\": \"POST\",\n \"url\": \"/api/procurement/contracts/option-sources/contract/options/filter\",\n \"body\": {\n \"query\": \"2026\",\n \"filters\": {\n \"companyId\": 1,\n \"supplierId\": 10\n },\n \"page\": 0,\n \"size\": 25\n }\n },\n \"filterProduct\": {\n \"method\": \"POST\",\n \"url\": \"/api/procurement/products/option-sources/product/options/filter\",\n \"body\": {\n \"filters\": {\n \"companyId\": 1,\n \"contractId\": 20\n },\n \"page\": 0,\n \"size\": 25\n }\n },\n \"rehydrateSavedValues\": {\n \"method\": \"GET\",\n \"urls\": [\n \"/api/procurement/companies/option-sources/company/options/by-ids?ids=1\",\n \"/api/procurement/suppliers/option-sources/supplier/options/by-ids?ids=10\",\n \"/api/procurement/contracts/option-sources/contract/options/by-ids?ids=20\",\n \"/api/procurement/products/option-sources/product/options/by-ids?ids=30\"\n ]\n }\n },\n \"expectedOptionShape\": {\n \"id\": 10,\n \"label\": \"ACME Suprimentos Ltda\",\n \"extra\": {\n \"code\": \"FOR-8742\",\n \"description\": \"12.345.678/0001-90 - APPROVED - LOW\",\n \"status\": \"ACTIVE\",\n \"selectable\": true,\n \"disabledReason\": null,\n \"detailHref\": \"/api/procurement/suppliers/10\",\n \"detailRoute\": \"/procurement/suppliers/10\",\n \"resourcePath\": \"/api/procurement/suppliers\",\n \"entityKey\": \"supplier\"\n }\n },\n \"expectedSubmitPayload\": {\n \"companyId\": 1,\n \"supplierId\": 10,\n \"contractId\": 20,\n \"productId\": 30,\n \"orderDate\": \"2026-04-15\",\n \"currency\": \"BRL\",\n \"quantity\": 2\n }\n}\n",
8519
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
8706
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
8520
8707
  "contentHash": "beacc31baf931cb0deeed7c50a2ec087af03f373a90cab2103101e831b3aacef",
8521
8708
  "sourceKind": "component_definition",
8522
8709
  "sourceId": "praxis-dynamic-form",
@@ -8526,7 +8713,7 @@
8526
8713
  "chunkIndex": 6,
8527
8714
  "chunkKind": "recipe",
8528
8715
  "content": "{\n \"_comment\": \"Showcase de campos variados com props específicas (validação, máscaras, sliders, cores).\",\n \"templateMeta\": {\n \"variantId\": \"fields\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"tags\": [\n \"fields\",\n \"metadata\"\n ],\n \"useWhen\": \"mostrar apenas fieldMetadata e exemplos de campos\",\n \"examplePrompts\": [\n \"gere somente a lista de campos\",\n \"adicione novos campos ao formulario\"\n ]\n },\n \"metadata\": {\n \"version\": \"2.0\"\n },\n \"fieldMetadata\": [\n {\n \"name\": \"fullName\",\n \"label\": \"Nome completo\",\n \"controlType\": \"input\",\n \"validators\": {\n \"maxLength\": 120\n }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"password\",\n \"label\": \"Senha\",\n \"controlType\": \"password\",\n \"validators\": {\n \"minLength\": 8\n }\n },\n {\n \"name\": \"profileColor\",\n \"label\": \"Cor do perfil\",\n \"controlType\": \"colorPicker\",\n \"format\": \"hex\"\n },\n {\n \"name\": \"salary\",\n \"label\": \"Salário\",\n \"controlType\": \"currency\",\n \"currencyCode\": \"BRL\",\n \"validators\": {\n \"min\": 0\n }\n },\n {\n \"name\": \"birthDate\",\n \"label\": \"Nascimento\",\n \"controlType\": \"date\",\n \"validators\": {\n \"min\": \"1900-01-01\",\n \"max\": \"2025-12-31\"\n }\n },\n {\n \"name\": \"availability\",\n \"label\": \"Disponibilidade\",\n \"controlType\": \"dateRange\"\n },\n {\n \"name\": \"workload\",\n \"label\": \"Carga horária\",\n \"controlType\": \"slider\",\n \"validators\": {\n \"min\": 0,\n \"max\": 40\n }\n },\n {\n \"name\": \"skills\",\n \"label\": \"Habilidades\",\n \"controlType\": \"multiSelect\",\n \"options\": [\n {\n \"text\": \"Angular\",\n \"value\": \"ANG\"\n },\n {\n \"text\": \"React\",\n \"value\": \"RE\"\n }\n ]\n },\n {\n \"name\": \"manager\",\n \"label\": \"Gestor\",\n \"controlType\": \"autoComplete\",\n \"endpoint\": \"/api/managers\"\n },\n {\n \"name\": \"document\",\n \"label\": \"CPF/CNPJ\",\n \"controlType\": \"cpfCnpjInput\",\n \"unmaskOnSubmit\": true\n },\n {\n \"name\": \"avatar\",\n \"label\": \"Avatar\",\n \"controlType\": \"avatar\",\n \"imageSrc\": \"https://picsum.photos/80\",\n \"materialDesign\": {\n \"shape\": \"circle\"\n }\n },\n {\n \"name\": \"attachments\",\n \"label\": \"Anexos\",\n \"controlType\": \"upload\",\n \"multiple\": true,\n \"accept\": \".pdf,.png,.jpg\"\n }\n ],\n \"sections\": [\n {\n \"id\": \"sec1\",\n \"title\": \"Perfil\",\n \"rows\": [\n {\n \"id\": \"r1\",\n \"columns\": [\n {\n \"id\": \"c1\",\n \"fields\": [\n \"fullName\",\n \"email\",\n \"password\"\n ]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"sec2\",\n \"title\": \"Detalhes\",\n \"rows\": [\n {\n \"id\": \"r2\",\n \"columns\": [\n {\n \"id\": \"c2\",\n \"fields\": [\n \"profileColor\",\n \"salary\",\n \"birthDate\",\n \"availability\",\n \"workload\"\n ]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"sec3\",\n \"title\": \"Outros\",\n \"rows\": [\n {\n \"id\": \"r3\",\n \"columns\": [\n {\n \"id\": \"c3\",\n \"fields\": [\n \"skills\",\n \"manager\",\n \"document\",\n \"avatar\",\n \"attachments\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}\n",
8529
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.fields.json",
8716
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.fields.json",
8530
8717
  "contentHash": "96b6a022941bcb3ae32ac168c92a308e394731d4556b1692c63994ed91f7c300",
8531
8718
  "sourceKind": "component_definition",
8532
8719
  "sourceId": "praxis-dynamic-form",
@@ -8536,7 +8723,7 @@
8536
8723
  "chunkIndex": 7,
8537
8724
  "chunkKind": "recipe",
8538
8725
  "content": "{\n \"_comment\": \"Generic recipe for PraxisDynamicForm (FormConfig). Values are placeholders for AI examples.\",\n \"templateMeta\": {\n \"variantId\": \"form-config\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"tags\": [\n \"full\",\n \"config\"\n ],\n \"useWhen\": \"gerar form completo com layout, campos e regras\",\n \"examplePrompts\": [\n \"gere um formulario completo com campos e layout\",\n \"crie um form completo baseado no schema\"\n ]\n },\n \"metadata\": {\n \"version\": \"2.0.0\",\n \"lastUpdated\": \"2024-02-01T12:00:00Z\",\n \"source\": \"local\",\n \"serverHash\": \"hash-abc-123\",\n \"schemaId\": \"path:/api/employees#request\",\n \"schemaContext\": {\n \"path\": \"/api/employees\",\n \"operation\": \"POST\",\n \"schemaType\": \"request\",\n \"internal\": false,\n \"tenant\": \"default\",\n \"locale\": \"pt-BR\"\n },\n \"customizations\": [\n {\n \"fieldName\": \"salary\",\n \"property\": \"label\",\n \"oldValue\": \"Salary\",\n \"newValue\": \"Salario\",\n \"timestamp\": \"2024-01-20T10:00:00Z\",\n \"source\": \"user\"\n }\n ]\n },\n \"api\": {\n \"saveEndpoint\": \"/api/employees\",\n \"loadEndpoint\": \"/api/employees/${id}\",\n \"saveMethod\": \"POST\",\n \"timeout\": 15000,\n \"headers\": {\n \"X-Module\": \"HR\",\n \"X-Request-Source\": \"dynamic-form\"\n },\n \"idField\": \"id\",\n \"beforeSave\": \"sanitizeEmployee\",\n \"afterLoad\": \"mapEmployee\"\n },\n \"behavior\": {\n \"confirmOnUnsavedChanges\": true,\n \"trackHistory\": true,\n \"focusFirstError\": true,\n \"scrollToErrors\": true,\n \"clearAfterSave\": false,\n \"redirectAfterSave\": \"/employees\",\n \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 200\n },\n \"messages\": {\n \"createRegistrySuccess\": \"Registro criado com sucesso.\",\n \"updateRegistrySuccess\": \"Registro atualizado com sucesso.\",\n \"createRegistryError\": \"Falha ao criar registro.\",\n \"updateRegistryError\": \"Falha ao atualizar registro.\",\n \"confirmations\": {\n \"submit\": \"Salvar alteracoes?\",\n \"cancel\": \"Descartar alteracoes?\",\n \"reset\": \"Limpar o formulario?\",\n \"archive\": \"Arquivar este registro?\"\n },\n \"customActions\": {\n \"archive\": {\n \"success\": \"Registro arquivado.\",\n \"error\": \"Falha ao arquivar.\",\n \"confirmation\": \"Arquivar registro agora?\"\n },\n \"preview\": {\n \"confirmation\": \"Gerar pre-visualizacao?\"\n }\n },\n \"loading\": {\n \"submit\": \"Salvando...\",\n \"cancel\": \"Cancelando...\",\n \"reset\": \"Limpando...\",\n \"archive\": \"Arquivando...\"\n }\n },\n \"hints\": {\n \"dataModes\": {\n \"create\": \"Preencha os dados para criar um novo registro.\",\n \"edit\": \"Atualize os dados e salve as alteracoes.\",\n \"view\": \"Visualize os dados do registro.\"\n },\n \"uiModes\": {\n \"presentation\": \"Modo apresentacao exibe apenas leitura.\",\n \"readonly\": \"Modo leitura bloqueia edicao.\",\n \"disabled\": \"Campos desabilitados nao permitem interacao.\",\n \"visible\": \"Controle de visibilidade sem destruir controles.\"\n }\n },\n \"hooks\": {\n \"beforeInit\": [\n {\n \"priority\": 100,\n \"timeoutMs\": 1500,\n \"args\": {\n \"source\": \"cache\"\n },\n \"id\": \"load-static-options\"\n }\n ],\n \"afterInit\": [\n {\n \"priority\": 50,\n \"timeoutMs\": 1200,\n \"args\": {\n \"enable\": true\n },\n \"id\": \"attach-shortcuts\"\n }\n ],\n \"beforeValidate\": [\n {\n \"priority\": 80,\n \"timeoutMs\": 1200,\n \"args\": {\n \"country\": \"BR\"\n },\n \"id\": \"normalize-phones\"\n }\n ],\n \"afterValidate\": [\n {\n \"priority\": 10,\n \"timeoutMs\": 1000,\n \"args\": {\n \"report\": \"warnings\"\n },\n \"id\": \"collect-warnings\"\n }\n ],\n \"beforeSubmit\": [\n {\n \"priority\": 100,\n \"timeoutMs\": 2000,\n \"args\": {\n \"trimStrings\": true\n },\n \"id\": \"sanitize-employee\"\n }\n ],\n \"afterSubmit\": [\n {\n \"priority\": 20,\n \"timeoutMs\": 1500,\n \"args\": {\n \"messageKey\": \"employeeSaved\"\n },\n \"id\": \"notify-success\"\n }\n ],\n \"onError\": [\n {\n \"priority\": 0,\n \"timeoutMs\": 1500,\n \"args\": {\n \"messageKey\": \"employeeSaveError\"\n },\n \"id\": \"notify-error\"\n }\n ]\n },\n \"fieldMetadata\": [\n {\n \"name\": \"id\",\n \"label\": \"ID\",\n \"controlType\": \"numericTextBox\",\n \"dataType\": \"number\",\n \"hidden\": true,\n \"readOnly\": true,\n \"description\": \"Backend generated identifier.\"\n },\n {\n \"name\": \"fullName\",\n \"label\": \"Full name\",\n \"controlType\": \"input\",\n \"dataType\": \"text\",\n \"placeholder\": \"Example: Ana Souza\",\n \"prefixIcon\": \"person\",\n \"iconPosition\": \"start\",\n \"iconSize\": \"small\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 3,\n \"maxLength\": 120,\n \"requiredMessage\": \"Name is required\",\n \"minLengthMessage\": \"Min 3 chars\",\n \"minWords\": 2\n },\n \"validationMode\": \"blur\",\n \"debounceTime\": 200,\n \"materialDesign\": {\n \"appearance\": \"outline\",\n \"color\": \"primary\",\n \"floatLabel\": \"auto\",\n \"density\": \"comfortable\",\n \"subscriptSizing\": \"dynamic\",\n \"hideRequiredMarker\": false,\n \"disableRipple\": true,\n \"customPalette\": {\n \"primary\": \"#005f73\",\n \"accent\": \"#0a9396\",\n \"warn\": \"#bb3e03\"\n },\n \"animations\": {\n \"disabled\": false,\n \"duration\": \"150ms\",\n \"easing\": \"ease-out\"\n }\n },\n \"group\": \"identity\",\n \"order\": 1,\n \"width\": \"50%\",\n \"isFlex\": true,\n \"id\": \"field-full-name\",\n \"version\": \"1.0.0\",\n \"context\": \"form\",\n \"createdAt\": \"2024-01-01T00:00:00Z\",\n \"updatedAt\": \"2024-02-01T00:00:00Z\",\n \"tags\": [\n \"identity\",\n \"employee\"\n ],\n \"cssClass\": \"field-full-name\",\n \"style\": {\n \"maxWidth\": \"480px\"\n },\n \"dataAttributes\": {\n \"data-qa\": \"full-name\"\n },\n \"required\": true\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"dataType\": \"email\",\n \"placeholder\": \"name@company.com\",\n \"validators\": {\n \"required\": true,\n \"email\": true,\n \"emailMessage\": \"Use a valid email.\"\n },\n \"unique\": true,\n \"ariaLabel\": \"Email address\",\n \"ariaDescribedBy\": \"email-help\",\n \"tabIndex\": 2,\n \"accessKey\": \"e\"\n },\n {\n \"name\": \"phone\",\n \"label\": \"Phone\",\n \"controlType\": \"maskedTextBox\",\n \"dataType\": \"text\",\n \"mask\": \"(99) 99999-9999\",\n \"validators\": {\n \"pattern\": \"^\\\\(\\\\d{2}\\\\) \\\\d{4,5}-\\\\d{4}$\",\n \"patternMessage\": \"Use (11) 99999-9999\"\n },\n \"hint\": \"Include area code.\"\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Active\",\n \"value\": \"ACTIVE\",\n \"icon\": \"check_circle\"\n },\n {\n \"text\": \"Inactive\",\n \"value\": \"INACTIVE\",\n \"icon\": \"block\"\n },\n {\n \"text\": \"On leave\",\n \"value\": \"ON_LEAVE\",\n \"icon\": \"schedule\"\n }\n ],\n \"defaultValue\": \"ACTIVE\",\n \"validators\": {\n \"required\": true\n },\n \"materialDesign\": {\n \"appearance\": \"outline\",\n \"color\": \"accent\"\n }\n },\n {\n \"name\": \"departmentId\",\n \"label\": \"Department\",\n \"controlType\": \"select\",\n \"endpoint\": \"/api/departments\",\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"queryParams\": {\n \"active\": true\n },\n \"cacheDuration\": 300000,\n \"validators\": {\n \"required\": true\n },\n \"resourcePath\": \"/api/departments\",\n \"filterCriteria\": {\n \"active\": true\n },\n \"optionLabelKey\": \"name\",\n \"optionValueKey\": \"id\",\n \"searchable\": true\n },\n {\n \"name\": \"teamId\",\n \"label\": \"Team\",\n \"controlType\": \"select\",\n \"endpoint\": \"/api/teams\",\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"dependencyFields\": [\n \"departmentId\"\n ],\n \"dependencyFilterMap\": {\n \"departmentId\": \"departmentId\"\n },\n \"dependencyValuePath\": \"id\",\n \"dependencyLoadOnChange\": \"immediate\",\n \"dependencyMergeStrategy\": \"replace\",\n \"dependencyDebounceMs\": 200,\n \"resetOnDependentChange\": true,\n \"enableDependencyCascade\": true,\n \"suppressInlineErrorsOnCascade\": true\n },\n {\n \"name\": \"managerId\",\n \"label\": \"Manager\",\n \"controlType\": \"autoComplete\",\n \"endpoint\": \"/api/employees\",\n \"queryParams\": {\n \"role\": \"manager\"\n },\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"filterField\": \"name\",\n \"dependencyFields\": [\n \"departmentId\"\n ],\n \"dependencyFilterMap\": {\n \"departmentId\": \"departmentId\"\n },\n \"dependencyLoadOnChange\": \"respectLoadOn\",\n \"disabled\": false\n },\n {\n \"name\": \"hireDate\",\n \"label\": \"Hire date\",\n \"controlType\": \"date\",\n \"dataType\": \"date\",\n \"validators\": {\n \"required\": true\n },\n \"minDate\": \"2020-01-01\",\n \"maxDate\": \"2030-12-31\",\n \"startView\": \"multi-year\",\n \"datepickerTogglePosition\": \"suffix\",\n \"touchUi\": true\n },\n {\n \"name\": \"terminationDate\",\n \"label\": \"Termination date\",\n \"controlType\": \"date\",\n \"conditionalDisplay\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"conditionalRequired\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n }\n },\n {\n \"name\": \"salary\",\n \"label\": \"Salary\",\n \"controlType\": \"currency\",\n \"dataType\": \"number\",\n \"format\": \"BRL|symbol|2\",\n \"validators\": {\n \"min\": 0,\n \"max\": 999999,\n \"minMessage\": \"Salary must be >= 0\"\n },\n \"min\": 0,\n \"max\": 999999,\n \"step\": 100,\n \"precision\": \"fixed\",\n \"currencyCode\": \"BRL\",\n \"currencyDisplay\": \"symbol\",\n \"prefix\": \"R$\",\n \"suffix\": \"bruto\",\n \"inlineEditing\": true,\n \"transformDisplayValue\": \"formatCurrency\",\n \"transformSaveValue\": \"parseCurrency\"\n },\n {\n \"name\": \"bonusPercent\",\n \"label\": \"Bonus %\",\n \"controlType\": \"slider\",\n \"dataType\": \"number\",\n \"defaultValue\": 10,\n \"validators\": {\n \"min\": 0,\n \"max\": 50\n },\n \"suffixIcon\": \"percent\",\n \"min\": 0,\n \"max\": 50,\n \"step\": 5,\n \"thumbLabel\": true,\n \"showTicks\": true,\n \"vertical\": false,\n \"invert\": false\n },\n {\n \"name\": \"workMode\",\n \"label\": \"Work mode\",\n \"controlType\": \"radio\",\n \"options\": [\n {\n \"text\": \"CLT\",\n \"value\": \"CLT\"\n },\n {\n \"text\": \"PJ\",\n \"value\": \"PJ\"\n },\n {\n \"text\": \"Intern\",\n \"value\": \"INTERN\"\n }\n ],\n \"defaultValue\": \"CLT\"\n },\n {\n \"name\": \"skills\",\n \"label\": \"Skills\",\n \"controlType\": \"multiSelect\",\n \"options\": [\n {\n \"text\": \"Angular\",\n \"value\": \"ANG\"\n },\n {\n \"text\": \"React\",\n \"value\": \"RE\"\n },\n {\n \"text\": \"Node\",\n \"value\": \"NODE\"\n }\n ],\n \"visibleIn\": [\n \"form\",\n \"filter\"\n ],\n \"multiple\": true,\n \"searchable\": true,\n \"clearable\": true,\n \"selectAll\": true,\n \"maxSelections\": 5,\n \"virtualScroll\": true,\n \"emptyOptionText\": \"None\"\n },\n {\n \"name\": \"availability\",\n \"label\": \"Availability\",\n \"controlType\": \"dateRange\",\n \"rangeSeparator\": \" to \"\n },\n {\n \"name\": \"notes\",\n \"label\": \"Notes\",\n \"controlType\": \"textarea\",\n \"validators\": {\n \"maxLength\": 500\n },\n \"hint\": \"Add relevant notes.\",\n \"textTransformApply\": \"displayOnly\",\n \"rows\": 4,\n \"minRows\": 3,\n \"maxRows\": 8,\n \"resize\": \"vertical\",\n \"spellcheck\": true,\n \"inputMode\": \"text\",\n \"textTransform\": \"uppercase\",\n \"readonly\": false,\n \"formHidden\": false,\n \"tableHidden\": true,\n \"filterHidden\": false\n },\n {\n \"name\": \"isActive\",\n \"label\": \"Active\",\n \"controlType\": \"toggle\",\n \"dataType\": \"boolean\",\n \"defaultValue\": true\n },\n {\n \"name\": \"avatar\",\n \"label\": \"Photo\",\n \"controlType\": \"upload\",\n \"accept\": \".png,.jpg,.jpeg\",\n \"multiple\": false,\n \"materialDesign\": {\n \"appearance\": \"outline\"\n },\n \"uploadUrl\": \"/api/uploads/avatars\",\n \"autoUpload\": true,\n \"maxFileSize\": 5242880,\n \"maxFiles\": 2,\n \"fileRestrictions\": {\n \"minResolution\": \"128x128\",\n \"maxResolution\": \"2048x2048\"\n },\n \"chunkSize\": 1048576,\n \"withCredentials\": false,\n \"headers\": {\n \"X-Upload-Source\": \"dynamic-form\"\n },\n \"method\": \"POST\",\n \"saveField\": \"file\"\n },\n {\n \"name\": \"terms\",\n \"label\": \"Accept terms\",\n \"controlType\": \"checkbox\",\n \"validators\": {\n \"requiredChecked\": true\n },\n \"tooltip\": \"Required to submit.\"\n },\n {\n \"name\": \"username\",\n \"label\": \"Username\",\n \"controlType\": \"input\",\n \"dataType\": \"text\",\n \"type\": \"text\",\n \"minLength\": 3,\n \"maxLength\": 20,\n \"pattern\": \"^[a-zA-Z0-9_]+$\",\n \"validators\": {\n \"required\": true,\n \"patternMessage\": \"Use letters, numbers, underscore\"\n },\n \"inputMode\": \"text\",\n \"autoComplete\": \"username\",\n \"readonly\": false,\n \"spellcheck\": false,\n \"textTransform\": \"lowercase\",\n \"placeholder\": \"user_name\"\n },\n {\n \"name\": \"password\",\n \"label\": \"Password\",\n \"controlType\": \"password\",\n \"dataType\": \"text\",\n \"type\": \"password\",\n \"showPasswordToggle\": true,\n \"autoComplete\": \"current-password\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 8\n }\n },\n {\n \"name\": \"country\",\n \"label\": \"Country\",\n \"controlType\": \"select\",\n \"dataType\": \"text\",\n \"options\": [\n {\n \"text\": \"Brazil\",\n \"value\": \"BR\"\n },\n {\n \"text\": \"United States\",\n \"value\": \"US\"\n },\n {\n \"text\": \"Canada\",\n \"value\": \"CA\"\n }\n ],\n \"optionLabelKey\": \"text\",\n \"optionValueKey\": \"value\",\n \"emptyOptionText\": \"Select a country\",\n \"searchable\": true,\n \"clearable\": true,\n \"resourcePath\": \"/api/countries\",\n \"filterCriteria\": {\n \"active\": true\n },\n \"multiple\": false\n },\n {\n \"name\": \"orgTree\",\n \"label\": \"Organization\",\n \"controlType\": \"treeSelect\",\n \"treeConfig\": {\n \"expandByDefault\": true,\n \"selectionMode\": \"single\"\n },\n \"nodes\": [\n {\n \"label\": \"HQ\",\n \"value\": \"hq\",\n \"children\": [\n {\n \"label\": \"Finance\",\n \"value\": \"finance\"\n }\n ]\n },\n {\n \"label\": \"Branch\",\n \"value\": \"branch\"\n }\n ],\n \"multiple\": false\n },\n {\n \"name\": \"ratingScore\",\n \"label\": \"Satisfaction\",\n \"controlType\": \"rating\",\n \"value\": 3,\n \"max\": 5,\n \"ratingMax\": 5,\n \"ratingPrecision\": 0.5,\n \"ratingIcon\": \"star\",\n \"ratingEmptyIcon\": \"star_border\",\n \"ratingAllowHalf\": true\n },\n {\n \"name\": \"progress\",\n \"label\": \"Progress\",\n \"controlType\": \"slider\",\n \"min\": 0,\n \"max\": 100,\n \"step\": 5,\n \"defaultValue\": 65,\n \"thumbLabel\": true,\n \"showTicks\": true\n },\n {\n \"name\": \"avatarDisplay\",\n \"label\": \"Avatar display\",\n \"controlType\": \"avatar\",\n \"imageSrc\": \"https://cdn.example.com/avatars/ana.png\",\n \"imageAlt\": \"User avatar\",\n \"initials\": \"AS\",\n \"avatarShape\": \"circle\",\n \"avatarSize\": \"medium\"\n },\n {\n \"name\": \"ctaButton\",\n \"label\": \"Request access\",\n \"controlType\": \"button\",\n \"icon\": \"send\",\n \"color\": \"primary\",\n \"variant\": \"raised\",\n \"size\": \"medium\",\n \"disabled\": false,\n \"loading\": false,\n \"action\": \"requestAccess\",\n \"actionPayload\": {\n \"role\": \"manager\"\n }\n },\n {\n \"name\": \"aiAssist\",\n \"label\": \"AI assist\",\n \"controlType\": \"button\",\n \"icon\": \"smart_toy\",\n \"color\": \"accent\",\n \"variant\": \"stroked\",\n \"size\": \"medium\",\n \"action\": \"aiAssist\",\n \"actionPayload\": {\n \"prompt\": \"Summarize the candidate profile\",\n \"history\": [\n {\n \"role\": \"user\",\n \"content\": \"Summarize this CV.\"\n },\n {\n \"role\": \"assistant\",\n \"content\": \"Summary goes here.\"\n }\n ]\n },\n \"tooltip\": \"Ask AI to summarize the candidate profile\"\n },\n {\n \"name\": \"themeColor\",\n \"label\": \"Theme color\",\n \"controlType\": \"colorPicker\",\n \"format\": \"hex\",\n \"views\": [\n \"palette\",\n \"gradient\"\n ],\n \"activeView\": \"palette\",\n \"preview\": true,\n \"clearButton\": true,\n \"actionsLayout\": \"end\",\n \"adaptiveMode\": true,\n \"adaptiveTitle\": \"Pick a color\",\n \"adaptiveSubtitle\": \"Brand palette\",\n \"popupSettings\": {\n \"width\": 320\n },\n \"gradientSettings\": {\n \"opacity\": true\n },\n \"paletteSettings\": {\n \"columns\": 8\n },\n \"fillMode\": \"solid\",\n \"rounded\": \"medium\",\n \"size\": \"medium\",\n \"icon\": \"palette\",\n \"iconClass\": \"color-icon\",\n \"svgIcon\": \"custom-palette\",\n \"tabindex\": 0\n },\n {\n \"name\": \"cpf\",\n \"label\": \"CPF/CNPJ\",\n \"controlType\": \"cpfCnpjInput\",\n \"maskType\": \"cpf-cnpj\",\n \"unmaskOnSubmit\": true,\n \"validators\": {\n \"cpf\": true,\n \"cnpj\": true\n }\n },\n {\n \"name\": \"meetingTime\",\n \"label\": \"Meeting time\",\n \"controlType\": \"timePicker\",\n \"enableSeconds\": true,\n \"stepMinute\": 15,\n \"stepSecond\": 30\n }\n ],\n \"sections\": [\n {\n \"id\": \"basic\",\n \"title\": \"Basic data\",\n \"description\": \"Primary profile and status fields.\",\n \"icon\": \"person\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"gapBottom\": 16,\n \"titleGapBottom\": 6,\n \"descriptionGapBottom\": 8,\n \"titleStyle\": \"titleMedium\",\n \"descriptionStyle\": \"bodyMedium\",\n \"titleColor\": \"#1a1a1a\",\n \"descriptionColor\": \"#666666\",\n \"headerAlign\": \"start\",\n \"headerTooltip\": \"Main data\",\n \"rows\": [\n {\n \"id\": \"row-basic-1\",\n \"gap\": 16,\n \"rowGap\": 12,\n \"columns\": [\n {\n \"id\": \"col-basic-1\",\n \"fields\": [\n \"fullName\",\n \"email\"\n ],\n \"span\": {\n \"xs\": 12,\n \"sm\": 12,\n \"md\": 6,\n \"lg\": 6,\n \"xl\": 6\n },\n \"padding\": 8,\n \"className\": \"col-basic-main\",\n \"testId\": \"col-basic-main\",\n \"title\": \"Identity\"\n },\n {\n \"id\": \"col-basic-2\",\n \"fields\": [\n \"status\",\n \"hireDate\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n },\n \"hidden\": {\n \"xs\": true,\n \"sm\": false,\n \"md\": false,\n \"lg\": false,\n \"xl\": false\n },\n \"order\": {\n \"xs\": 2,\n \"sm\": 1,\n \"md\": 2,\n \"lg\": 2,\n \"xl\": 1\n }\n }\n ],\n \"title\": \"Core fields\"\n },\n {\n \"id\": \"row-basic-2\",\n \"gap\": 16,\n \"columns\": [\n {\n \"id\": \"col-basic-3\",\n \"fields\": [\n \"phone\",\n \"isActive\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n },\n \"offset\": {\n \"xs\": 0,\n \"sm\": 0,\n \"md\": 1,\n \"lg\": 0,\n \"xl\": 0\n }\n },\n {\n \"id\": \"col-basic-4\",\n \"fields\": [\n \"departmentId\",\n \"teamId\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-basic-3\",\n \"columns\": [\n {\n \"id\": \"col-basic-5\",\n \"fields\": [\n \"managerId\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"employment\",\n \"title\": \"Employment\",\n \"description\": \"Contract and compensation.\",\n \"icon\": \"badge\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"rows\": [\n {\n \"id\": \"row-employment-1\",\n \"gap\": 16,\n \"columns\": [\n {\n \"id\": \"col-employment-1\",\n \"fields\": [\n \"salary\",\n \"bonusPercent\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-employment-2\",\n \"fields\": [\n \"workMode\",\n \"terminationDate\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-employment-2\",\n \"rowGap\": 16,\n \"columns\": [\n {\n \"id\": \"col-employment-3\",\n \"fields\": [\n \"skills\",\n \"availability\"\n ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"extras\",\n \"title\": \"Extras\",\n \"description\": \"Additional notes and context.\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"rows\": [\n {\n \"id\": \"row-extras-1\",\n \"columns\": [\n {\n \"id\": \"col-extras-1\",\n \"fields\": [\n \"notes\"\n ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n },\n \"align\": \"stretch\",\n \"padding\": 8\n }\n ]\n }\n ]\n },\n {\n \"id\": \"attachments\",\n \"title\": \"Attachments\",\n \"description\": \"Files and confirmations.\",\n \"collapsible\": true,\n \"collapsed\": true,\n \"rows\": [\n {\n \"id\": \"row-attachments-1\",\n \"columns\": [\n {\n \"id\": \"col-attachments-1\",\n \"fields\": [\n \"avatar\",\n \"terms\"\n ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n },\n \"align\": \"center\"\n }\n ]\n }\n ]\n },\n {\n \"id\": \"advanced\",\n \"title\": \"Advanced\",\n \"description\": \"Extra controls and integrations.\",\n \"collapsible\": true,\n \"collapsed\": true,\n \"rows\": [\n {\n \"id\": \"row-advanced-1\",\n \"gap\": 16,\n \"columns\": [\n {\n \"id\": \"col-advanced-1\",\n \"fields\": [\n \"username\",\n \"password\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-advanced-2\",\n \"fields\": [\n \"country\",\n \"orgTree\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-advanced-2\",\n \"gap\": 16,\n \"columns\": [\n {\n \"id\": \"col-advanced-3\",\n \"fields\": [\n \"themeColor\",\n \"cpf\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-advanced-4\",\n \"fields\": [\n \"meetingTime\",\n \"ratingScore\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-advanced-3\",\n \"gap\": 16,\n \"columns\": [\n {\n \"id\": \"col-advanced-5\",\n \"fields\": [\n \"progress\",\n \"avatarDisplay\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-advanced-6\",\n \"fields\": [\n \"ctaButton\",\n \"aiAssist\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n }\n ],\n \"actions\": {\n \"submit\": {\n \"visible\": true,\n \"label\": \"Save\",\n \"icon\": \"save\",\n \"color\": \"primary\",\n \"variant\": \"raised\",\n \"size\": \"medium\",\n \"type\": \"submit\",\n \"shortcut\": \"Ctrl+S\",\n \"tooltip\": \"Save changes\",\n \"className\": \"action-submit\",\n \"style\": {\n \"letterSpacing\": \"0.5px\"\n },\n \"disabled\": false,\n \"loading\": false\n },\n \"cancel\": {\n \"visible\": true,\n \"label\": \"Cancel\",\n \"icon\": \"close\",\n \"type\": \"button\",\n \"color\": \"basic\"\n },\n \"reset\": {\n \"visible\": true,\n \"label\": \"Reset\",\n \"type\": \"reset\",\n \"color\": \"basic\"\n },\n \"custom\": [\n {\n \"id\": \"archive\",\n \"visible\": true,\n \"label\": \"Archive\",\n \"icon\": \"archive\",\n \"color\": \"warn\",\n \"variant\": \"stroked\",\n \"action\": \"archive\",\n \"tooltip\": \"Archive record\"\n },\n {\n \"id\": \"preview\",\n \"visible\": true,\n \"label\": \"Preview\",\n \"icon\": \"visibility\",\n \"color\": \"accent\",\n \"variant\": \"flat\",\n \"action\": \"preview\"\n }\n ],\n \"position\": \"right\",\n \"orientation\": \"horizontal\",\n \"spacing\": \"normal\",\n \"sticky\": true,\n \"divider\": true,\n \"placement\": \"afterSections\",\n \"containerClassName\": \"form-actions-container\",\n \"containerStyles\": {\n \"background\": \"var(--md-sys-color-surface-container)\",\n \"border\": \"1px solid var(--md-sys-color-outline-variant)\",\n \"borderRadius\": \"12px\",\n \"padding\": \"12px 16px\"\n },\n \"mobile\": {\n \"position\": \"center\",\n \"orientation\": \"vertical\",\n \"collapseToMenu\": true\n }\n },\n \"formRules\": [\n {\n \"id\": \"hide-comp-for-intern\",\n \"name\": \"Hide compensation for interns\",\n \"targetType\": \"field\",\n \"targets\": [\n \"salary\",\n \"bonusPercent\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"workMode\"\n },\n \"INTERN\"\n ]\n },\n \"properties\": {\n \"visible\": false,\n \"required\": false\n },\n \"propertiesWhenFalse\": {\n \"visible\": true\n }\n },\n \"description\": \"Rule for coverage of description field.\",\n \"targetFields\": [\n \"salary\",\n \"bonusPercent\"\n ],\n \"context\": \"visibility\"\n },\n {\n \"id\": \"require-termination-date\",\n \"name\": \"Require termination date when inactive\",\n \"targetType\": \"field\",\n \"targets\": [\n \"terminationDate\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"properties\": {\n \"visible\": true,\n \"required\": true\n }\n }\n },\n {\n \"id\": \"collapse-employment-section\",\n \"name\": \"Collapse employment when active\",\n \"targetType\": \"section\",\n \"targets\": [\n \"employment\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"ACTIVE\"\n ]\n },\n \"properties\": {\n \"collapsed\": false\n },\n \"propertiesWhenFalse\": {\n \"collapsed\": true\n }\n }\n },\n {\n \"id\": \"disable-archive-when-inactive\",\n \"name\": \"Disable archive when not active\",\n \"targetType\": \"action\",\n \"targets\": [\n \"archive\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"isActive\"\n },\n true\n ]\n },\n \"properties\": {\n \"disabled\": false\n },\n \"propertiesWhenFalse\": {\n \"disabled\": true\n }\n }\n },\n {\n \"id\": \"hide-extras-row\",\n \"name\": \"Hide extras when intern\",\n \"targetType\": \"row\",\n \"targets\": [\n \"row-extras-1\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"workMode\"\n },\n \"INTERN\"\n ]\n },\n \"properties\": {\n \"visible\": false\n },\n \"propertiesWhenFalse\": {\n \"visible\": true,\n \"rowGap\": 16\n }\n }\n },\n {\n \"id\": \"expand-notes-column\",\n \"name\": \"Expand notes column when inactive\",\n \"targetType\": \"column\",\n \"targets\": [\n \"col-extras-1\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"properties\": {\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n }\n }\n }\n },\n {\n \"id\": \"rule-field-all\",\n \"name\": \"Field properties coverage\",\n \"targetType\": \"field\",\n \"targets\": [\n \"fullName\"\n ],\n \"effect\": {\n \"condition\": true,\n \"properties\": {\n \"visible\": true,\n \"required\": true,\n \"readonly\": false,\n \"disabled\": false,\n \"className\": \"rule-field\",\n \"style\": {\n \"color\": \"#333333\"\n },\n \"label\": \"Rule label\",\n \"description\": \"Rule description\",\n \"placeholder\": \"Rule placeholder\",\n \"hint\": \"Rule hint\",\n \"tooltip\": \"Rule tooltip\",\n \"prefixIcon\": \"info\",\n \"suffixIcon\": \"check\",\n \"prefixText\": \"R$\",\n \"suffixText\": \"USD\",\n \"defaultValue\": {\n \"value\": \"default\"\n },\n \"options\": [\n {\n \"text\": \"A\",\n \"value\": \"A\"\n }\n ],\n \"appearance\": \"outline\",\n \"color\": \"primary\",\n \"floatLabel\": \"always\",\n \"hintPosition\": \"end\",\n \"validators\": {\n \"required\": true\n }\n },\n \"propertiesWhenFalse\": {\n \"visible\": false,\n \"required\": false,\n \"readonly\": true,\n \"disabled\": true,\n \"className\": \"rule-field-off\",\n \"style\": {\n \"color\": \"#999999\"\n },\n \"label\": \"Rule label off\",\n \"description\": \"Rule description off\",\n \"placeholder\": \"Rule placeholder off\",\n \"hint\": \"Rule hint off\",\n \"tooltip\": \"Rule tooltip off\",\n \"prefixIcon\": \"block\",\n \"suffixIcon\": \"close\",\n \"prefixText\": \"OFF\",\n \"suffixText\": \"OFF\",\n \"defaultValue\": {\n \"value\": null\n },\n \"options\": [\n {\n \"text\": \"B\",\n \"value\": \"B\"\n }\n ],\n \"appearance\": \"fill\",\n \"color\": \"accent\",\n \"floatLabel\": \"never\",\n \"hintPosition\": \"start\",\n \"validators\": {\n \"required\": false\n }\n }\n }\n },\n {\n \"id\": \"rule-section-all\",\n \"name\": \"Section properties coverage\",\n \"targetType\": \"section\",\n \"targets\": [\n \"basic\"\n ],\n \"effect\": {\n \"condition\": true,\n \"properties\": {\n \"visible\": true,\n \"title\": \"Rule section title\",\n \"description\": \"Rule section description\",\n \"icon\": \"settings\",\n \"className\": \"rule-section\",\n \"style\": {\n \"borderRadius\": \"8px\"\n },\n \"borderColor\": \"#cccccc\",\n \"borderStyle\": \"solid\",\n \"borderWidth\": 1,\n \"collapsible\": true,\n \"collapsed\": false,\n \"headerTooltip\": \"Section tooltip\",\n \"headerAlign\": \"start\",\n \"gapBottom\": 12,\n \"titleGapBottom\": 4,\n \"descriptionGapBottom\": 6,\n \"titleColor\": \"#222222\",\n \"descriptionColor\": \"#555555\",\n \"titleStyle\": \"titleSmall\",\n \"descriptionStyle\": \"bodySmall\",\n \"appearance\": \"outlined\"\n },\n \"propertiesWhenFalse\": {\n \"visible\": false,\n \"title\": \"Rule section title off\",\n \"description\": \"Rule section description off\",\n \"icon\": \"block\",\n \"className\": \"rule-section-off\",\n \"style\": {\n \"borderRadius\": \"0px\"\n },\n \"borderColor\": \"#eeeeee\",\n \"borderStyle\": \"dashed\",\n \"borderWidth\": 0,\n \"collapsible\": false,\n \"collapsed\": true,\n \"headerTooltip\": \"Section tooltip off\",\n \"headerAlign\": \"center\",\n \"gapBottom\": 0,\n \"titleGapBottom\": 0,\n \"descriptionGapBottom\": 0,\n \"titleColor\": \"#999999\",\n \"descriptionColor\": \"#999999\",\n \"titleStyle\": \"titleMedium\",\n \"descriptionStyle\": \"bodyMedium\",\n \"appearance\": \"flat\"\n }\n }\n },\n {\n \"id\": \"rule-action-all\",\n \"name\": \"Action properties coverage\",\n \"targetType\": \"action\",\n \"targets\": [\n \"archive\"\n ],\n \"effect\": {\n \"condition\": true,\n \"properties\": {\n \"visible\": true,\n \"disabled\": false,\n \"loading\": false,\n \"label\": \"Rule action\",\n \"icon\": \"archive\",\n \"tooltip\": \"Rule tooltip\",\n \"color\": \"warn\",\n \"variant\": \"stroked\",\n \"size\": \"medium\",\n \"className\": \"rule-action\",\n \"style\": {\n \"minWidth\": \"120px\"\n }\n },\n \"propertiesWhenFalse\": {\n \"visible\": false,\n \"disabled\": true,\n \"loading\": true,\n \"label\": \"Rule action off\",\n \"icon\": \"block\",\n \"tooltip\": \"Rule tooltip off\",\n \"color\": \"basic\",\n \"variant\": \"flat\",\n \"size\": \"small\",\n \"className\": \"rule-action-off\",\n \"style\": {\n \"minWidth\": \"80px\"\n }\n }\n }\n },\n {\n \"id\": \"rule-row-all\",\n \"name\": \"Row properties coverage\",\n \"targetType\": \"row\",\n \"targets\": [\n \"row-basic-1\"\n ],\n \"effect\": {\n \"condition\": true,\n \"properties\": {\n \"visible\": true,\n \"gap\": 12,\n \"rowGap\": 8,\n \"className\": \"rule-row\",\n \"style\": {\n \"marginBottom\": \"12px\"\n }\n },\n \"propertiesWhenFalse\": {\n \"visible\": false,\n \"gap\": 0,\n \"rowGap\": 0,\n \"className\": \"rule-row-off\",\n \"style\": {\n \"marginBottom\": \"0px\"\n }\n }\n }\n },\n {\n \"id\": \"rule-column-all\",\n \"name\": \"Column properties coverage\",\n \"targetType\": \"column\",\n \"targets\": [\n \"col-basic-1\"\n ],\n \"effect\": {\n \"condition\": true,\n \"properties\": {\n \"visible\": true,\n \"span\": {\n \"xs\": 12,\n \"sm\": 12,\n \"md\": 6,\n \"lg\": 6,\n \"xl\": 6\n },\n \"offset\": {\n \"xs\": 0,\n \"sm\": 0,\n \"md\": 0,\n \"lg\": 0,\n \"xl\": 0\n },\n \"order\": {\n \"xs\": 1,\n \"sm\": 1,\n \"md\": 1,\n \"lg\": 1,\n \"xl\": 1\n },\n \"hidden\": {\n \"xs\": false,\n \"sm\": false,\n \"md\": false,\n \"lg\": false,\n \"xl\": false\n },\n \"align\": \"stretch\",\n \"padding\": 8,\n \"className\": \"rule-column\",\n \"style\": {\n \"backgroundColor\": \"#f6f6f6\"\n }\n },\n \"propertiesWhenFalse\": {\n \"visible\": false,\n \"span\": {\n \"xs\": 12,\n \"sm\": 12,\n \"md\": 12,\n \"lg\": 12,\n \"xl\": 12\n },\n \"offset\": {\n \"xs\": 0,\n \"sm\": 0,\n \"md\": 0,\n \"lg\": 0,\n \"xl\": 0\n },\n \"order\": {\n \"xs\": 2,\n \"sm\": 2,\n \"md\": 2,\n \"lg\": 2,\n \"xl\": 2\n },\n \"hidden\": {\n \"xs\": true,\n \"sm\": true,\n \"md\": true,\n \"lg\": true,\n \"xl\": true\n },\n \"align\": \"center\",\n \"padding\": 0,\n \"className\": \"rule-column-off\",\n \"style\": {\n \"backgroundColor\": \"#ffffff\"\n }\n }\n }\n }\n ],\n \"formRulesState\": {\n \"nodes\": {},\n \"rootNodes\": [],\n \"selectedNodeId\": null,\n \"currentDSL\": \"\",\n \"currentJSON\": [],\n \"validationErrors\": [],\n \"mode\": \"visual\",\n \"isDirty\": false,\n \"history\": [],\n \"historyPosition\": 0\n },\n \"_variants\": [\n {\n \"id\": \"actions-legacy-flags\",\n \"description\": \"Legacy actions flags.\",\n \"patch\": {\n \"actions\": {\n \"showSaveButton\": true,\n \"submitButtonLabel\": \"Save\",\n \"showCancelButton\": true,\n \"cancelButtonLabel\": \"Back\",\n \"showResetButton\": false\n }\n }\n },\n {\n \"id\": \"layout-minimal\",\n \"description\": \"Minimal layout with one section and two fields.\",\n \"patch\": {\n \"sections\": [\n {\n \"id\": \"simple\",\n \"title\": \"Simple\",\n \"rows\": [\n {\n \"id\": \"row-simple-1\",\n \"columns\": [\n {\n \"id\": \"col-simple-1\",\n \"fields\": [\n \"fullName\",\n \"email\"\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"id\": \"rules-clear-override\",\n \"description\": \"Clear rule overrides with null.\",\n \"patch\": {\n \"formRules\": [\n {\n \"id\": \"hide-comp-for-intern\",\n \"name\": \"Hide compensation for interns\",\n \"targetType\": \"field\",\n \"targets\": [\n \"salary\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"workMode\"\n },\n \"INTERN\"\n ]\n },\n \"properties\": {\n \"visible\": null\n }\n }\n }\n ]\n }\n }\n ],\n \"presentation\": {\n \"labelFontSize\": 12,\n \"valueFontSize\": 14,\n \"labelPosition\": \"left\",\n \"compact\": false,\n \"density\": \"cozy\",\n \"labelWidth\": 140,\n \"labelAlign\": \"start\",\n \"valueAlign\": \"end\"\n }\n}\n",
8539
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.form-config.json",
8726
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
8540
8727
  "contentHash": "eb8680d3bf134f3a9db09ba3ecc324db4d163a86c5ec5fcd7ffe972e381c9b1e",
8541
8728
  "sourceKind": "component_definition",
8542
8729
  "sourceId": "praxis-dynamic-form",
@@ -8546,7 +8733,7 @@
8546
8733
  "chunkIndex": 8,
8547
8734
  "chunkKind": "recipe",
8548
8735
  "content": "{\n \"_comment\": \"Component-level recipe for PraxisDynamicForm. Values are placeholders for AI examples.\",\n \"templateMeta\": {\n \"defaultVariantId\": \"form-config\",\n \"variants\": [\n {\n \"id\": \"form-config\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"form-config\",\n \"aiDescription\": \"FormConfig completo com layout, validacoes e hooks.\",\n \"tags\": [\n \"full\",\n \"config\"\n ],\n \"useWhen\": \"usuario pede formulario completo ou gerado a partir do schema\",\n \"examplePrompts\": [\n \"gere um formulario completo para cadastro de funcionario\",\n \"crie um form completo com layout e validacoes\"\n ]\n },\n {\n \"id\": \"fields\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"fields\",\n \"aiDescription\": \"Lista completa de FieldMetadata e sections.\",\n \"tags\": [\n \"fields\",\n \"metadata\"\n ],\n \"useWhen\": \"usuario pede apenas campos ou metadados\",\n \"examplePrompts\": [\n \"adicione campos para endereco e contato\",\n \"gere somente a lista de campos\"\n ]\n },\n {\n \"id\": \"layout\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"layout\",\n \"aiDescription\": \"Layout de secoes/linhas/colunas com exemplos de acoes.\",\n \"tags\": [\n \"layout\",\n \"sections\"\n ],\n \"useWhen\": \"usuario pede reorganizacao visual do formulario\",\n \"examplePrompts\": [\n \"organize o layout em duas colunas\",\n \"crie secoes e linhas para o formulario\"\n ]\n },\n {\n \"id\": \"validation\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"validation\",\n \"aiDescription\": \"Validacoes complexas e regras condicionais.\",\n \"tags\": [\n \"validation\",\n \"rules\"\n ],\n \"useWhen\": \"usuario pede validacoes avancadas ou regras condicionais\",\n \"examplePrompts\": [\n \"adicione validacao cruzada de email\",\n \"crie validacoes condicionais para empresa\"\n ]\n },\n {\n \"id\": \"local-transient\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"local-transient\",\n \"aiDescription\": \"Campos locais/transient que participam da UI mas ficam fora do payload backend por padrao.\",\n \"tags\": [\n \"fields\",\n \"local\",\n \"transient\",\n \"submit\"\n ],\n \"useWhen\": \"usuario precisa de campos auxiliares no formulario que nao devem participar do payload persistido\",\n \"examplePrompts\": [\n \"adicione um campo local que nao seja enviado ao backend\",\n \"crie campos auxiliares transient para ajudar no preenchimento\"\n ]\n },\n {\n \"id\": \"entity-lookup-procurement\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"entity-lookup-procurement\",\n \"aiDescription\": \"Formulario de pedido de compra com Entity Lookup corporativo, RESOURCE_ENTITY, cascata, reidratacao e politica de selecao.\",\n \"tags\": [\n \"entity-lookup\",\n \"resource-entity\",\n \"option-source\",\n \"cascading\",\n \"rehydration\",\n \"procurement\"\n ],\n \"useWhen\": \"usuario precisa selecionar entidades reais do dominio com status, permissao, navegacao, dependsOn e by-ids\",\n \"examplePrompts\": [\n \"crie um pedido de compra com lookup de fornecedor contrato e produto\",\n \"gere entityLookup com dependsOn e dependencyFilterMap\",\n \"mostre um formulario com RESOURCE_ENTITY e reidratacao por by-ids\"\n ]\n },\n {\n \"id\": \"visual-block-domain-rules\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"visual-block-domain-rules\",\n \"aiDescription\": \"Regras de dominio que alteram visualBlock text/title/message/style sem criar campos nem payload.\",\n \"tags\": [\n \"visual-block\",\n \"form-rules\",\n \"domain-rules\",\n \"rich-content\",\n \"llm-authoring\"\n ],\n \"useWhen\": \"usuario precisa de avisos, orientacoes e copy operacional condicionais sem alterar submit payload\",\n \"examplePrompts\": [\n \"crie regras de dominio para alterar avisos visuais do formulario\",\n \"adicione visualBlock rules para LGPD compliance ou risco de fornecedor\",\n \"mostre regras de texto para blocos visuais sem criar campos\"\n ]\n },\n {\n \"id\": \"command-rules\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"variantId\": \"command-rules\",\n \"aiDescription\": \"Regras condicionais governadas que executam GlobalActionRef depois que valores calculados estabilizam.\",\n \"tags\": [\n \"formCommandRules\",\n \"global-action\",\n \"computed-values\",\n \"business-rules\"\n ],\n \"useWhen\": \"usuario precisa disparar alertas, confirmacoes ou comandos host-mediated por regra declarativa do formulario\",\n \"examplePrompts\": [\n \"crie uma regra que alerta quando idade calculada for menor que 18\",\n \"confirme quando o periodo de ferias iniciar em uma sexta-feira\",\n \"mostre formCommandRules com dialog.alert e dialog.confirm\"\n ]\n }\n ]\n },\n \"component\": \"praxis-dynamic-form\",\n \"inputs\": {\n \"resourcePath\": \"/api/employees\",\n \"resourceId\": \"123\",\n \"mode\": \"edit\",\n \"config\": {\n \"_comment\": \"Use praxis-dynamic-form.form-config.json for a full FormConfig example.\",\n \"sections\": [\n {\n \"id\": \"minimal\",\n \"rows\": []\n }\n ],\n \"presentation\": {\n \"labelFontSize\": 12,\n \"valueFontSize\": 14,\n \"labelPosition\": \"left\",\n \"compact\": false,\n \"density\": \"cozy\",\n \"labelWidth\": 140,\n \"labelAlign\": \"start\",\n \"valueAlign\": \"end\"\n }\n },\n \"schemaSource\": \"resource\",\n \"enableCustomization\": true,\n \"formId\": \"employee-form\",\n \"layout\": {\n \"formTitle\": \"Legacy layout example\",\n \"formDescription\": \"Fieldsets-based layout (legacy)\",\n \"fieldsets\": [\n {\n \"id\": \"legacy-basic\",\n \"title\": \"Legacy\",\n \"orientation\": \"vertical\",\n \"rows\": [\n {\n \"id\": \"legacy-row-1\",\n \"orientation\": \"horizontal\",\n \"fields\": [\n {\n \"name\": \"legacyField\",\n \"label\": \"Legacy field\",\n \"controlType\": \"input\"\n }\n ]\n }\n ]\n }\n ]\n },\n \"backConfig\": {\n \"strategy\": \"navigate\",\n \"returnTo\": \"/employees\",\n \"confirmOnDirty\": true\n },\n \"hooks\": {\n \"beforeInit\": [\n {\n \"id\": \"load-static-options\",\n \"priority\": 100,\n \"timeoutMs\": 2000,\n \"args\": {\n \"source\": \"cache\"\n }\n }\n ],\n \"afterInit\": [],\n \"beforeValidate\": [],\n \"afterValidate\": [],\n \"beforeSubmit\": [],\n \"afterSubmit\": [\n {\n \"id\": \"notify-success\",\n \"priority\": 10\n }\n ],\n \"onError\": []\n },\n \"removeEmptyContainersOnSave\": true,\n \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 250,\n \"notifyIfOutdated\": \"snackbar\",\n \"snoozeMs\": 86400000,\n \"autoOpenSettingsOnOutdated\": false,\n \"readonlyModeGlobal\": false,\n \"disabledModeGlobal\": false,\n \"presentationModeGlobal\": false,\n \"visibleGlobal\": true,\n \"customEndpoints\": {\n \"getAll\": \"/api/employees\",\n \"getById\": \"/api/employees/{id}\",\n \"create\": \"/api/employees\",\n \"update\": \"/api/employees/{id}\",\n \"delete\": \"/api/employees/{id}\",\n \"filter\": \"/api/employees/filter\",\n \"schema\": \"/api/employees/schemas\"\n }\n },\n \"outputs\": {\n \"formSubmit\": {\n \"payload\": {\n \"stage\": \"after\",\n \"formData\": {\n \"id\": 123,\n \"fullName\": \"Ana Souza\"\n },\n \"rawFormData\": {\n \"id\": 123,\n \"fullName\": \"Ana Souza\",\n \"approvalComment\": \"Conferido com o solicitante\"\n },\n \"isValid\": true,\n \"validationErrors\": [],\n \"entityId\": 123,\n \"operation\": \"update\",\n \"result\": {\n \"status\": \"ok\"\n }\n }\n },\n \"formCancel\": {\n \"payload\": null\n },\n \"formReset\": {\n \"payload\": null\n },\n \"configChange\": {\n \"payload\": {\n \"sections\": [\n {\n \"id\": \"minimal\",\n \"rows\": []\n }\n ]\n }\n },\n \"formReady\": {\n \"payload\": {\n \"formGroup\": \"[FormGroup]\",\n \"fieldsMetadata\": [\n {\n \"name\": \"fullName\",\n \"label\": \"Full name\",\n \"controlType\": \"input\"\n }\n ],\n \"layout\": {\n \"formTitle\": \"Employee\"\n },\n \"hasEntity\": true,\n \"entityId\": 123\n }\n },\n \"valueChange\": {\n \"payload\": {\n \"formData\": {\n \"email\": \"ana@example.com\"\n },\n \"changedField\": \"email\",\n \"previousValue\": \"old@example.com\",\n \"currentValue\": \"ana@example.com\",\n \"changedFields\": [\n \"email\"\n ],\n \"isValid\": true,\n \"entityId\": 123\n }\n },\n \"syncCompleted\": {\n \"payload\": {\n \"hasChanges\": true,\n \"addedFields\": [\n {\n \"name\": \"nickname\",\n \"label\": \"Nickname\",\n \"controlType\": \"input\"\n }\n ],\n \"removedFields\": [\n \"legacyField\"\n ],\n \"modifiedFields\": [\n {\n \"fieldName\": \"email\",\n \"property\": \"label\",\n \"localValue\": \"Email\",\n \"serverValue\": \"E-mail\"\n }\n ],\n \"conflicts\": [\n {\n \"fieldName\": \"salary\",\n \"reason\": \"user-customized\",\n \"resolution\": \"keep-local\"\n }\n ]\n }\n },\n \"initializationError\": {\n \"payload\": {\n \"stage\": \"schema-fetch\",\n \"error\": {\n \"message\": \"Schema failed to load\"\n },\n \"context\": {\n \"formId\": \"employee-form\",\n \"resourcePath\": \"/api/employees\",\n \"hasLocalConfig\": true\n },\n \"recoverable\": true,\n \"userMessage\": \"Unable to load form schema.\"\n }\n },\n \"enableCustomizationChange\": {\n \"payload\": true\n },\n \"customAction\": {\n \"payload\": {\n \"actionId\": \"archive\",\n \"formData\": {\n \"id\": 123\n },\n \"isValid\": true,\n \"source\": \"button\"\n }\n },\n \"actionConfirmation\": {\n \"payload\": {\n \"actionId\": \"archive\",\n \"message\": \"Confirm archive?\",\n \"confirmed\": true\n }\n },\n \"schemaStatusChange\": {\n \"payload\": {\n \"outdated\": false,\n \"serverHash\": \"hash-abc-123\",\n \"lastVerifiedAt\": \"2024-02-02T10:00:00Z\",\n \"formId\": \"employee-form\"\n }\n }\n }\n}\n",
8549
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.json",
8736
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.json",
8550
8737
  "contentHash": "41d4a94c1baf1bb5150f8504c1a3e6e74134f1f6de30046982cb270c0233538e",
8551
8738
  "sourceKind": "component_definition",
8552
8739
  "sourceId": "praxis-dynamic-form",
@@ -8556,7 +8743,7 @@
8556
8743
  "chunkIndex": 9,
8557
8744
  "chunkKind": "recipe",
8558
8745
  "content": "{\n \"_comment\": \"Receita de layout complexo com múltiplas seções, colunas assimétricas (2/3 + 1/3) e ações posicionadas explicitamente.\",\n \"templateMeta\": {\n \"variantId\": \"layout\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"tags\": [\n \"layout\",\n \"sections\"\n ],\n \"useWhen\": \"ajustar layout, secoes, linhas e colunas\",\n \"examplePrompts\": [\n \"organize o layout em colunas\",\n \"divida o formulario em secoes\"\n ]\n },\n \"metadata\": {\n \"name\": \"Complex Layout Example\",\n \"version\": \"v1\"\n },\n \"sections\": [\n {\n \"id\": \"summary\",\n \"title\": \"Resumo\",\n \"description\": \"Informações principais em colunas assimétricas.\",\n \"rows\": [\n {\n \"id\": \"summary-row-1\",\n \"columns\": [\n {\n \"id\": \"summary-main\",\n \"span\": {\n \"md\": 8,\n \"lg\": 8\n },\n \"fields\": [\n \"title\",\n \"description\"\n ],\n \"_comment\": \"Coluna principal ocupando 2/3 da largura.\"\n },\n {\n \"id\": \"summary-side\",\n \"span\": {\n \"md\": 4,\n \"lg\": 4\n },\n \"fields\": [\n \"status\",\n \"priority\",\n \"owner\"\n ],\n \"_comment\": \"Coluna lateral ocupando 1/3 da largura.\"\n }\n ]\n }\n ]\n },\n {\n \"id\": \"dates\",\n \"title\": \"Datas\",\n \"rows\": [\n {\n \"id\": \"dates-row-1\",\n \"columns\": [\n {\n \"id\": \"dates-start\",\n \"span\": {\n \"md\": 4,\n \"lg\": 4\n },\n \"fields\": [\n \"startDate\"\n ]\n },\n {\n \"id\": \"dates-due\",\n \"span\": {\n \"md\": 4,\n \"lg\": 4\n },\n \"fields\": [\n \"dueDate\"\n ]\n },\n {\n \"id\": \"dates-sla\",\n \"span\": {\n \"md\": 4,\n \"lg\": 4\n },\n \"fields\": [\n \"slaDays\"\n ]\n }\n ],\n \"_comment\": \"Linha com 3 colunas de largura igual (automatico).\"\n }\n ]\n },\n {\n \"id\": \"attachments\",\n \"title\": \"Anexos e Comentários\",\n \"rows\": [\n {\n \"id\": \"attachments-row-1\",\n \"columns\": [\n {\n \"id\": \"attachments-col\",\n \"fields\": [\n \"attachments\"\n ]\n }\n ]\n },\n {\n \"id\": \"attachments-row-2\",\n \"columns\": [\n {\n \"id\": \"notes-col\",\n \"fields\": [\n \"notes\"\n ]\n }\n ]\n }\n ]\n }\n ],\n \"fieldMetadata\": [\n {\n \"name\": \"title\",\n \"label\": \"Título\",\n \"controlType\": \"input\",\n \"validators\": {\n \"required\": true\n }\n },\n {\n \"name\": \"description\",\n \"label\": \"Descrição\",\n \"controlType\": \"textarea\",\n \"rows\": 3\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"label\": \"Aberto\",\n \"value\": \"OPEN\"\n },\n {\n \"label\": \"Fechado\",\n \"value\": \"CLOSED\"\n }\n ]\n },\n {\n \"name\": \"priority\",\n \"label\": \"Prioridade\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"label\": \"Alta\",\n \"value\": \"HIGH\"\n },\n {\n \"label\": \"Média\",\n \"value\": \"MEDIUM\"\n },\n {\n \"label\": \"Baixa\",\n \"value\": \"LOW\"\n }\n ]\n },\n {\n \"name\": \"owner\",\n \"label\": \"Responsável\",\n \"controlType\": \"autoComplete\",\n \"searchable\": true\n },\n {\n \"name\": \"startDate\",\n \"label\": \"Início\",\n \"controlType\": \"date\"\n },\n {\n \"name\": \"dueDate\",\n \"label\": \"Entrega\",\n \"controlType\": \"date\"\n },\n {\n \"name\": \"slaDays\",\n \"label\": \"SLA (dias)\",\n \"controlType\": \"numericTextBox\"\n },\n {\n \"name\": \"attachments\",\n \"label\": \"Anexos\",\n \"controlType\": \"upload\"\n },\n {\n \"name\": \"notes\",\n \"label\": \"Notas\",\n \"controlType\": \"textarea\",\n \"rows\": 4\n }\n ],\n \"actions\": {\n \"submit\": {\n \"id\": \"save\",\n \"label\": \"Salvar\",\n \"color\": \"primary\",\n \"visible\": true,\n \"type\": \"submit\"\n },\n \"cancel\": {\n \"id\": \"cancel\",\n \"label\": \"Cancelar\",\n \"color\": \"basic\",\n \"visible\": true,\n \"type\": \"button\"\n },\n \"reset\": {\n \"id\": \"reset\",\n \"label\": \"Limpar\",\n \"color\": \"basic\",\n \"visible\": false,\n \"type\": \"reset\"\n },\n \"position\": \"right\",\n \"placement\": \"afterSections\"\n }\n}\n",
8559
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.layout.json",
8746
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.layout.json",
8560
8747
  "contentHash": "0a684ab4e0f45325f1540b3fc0569c41d61ce8af8bd91764ad449b5769134156",
8561
8748
  "sourceKind": "component_definition",
8562
8749
  "sourceId": "praxis-dynamic-form",
@@ -8566,7 +8753,7 @@
8566
8753
  "chunkIndex": 10,
8567
8754
  "chunkKind": "recipe",
8568
8755
  "content": "{\n \"_comment\": \"Recipe for host local/transient fields in PraxisDynamicForm. These fields participate in UI state but are omitted from backend payloads by default.\",\n \"templateMeta\": {\n \"variantId\": \"local-transient\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"tags\": [\n \"fields\",\n \"local\",\n \"transient\",\n \"submit\"\n ],\n \"useWhen\": \"campos auxiliares do host devem ajudar no preenchimento sem entrar no payload enviado ao backend\",\n \"examplePrompts\": [\n \"adicione campos locais que nao sejam enviados ao backend\",\n \"crie campos transient para calculo ou confirmacao visual\",\n \"mostre formData filtrado e rawFormData completo no submit\"\n ]\n },\n \"metadata\": {\n \"version\": \"2.0.0\",\n \"source\": \"local\",\n \"schemaId\": \"path:/api/employees#request\"\n },\n \"fieldMetadata\": [\n {\n \"name\": \"fullName\",\n \"label\": \"Nome completo\",\n \"controlType\": \"input\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 3\n }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"approvalComment\",\n \"label\": \"Comentario interno de aprovacao\",\n \"controlType\": \"textarea\",\n \"source\": \"local\",\n \"submitPolicy\": \"omit\",\n \"description\": \"Campo auxiliar do host. Participa da UI e de regras locais, mas nao entra em formSubmit.formData.\"\n },\n {\n \"name\": \"calculatedRiskScore\",\n \"label\": \"Score calculado\",\n \"controlType\": \"numericTextBox\",\n \"transient\": true,\n \"readOnly\": true,\n \"description\": \"Valor calculado no cliente para orientar o preenchimento. Omitido do payload por padrao.\"\n },\n {\n \"name\": \"manualOverrideReason\",\n \"label\": \"Justificativa de ajuste manual\",\n \"controlType\": \"textarea\",\n \"source\": \"local\",\n \"submitPolicy\": \"includeWhenDirty\",\n \"description\": \"Exemplo de excecao: campo local enviado somente se o usuario alterar o controle.\"\n }\n ],\n \"sections\": [\n {\n \"id\": \"employee-data\",\n \"title\": \"Dados do funcionario\",\n \"rows\": [\n {\n \"id\": \"identity-row\",\n \"columns\": [\n {\n \"id\": \"identity-column\",\n \"fields\": [\n \"fullName\",\n \"email\"\n ]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"host-assistance\",\n \"title\": \"Apoio ao preenchimento\",\n \"rows\": [\n {\n \"id\": \"local-row\",\n \"columns\": [\n {\n \"id\": \"local-column\",\n \"fields\": [\n \"approvalComment\",\n \"calculatedRiskScore\",\n \"manualOverrideReason\"\n ]\n }\n ]\n }\n ]\n }\n ],\n \"submitExample\": {\n \"rawFormData\": {\n \"fullName\": \"Ana Souza\",\n \"email\": \"ana@example.com\",\n \"approvalComment\": \"Validado com RH\",\n \"calculatedRiskScore\": 82,\n \"manualOverrideReason\": \"Ajuste autorizado\"\n },\n \"formData\": {\n \"fullName\": \"Ana Souza\",\n \"email\": \"ana@example.com\",\n \"manualOverrideReason\": \"Ajuste autorizado\"\n },\n \"notes\": [\n \"approvalComment usa submitPolicy omit e fica somente em rawFormData.\",\n \"calculatedRiskScore usa transient true e fica somente em rawFormData.\",\n \"manualOverrideReason usa includeWhenDirty e entra em formData apenas quando o controle estiver dirty.\"\n ]\n }\n}\n",
8569
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.local-transient.json",
8756
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.local-transient.json",
8570
8757
  "contentHash": "2f762aded58a3182833e4675253ca7d0a3878ca447dfcd8a57623f6c6d61c75e",
8571
8758
  "sourceKind": "component_definition",
8572
8759
  "sourceId": "praxis-dynamic-form",
@@ -8576,7 +8763,7 @@
8576
8763
  "chunkIndex": 11,
8577
8764
  "chunkKind": "recipe",
8578
8765
  "content": "{\n \"_comment\": \"Receita focada em validações complexas: campos dependentes, validação cruzada (matchField), assíncrona (unique) e regras condicionais.\",\n \"templateMeta\": {\n \"variantId\": \"validation\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"tags\": [\n \"validation\",\n \"rules\"\n ],\n \"useWhen\": \"criar validacoes avancadas e regras condicionais\",\n \"examplePrompts\": [\n \"adicione validacao cruzada de email\",\n \"crie regras condicionais por tipo de conta\"\n ]\n },\n \"metadata\": {\n \"name\": \"Advanced Validation Form\",\n \"version\": \"v1\"\n },\n \"fieldMetadata\": [\n {\n \"name\": \"username\",\n \"label\": \"Usuário\",\n \"controlType\": \"input\",\n \"unique\": true,\n \"validators\": {\n \"required\": true,\n \"minLength\": 4,\n \"pattern\": \"^[a-z0-9_]+$\",\n \"patternMessage\": \"Apenas letras minúsculas, números e underline.\",\n \"uniqueValidator\": \"checkUsernameUnique\",\n \"uniqueMessage\": \"Este usuário já está em uso.\"\n },\n \"_comment\": \"Validação de pattern regex e unicidade simulada.\"\n },\n {\n \"name\": \"email\",\n \"label\": \"E-mail\",\n \"controlType\": \"email\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"confirmEmail\",\n \"label\": \"Confirmar E-mail\",\n \"controlType\": \"email\",\n \"validators\": {\n \"required\": true,\n \"matchField\": \"email\",\n \"matchFieldMessage\": \"Os e-mails não conferem.\"\n },\n \"_comment\": \"Validação cruzada: deve ser igual ao campo 'email'.\"\n },\n {\n \"name\": \"password\",\n \"label\": \"Senha\",\n \"controlType\": \"password\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 8,\n \"customValidator\": \"passwordStrength\"\n }\n },\n {\n \"name\": \"age\",\n \"label\": \"Idade\",\n \"controlType\": \"numericTextBox\",\n \"validators\": {\n \"required\": true,\n \"min\": 18,\n \"max\": 120,\n \"minMessage\": \"É necessário ser maior de 18 anos.\"\n }\n },\n {\n \"name\": \"accountType\",\n \"label\": \"Tipo de Conta\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"label\": \"Pessoal\",\n \"value\": \"PERSONAL\"\n },\n {\n \"label\": \"Empresarial\",\n \"value\": \"BUSINESS\"\n }\n ],\n \"defaultValue\": \"PERSONAL\"\n },\n {\n \"name\": \"cnpj\",\n \"label\": \"CNPJ\",\n \"controlType\": \"cpfCnpjInput\",\n \"maskType\": \"cnpj\",\n \"conditionalRequired\": {\n \"==\": [\n {\n \"var\": \"accountType\"\n },\n \"BUSINESS\"\n ]\n },\n \"conditionalDisplay\": {\n \"==\": [\n {\n \"var\": \"accountType\"\n },\n \"BUSINESS\"\n ]\n },\n \"_comment\": \"Campo condicional: só aparece e é obrigatório se accountType for 'BUSINESS'.\"\n },\n {\n \"name\": \"bio\",\n \"label\": \"Biografia\",\n \"controlType\": \"textarea\",\n \"validators\": {\n \"minWords\": 10,\n \"maxLength\": 500\n },\n \"hint\": \"Conte-nos um pouco sobre você (mínimo 10 palavras).\"\n },\n {\n \"name\": \"terms\",\n \"label\": \"Aceito os termos de uso\",\n \"controlType\": \"checkbox\",\n \"validators\": {\n \"requiredChecked\": true\n }\n }\n ],\n \"sections\": [\n {\n \"id\": \"credentials\",\n \"title\": \"Credenciais\",\n \"rows\": [\n {\n \"id\": \"credentials-row-1\",\n \"columns\": [\n {\n \"id\": \"username-col\",\n \"fields\": [\n \"username\"\n ]\n }\n ]\n },\n {\n \"id\": \"credentials-row-2\",\n \"columns\": [\n {\n \"id\": \"email-col\",\n \"fields\": [\n \"email\",\n \"confirmEmail\"\n ]\n }\n ]\n },\n {\n \"id\": \"credentials-row-3\",\n \"columns\": [\n {\n \"id\": \"password-col\",\n \"fields\": [\n \"password\"\n ]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"profile\",\n \"title\": \"Perfil\",\n \"rows\": [\n {\n \"id\": \"profile-row-1\",\n \"columns\": [\n {\n \"id\": \"age-col\",\n \"fields\": [\n \"age\",\n \"accountType\"\n ]\n }\n ]\n },\n {\n \"id\": \"profile-row-2\",\n \"columns\": [\n {\n \"id\": \"cnpj-col\",\n \"fields\": [\n \"cnpj\"\n ]\n }\n ]\n },\n {\n \"id\": \"profile-row-3\",\n \"columns\": [\n {\n \"id\": \"bio-col\",\n \"fields\": [\n \"bio\"\n ]\n }\n ]\n }\n ]\n },\n {\n \"id\": \"terms\",\n \"rows\": [\n {\n \"id\": \"terms-row-1\",\n \"columns\": [\n {\n \"id\": \"terms-col\",\n \"fields\": [\n \"terms\"\n ]\n }\n ]\n }\n ]\n }\n ],\n \"actions\": {\n \"submit\": {\n \"id\": \"submit\",\n \"label\": \"Cadastrar\",\n \"color\": \"primary\",\n \"visible\": true,\n \"type\": \"submit\"\n },\n \"cancel\": {\n \"id\": \"cancel\",\n \"label\": \"Cancelar\",\n \"color\": \"basic\",\n \"visible\": false,\n \"type\": \"button\"\n },\n \"reset\": {\n \"id\": \"reset\",\n \"label\": \"Limpar\",\n \"color\": \"basic\",\n \"visible\": false,\n \"type\": \"reset\"\n }\n }\n}\n",
8579
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.validation.json",
8766
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.validation.json",
8580
8767
  "contentHash": "4ee17414b7a5f61bfc18e56edd24462c227db8bea7508d33de1aefd2fc09d78e",
8581
8768
  "sourceKind": "component_definition",
8582
8769
  "sourceId": "praxis-dynamic-form",
@@ -8586,7 +8773,7 @@
8586
8773
  "chunkIndex": 12,
8587
8774
  "chunkKind": "recipe",
8588
8775
  "content": "{\n \"_comment\": \"Official Praxis Dynamic Form recipe for derived visualBlock materializations.\",\n \"_comment2\": \"Use this when governed semantic decisions already need conditional UI guidance, compliance copy or operational warnings without creating fields or changing submit payload.\",\n \"templateMeta\": {\n \"variantId\": \"visual-block-domain-rules\",\n \"variantOf\": \"praxis-dynamic-form\",\n \"registryKey\": \"praxis-dynamic-form\",\n \"status\": \"public-example\",\n \"tags\": [\n \"visual-block\",\n \"form-rules\",\n \"domain-rules\",\n \"rich-content\",\n \"llm-authoring\"\n ],\n \"useWhen\": \"Materialize governed semantic decisions as Dynamic Form visual guidance while keeping visual blocks outside fieldMetadata, FormControl and payload.\",\n \"examplePrompts\": [\n \"materialize governed employee status supplier risk and support priority decisions as visual block guidance\",\n \"project conditional compliance guidance without changing submit payload\",\n \"show how LLMs should materialize visualBlock text title message projections with node ids\"\n ]\n },\n \"platformValue\": {\n \"canonicalOwner\": \"praxis-config-starter owns governed semantic decisions; @praxisui/dynamic-form owns derived formRules and FormColumn.items.\",\n \"visualBlockRuntime\": \"@praxisui/rich-content owns RichContentDocument rendering.\",\n \"safeRuleContract\": \"visualBlock rules may update visible, hidden, text, title, message, className, rootClassName, layout and style through RULE_PROPERTY_SCHEMA.\",\n \"payloadBoundary\": \"visualBlock is visual-only: never put visual blocks in fieldMetadata and never read them from formData.\",\n \"llmContract\": \"LLMs should author business rules through governed domain-rules/shared_rule_authoring. Use operationId rule.visualBlockGuidance.add or equivalent formRules only as a derived UI materialization; formRulesState is generated by Praxis internals after review.\"\n },\n \"authoringGuidance\": [\n \"Do not use visualBlockGuidance as the canonical business-rule authoring path.\",\n \"Prefer domain-rules/shared_rule_authoring for business-rule, policy, eligibility, validation, compliance or shared decisions.\",\n \"Use operationId rule.visualBlockGuidance.add only when a governed decision needs a derived Dynamic Form visual projection.\",\n \"Use targetType visualBlock and target the richContent item id from sections[].rows[].columns[].items[].id.\",\n \"Set type visualBlockGuidance, context notification and metadata.origin llm with metadata.reviewStatus pending.\",\n \"Use textNodeId, titleNodeId or messageNodeId when the target document has more than one editable textual node.\",\n \"Keep condition in canonical Json Logic.\",\n \"Do not write document, HTML, event handlers, arbitrary URLs or field-like metadata from a rule.\",\n \"Use the editor diagnostics and Corrigir action when a property is rejected or partially sanitized.\",\n \"Ask an LLM for semantic correction only when the desired replacement needs business meaning.\"\n ],\n \"teaches\": [\n \"formRules.visualBlock\",\n \"visualBlock.text\",\n \"visualBlock.title\",\n \"visualBlock.message\",\n \"visualBlock.textNodeId\",\n \"visualBlock.titleNodeId\",\n \"visualBlock.messageNodeId\",\n \"visualBlock.visual-only\",\n \"llm-generated-pending-review\"\n ],\n \"config\": {\n \"fieldMetadata\": [\n {\n \"name\": \"ativo\",\n \"label\": \"Ativo\",\n \"controlType\": \"checkbox\",\n \"source\": \"schema\"\n },\n {\n \"name\": \"cargoId\",\n \"label\": \"Cargo\",\n \"controlType\": \"select\",\n \"source\": \"schema\",\n \"options\": [\n {\n \"label\": \"Analista\",\n \"value\": \"analista\"\n },\n {\n \"label\": \"Gestor\",\n \"value\": \"gestor\"\n }\n ]\n },\n {\n \"name\": \"riscoFornecedor\",\n \"label\": \"Risco do fornecedor\",\n \"controlType\": \"select\",\n \"source\": \"schema\",\n \"options\": [\n {\n \"label\": \"Baixo\",\n \"value\": \"baixo\"\n },\n {\n \"label\": \"Alto\",\n \"value\": \"alto\"\n },\n {\n \"label\": \"Critico\",\n \"value\": \"critico\"\n }\n ]\n },\n {\n \"name\": \"prioridade\",\n \"label\": \"Prioridade\",\n \"controlType\": \"select\",\n \"source\": \"schema\",\n \"options\": [\n {\n \"label\": \"Normal\",\n \"value\": \"normal\"\n },\n {\n \"label\": \"Alta\",\n \"value\": \"alta\"\n }\n ]\n }\n ],\n \"sections\": [\n {\n \"id\": \"domain-guidance\",\n \"title\": \"Domain guidance examples\",\n \"rows\": [\n {\n \"id\": \"domain-guidance-row\",\n \"columns\": [\n {\n \"id\": \"domain-guidance-column\",\n \"items\": [\n {\n \"kind\": \"richContent\",\n \"id\": \"profile-status-card\",\n \"layout\": \"block\",\n \"document\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": [\n {\n \"type\": \"card\",\n \"id\": \"profile-status-title\",\n \"title\": \"Employee active\",\n \"content\": [\n {\n \"type\": \"text\",\n \"id\": \"profile-status-message\",\n \"text\": \"Keep assignment, department and contact details current.\"\n }\n ]\n }\n ]\n }\n },\n {\n \"kind\": \"field\",\n \"id\": \"field-ativo\",\n \"fieldName\": \"ativo\"\n },\n {\n \"kind\": \"field\",\n \"id\": \"field-cargoId\",\n \"fieldName\": \"cargoId\"\n },\n {\n \"kind\": \"richContent\",\n \"id\": \"supplier-risk-notice\",\n \"layout\": \"block\",\n \"document\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": [\n {\n \"type\": \"text\",\n \"id\": \"message\",\n \"text\": \"Supplier has no critical blocks for this order.\"\n }\n ]\n }\n },\n {\n \"kind\": \"field\",\n \"id\": \"field-riscoFornecedor\",\n \"fieldName\": \"riscoFornecedor\"\n },\n {\n \"kind\": \"richContent\",\n \"id\": \"ticket-sla-guidance\",\n \"layout\": \"block\",\n \"document\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": [\n {\n \"type\": \"text\",\n \"id\": \"text\",\n \"text\": \"Register enough context for triage and follow-up.\"\n }\n ]\n }\n },\n {\n \"kind\": \"field\",\n \"id\": \"field-prioridade\",\n \"fieldName\": \"prioridade\"\n }\n ],\n \"fields\": [\n \"ativo\",\n \"cargoId\",\n \"riscoFornecedor\",\n \"prioridade\"\n ]\n }\n ]\n }\n ]\n }\n ],\n \"formRules\": [\n {\n \"id\": \"employee-inactive-guidance\",\n \"name\": \"Employee inactive guidance\",\n \"type\": \"visualBlockGuidance\",\n \"targetType\": \"visualBlock\",\n \"context\": \"notification\",\n \"targets\": [\n \"profile-status-card\"\n ],\n \"metadata\": {\n \"origin\": \"llm\",\n \"reviewStatus\": \"pending\"\n },\n \"effect\": {\n \"condition\": {\n \"===\": [\n {\n \"var\": \"ativo\"\n },\n false\n ]\n },\n \"properties\": {\n \"title\": \"Employee inactive\",\n \"titleNodeId\": \"profile-status-title\",\n \"message\": \"Review offboarding, access revocation and justification before saving.\",\n \"messageNodeId\": \"profile-status-message\",\n \"className\": \"employee-status-card employee-status-card--warning\"\n },\n \"propertiesWhenFalse\": {\n \"title\": \"Employee active\",\n \"titleNodeId\": \"profile-status-title\",\n \"message\": \"Keep assignment, department and contact details current.\",\n \"messageNodeId\": \"profile-status-message\",\n \"className\": \"employee-status-card employee-status-card--ok\"\n }\n }\n },\n {\n \"id\": \"supplier-risk-guidance\",\n \"name\": \"Supplier risk guidance\",\n \"type\": \"visualBlockGuidance\",\n \"targetType\": \"visualBlock\",\n \"context\": \"notification\",\n \"targets\": [\n \"supplier-risk-notice\"\n ],\n \"metadata\": {\n \"origin\": \"llm\",\n \"reviewStatus\": \"pending\"\n },\n \"effect\": {\n \"condition\": {\n \"in\": [\n {\n \"var\": \"riscoFornecedor\"\n },\n [\n \"alto\",\n \"critico\"\n ]\n ]\n },\n \"properties\": {\n \"message\": \"Supplier requires compliance approval before issuing the order.\",\n \"messageNodeId\": \"message\",\n \"className\": \"supplier-risk-notice supplier-risk-notice--critical\"\n },\n \"propertiesWhenFalse\": {\n \"message\": \"Supplier has no critical blocks for this order.\",\n \"messageNodeId\": \"message\",\n \"className\": \"supplier-risk-notice supplier-risk-notice--neutral\"\n }\n }\n },\n {\n \"id\": \"ticket-priority-copy\",\n \"name\": \"Ticket priority copy\",\n \"type\": \"visualBlockGuidance\",\n \"targetType\": \"visualBlock\",\n \"context\": \"notification\",\n \"targets\": [\n \"ticket-sla-guidance\"\n ],\n \"metadata\": {\n \"origin\": \"llm\",\n \"reviewStatus\": \"pending\"\n },\n \"effect\": {\n \"condition\": {\n \"===\": [\n {\n \"var\": \"prioridade\"\n },\n \"alta\"\n ]\n },\n \"properties\": {\n \"text\": \"High priority: confirm impact, SLA deadline and escalation owner.\",\n \"textNodeId\": \"text\",\n \"rootClassName\": \"ticket-sla-guidance ticket-sla-guidance--high\"\n },\n \"propertiesWhenFalse\": {\n \"text\": \"Register enough context for triage and follow-up.\",\n \"textNodeId\": \"text\",\n \"rootClassName\": \"ticket-sla-guidance ticket-sla-guidance--standard\"\n }\n }\n }\n ]\n },\n \"diagnosticExpectations\": {\n \"validTargets\": [\n \"profile-status-card\",\n \"supplier-risk-notice\",\n \"ticket-sla-guidance\"\n ],\n \"visualOnly\": true,\n \"formRulesStateAuthoredByRecipe\": false,\n \"reviewRequired\": [\n \"employee-inactive-guidance\",\n \"supplier-risk-guidance\",\n \"ticket-priority-copy\"\n ]\n }\n}\n",
8589
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.visual-block-domain-rules.json",
8776
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.visual-block-domain-rules.json",
8590
8777
  "contentHash": "64b51171e4fd0aec292a955514d59c4f3dd60fba899f814edea0bf43b5d61aed",
8591
8778
  "sourceKind": "component_definition",
8592
8779
  "sourceId": "praxis-dynamic-form",
@@ -8602,44 +8789,60 @@
8602
8789
  {
8603
8790
  "name": "config",
8604
8791
  "type": "FormConfig",
8605
- "required": false
8792
+ "required": false,
8793
+ "description": "Filter form configuration (sections and fieldMetadata).",
8794
+ "label": "Configuration"
8606
8795
  },
8607
8796
  {
8608
8797
  "name": "formId",
8609
8798
  "type": "string",
8610
- "required": false
8799
+ "required": false,
8800
+ "description": "Key used for local persistence.",
8801
+ "label": "Form ID"
8611
8802
  },
8612
8803
  {
8613
8804
  "name": "resourcePath",
8614
8805
  "type": "string",
8615
- "required": false
8806
+ "required": false,
8807
+ "description": "Resource path used by filter schema.",
8808
+ "label": "Resource"
8616
8809
  },
8617
8810
  {
8618
8811
  "name": "mode",
8619
8812
  "type": "string",
8620
- "required": false
8813
+ "required": false,
8814
+ "description": "Form mode (create, edit, view).",
8815
+ "label": "Mode"
8621
8816
  }
8622
8817
  ],
8623
8818
  "outputs": [
8624
8819
  {
8625
8820
  "name": "formReady",
8626
8821
  "type": "{ formGroup: FormGroup<Record<string, unknown>> }",
8627
- "required": false
8822
+ "required": false,
8823
+ "description": "Emitted when the form group is ready.",
8824
+ "label": "Form Ready"
8628
8825
  },
8629
8826
  {
8630
8827
  "name": "valueChange",
8631
8828
  "type": "{ formData: Record<string, unknown> }",
8632
- "required": false
8829
+ "required": false,
8830
+ "description": "Emitted when form values change.",
8831
+ "label": "Value Change"
8633
8832
  },
8634
8833
  {
8635
8834
  "name": "submit",
8636
8835
  "type": "{ formData: Record<string, unknown> }",
8637
- "required": false
8836
+ "required": false,
8837
+ "description": "Emitted on submit.",
8838
+ "label": "Submit"
8638
8839
  },
8639
8840
  {
8640
8841
  "name": "validityChange",
8641
8842
  "type": "boolean",
8642
- "required": false
8843
+ "required": false,
8844
+ "description": "Emitted when validity changes.",
8845
+ "label": "Validity"
8643
8846
  }
8644
8847
  ],
8645
8848
  "configSchemaId": "FormConfig",
@@ -8653,6 +8856,79 @@
8653
8856
  "configurable"
8654
8857
  ],
8655
8858
  "lib": "@praxisui/dynamic-form",
8859
+ "ports": [
8860
+ {
8861
+ "id": "config",
8862
+ "label": "Form Config",
8863
+ "direction": "input",
8864
+ "semanticKind": "config-fragment",
8865
+ "description": "Declarative filter form contract used to materialize sections and fields.",
8866
+ "schema": {
8867
+ "id": "FormConfig",
8868
+ "kind": "ts-type",
8869
+ "ref": "FormConfig"
8870
+ },
8871
+ "exposure": {
8872
+ "public": true,
8873
+ "group": "config"
8874
+ }
8875
+ },
8876
+ {
8877
+ "id": "valueChange",
8878
+ "label": "Value Change",
8879
+ "direction": "output",
8880
+ "semanticKind": "event",
8881
+ "description": "Event emitted whenever the current form payload changes.",
8882
+ "cardinality": "stream",
8883
+ "schema": {
8884
+ "id": "PraxisFilterFormValueChange",
8885
+ "kind": "structural-shape",
8886
+ "ref": "{ formData: Record<string, unknown> }"
8887
+ },
8888
+ "exposure": {
8889
+ "public": true,
8890
+ "group": "events"
8891
+ }
8892
+ },
8893
+ {
8894
+ "id": "submit",
8895
+ "label": "Submit",
8896
+ "direction": "output",
8897
+ "semanticKind": "event",
8898
+ "description": "Event emitted when the user submits the filter form.",
8899
+ "cardinality": "stream",
8900
+ "schema": {
8901
+ "id": "PraxisFilterFormSubmit",
8902
+ "kind": "structural-shape",
8903
+ "ref": "{ formData: Record<string, unknown> }"
8904
+ },
8905
+ "exposure": {
8906
+ "public": true,
8907
+ "group": "events"
8908
+ }
8909
+ },
8910
+ {
8911
+ "id": "validityChange",
8912
+ "label": "Validity Change",
8913
+ "direction": "output",
8914
+ "semanticKind": "status",
8915
+ "description": "Status signal emitted when the form validity changes.",
8916
+ "cardinality": "stream",
8917
+ "schema": {
8918
+ "id": "boolean",
8919
+ "kind": "ts-type",
8920
+ "ref": "boolean"
8921
+ },
8922
+ "exposure": {
8923
+ "public": true,
8924
+ "group": "status"
8925
+ }
8926
+ }
8927
+ ],
8928
+ "configEditor": {
8929
+ "component": "[ref:PraxisFilterFormWidgetConfigEditor]",
8930
+ "title": "Configurar filtro"
8931
+ },
8656
8932
  "source": "projects/praxis-dynamic-form/src/lib/filter-form/praxis-filter-form.metadata.ts",
8657
8933
  "exportName": "PRAXIS_FILTER_FORM_COMPONENT_METADATA",
8658
8934
  "capabilities": [
@@ -14287,7 +14563,7 @@
14287
14563
  "chunkIndex": 0,
14288
14564
  "chunkKind": "summary",
14289
14565
  "content": "Component ID: praxis-filter-form\nSelector: praxis-filter-form\nFriendly Name: Praxis Filter Form\nDescription: Filter form driven by FormConfig and fieldMetadata.\nCategory: form\nLib/Package: @praxisui/dynamic-form\nTags: widget, form, filter, configurable\nInputs:\n - config (FormConfig)\n - formId (string)\n - resourcePath (string)\n - mode (string)\nOutputs:\n - formReady ({ formGroup: FormGroup<Record<string, unknown>> })\n - valueChange ({ formData: Record<string, unknown> })\n - submit ({ formData: Record<string, unknown> })\n - validityChange (boolean)\n",
14290
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/filter-form/praxis-filter-form.metadata.ts",
14566
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/filter-form/praxis-filter-form.metadata.ts",
14291
14567
  "contentHash": "a4b5375a63cfd32a3ec2cea1a357b5d0333d644b6fd91ea24ff02430dc1d994e",
14292
14568
  "sourceKind": "component_definition",
14293
14569
  "sourceId": "praxis-filter-form",
@@ -14297,7 +14573,7 @@
14297
14573
  "chunkIndex": 1,
14298
14574
  "chunkKind": "capabilities",
14299
14575
  "content": "Schema Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versão da configuração do formulário para controle de migração.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuração do formulário.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da última atualização da configuração (ISO-8601).\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: ID do schema de origem para reconciliação no servidor.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema usado para compor o formulário.\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema de origem.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operação do schema (ex.: \"get\", \"post\").\n - Path: metadata.schemaContext.schemaType\n Category: metadata\n Kind: enum\n Description: Tipo do schema (response/request).\n - Path: metadata.schemaContext.internal\n Category: metadata\n Kind: boolean\n Description: Indica se o schema é interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema (se aplicável).\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema (se aplicável).\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash dos dados do servidor para detecção de mudanças.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizações manuais aplicadas ao formulário.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Array de metadados dos campos. Usado para referenciar a configuração de campos.\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: helpPresentation\n Category: appearance\n Kind: object\n Description: Politica visual do formulario para exibir hint/helpText dos campos sem alterar a semantica publicada pelos DTOs.\n - Path: helpPresentation.display\n Category: appearance\n Kind: enum\n Description: Define se a ajuda semantica dos campos fica inline, em icone de ajuda, automatica por densidade, ou oculta visualmente.\n - Path: helpPresentation.inlineMaxLength\n Category: appearance\n Kind: number\n Description: Tamanho maximo para manter ajuda inline quando display=\"auto\".\n - Path: helpPresentation.preferPopoverForControls\n Category: appearance\n Kind: array\n Description: Tipos de controle que devem preferir icone de ajuda quando display=\"auto\", como toggle, checkbox ou select.\n - Path: editorialContext\n Category: editorial\n Kind: object\n Description: Contexto editorial compartilhado entre os blocos hospedados antes/depois do formulario.\n - Path: editorialContext.[token]\n Category: editorial\n Kind: string\n Description: Valor simples exposto no contexto editorial.\n - Path: formBlocksBefore\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado antes do formulario.\n - Path: formBlocksBefore.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content.\n - Path: formBlocksBefore.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content editorial.\n - Path: formBlocksBefore.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes do formulario.\n - Path: formBlocksBefore.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes do formulario.\n - Path: formBlocksBefore.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content hospedado antes do formulario.\n - Path: formBlocksBeforeActions\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois das seções e antes da área principal de ações.\n - Path: formBlocksBeforeActions.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes da área principal de ações.\n - Path: formBlocksBeforeActions.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes da área principal de ações.\n - Path: formBlocksBeforeActions.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content antes das ações.\n - Path: formBlocksAfter\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois do formulario inteiro, incluindo a área principal de ações.\n - Path: formBlocksAfter.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content de fechamento.\n - Path: formBlocksAfter.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content de fechamento.\n - Path: formBlocksAfter.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados depois do formulario.\n - Path: formBlocksAfter.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado depois do formulario.\n - Path: formBlocksAfter.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content de fechamento.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID único da seção.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Título exibido para cada seção do formulário.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descrição auxiliar exibida abaixo do título da seção.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Nome do ícone (Material Icons) para o cabeçalho da seção.\n - Path: sections[].sectionHeader\n Category: layout\n Kind: object\n Description: Configuração rica do header visual da seção, com suporte a avatar por imagem, iniciais ou modo automático.\n - Path: sections[].sectionHeader.mode\n Category: layout\n Kind: enum\n Description: Estratégia visual do header da seção.\n - Path: sections[].sectionHeader.sourceField\n Category: layout\n Kind: string\n Description: Campo do formulário usado como origem da imagem do avatar.\n - Path: sections[].sectionHeader.initialsSourceField\n Category: layout\n Kind: string\n Description: Campo textual usado para derivar iniciais do avatar.\n - Path: sections[].sectionHeader.altField\n Category: layout\n Kind: string\n Description: Campo textual usado como texto acessivel do avatar e como fallback textual para iniciais quando initialsSourceField nao estiver definido.\n - Path: sections[].sectionHeader.fallbackIcon\n Category: layout\n Kind: string\n Description: Ícone opcional usado quando o avatar dinâmico estiver vazio ou inválido.\n - Path: sections[].sectionHeader.emptyState\n Category: layout\n Kind: enum\n Description: Comportamento do header quando os campos de origem ainda não possuem valor.\n - Path: sections[].sectionHeader.size\n Category: layout\n Kind: enum\n Description: Tamanho semântico do avatar da seção, materializado pelo runtime via tokens.\n - Path: sections[].sectionHeader.initialsMaxLength\n Category: layout\n Kind: number\n Description: Máximo de letras exibidas no avatar textual.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Define se a seção pode ser colapsada/expandida pelo usuário.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial da seção (colapsada/expandida) quando `collapsible` é true.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após a seção.\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo do título da seção.\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo da descrição da seção.\n - Path: sections[].appearance\n Category: appearance\n Kind: enum\n Description: Preset visual do container/cabeçalho da seção.\n - Path: sections[].stepLabel\n Category: content\n Kind: string\n Description: Rótulo curto do passo exibido antes do título da seção.\n - Path: sections[].titleStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para o título da seção.\n - Path: sections[].descriptionStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para a descrição da seção.\n - Path: sections[].titleColor\n Category: appearance\n Kind: string\n Description: Cor do título da seção (CSS color ou token).\n - Path: sections[].descriptionColor\n Category: appearance\n Kind: string\n Description: Cor da descrição da seção (CSS color ou token).\n - Path: sections[].headerAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento horizontal do conteúdo do cabeçalho da seção.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Texto de tooltip para o cabeçalho da seção.\n - Path: sections[].headerActions\n Category: layout\n Kind: array\n Description: Lista de ações iconográficas renderizadas no canto direito do cabeçalho da seção.\n - Path: sections[].headerActions[].id\n Category: layout\n Kind: string\n Description: ID estável da ação de cabeçalho da seção.\n - Path: sections[].headerActions[].label\n Category: layout\n Kind: string\n Description: Label acessível usada em tooltip e aria-label da ação.\n - Path: sections[].headerActions[].icon\n Category: layout\n Kind: string\n Description: Ícone renderizado na ação do cabeçalho da seção.\n - Path: sections[].headerActions[].action\n Category: layout\n Kind: string\n Description: Nome opcional da ação emitida no customAction; se ausente, o runtime usa o ID.\n - Path: sections[].headerActions[].tooltip\n Category: layout\n Kind: string\n Description: Tooltip opcional da ação; se ausente, o runtime usa a label.\n - Path: sections[].headerActions[].color\n Category: appearance\n Kind: enum\n Description: Tom visual da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].visible\n Category: layout\n Kind: boolean\n Description: Controla a visibilidade da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].disabled\n Category: layout\n Kind: boolean\n Description: Controla o estado desabilitado da ação do cabeçalho da seção.\n - Path: sections[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da seção.\n - Path: sections[].styles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da seção.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID único da linha dentro de uma seção.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Título interno da linha (usado em editores e labels).\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaçamento horizontal (em px) entre colunas nesta linha.\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após esta linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID único da coluna dentro de uma linha.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Título interno da coluna (usado em editores e labels).\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Atributo data-testid aplicado ao container da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Projeção legada/derivada dos itens kind:\"field\" dentro da coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo dentro da projeção legada/derivada da coluna.\n - Path: sections[].rows[].columns[].items\n Category: layout\n Kind: array\n Description: Lista canônica ordenada de itens da coluna: campos e blocos visuais.\n - Path: sections[].rows[].columns[].items[].kind\n Category: layout\n Kind: enum\n Description: Tipo do item de layout da coluna.\n - Path: sections[].rows[].columns[].items[].id\n Category: layout\n Kind: string\n Description: ID estável do item de layout dentro do formulário.\n - Path: sections[].rows[].columns[].items[].fieldName\n Category: layout\n Kind: string\n Description: Nome do campo quando kind é \"field\".\n - Path: sections[].rows[].columns[].items[].document\n Category: editorial\n Kind: object\n Description: RichContentDocument do bloco visual quando kind é \"richContent\".\n - Path: sections[].rows[].columns[].items[].layout\n Category: editorial\n Kind: enum\n Description: Modo de renderização do bloco visual richContent dentro da coluna.\n - Path: sections[].rows[].columns[].items[].rootClassName\n Category: appearance\n Kind: string\n Description: Classe CSS opcional aplicada ao bloco visual richContent.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Largura da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Largura da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Largura da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas médias (md).\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas médias (md).\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento vertical do conteúdo da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding (em px) interno da coluna.\n - Path: sections[].rows[].columns[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada à coluna.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botão de submissão.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de submissão.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de submissão.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de submissão.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botão de submissão.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de submissão.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de submissão.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de submissão.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de submissão.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de submissão.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de submissão.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de submissão.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de submissão.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+s\") para o botão de submissão.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botão de cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botão de cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"esc\") para o botão de cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botão de reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botão de reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+shift+r\") para o botão de reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Lista de botões de ação customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuração de um botão de ação customizado.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID da ação customizada.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade da ação customizada.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Rótulo da ação customizada.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para a ação customizada.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor da ação customizada.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual da ação customizada.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho da ação customizada.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada à ação customizada.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados à ação customizada.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Desabilita a ação customizada.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo do botão da ação customizada.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido na ação customizada.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento na ação customizada.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado para a ação customizada.\n - Path: actions.position\n Category: layout\n Kind: enum\n Description: Posicionamento horizontal da barra de ações.\n - Path: actions.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões dentro da barra de ações (horizontal/vertical).\n - Path: actions.spacing\n Category: layout\n Kind: enum\n Description: Espaçamento entre os botões na barra de ações.\n - Path: actions.sticky\n Category: layout\n Kind: boolean\n Description: Define se a barra de ações deve permanecer visível ao rolar a página.\n - Path: actions.divider\n Category: layout\n Kind: boolean\n Description: Exibe um divisor superior acima da barra de ações.\n - Path: actions.placement\n Category: layout\n Kind: enum\n Description: Localização estrutural da barra de ações no layout.\n - Path: actions.mobile.position\n Category: layout\n Kind: enum\n Description: Posicionamento da barra de ações em dispositivos móveis.\n - Path: actions.mobile.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões em dispositivos móveis.\n - Path: actions.mobile.collapseToMenu\n Category: behavior\n Kind: boolean\n Description: Em mobile, agrupa ações em um menu (se houver muitas).\n - Path: actions.containerClassName\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da barra de ações.\n - Path: actions.containerStyles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da barra de ações.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de submit.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de cancel.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de cancel.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de reset.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Exibe um alerta se o usuário tentar sair com mudanças não salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Habilita rastreamento de histórico para desfazer/refazer (se suportado).\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Ao submeter, foca automaticamente no primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Ao submeter, rola a página para exibir o primeiro erro.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulário após uma submissão bem-sucedida.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: URL para redirecionar após uma submissão bem-sucedida.\n - Path: behavior.reactiveValidation\n Category: validation\n Kind: boolean\n Description: Ativa validação reativa (em tempo real) em `valueChanges`.\n - Path: behavior.reactiveValidationDebounceMs\n Category: validation\n Kind: number\n Description: Debounce (em ms) para a validação reativa.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: URL para onde os dados do formulário serão enviados (POST/PUT/PATCH).\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: URL para buscar dados para popular o formulário (GET).\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Método HTTP para a requisição de salvar.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Tempo limite (em ms) para as requisições API.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Cabeçalhos HTTP personalizados para as requisições API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Nome do campo que representa o ID do registro no payload (para PUT/PATCH).\n - Path: api.beforeSave\n Category: hooks\n Kind: expression\n Description: Hook para pré-processamento de dados antes de enviar para a API.\n - Path: api.afterLoad\n Category: hooks\n Kind: expression\n Description: Hook para pós-processamento de dados após carregar da API.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após atualização de registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após criação de registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após atualização de registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após criação de registro.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de submeter o formulário.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de cancelar.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de resetar o formulário.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para ações customizadas. Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da ação customizada (success/error/confirmation). Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Mensagem de sucesso para a ação customizada.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Mensagem de erro para a ação customizada.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para a ação customizada.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o envio do formulário.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o cancelamento.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o reset do formulário.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem exibida durante a execução de uma ação customizada. Substitua `[actionId]` pelo ID da ação.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID único da regra de layout.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome amigável da regra de layout.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descrição da regra de layout para documentação.\n - Path: formRules[].metadata.origin\n Category: rules\n Kind: enum\n Description: Origem da regra sugerida pela IA.\n - Path: formRules[].metadata.reviewStatus\n Category: rules\n Kind: enum\n Description: Status de revisão humana da regra sugerida pela IA.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo do elemento alvo da regra (campo, seção, ação, linha, coluna ou bloco visual).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra (quando properties não forem informadas).\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: Lista de IDs dos elementos alvo da regra. O tipo do ID depende de `targetType`.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo da regra.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para alvos de campo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formCommandRules\n Category: rules\n Kind: array\n Description: Regras condicionais de comando avaliadas depois que formRules estabilizam valores calculados.\n - Path: formCommandRules[].condition\n Category: rules\n Kind: expression\n Description: Condicao Json Logic avaliada sobre formData estabilizado, incluindo field values calculados.\n - Path: formCommandRules[].effects[].kind\n Category: rules\n Kind: enum\n Description: Tipo do efeito de comando. O primeiro corte suporta apenas global-action.\n - Path: formCommandRules[].effects[].globalAction\n Category: rules\n Kind: object\n Description: GlobalActionRef estruturado executado por GlobalActionService.executeRef quando a regra entra na condicao.\n - Path: formCommandRules[].policy\n Category: rules\n Kind: object\n Description: Politica operacional do comando: trigger, distinct, distinctBy, debounceMs, errorPolicy e runOnInitialEvaluation.\n - Path: formRulesState\n Category: metadata\n Kind: object\n Description: Estado interno do builder visual de regras, gerado apenas para round-trip do editor.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declarações de hooks por estágio do ciclo de vida do formulário.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hints.dataModes.create\n Category: form_config\n Kind: string\n Description: Dica para o modo de criação de dados.\n - Path: hints.dataModes.edit\n Category: form_config\n Kind: string\n Description: Dica para o modo de edição de dados.\n - Path: hints.dataModes.view\n Category: form_config\n Kind: string\n Description: Dica para o modo de visualização de dados.\n - Path: hints.uiModes.presentation\n Category: form_config\n Kind: string\n Description: Dica para o modo de apresentação da UI.\n - Path: hints.uiModes.readonly\n Category: form_config\n Kind: string\n Description: Dica para o modo de somente leitura da UI.\n - Path: hints.uiModes.disabled\n Category: form_config\n Kind: string\n Description: Dica para o modo desabilitado da UI.\n - Path: hints.uiModes.visible\n Category: form_config\n Kind: string\n Description: Dica para o modo de visibilidade da UI.\n - Path: fieldMetadata[].id\n Category: identity\n Kind: string\n Description: Identificador unico da instancia do componente.\n - Path: fieldMetadata[].version\n Category: identity\n Kind: string\n Description: Versao do schema de metadata (migracao).\n - Path: fieldMetadata[].context\n Category: identity\n Kind: enum\n Description: Contexto de uso do componente (form/filter/table/dialog/standalone).\n - Path: fieldMetadata[].createdAt\n Category: misc\n Kind: string\n Description: Timestamp de criacao (ISO).\n - Path: fieldMetadata[].updatedAt\n Category: misc\n Kind: string\n Description: Timestamp de atualizacao (ISO).\n - Path: fieldMetadata[].tags\n Category: identity\n Kind: array\n Description: Tags para categorizacao e busca.\n - Path: fieldMetadata[].cssClass\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao host do componente.\n - Path: fieldMetadata[].style\n Category: appearance\n Kind: object\n Description: Estilos inline (objeto CSS).\n - Path: fieldMetadata[].dataAttributes\n Category: data\n Kind: object\n Description: Data attributes para teste/analytics.\n - Path: fieldMetadata[].name\n Category: identity\n Kind: string\n Description: Identificador único do campo. Essencial para binding.\n - Path: fieldMetadata[].label\n Category: identity\n Kind: string\n Description: Rótulo principal exibido para o usuário.\n - Path: fieldMetadata[].placeholder\n Category: identity\n Kind: string\n Description: Texto temporário exibido quando vazio.\n - Path: fieldMetadata[].hint\n Category: identity\n Kind: string\n Description: Texto de ajuda exibido abaixo do campo.\n - Path: fieldMetadata[].helpText\n Category: identity\n Kind: string\n Description: Texto semântico de ajuda publicado pelo schema/DTO.\n - Path: fieldMetadata[].tooltip\n Category: identity\n Kind: string\n Description: Texto exibido ao passar o mouse.\n - Path: fieldMetadata[].tooltipOnHover\n Category: identity\n Kind: boolean\n Description: Habilita apresentação do tooltip no hover quando suportado pelo renderer.\n - Path: fieldMetadata[].description\n Category: identity\n Kind: string\n Description: Descrição detalhada (usada em documentação ou helps extensos).\n - Path: fieldMetadata[].selectionMode\n Category: behavior\n Kind: enum\n Description: Semântica de seleção explícita para controles de escolha.\n - Path: fieldMetadata[].variant\n Category: appearance\n Kind: string\n Description: Variante visual/semântica do controle.\n - Path: fieldMetadata[].density\n Category: appearance\n Kind: enum\n Description: Densidade visual do shell do controle.\n - Path: fieldMetadata[].links\n Category: identity\n Kind: array\n Description: Links ricos associados ao campo, úteis em consentimentos e conteúdo legal.\n - Path: fieldMetadata[].group\n Category: identity\n Kind: string\n Description: Agrupador lógico do campo.\n - Path: fieldMetadata[].order\n Category: layout\n Kind: number\n Description: Ordem de exibição do campo.\n - Path: fieldMetadata[].width\n Category: layout\n Kind: string\n Description: Largura do campo (ex: 50%, 100px).\n - Path: fieldMetadata[].isFlex\n Category: layout\n Kind: boolean\n Description: Se true, usa flex-grow para preencher espaço.\n - Path: fieldMetadata[].controlType\n Category: behavior\n Kind: enum\n Description: Tipo do componente de UI (input, select, datepicker, etc).\n - Path: fieldMetadata[].dataType\n Category: data\n Kind: enum\n Description: Tipo de dado do campo (text, number, date, etc).\n - Path: fieldMetadata[].source\n Category: data\n Kind: enum\n Description: Origem semântica do campo. Use local para campos do host que não vêm do schema backend.\n - Path: fieldMetadata[].transient\n Category: data\n Kind: boolean\n Description: Marca o campo como temporário/local para preenchimento. O dynamic-form omite do submit por padrão.\n - Path: fieldMetadata[].submitPolicy\n Category: behavior\n Kind: enum\n Description: Política de submit para sobrescrever o padrão de campos locais/transient.\n - Path: fieldMetadata[].materialDesign.appearance\n Category: appearance\n Kind: enum\n Description: Aparência do campo Material (fill/outline).\n - Path: fieldMetadata[].materialDesign.color\n Category: appearance\n Kind: enum\n Description: Tema de cor Material (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.floatLabel\n Category: appearance\n Kind: enum\n Description: Comportamento do rótulo flutuante.\n - Path: fieldMetadata[].materialDesign.subscriptSizing\n Category: appearance\n Kind: enum\n Description: Estratégia de sizing do subscript (erros/hints).\n - Path: fieldMetadata[].materialDesign.hideRequiredMarker\n Category: appearance\n Kind: boolean\n Description: Oculta o asterisco de campo obrigatório.\n - Path: fieldMetadata[].materialDesign.density\n Category: appearance\n Kind: enum\n Description: Densidade do campo Material.\n - Path: fieldMetadata[].materialDesign.disableRipple\n Category: appearance\n Kind: boolean\n Description: Desativa ripple/ondulação em componentes Material.\n - Path: fieldMetadata[].materialDesign.customPalette\n Category: appearance\n Kind: object\n Description: Override de paleta (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.animations\n Category: appearance\n Kind: object\n Description: Configuração de animações (disable, duration, easing).\n - Path: fieldMetadata[].prefixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido antes do valor.\n - Path: fieldMetadata[].suffixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido depois do valor.\n - Path: fieldMetadata[].iconPosition\n Category: appearance\n Kind: enum\n Description: Posição preferencial do ícone principal.\n - Path: fieldMetadata[].iconSize\n Category: appearance\n Kind: enum\n Description: Tamanho do ícone.\n - Path: fieldMetadata[].iconColor\n Category: appearance\n Kind: string\n Description: Cor semântica ou token de cor aplicado ao ícone principal.\n - Path: fieldMetadata[].iconClass\n Category: appearance\n Kind: string\n Description: Classe CSS controlada pelo host para o ícone principal.\n - Path: fieldMetadata[].iconStyle\n Category: appearance\n Kind: string\n Description: Estilo visual semântico do ícone quando o renderer suportar variações.\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\nComponent Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.layoutPolicy\n Category: inputs\n Kind: object\n Description: Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.\n - Path: inputs.layoutPolicy.source\n Category: inputs\n Kind: enum\n Description: Define se o layout vem de configuracao authorada ou do schema.\n - Path: inputs.layoutPolicy.preset\n Category: inputs\n Kind: enum\n Description: Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit.\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n - Path: inputs.layoutPolicy.persistence\n Category: inputs\n Kind: enum\n Description: Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito.\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n - Path: inputs.fieldIconPolicy\n Category: inputs\n Kind: enum\n Description: Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
14300
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
14576
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
14301
14577
  "contentHash": "c05a6371db5ac065bf75223cf06663456383933d63d8fe60f7d4588cffb5ac69",
14302
14578
  "sourceKind": "component_definition",
14303
14579
  "sourceId": "praxis-filter-form",
@@ -14307,7 +14583,7 @@
14307
14583
  "chunkIndex": 2,
14308
14584
  "chunkKind": "context_pack",
14309
14585
  "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"fieldMetadata[].controlType\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"input\",\n \"label\": \"Input\"\n },\n {\n \"value\": \"textarea\",\n \"label\": \"Textarea\"\n },\n {\n \"value\": \"email\",\n \"label\": \"Email\"\n },\n {\n \"value\": \"password\",\n \"label\": \"Password\"\n },\n {\n \"value\": \"search\",\n \"label\": \"Search\"\n },\n {\n \"value\": \"url\",\n \"label\": \"URL\"\n },\n {\n \"value\": \"phone\",\n \"label\": \"Phone\"\n },\n {\n \"value\": \"cpfCnpjInput\",\n \"label\": \"CPF/CNPJ\"\n },\n {\n \"value\": \"numericTextBox\",\n \"label\": \"Number\"\n },\n {\n \"value\": \"currency\",\n \"label\": \"Currency\"\n },\n {\n \"value\": \"priceRange\",\n \"label\": \"Price range\"\n },\n {\n \"value\": \"date\",\n \"label\": \"Date picker\"\n },\n {\n \"value\": \"dateRange\",\n \"label\": \"Date range\"\n },\n {\n \"value\": \"dateInput\",\n \"label\": \"Date input\"\n },\n {\n \"value\": \"dateTime\",\n \"label\": \"Datetime\"\n },\n {\n \"value\": \"dateTimeRange\",\n \"label\": \"Datetime range\"\n },\n {\n \"value\": \"dateTimeLocal\",\n \"label\": \"Datetime local\"\n },\n {\n \"value\": \"time\",\n \"label\": \"Time input\"\n },\n {\n \"value\": \"timePicker\",\n \"label\": \"Time picker\"\n },\n {\n \"value\": \"timeRange\",\n \"label\": \"Time range\"\n },\n {\n \"value\": \"week\",\n \"label\": \"Week input\"\n },\n {\n \"value\": \"month\",\n \"label\": \"Month input\"\n },\n {\n \"value\": \"year\",\n \"label\": \"Year input\"\n },\n {\n \"value\": \"select\",\n \"label\": \"Select\"\n },\n {\n \"value\": \"multiSelect\",\n \"label\": \"Multi select\"\n },\n {\n \"value\": \"multiSelectTree\",\n \"label\": \"Multi select tree\"\n },\n {\n \"value\": \"treeSelect\",\n \"label\": \"Tree select\"\n },\n {\n \"value\": \"transferList\",\n \"label\": \"Transfer list\"\n },\n {\n \"value\": \"autoComplete\",\n \"label\": \"Autocomplete\"\n },\n {\n \"value\": \"searchable-select\",\n \"label\": \"Searchable select\"\n },\n {\n \"value\": \"async-select\",\n \"label\": \"Async select\"\n },\n {\n \"value\": \"radio\",\n \"label\": \"Radio group\"\n },\n {\n \"value\": \"checkbox\",\n \"label\": \"Checkbox group\"\n },\n {\n \"value\": \"selectionList\",\n \"label\": \"Selection list\"\n },\n {\n \"value\": \"toggle\",\n \"label\": \"Toggle\"\n },\n {\n \"value\": \"buttonToggle\",\n \"label\": \"Button toggle\"\n },\n {\n \"value\": \"slider\",\n \"label\": \"Slider\"\n },\n {\n \"value\": \"rangeSlider\",\n \"label\": \"Range slider\"\n },\n {\n \"value\": \"rating\",\n \"label\": \"Rating\"\n },\n {\n \"value\": \"chipInput\",\n \"label\": \"Chips\"\n },\n {\n \"value\": \"chipList\",\n \"label\": \"Chip list\"\n },\n {\n \"value\": \"upload\",\n \"label\": \"File upload\"\n },\n {\n \"value\": \"color\",\n \"label\": \"Color input\"\n },\n {\n \"value\": \"colorPicker\",\n \"label\": \"Color picker\"\n },\n {\n \"value\": \"cronBuilder\",\n \"label\": \"Cron builder\"\n }\n ]\n },\n \"fieldMetadata[].source\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"schema\",\n \"label\": \"Schema field\"\n },\n {\n \"value\": \"local\",\n \"label\": \"Local field\"\n }\n ]\n },\n \"fieldMetadata[].submitPolicy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"omit\",\n \"label\": \"Omit from submit payload\"\n },\n {\n \"value\": \"include\",\n \"label\": \"Include in submit payload\"\n },\n {\n \"value\": \"includeWhenDirty\",\n \"label\": \"Include only when dirty\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"fill\",\n \"label\": \"Fill\"\n },\n {\n \"value\": \"outline\",\n \"label\": \"Outline\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.floatLabel\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"always\",\n \"label\": \"Always\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.density\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"comfortable\",\n \"label\": \"Comfortable\"\n },\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"dense\",\n \"label\": \"Dense\"\n }\n ]\n },\n \"actions.position\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"left\",\n \"label\": \"Left\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"right\",\n \"label\": \"Right\"\n },\n {\n \"value\": \"justified\",\n \"label\": \"Justified\"\n },\n {\n \"value\": \"split\",\n \"label\": \"Split\"\n }\n ]\n },\n \"actions.orientation\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"horizontal\",\n \"label\": \"Horizontal\"\n },\n {\n \"value\": \"vertical\",\n \"label\": \"Vertical\"\n }\n ]\n },\n \"actions.spacing\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"normal\",\n \"label\": \"Normal\"\n },\n {\n \"value\": \"spacious\",\n \"label\": \"Spacious\"\n }\n ]\n },\n \"actions.placement\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"insideLastSection\",\n \"label\": \"Inside last section\"\n },\n {\n \"value\": \"afterSections\",\n \"label\": \"After sections\"\n },\n {\n \"value\": \"top\",\n \"label\": \"Top\"\n }\n ]\n },\n \"actions.submit.type\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"button\",\n \"label\": \"Button\"\n },\n {\n \"value\": \"submit\",\n \"label\": \"Submit\"\n },\n {\n \"value\": \"reset\",\n \"label\": \"Reset\"\n }\n ]\n },\n \"actions.submit.variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"raised\",\n \"label\": \"Raised\"\n },\n {\n \"value\": \"stroked\",\n \"label\": \"Stroked\"\n },\n {\n \"value\": \"flat\",\n \"label\": \"Flat\"\n },\n {\n \"value\": \"fab\",\n \"label\": \"Fab\"\n }\n ]\n },\n \"actions.submit.size\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"small\",\n \"label\": \"Small\"\n },\n {\n \"value\": \"medium\",\n \"label\": \"Medium\"\n },\n {\n \"value\": \"large\",\n \"label\": \"Large\"\n }\n ]\n },\n \"actions.submit.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n },\n {\n \"value\": \"basic\",\n \"label\": \"Basic\"\n }\n ]\n },\n \"sections[].headerAlign\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n }\n ]\n },\n \"sections[].appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"card\",\n \"label\": \"Card\"\n },\n {\n \"value\": \"plain\",\n \"label\": \"Plain\"\n },\n {\n \"value\": \"step\",\n \"label\": \"Step\"\n }\n ]\n },\n \"sections[].sectionHeader.mode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"icon\",\n \"label\": \"Icon\"\n },\n {\n \"value\": \"avatar-image\",\n \"label\": \"Avatar image\"\n },\n {\n \"value\": \"avatar-initials\",\n \"label\": \"Avatar initials\"\n },\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n }\n ]\n },\n \"sections[].sectionHeader.emptyState\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"placeholder-avatar\",\n \"label\": \"Neutral placeholder\"\n },\n {\n \"value\": \"fallback-icon\",\n \"label\": \"Fallback icon\"\n },\n {\n \"value\": \"none\",\n \"label\": \"None\"\n }\n ]\n },\n \"sections[].sectionHeader.size\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"sm\",\n \"label\": \"Small\"\n },\n {\n \"value\": \"md\",\n \"label\": \"Medium\"\n },\n {\n \"value\": \"lg\",\n \"label\": \"Large\"\n }\n ]\n },\n \"sections[].stepLabel\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"Dados básicos\",\n \"label\": \"Dados básicos\"\n },\n {\n \"value\": \"Detalhes\",\n \"label\": \"Detalhes\"\n },\n {\n \"value\": \"Confirmação\",\n \"label\": \"Confirmação\"\n }\n ]\n },\n \"sections[].titleStyle\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"titleLarge\",\n \"label\": \"Title large\"\n },\n {\n \"value\": \"titleMedium\",\n \"label\": \"Title medium\"\n },\n {\n \"value\": \"titleSmall\",\n \"label\": \"Title small\"\n },\n {\n \"value\": \"headlineSmall\",\n \"label\": \"Headline small\"\n }\n ]\n },\n \"sections[].descriptionStyle\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"bodyLarge\",\n \"label\": \"Body large\"\n },\n {\n \"value\": \"bodyMedium\",\n \"label\": \"Body medium\"\n },\n {\n \"value\": \"bodySmall\",\n \"label\": \"Body small\"\n }\n ]\n },\n \"sections[].rows[].columns[].align\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n },\n {\n \"value\": \"stretch\",\n \"label\": \"Stretch\"\n }\n ]\n },\n \"sections[].rows[].columns[].items[].kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n },\n {\n \"value\": \"richContent\",\n \"label\": \"Rich content\"\n }\n ]\n },\n \"sections[].rows[].columns[].items[].layout\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"block\",\n \"label\": \"Block\"\n },\n {\n \"value\": \"inline\",\n \"label\": \"Inline\"\n }\n ]\n },\n \"formRules[].targetType\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n },\n {\n \"value\": \"section\",\n \"label\": \"Section\"\n },\n {\n \"value\": \"row\",\n \"label\": \"Row\"\n },\n {\n \"value\": \"column\",\n \"label\": \"Column\"\n },\n {\n \"value\": \"action\",\n \"label\": \"Action\"\n },\n {\n \"value\": \"visualBlock\",\n \"label\": \"Visual block\"\n }\n ]\n },\n \"formRules[].context\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"visibility\",\n \"label\": \"Visibility\"\n },\n {\n \"value\": \"readOnly\",\n \"label\": \"Read only\"\n },\n {\n \"value\": \"style\",\n \"label\": \"Style\"\n },\n {\n \"value\": \"validation\",\n \"label\": \"Validation\"\n },\n {\n \"value\": \"notification\",\n \"label\": \"Notification\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"field.visibility.hide\",\n \"intentExamples\": [\n \"hide field\",\n \"ocultar campo\",\n \"esconder campo\",\n \"invisible\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"hidden\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.visibility.show\",\n \"intentExamples\": [\n \"show field\",\n \"mostrar campo\",\n \"exibir campo\",\n \"visible\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"hidden\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.label.set\",\n \"intentExamples\": [\n \"label\",\n \"rename field\",\n \"renomear campo\",\n \"titulo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.placeholder.set\",\n \"intentExamples\": [\n \"placeholder\",\n \"hint text\",\n \"texto de ajuda\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"placeholder\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.required.enable\",\n \"intentExamples\": [\n \"required\",\n \"obrigatorio\",\n \"mandatory\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"required\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.required.disable\",\n \"intentExamples\": [\n \"optional\",\n \"nao obrigatorio\",\n \"opcional\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"required\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.readonly.enable\",\n \"intentExamples\": [\n \"readonly\",\n \"somente leitura\",\n \"read only\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"readOnly\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.readonly.disable\",\n \"intentExamples\": [\n \"editable\",\n \"editavel\",\n \"read write\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"readOnly\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.disabled.enable\",\n \"intentExamples\": [\n \"disable field\",\n \"desabilitar campo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"disabled\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.disabled.disable\",\n \"intentExamples\": [\n \"enable field\",\n \"habilitar campo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"disabled\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.controlType.set\",\n \"intentExamples\": [\n \"control type\",\n \"tipo de campo\",\n \"controlType\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"controlType\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.icon.prefix.set\",\n \"intentExamples\": [\n \"prefix icon\",\n \"icone prefixo\",\n \"icon before\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"prefixIcon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.icon.suffix.set\",\n \"intentExamples\": [\n \"suffix icon\",\n \"icone sufixo\",\n \"icon after\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"suffixIcon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.title.set\",\n \"intentExamples\": [\n \"section title\",\n \"titulo da secao\",\n \"section name\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"title\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.description.set\",\n \"intentExamples\": [\n \"section description\",\n \"descricao da secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"description\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.add\",\n \"intentExamples\": [\n \"add section\",\n \"adicionar secao\",\n \"nova secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{value}}\",\n \"title\": \"{{value}}\",\n \"rows\": []\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da seção é único e relevante.\"\n },\n {\n \"id\": \"section.remove\",\n \"intentExamples\": [\n \"remove section\",\n \"remover secao\",\n \"excluir secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"_delete\": true\n }\n ]\n },\n \"safetyNotes\": \"Remover uma seção é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"section.order.set\",\n \"intentExamples\": [\n \"order section\",\n \"reordenar secao\",\n \"mover secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"_order\": \"{{value}}\"\n }\n ]\n },\n \"safetyNotes\": \"A reordenação de seções é uma operação que deve ser revisada.\"\n },\n {\n \"id\": \"row.add\",\n \"intentExamples\": [\n \"add row\",\n \"adicionar linha\",\n \"nova linha na secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"rows\": [\n {\n \"id\": \"{{value}}\",\n \"columns\": []\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da linha é único e relevante na seção.\"\n },\n {\n \"id\": \"row.remove\",\n \"intentExamples\": [\n \"remove row\",\n \"remover linha\",\n \"excluir linha da secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"rows\": [\n {\n \"id\": \"{{value}}\",\n \"_delete\": true\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover uma linha é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"column.add\",\n \"intentExamples\": [\n \"add column\",\n \"adicionar coluna\",\n \"nova coluna na linha\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{value}}\",\n \"items\": []\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da coluna é único e relevante na linha.\"\n },\n {\n \"id\": \"column.remove\",\n \"intentExamples\": [\n \"remove column\",\n \"remover coluna\",\n \"excluir coluna da linha\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{value}}\",\n \"_delete\": true\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover uma coluna é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"column.field.add\",\n \"intentExamples\": [\n \"add field to column\",\n \"adicionar campo a coluna\",\n \"colocar campo na coluna\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{target.columnId}}\",\n \"items\": [\n {\n \"kind\": \"field\",\n \"id\": \"field-{{value}}\",\n \"fieldName\": \"{{value}}\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico.\"\n },\n {\n \"id\": \"column.field.remove\",\n \"intentExamples\": [\n \"remove field from column\",\n \"remover campo da coluna\",\n \"tirar campo da coluna\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{target.columnId}}\",\n \"items\": [\n {\n \"kind\": \"field\",\n \"fieldName\": \"{{value}}\",\n \"_remove\": true\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover um campo de uma coluna pode alterar o layout do formulário.\"\n },\n {\n \"id\": \"actions.submit.label.set\",\n \"intentExamples\": [\n \"submit label\",\n \"rotulo salvar\",\n \"texto botao enviar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"submit\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.submit.visible.set\",\n \"intentExamples\": [\n \"show submit\",\n \"esconder salvar\",\n \"visibilidade enviar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"submit\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.cancel.label.set\",\n \"intentExamples\": [\n \"cancel label\",\n \"rotulo cancelar\",\n \"texto botao cancelar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"cancel\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.cancel.visible.set\",\n \"intentExamples\": [\n \"show cancel\",\n \"esconder cancelar\",\n \"visibilidade cancelar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"cancel\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.reset.label.set\",\n \"intentExamples\": [\n \"reset label\",\n \"rotulo resetar\",\n \"texto botao limpar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"reset\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.reset.visible.set\",\n \"intentExamples\": [\n \"show reset\",\n \"esconder reset\",\n \"visibilidade limpar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"reset\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"rule.add.visibility\",\n \"intentExamples\": [\n \"add visibility rule\",\n \"regra de visibilidade\",\n \"campo condicional\"\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{value.id}}\",\n \"name\": \"{{value.name}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{target}}\"\n ],\n \"effect\": {\n \"condition\": \"{{value.condition}}\",\n \"properties\": {\n \"hidden\": false\n },\n \"propertiesWhenFalse\": {\n \"hidden\": true\n }\n }\n }\n ]\n },\n \"safetyNotes\": \"Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao.\"\n },\n {\n \"id\": \"rule.remove\",\n \"intentExamples\": [\n \"remove rule\",\n \"excluir regra\",\n \"apagar regra\"\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{target}}\",\n \"_delete\": true\n }\n ]\n },\n \"safetyNotes\": \"Remover regras pode ter efeitos inesperados no comportamento do formulário.\"\n },\n {\n \"id\": \"rule.add.dependency\",\n \"intentExamples\": [\n \"adicionar dependencia\",\n \"campo depende de\",\n \"mostrar se\",\n \"obrigatorio se\",\n \"desabilitar se\",\n \"campo condicional\"\n ],\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"operation\": \"create\",\n \"params\": [\n {\n \"name\": \"triggerField\",\n \"type\": \"STRING\",\n \"description\": \"Campo que controla a regra (ex: tipoPessoa)\"\n },\n {\n \"name\": \"conditionValue\",\n \"type\": \"STRING\",\n \"description\": \"Valor do trigger para ativar a regra (ex: \\\"Jurídica\\\")\"\n },\n {\n \"name\": \"targetField\",\n \"type\": \"STRING\",\n \"description\": \"Campo afetado pela regra (ex: cnpj)\"\n },\n {\n \"name\": \"effectType\",\n \"type\": \"ENUM\",\n \"options\": [\n \"visibility\",\n \"required\",\n \"disabled\"\n ],\n \"description\": \"Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)\"\n }\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"rule_{{params.triggerField}}_{{params.targetField}}\",\n \"name\": \"Dependência: {{params.targetField}} depende de {{params.triggerField}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{params.targetField}}\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"{{params.triggerField}}\"\n },\n \"{{params.conditionValue}}\"\n ]\n },\n \"properties\": {\n \"hidden\": \"{{params.effectType === 'visibility' ? false : undefined}}\",\n \"required\": \"{{params.effectType === 'required' ? true : undefined}}\",\n \"disabled\": \"{{params.effectType === 'disabled' ? true : undefined}}\"\n },\n \"propertiesWhenFalse\": {\n \"hidden\": \"{{params.effectType === 'visibility' ? true : undefined}}\",\n \"required\": \"{{params.effectType === 'required' ? false : undefined}}\",\n \"disabled\": \"{{params.effectType === 'disabled' ? false : undefined}}\"\n }\n }\n }\n ]\n },\n \"safetyNotes\": \"Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples.\"\n },\n {\n \"id\": \"rule.add.custom\",\n \"intentExamples\": [\n \"adicionar regra customizada\",\n \"regra complexa\",\n \"logica de formulario\"\n ],\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"operation\": \"create\",\n \"params\": [\n {\n \"name\": \"id\",\n \"type\": \"STRING\",\n \"description\": \"ID único da regra\"\n },\n {\n \"name\": \"condition\",\n \"type\": \"STRING\",\n \"description\": \"Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \\\"and\\\": [{ \\\">\\\": [{ \\\"var\\\": \\\"idade\\\" }, 18] }, { \\\"==\\\": [{ \\\"var\\\": \\\"possuiHabilitacao\\\" }, true] }] })\"\n },\n {\n \"name\": \"targetField\",\n \"type\": \"STRING\",\n \"description\": \"Campo afetado\"\n },\n {\n \"name\": \"propertyName\",\n \"type\": \"STRING\",\n \"description\": \"Propriedade afetada (hidden, required, disabled, readOnly)\"\n },\n {\n \"name\": \"valueIfTrue\",\n \"type\": \"BOOLEAN\",\n \"description\": \"Valor se a condição for verdadeira\"\n },\n {\n \"name\": \"valueIfFalse\",\n \"type\": \"BOOLEAN\",\n \"description\": \"Valor se a condição for falsa\"\n }\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{params.id}}\",\n \"name\": \"Regra Customizada: {{params.id}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{params.targetField}}\"\n ],\n \"effect\": {\n \"condition\": \"{{params.condition}}\",\n \"properties\": {\n \"{{params.propertyName}}\": \"{{params.valueIfTrue}}\"\n },\n \"propertiesWhenFalse\": {\n \"{{params.propertyName}}\": \"{{params.valueIfFalse}}\"\n }\n }\n }\n ]\n }\n }\n ],\n \"fieldResolvers\": {\n \"fieldMetadata[]\": [\n \"name\",\n \"label\"\n ],\n \"sections[]\": [\n \"id\",\n \"title\"\n ],\n \"sections[].rows[].columns[].items[]\": [\n \"id\",\n \"fieldName\"\n ],\n \"sections[].rows[].columns[].fields[]\": []\n },\n \"hints\": [\n \"Use fieldMetadata[].name as the canonical field id; avoid array indexes.\",\n \"Local fields are real form controls. Create them in fieldMetadata[] with source:\\\"local\\\", usually transient:true and submitPolicy:\\\"omit\\\", then place them as kind:\\\"field\\\" layout items.\",\n \"submitPolicy accepts only \\\"omit\\\", \\\"include\\\", or \\\"includeWhenDirty\\\". If legacy prompt text says \\\"never\\\", normalize it to \\\"omit\\\" before persisting.\",\n \"Visual blocks are not fields. Store them only as kind:\\\"richContent\\\" layout items and never in fieldMetadata[].\",\n \"Use sections[].rows[].columns[].items[] as the canonical mixed layout order. kind:\\\"field\\\" items reference fieldMetadata; kind:\\\"richContent\\\" items are visual blocks outside submit payload.\",\n \"Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.\",\n \"For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.\",\n \"For field formRules that must calculate a FormControl value, use effect.properties.value with the closed envelope { expression: <JSON Logic> }, such as { expression: { yearsSince: [{ var: \\\"birthDate\\\" }] } }. Use the closed envelope { literal: <value> } for structured literal objects; do not add extra keys and do not generate TypeScript functions.\",\n \"For conditional side effects, use formCommandRules with effects[].kind:\\\"global-action\\\" and a structured globalAction ref. The visual editor authors the primary effect and preserves secondary effects from advanced JSON. Do not put alert/modal/navigation commands inside formRules[].effect.properties.\",\n \"LLM-created formRules must include metadata.origin:\\\"llm\\\" and metadata.reviewStatus:\\\"pending\\\"; never write generated formRulesState.\",\n \"Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.\",\n \"For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.\",\n \"Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.\",\n \"When adding sections/rows/columns, provide a unique \\\"id\\\" for each new element.\",\n \"For nested layout changes (column within a row within a section), explicitly define \\\"target.sectionId\\\", \\\"target.rowId\\\", \\\"target.columnId\\\" in user prompt for clarity.\",\n \"DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).\",\n \"DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).\",\n \"DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.\",\n \"DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.\",\n \"DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally.\"\n ]\n }\n}",
14310
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",
14586
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",
14311
14587
  "contentHash": "fce0638895fb6284d9f1f6c896a2eeb5945f4877b418f942a1872f60b1541c15",
14312
14588
  "sourceKind": "component_definition",
14313
14589
  "sourceId": "praxis-filter-form",