@praxisui/dynamic-form 9.0.0-beta.22 → 9.0.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -1
- package/ai/component-registry.json +265 -24
- package/docs/schema-driven-layout-materialization-rfc.md +446 -0
- package/fesm2022/praxisui-dynamic-form.mjs +479 -32
- package/package.json +8 -8
- package/src/lib/praxis-dynamic-form.json-api.md +22 -0
- package/types/praxisui-dynamic-form.d.ts +28 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-
|
|
3
|
+
"generatedAt": "2026-07-01T18:24:10.710Z",
|
|
4
4
|
"packageName": "@praxisui/dynamic-form",
|
|
5
|
-
"packageVersion": "9.0.0-beta.
|
|
5
|
+
"packageVersion": "9.0.0-beta.26",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 2,
|
|
@@ -117,6 +117,11 @@
|
|
|
117
117
|
"type": "'default' | 'compactPresentation'",
|
|
118
118
|
"required": false
|
|
119
119
|
},
|
|
120
|
+
{
|
|
121
|
+
"name": "layoutPolicy",
|
|
122
|
+
"type": "DynamicFormLayoutPolicy | null",
|
|
123
|
+
"required": false
|
|
124
|
+
},
|
|
120
125
|
{
|
|
121
126
|
"name": "backConfig",
|
|
122
127
|
"type": "BackConfig",
|
|
@@ -172,6 +177,11 @@
|
|
|
172
177
|
"type": "boolean | null",
|
|
173
178
|
"required": false
|
|
174
179
|
},
|
|
180
|
+
{
|
|
181
|
+
"name": "fieldIconPolicy",
|
|
182
|
+
"type": "'all' | 'presentation-only' | 'none'",
|
|
183
|
+
"required": false
|
|
184
|
+
},
|
|
175
185
|
{
|
|
176
186
|
"name": "visibleGlobal",
|
|
177
187
|
"type": "boolean | null",
|
|
@@ -381,6 +391,37 @@
|
|
|
381
391
|
"critical": true,
|
|
382
392
|
"safetyNotes": "Consuma FieldMetadata via catálogo base (field-metadata-ai-capabilities); use controlType para escolher overlay de microcomponente. Não altere props internas aqui sem consultar o catálogo base."
|
|
383
393
|
},
|
|
394
|
+
{
|
|
395
|
+
"path": "helpPresentation",
|
|
396
|
+
"category": "appearance",
|
|
397
|
+
"valueKind": "object",
|
|
398
|
+
"description": "Politica visual do formulario para exibir hint/helpText dos campos sem alterar a semantica publicada pelos DTOs.",
|
|
399
|
+
"safetyNotes": "Use para densidade visual de formularios; nao remova helpText/hint dos DTOs para limpar a UI."
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"path": "helpPresentation.display",
|
|
403
|
+
"category": "appearance",
|
|
404
|
+
"valueKind": "enum",
|
|
405
|
+
"allowedValues": [
|
|
406
|
+
"inline",
|
|
407
|
+
"popover",
|
|
408
|
+
"auto",
|
|
409
|
+
"hidden"
|
|
410
|
+
],
|
|
411
|
+
"description": "Define se a ajuda semantica dos campos fica inline, em icone de ajuda, automatica por densidade, ou oculta visualmente."
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"path": "helpPresentation.inlineMaxLength",
|
|
415
|
+
"category": "appearance",
|
|
416
|
+
"valueKind": "number",
|
|
417
|
+
"description": "Tamanho maximo para manter ajuda inline quando display=\"auto\"."
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"path": "helpPresentation.preferPopoverForControls",
|
|
421
|
+
"category": "appearance",
|
|
422
|
+
"valueKind": "array",
|
|
423
|
+
"description": "Tipos de controle que devem preferir icone de ajuda quando display=\"auto\", como toggle, checkbox ou select."
|
|
424
|
+
},
|
|
384
425
|
{
|
|
385
426
|
"path": "editorialContext",
|
|
386
427
|
"category": "editorial",
|
|
@@ -3865,6 +3906,76 @@
|
|
|
3865
3906
|
"description": "Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.",
|
|
3866
3907
|
"safetyNotes": "Nao reprocessa layouts ja persistidos ou authorados."
|
|
3867
3908
|
},
|
|
3909
|
+
{
|
|
3910
|
+
"path": "inputs.layoutPolicy",
|
|
3911
|
+
"category": "inputs",
|
|
3912
|
+
"valueKind": "object",
|
|
3913
|
+
"description": "Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.",
|
|
3914
|
+
"safetyNotes": "Use source=schema com persistence=transient para surfaces schema-driven; nao use para sobrescrever layouts authorados sem detach explicito."
|
|
3915
|
+
},
|
|
3916
|
+
{
|
|
3917
|
+
"path": "inputs.layoutPolicy.source",
|
|
3918
|
+
"category": "inputs",
|
|
3919
|
+
"valueKind": "enum",
|
|
3920
|
+
"allowedValues": [
|
|
3921
|
+
"authored",
|
|
3922
|
+
"schema"
|
|
3923
|
+
],
|
|
3924
|
+
"description": "Define se o layout vem de configuracao authorada ou do schema."
|
|
3925
|
+
},
|
|
3926
|
+
{
|
|
3927
|
+
"path": "inputs.layoutPolicy.preset",
|
|
3928
|
+
"category": "inputs",
|
|
3929
|
+
"valueKind": "enum",
|
|
3930
|
+
"allowedValues": [
|
|
3931
|
+
"default",
|
|
3932
|
+
"compactPresentation",
|
|
3933
|
+
"groupedCommand"
|
|
3934
|
+
],
|
|
3935
|
+
"description": "Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit."
|
|
3936
|
+
},
|
|
3937
|
+
{
|
|
3938
|
+
"path": "inputs.layoutPolicy.intent",
|
|
3939
|
+
"category": "inputs",
|
|
3940
|
+
"valueKind": "enum",
|
|
3941
|
+
"allowedValues": [
|
|
3942
|
+
"detail",
|
|
3943
|
+
"command"
|
|
3944
|
+
],
|
|
3945
|
+
"description": "Intencao da surface: detalhe/apresentacao ou comando/editavel."
|
|
3946
|
+
},
|
|
3947
|
+
{
|
|
3948
|
+
"path": "inputs.layoutPolicy.lifecycle",
|
|
3949
|
+
"category": "inputs",
|
|
3950
|
+
"valueKind": "enum",
|
|
3951
|
+
"allowedValues": [
|
|
3952
|
+
"initial",
|
|
3953
|
+
"live"
|
|
3954
|
+
],
|
|
3955
|
+
"description": "Ciclo de materializacao do layout schema-driven."
|
|
3956
|
+
},
|
|
3957
|
+
{
|
|
3958
|
+
"path": "inputs.layoutPolicy.persistence",
|
|
3959
|
+
"category": "inputs",
|
|
3960
|
+
"valueKind": "enum",
|
|
3961
|
+
"allowedValues": [
|
|
3962
|
+
"transient",
|
|
3963
|
+
"authorable"
|
|
3964
|
+
],
|
|
3965
|
+
"description": "Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito."
|
|
3966
|
+
},
|
|
3967
|
+
{
|
|
3968
|
+
"path": "inputs.fieldIconPolicy",
|
|
3969
|
+
"category": "inputs",
|
|
3970
|
+
"valueKind": "enum",
|
|
3971
|
+
"allowedValues": [
|
|
3972
|
+
"all",
|
|
3973
|
+
"presentation-only",
|
|
3974
|
+
"none"
|
|
3975
|
+
],
|
|
3976
|
+
"description": "Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.",
|
|
3977
|
+
"safetyNotes": "Use presentation-only para telas corporativas densas quando os icones ajudam no detalhe read-only mas poluem controles editaveis."
|
|
3978
|
+
},
|
|
3868
3979
|
{
|
|
3869
3980
|
"path": "inputs.backConfig",
|
|
3870
3981
|
"category": "inputs",
|
|
@@ -5453,7 +5564,7 @@
|
|
|
5453
5564
|
}
|
|
5454
5565
|
]
|
|
5455
5566
|
},
|
|
5456
|
-
"safetyNotes": "
|
|
5567
|
+
"safetyNotes": "Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao."
|
|
5457
5568
|
},
|
|
5458
5569
|
{
|
|
5459
5570
|
"id": "rule.remove",
|
|
@@ -5522,7 +5633,14 @@
|
|
|
5522
5633
|
"{{params.targetField}}"
|
|
5523
5634
|
],
|
|
5524
5635
|
"effect": {
|
|
5525
|
-
"condition":
|
|
5636
|
+
"condition": {
|
|
5637
|
+
"==": [
|
|
5638
|
+
{
|
|
5639
|
+
"var": "{{params.triggerField}}"
|
|
5640
|
+
},
|
|
5641
|
+
"{{params.conditionValue}}"
|
|
5642
|
+
]
|
|
5643
|
+
},
|
|
5526
5644
|
"properties": {
|
|
5527
5645
|
"hidden": "{{params.effectType === 'visibility' ? false : undefined}}",
|
|
5528
5646
|
"required": "{{params.effectType === 'required' ? true : undefined}}",
|
|
@@ -5558,7 +5676,7 @@
|
|
|
5558
5676
|
{
|
|
5559
5677
|
"name": "condition",
|
|
5560
5678
|
"type": "STRING",
|
|
5561
|
-
"description": "
|
|
5679
|
+
"description": "Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \"and\": [{ \">\": [{ \"var\": \"idade\" }, 18] }, { \"==\": [{ \"var\": \"possuiHabilitacao\" }, true] }] })"
|
|
5562
5680
|
},
|
|
5563
5681
|
{
|
|
5564
5682
|
"name": "targetField",
|
|
@@ -5688,6 +5806,21 @@
|
|
|
5688
5806
|
],
|
|
5689
5807
|
"description": "Preset usado apenas ao gerar a configuracao inicial a partir de metadata/schema; nao reprocessa layouts persistidos ou autorados."
|
|
5690
5808
|
},
|
|
5809
|
+
{
|
|
5810
|
+
"name": "layoutPolicy",
|
|
5811
|
+
"type": "DynamicFormLayoutPolicy",
|
|
5812
|
+
"description": "Politica opt-in para layout schema-driven transient. Use source=schema apenas quando o backend schema for a fonte canonica do agrupamento."
|
|
5813
|
+
},
|
|
5814
|
+
{
|
|
5815
|
+
"name": "fieldIconPolicy",
|
|
5816
|
+
"type": "string",
|
|
5817
|
+
"allowedValues": [
|
|
5818
|
+
"all",
|
|
5819
|
+
"presentation-only",
|
|
5820
|
+
"none"
|
|
5821
|
+
],
|
|
5822
|
+
"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."
|
|
5823
|
+
},
|
|
5691
5824
|
{
|
|
5692
5825
|
"name": "enableCustomization",
|
|
5693
5826
|
"type": "boolean",
|
|
@@ -8191,9 +8324,9 @@
|
|
|
8191
8324
|
{
|
|
8192
8325
|
"chunkIndex": 0,
|
|
8193
8326
|
"chunkKind": "summary",
|
|
8194
|
-
"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 - 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 - 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",
|
|
8327
|
+
"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",
|
|
8195
8328
|
"sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.metadata.ts",
|
|
8196
|
-
"contentHash": "
|
|
8329
|
+
"contentHash": "f699ad0db1bb0625cf759d14b5b7ef61758c72e3aa7b3ae27f6e1ee3bcf52459",
|
|
8197
8330
|
"sourceKind": "component_definition",
|
|
8198
8331
|
"sourceId": "praxis-dynamic-form",
|
|
8199
8332
|
"corpusVersion": "1.0.0"
|
|
@@ -8201,9 +8334,9 @@
|
|
|
8201
8334
|
{
|
|
8202
8335
|
"chunkIndex": 1,
|
|
8203
8336
|
"chunkKind": "capabilities",
|
|
8204
|
-
"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: 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: rules\n Kind: object\n Description: Estado interno do builder de regras (metadados visuais).\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.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[].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.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",
|
|
8337
|
+
"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: rules\n Kind: object\n Description: Estado interno do builder de regras (metadados visuais).\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.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[].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.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",
|
|
8205
8338
|
"sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
|
|
8206
|
-
"contentHash": "
|
|
8339
|
+
"contentHash": "c19b5bda8e257e368ce03880d7ad9132be3d99d157799e850fc53c70cfed05e0",
|
|
8207
8340
|
"sourceKind": "component_definition",
|
|
8208
8341
|
"sourceId": "praxis-dynamic-form",
|
|
8209
8342
|
"corpusVersion": "1.0.0"
|
|
@@ -8211,9 +8344,9 @@
|
|
|
8211
8344
|
{
|
|
8212
8345
|
"chunkIndex": 2,
|
|
8213
8346
|
"chunkKind": "authoring_manifest",
|
|
8214
|
-
"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 completa do formulário\"\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\": \"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}",
|
|
8347
|
+
"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 completa do formulário\"\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.\"\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}",
|
|
8215
8348
|
"sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
|
|
8216
|
-
"contentHash": "
|
|
8349
|
+
"contentHash": "ea79ad3816334314df94d42d8762699c34fe738c297bc4fd70faef61ef9f4b88",
|
|
8217
8350
|
"sourceKind": "component_definition",
|
|
8218
8351
|
"sourceId": "praxis-dynamic-form",
|
|
8219
8352
|
"corpusVersion": "1.0.0"
|
|
@@ -8221,9 +8354,9 @@
|
|
|
8221
8354
|
{
|
|
8222
8355
|
"chunkIndex": 3,
|
|
8223
8356
|
"chunkKind": "context_pack",
|
|
8224
|
-
"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\": \"Criação de regras requer atenção à lógica e IDs de campos. Teste a regra após a criação.\"\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\": \"{{params.triggerField}} == \\\"{{params.conditionValue}}\\\"\",\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\": \"Expressão condicional (ex: idade > 18 && possuiHabilitacao)\"\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}",
|
|
8357
|
+
"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}",
|
|
8225
8358
|
"sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
|
|
8226
|
-
"contentHash": "
|
|
8359
|
+
"contentHash": "fce0638895fb6284d9f1f6c896a2eeb5945f4877b418f942a1872f60b1541c15",
|
|
8227
8360
|
"sourceKind": "component_definition",
|
|
8228
8361
|
"sourceId": "praxis-dynamic-form",
|
|
8229
8362
|
"corpusVersion": "1.0.0"
|
|
@@ -8261,9 +8394,9 @@
|
|
|
8261
8394
|
{
|
|
8262
8395
|
"chunkIndex": 7,
|
|
8263
8396
|
"chunkKind": "recipe",
|
|
8264
|
-
"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\": \"status == 'INACTIVE'\",\n \"conditionalRequired\": \"status == 'INACTIVE'\"\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\": \"workMode == 'INTERN'\",\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\": \"status == 'INACTIVE'\",\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\": \"status == 'ACTIVE'\",\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\": \"isActive == true\",\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\": \"workMode == 'INTERN'\",\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\": \"status == 'INACTIVE'\",\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\": \"workMode == 'INTERN'\",\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",
|
|
8397
|
+
"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",
|
|
8265
8398
|
"sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.form-config.json",
|
|
8266
|
-
"contentHash": "
|
|
8399
|
+
"contentHash": "eb8680d3bf134f3a9db09ba3ecc324db4d163a86c5ec5fcd7ffe972e381c9b1e",
|
|
8267
8400
|
"sourceKind": "component_definition",
|
|
8268
8401
|
"sourceId": "praxis-dynamic-form",
|
|
8269
8402
|
"corpusVersion": "1.0.0"
|
|
@@ -8301,9 +8434,9 @@
|
|
|
8301
8434
|
{
|
|
8302
8435
|
"chunkIndex": 11,
|
|
8303
8436
|
"chunkKind": "recipe",
|
|
8304
|
-
"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\": \"
|
|
8437
|
+
"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",
|
|
8305
8438
|
"sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-dynamic-form.validation.json",
|
|
8306
|
-
"contentHash": "
|
|
8439
|
+
"contentHash": "4ee17414b7a5f61bfc18e56edd24462c227db8bea7508d33de1aefd2fc09d78e",
|
|
8307
8440
|
"sourceKind": "component_definition",
|
|
8308
8441
|
"sourceId": "praxis-dynamic-form",
|
|
8309
8442
|
"corpusVersion": "1.0.0"
|
|
@@ -8498,6 +8631,37 @@
|
|
|
8498
8631
|
"critical": true,
|
|
8499
8632
|
"safetyNotes": "Consuma FieldMetadata via catálogo base (field-metadata-ai-capabilities); use controlType para escolher overlay de microcomponente. Não altere props internas aqui sem consultar o catálogo base."
|
|
8500
8633
|
},
|
|
8634
|
+
{
|
|
8635
|
+
"path": "helpPresentation",
|
|
8636
|
+
"category": "appearance",
|
|
8637
|
+
"valueKind": "object",
|
|
8638
|
+
"description": "Politica visual do formulario para exibir hint/helpText dos campos sem alterar a semantica publicada pelos DTOs.",
|
|
8639
|
+
"safetyNotes": "Use para densidade visual de formularios; nao remova helpText/hint dos DTOs para limpar a UI."
|
|
8640
|
+
},
|
|
8641
|
+
{
|
|
8642
|
+
"path": "helpPresentation.display",
|
|
8643
|
+
"category": "appearance",
|
|
8644
|
+
"valueKind": "enum",
|
|
8645
|
+
"allowedValues": [
|
|
8646
|
+
"inline",
|
|
8647
|
+
"popover",
|
|
8648
|
+
"auto",
|
|
8649
|
+
"hidden"
|
|
8650
|
+
],
|
|
8651
|
+
"description": "Define se a ajuda semantica dos campos fica inline, em icone de ajuda, automatica por densidade, ou oculta visualmente."
|
|
8652
|
+
},
|
|
8653
|
+
{
|
|
8654
|
+
"path": "helpPresentation.inlineMaxLength",
|
|
8655
|
+
"category": "appearance",
|
|
8656
|
+
"valueKind": "number",
|
|
8657
|
+
"description": "Tamanho maximo para manter ajuda inline quando display=\"auto\"."
|
|
8658
|
+
},
|
|
8659
|
+
{
|
|
8660
|
+
"path": "helpPresentation.preferPopoverForControls",
|
|
8661
|
+
"category": "appearance",
|
|
8662
|
+
"valueKind": "array",
|
|
8663
|
+
"description": "Tipos de controle que devem preferir icone de ajuda quando display=\"auto\", como toggle, checkbox ou select."
|
|
8664
|
+
},
|
|
8501
8665
|
{
|
|
8502
8666
|
"path": "editorialContext",
|
|
8503
8667
|
"category": "editorial",
|
|
@@ -11982,6 +12146,76 @@
|
|
|
11982
12146
|
"description": "Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.",
|
|
11983
12147
|
"safetyNotes": "Nao reprocessa layouts ja persistidos ou authorados."
|
|
11984
12148
|
},
|
|
12149
|
+
{
|
|
12150
|
+
"path": "inputs.layoutPolicy",
|
|
12151
|
+
"category": "inputs",
|
|
12152
|
+
"valueKind": "object",
|
|
12153
|
+
"description": "Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.",
|
|
12154
|
+
"safetyNotes": "Use source=schema com persistence=transient para surfaces schema-driven; nao use para sobrescrever layouts authorados sem detach explicito."
|
|
12155
|
+
},
|
|
12156
|
+
{
|
|
12157
|
+
"path": "inputs.layoutPolicy.source",
|
|
12158
|
+
"category": "inputs",
|
|
12159
|
+
"valueKind": "enum",
|
|
12160
|
+
"allowedValues": [
|
|
12161
|
+
"authored",
|
|
12162
|
+
"schema"
|
|
12163
|
+
],
|
|
12164
|
+
"description": "Define se o layout vem de configuracao authorada ou do schema."
|
|
12165
|
+
},
|
|
12166
|
+
{
|
|
12167
|
+
"path": "inputs.layoutPolicy.preset",
|
|
12168
|
+
"category": "inputs",
|
|
12169
|
+
"valueKind": "enum",
|
|
12170
|
+
"allowedValues": [
|
|
12171
|
+
"default",
|
|
12172
|
+
"compactPresentation",
|
|
12173
|
+
"groupedCommand"
|
|
12174
|
+
],
|
|
12175
|
+
"description": "Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit."
|
|
12176
|
+
},
|
|
12177
|
+
{
|
|
12178
|
+
"path": "inputs.layoutPolicy.intent",
|
|
12179
|
+
"category": "inputs",
|
|
12180
|
+
"valueKind": "enum",
|
|
12181
|
+
"allowedValues": [
|
|
12182
|
+
"detail",
|
|
12183
|
+
"command"
|
|
12184
|
+
],
|
|
12185
|
+
"description": "Intencao da surface: detalhe/apresentacao ou comando/editavel."
|
|
12186
|
+
},
|
|
12187
|
+
{
|
|
12188
|
+
"path": "inputs.layoutPolicy.lifecycle",
|
|
12189
|
+
"category": "inputs",
|
|
12190
|
+
"valueKind": "enum",
|
|
12191
|
+
"allowedValues": [
|
|
12192
|
+
"initial",
|
|
12193
|
+
"live"
|
|
12194
|
+
],
|
|
12195
|
+
"description": "Ciclo de materializacao do layout schema-driven."
|
|
12196
|
+
},
|
|
12197
|
+
{
|
|
12198
|
+
"path": "inputs.layoutPolicy.persistence",
|
|
12199
|
+
"category": "inputs",
|
|
12200
|
+
"valueKind": "enum",
|
|
12201
|
+
"allowedValues": [
|
|
12202
|
+
"transient",
|
|
12203
|
+
"authorable"
|
|
12204
|
+
],
|
|
12205
|
+
"description": "Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito."
|
|
12206
|
+
},
|
|
12207
|
+
{
|
|
12208
|
+
"path": "inputs.fieldIconPolicy",
|
|
12209
|
+
"category": "inputs",
|
|
12210
|
+
"valueKind": "enum",
|
|
12211
|
+
"allowedValues": [
|
|
12212
|
+
"all",
|
|
12213
|
+
"presentation-only",
|
|
12214
|
+
"none"
|
|
12215
|
+
],
|
|
12216
|
+
"description": "Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.",
|
|
12217
|
+
"safetyNotes": "Use presentation-only para telas corporativas densas quando os icones ajudam no detalhe read-only mas poluem controles editaveis."
|
|
12218
|
+
},
|
|
11985
12219
|
{
|
|
11986
12220
|
"path": "inputs.backConfig",
|
|
11987
12221
|
"category": "inputs",
|
|
@@ -13570,7 +13804,7 @@
|
|
|
13570
13804
|
}
|
|
13571
13805
|
]
|
|
13572
13806
|
},
|
|
13573
|
-
"safetyNotes": "
|
|
13807
|
+
"safetyNotes": "Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao."
|
|
13574
13808
|
},
|
|
13575
13809
|
{
|
|
13576
13810
|
"id": "rule.remove",
|
|
@@ -13639,7 +13873,14 @@
|
|
|
13639
13873
|
"{{params.targetField}}"
|
|
13640
13874
|
],
|
|
13641
13875
|
"effect": {
|
|
13642
|
-
"condition":
|
|
13876
|
+
"condition": {
|
|
13877
|
+
"==": [
|
|
13878
|
+
{
|
|
13879
|
+
"var": "{{params.triggerField}}"
|
|
13880
|
+
},
|
|
13881
|
+
"{{params.conditionValue}}"
|
|
13882
|
+
]
|
|
13883
|
+
},
|
|
13643
13884
|
"properties": {
|
|
13644
13885
|
"hidden": "{{params.effectType === 'visibility' ? false : undefined}}",
|
|
13645
13886
|
"required": "{{params.effectType === 'required' ? true : undefined}}",
|
|
@@ -13675,7 +13916,7 @@
|
|
|
13675
13916
|
{
|
|
13676
13917
|
"name": "condition",
|
|
13677
13918
|
"type": "STRING",
|
|
13678
|
-
"description": "
|
|
13919
|
+
"description": "Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \"and\": [{ \">\": [{ \"var\": \"idade\" }, 18] }, { \"==\": [{ \"var\": \"possuiHabilitacao\" }, true] }] })"
|
|
13679
13920
|
},
|
|
13680
13921
|
{
|
|
13681
13922
|
"name": "targetField",
|
|
@@ -13773,9 +14014,9 @@
|
|
|
13773
14014
|
{
|
|
13774
14015
|
"chunkIndex": 1,
|
|
13775
14016
|
"chunkKind": "capabilities",
|
|
13776
|
-
"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: 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: rules\n Kind: object\n Description: Estado interno do builder de regras (metadados visuais).\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.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[].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.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",
|
|
14017
|
+
"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: rules\n Kind: object\n Description: Estado interno do builder de regras (metadados visuais).\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.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[].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.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",
|
|
13777
14018
|
"sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
|
|
13778
|
-
"contentHash": "
|
|
14019
|
+
"contentHash": "c19b5bda8e257e368ce03880d7ad9132be3d99d157799e850fc53c70cfed05e0",
|
|
13779
14020
|
"sourceKind": "component_definition",
|
|
13780
14021
|
"sourceId": "praxis-filter-form",
|
|
13781
14022
|
"corpusVersion": "1.0.0"
|
|
@@ -13783,9 +14024,9 @@
|
|
|
13783
14024
|
{
|
|
13784
14025
|
"chunkIndex": 2,
|
|
13785
14026
|
"chunkKind": "context_pack",
|
|
13786
|
-
"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\": \"Criação de regras requer atenção à lógica e IDs de campos. Teste a regra após a criação.\"\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\": \"{{params.triggerField}} == \\\"{{params.conditionValue}}\\\"\",\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\": \"Expressão condicional (ex: idade > 18 && possuiHabilitacao)\"\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}",
|
|
14027
|
+
"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}",
|
|
13787
14028
|
"sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",
|
|
13788
|
-
"contentHash": "
|
|
14029
|
+
"contentHash": "fce0638895fb6284d9f1f6c896a2eeb5945f4877b418f942a1872f60b1541c15",
|
|
13789
14030
|
"sourceKind": "component_definition",
|
|
13790
14031
|
"sourceId": "praxis-filter-form",
|
|
13791
14032
|
"corpusVersion": "1.0.0"
|