@praxisui/manual-form 9.0.0-beta.27 → 9.0.0-beta.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -111,6 +111,26 @@ The toolbar and metadata bridge are runtime entry points. They are not separate
111
111
 
112
112
  Free JSON patches from AI flows are not the public authoring contract. Local apply must come from a manifest-backed `componentEditPlan`.
113
113
 
114
+ ### Rule Authoring Contract
115
+
116
+ `formRules` is the authorable rules surface for manual forms. Each rule `effect.condition` must be a JSON Logic object, for example:
117
+
118
+ ```json
119
+ {
120
+ "id": "required-customer",
121
+ "targetType": "field",
122
+ "targets": ["customer"],
123
+ "effect": {
124
+ "condition": { "!==": [{ "var": "customer" }, null] },
125
+ "properties": { "required": true }
126
+ }
127
+ }
128
+ ```
129
+
130
+ Do not use legacy JSON Schema condition blocks such as `allOf`/`if`/`then`, and do not use textual expression strings such as `customer != null`.
131
+
132
+ `formRulesState` is internal round-trip state generated by the visual editor. Treat it as read-only metadata: tools and hosts should author `formRules` and let the editor materialize or preserve `formRulesState` when needed.
133
+
114
134
  ## Public API Snapshot
115
135
 
116
136
  Main exports include `ManualFormComponent`, `ManualFormHeaderComponent`, `ManualFormActionsComponent`, `ManualFormConfigEditorComponent`, `ManualFormInstance`, seed helpers, manual field directives, metadata bridge services, DI tokens, AI capabilities and `PRAXIS_MANUAL_FORM_AUTHORING_MANIFEST`.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-01T19:52:01.852Z",
3
+ "generatedAt": "2026-07-01T22:59:31.192Z",
4
4
  "packageName": "@praxisui/manual-form",
5
- "packageVersion": "9.0.0-beta.27",
5
+ "packageVersion": "9.0.0-beta.28",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -1493,9 +1493,10 @@
1493
1493
  },
1494
1494
  {
1495
1495
  "path": "formRulesState",
1496
- "category": "rules",
1496
+ "category": "metadata",
1497
1497
  "valueKind": "object",
1498
- "description": "Estado bruto do visual builder."
1498
+ "description": "Estado interno do builder visual de regras, gerado apenas para round-trip do editor.",
1499
+ "safetyNotes": "Read-only/internal. Nao use como alvo de autoria, patch, exemplo ou operacao de IA; gere somente formRules e deixe o editor materializar formRulesState."
1499
1500
  },
1500
1501
  {
1501
1502
  "path": "hooks",
@@ -4291,9 +4292,9 @@
4291
4292
  {
4292
4293
  "chunkIndex": 1,
4293
4294
  "chunkKind": "capabilities",
4294
- "content": "Component Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versao da configuracao do formulario.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuracao.\n - Path: metadata.title\n Category: metadata\n Kind: string\n Description: Titulo exibido no cabecalho quando formTitle nao for informado.\n - Path: metadata.description\n Category: metadata\n Kind: string\n Description: Descricao exibida no cabecalho quando formDescription nao for informado.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da ultima atualizacao.\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: Identificador do schema usado na composicao.\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash do schema/servidor para reconciliacao.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema (path/operation/schemaType).\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema usado para compor o formulario.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operacao 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: Marca schema como interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema.\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizacoes.\n - Path: metadata.customizations[]\n Category: metadata\n Kind: object\n Description: Registro de customizacao.\n - Path: metadata.customizations[].fieldName\n Category: metadata\n Kind: string\n Description: Campo customizado.\n - Path: metadata.customizations[].property\n Category: metadata\n Kind: string\n Description: Propriedade alterada.\n - Path: metadata.customizations[].oldValue\n Category: metadata\n Kind: object\n Description: Valor anterior.\n - Path: metadata.customizations[].newValue\n Category: metadata\n Kind: object\n Description: Novo valor.\n - Path: metadata.customizations[].timestamp\n Category: metadata\n Kind: string\n Description: Timestamp da alteracao (ISO).\n - Path: metadata.customizations[].source\n Category: metadata\n Kind: enum\n Description: Origem da alteracao.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Metadados dos campos (FieldMetadata).\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: sections[]\n Category: layout\n Kind: object\n Description: Secao do formulario.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID da secao.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Titulo da secao.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descricao da secao.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Icone da secao.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Secao recolhivel.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial recolhido.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaco extra apos a secao (px).\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaco abaixo do titulo (px).\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaco abaixo da descricao (px).\n - Path: sections[].titleStyle\n Category: layout\n Kind: enum\n Description: Preset tipografico do titulo.\n - Path: sections[].descriptionStyle\n Category: layout\n Kind: enum\n Description: Preset tipografico da descricao.\n - Path: sections[].titleColor\n Category: layout\n Kind: string\n Description: Cor do titulo.\n - Path: sections[].descriptionColor\n Category: layout\n Kind: string\n Description: Cor da descricao.\n - Path: sections[].headerAlign\n Category: layout\n Kind: enum\n Description: Alinhamento do header.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Tooltip do header da secao.\n - Path: sections[].rows[]\n Category: layout\n Kind: object\n Description: Linha da secao.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID da linha.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Titulo da linha.\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaco horizontal entre colunas (px).\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaco vertical apos a linha (px).\n - Path: sections[].rows[].columns[]\n Category: layout\n Kind: object\n Description: Coluna da linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID da coluna.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Titulo da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Campos associados a coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo na coluna.\n - Path: sections[].rows[].columns[].span\n Category: layout\n Kind: object\n Description: Span responsivo.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Span xs (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Span sm (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Span md (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Span lg (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Span xl (1-12).\n - Path: sections[].rows[].columns[].offset\n Category: layout\n Kind: object\n Description: Offset responsivo.\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset xs (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset sm (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset md (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset lg (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset xl (1-12).\n - Path: sections[].rows[].columns[].order\n Category: layout\n Kind: object\n Description: Order responsivo.\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Order xs.\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Order sm.\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Order md.\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Order lg.\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Order xl.\n - Path: sections[].rows[].columns[].hidden\n Category: layout\n Kind: object\n Description: Hidden responsivo.\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Ocultar no xs.\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Ocultar no sm.\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Ocultar no md.\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Ocultar no lg.\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Ocultar no xl.\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding da coluna (px).\n - Path: sections[].rows[].columns[].className\n Category: layout\n Kind: string\n Description: Classe CSS da coluna.\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Test id da coluna.\n - Path: actions\n Category: actions\n Kind: object\n Description: Layout de acoes do formulario.\n - Path: actions.position\n Category: actions\n Kind: enum\n Description: Posicao das acoes.\n - Path: actions.orientation\n Category: actions\n Kind: enum\n Description: Orientacao das acoes.\n - Path: actions.spacing\n Category: actions\n Kind: enum\n Description: Espacamento das acoes.\n - Path: actions.sticky\n Category: actions\n Kind: boolean\n Description: Fixar barra de acoes.\n - Path: actions.divider\n Category: actions\n Kind: boolean\n Description: Exibir divisor acima das acoes.\n - Path: actions.placement\n Category: actions\n Kind: enum\n Description: Posicionamento estrutural das acoes.\n - Path: actions.containerClassName\n Category: actions\n Kind: string\n Description: Classe CSS do container de acoes.\n - Path: actions.containerStyles\n Category: actions\n Kind: object\n Description: Estilos inline do container.\n - Path: actions.mobile\n Category: actions\n Kind: object\n Description: Config para mobile.\n - Path: actions.mobile.position\n Category: actions\n Kind: enum\n Description: Posicao das acoes no mobile.\n - Path: actions.mobile.orientation\n Category: actions\n Kind: enum\n Description: Orientacao no mobile.\n - Path: actions.mobile.collapseToMenu\n Category: actions\n Kind: boolean\n Description: Colapsar acoes em menu.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar botao salvar.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar cancelar.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do cancelar.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do reset.\n - Path: actions.submit\n Category: actions\n Kind: object\n Description: Botao submit.\n - Path: actions.cancel\n Category: actions\n Kind: object\n Description: Botao cancelar.\n - Path: actions.reset\n Category: actions\n Kind: object\n Description: Botao reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Botoes customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuracao de botao customizado.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botao.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Label do botao.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Icone do botao.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilo inline.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botao.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Botao desabilitado.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botao.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento custom.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Estado loading.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botao.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botao cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Label do botao cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Icone do botao cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS do botao cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilo inline do botao cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botao cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao cancelar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botao reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Label do botao reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Icone do botao reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS do botao reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilo inline do botao reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botao reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao reset.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao reset.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID do botao customizado.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao customizado.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Label do botao customizado.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Icone do botao customizado.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS do botao customizado.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilo inline do botao customizado.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor do botao customizado.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao customizado.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao customizado.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao customizado.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao customizado.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao customizado.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao customizado.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao customizado.\n - Path: behavior\n Category: behavior\n Kind: object\n Description: Comportamento do formulario.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Solicita confirmacao ao sair com alteracoes nao salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Mantem historico de alteracoes do formulario.\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Move o foco para o primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Rola a tela ate a primeira area com erro de validacao.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulario apos salvar com sucesso.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: Destino de navegacao apos salvar com sucesso.\n - Path: behavior.reactiveValidation\n Category: behavior\n Kind: boolean\n Description: Ativa validacao reativa durante a digitacao.\n - Path: behavior.reactiveValidationDebounceMs\n Category: behavior\n Kind: number\n Description: Debounce em milissegundos para a validacao reativa.\n - Path: api\n Category: api\n Kind: object\n Description: Configuracao de API do formulario.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: Endpoint usado para persistir os dados do formulario.\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: Endpoint usado para carregar os dados iniciais do formulario.\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Metodo HTTP usado na operacao de salvamento.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Timeout da operacao de API em milissegundos.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Headers HTTP adicionais enviados nas operacoes de API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Campo que representa o identificador primario no payload remoto.\n - Path: api.beforeSave\n Category: api\n Kind: expression\n Description: Hook/callback do host antes de salvar. Nao e Json Logic nem expressao computada serializavel.\n - Path: api.afterLoad\n Category: api\n Kind: expression\n Description: Hook/callback do host apos carregar. Nao e Json Logic nem expressao computada serializavel.\n - Path: messages\n Category: messages\n Kind: object\n Description: Mensagens e i18n do formulario.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso ao atualizar registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso ao criar registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro ao atualizar registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro ao criar registro.\n - Path: messages.confirmations\n Category: messages\n Kind: object\n Description: Mensagens de confirmacao.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Confirmacao de submit.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Confirmacao de cancel.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Confirmacao de reset.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Confirmacao para acao custom.\n - Path: messages.customActions\n Category: messages\n Kind: object\n Description: Mensagens por acao custom.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da acao custom (success/error/confirmation).\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Sucesso para acao custom.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Erro para acao custom.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Confirmacao para acao custom.\n - Path: messages.loading\n Category: messages\n Kind: object\n Description: Mensagens de loading.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem de loading no submit.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem de loading no cancel.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem de loading no reset.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de loading para acao custom.\n - Path: formRules\n Category: rules\n Kind: array\n Description: Regras de layout/comportamento.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID da regra.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome da regra.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descricao da regra.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo de alvo.\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: IDs dos alvos canonicos.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo canonico.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para campos alvo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra.\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formRules[].effect.properties\n Category: rules\n Kind: object\n Description: Propriedades aplicadas quando true.\n - Path: formRules[].effect.propertiesWhenFalse\n Category: rules\n Kind: object\n Description: Propriedades aplicadas quando false.\n - Path: formRulesState\n Category: rules\n Kind: object\n Description: Estado bruto do visual builder.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declaracoes de hooks por estagio.\n - Path: hooks.beforeInit\n Category: hooks\n Kind: array\n Description: Hooks beforeInit.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook.\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook.\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Args do hook.\n - Path: hooks.afterInit\n Category: hooks\n Kind: array\n Description: Hooks afterInit.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos a inicializacao.\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos a inicializacao.\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos a inicializacao em milissegundos.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos a inicializacao.\n - Path: hooks.beforeValidate\n Category: hooks\n Kind: array\n Description: Hooks beforeValidate.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado antes da validacao.\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook antes da validacao.\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook antes da validacao em milissegundos.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook antes da validacao.\n - Path: hooks.afterValidate\n Category: hooks\n Kind: array\n Description: Hooks afterValidate.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos a validacao.\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos a validacao.\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos a validacao em milissegundos.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos a validacao.\n - Path: hooks.beforeSubmit\n Category: hooks\n Kind: array\n Description: Hooks beforeSubmit.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado antes do submit.\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook antes do submit.\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook antes do submit em milissegundos.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook antes do submit.\n - Path: hooks.afterSubmit\n Category: hooks\n Kind: array\n Description: Hooks afterSubmit.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos o submit.\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos o submit.\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos o submit em milissegundos.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos o submit.\n - Path: hooks.onError\n Category: hooks\n Kind: array\n Description: Hooks onError.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado em cenarios de erro.\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook em cenarios de erro.\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook de erro em milissegundos.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook de erro.\n - Path: hints.dataModes.create\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo create de dados.\n - Path: hints.dataModes.edit\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo edit de dados.\n - Path: hints.dataModes.view\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo view de dados.\n - Path: hints.uiModes.presentation\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo de apresentacao da UI.\n - Path: hints.uiModes.readonly\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo somente leitura.\n - Path: hints.uiModes.disabled\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo desabilitado.\n - Path: hints.uiModes.visible\n Category: hints\n Kind: string\n Description: Texto de apoio para a visibilidade dos elementos da UI.\nCapability Notes:\n - ManualForm usa FormConfig interno para metadados e layout.\n - fieldMetadata[] deve seguir o catalogo base de FieldMetadata.\n - Arrays de layout e actions devem ser mesclados por id/label, evitando replace total.\n - ManualFormHeader usa metadata.title/metadata.description como fallback para titulo/descricao.\n - Se controlType nao tiver catalogo dedicado, trate como FieldMetadata base.\n",
4295
+ "content": "Component Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versao da configuracao do formulario.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuracao.\n - Path: metadata.title\n Category: metadata\n Kind: string\n Description: Titulo exibido no cabecalho quando formTitle nao for informado.\n - Path: metadata.description\n Category: metadata\n Kind: string\n Description: Descricao exibida no cabecalho quando formDescription nao for informado.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da ultima atualizacao.\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: Identificador do schema usado na composicao.\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash do schema/servidor para reconciliacao.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema (path/operation/schemaType).\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema usado para compor o formulario.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operacao 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: Marca schema como interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema.\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizacoes.\n - Path: metadata.customizations[]\n Category: metadata\n Kind: object\n Description: Registro de customizacao.\n - Path: metadata.customizations[].fieldName\n Category: metadata\n Kind: string\n Description: Campo customizado.\n - Path: metadata.customizations[].property\n Category: metadata\n Kind: string\n Description: Propriedade alterada.\n - Path: metadata.customizations[].oldValue\n Category: metadata\n Kind: object\n Description: Valor anterior.\n - Path: metadata.customizations[].newValue\n Category: metadata\n Kind: object\n Description: Novo valor.\n - Path: metadata.customizations[].timestamp\n Category: metadata\n Kind: string\n Description: Timestamp da alteracao (ISO).\n - Path: metadata.customizations[].source\n Category: metadata\n Kind: enum\n Description: Origem da alteracao.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Metadados dos campos (FieldMetadata).\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: sections[]\n Category: layout\n Kind: object\n Description: Secao do formulario.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID da secao.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Titulo da secao.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descricao da secao.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Icone da secao.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Secao recolhivel.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial recolhido.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaco extra apos a secao (px).\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaco abaixo do titulo (px).\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaco abaixo da descricao (px).\n - Path: sections[].titleStyle\n Category: layout\n Kind: enum\n Description: Preset tipografico do titulo.\n - Path: sections[].descriptionStyle\n Category: layout\n Kind: enum\n Description: Preset tipografico da descricao.\n - Path: sections[].titleColor\n Category: layout\n Kind: string\n Description: Cor do titulo.\n - Path: sections[].descriptionColor\n Category: layout\n Kind: string\n Description: Cor da descricao.\n - Path: sections[].headerAlign\n Category: layout\n Kind: enum\n Description: Alinhamento do header.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Tooltip do header da secao.\n - Path: sections[].rows[]\n Category: layout\n Kind: object\n Description: Linha da secao.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID da linha.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Titulo da linha.\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaco horizontal entre colunas (px).\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaco vertical apos a linha (px).\n - Path: sections[].rows[].columns[]\n Category: layout\n Kind: object\n Description: Coluna da linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID da coluna.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Titulo da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Campos associados a coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo na coluna.\n - Path: sections[].rows[].columns[].span\n Category: layout\n Kind: object\n Description: Span responsivo.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Span xs (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Span sm (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Span md (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Span lg (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Span xl (1-12).\n - Path: sections[].rows[].columns[].offset\n Category: layout\n Kind: object\n Description: Offset responsivo.\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset xs (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset sm (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset md (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset lg (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset xl (1-12).\n - Path: sections[].rows[].columns[].order\n Category: layout\n Kind: object\n Description: Order responsivo.\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Order xs.\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Order sm.\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Order md.\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Order lg.\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Order xl.\n - Path: sections[].rows[].columns[].hidden\n Category: layout\n Kind: object\n Description: Hidden responsivo.\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Ocultar no xs.\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Ocultar no sm.\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Ocultar no md.\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Ocultar no lg.\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Ocultar no xl.\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding da coluna (px).\n - Path: sections[].rows[].columns[].className\n Category: layout\n Kind: string\n Description: Classe CSS da coluna.\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Test id da coluna.\n - Path: actions\n Category: actions\n Kind: object\n Description: Layout de acoes do formulario.\n - Path: actions.position\n Category: actions\n Kind: enum\n Description: Posicao das acoes.\n - Path: actions.orientation\n Category: actions\n Kind: enum\n Description: Orientacao das acoes.\n - Path: actions.spacing\n Category: actions\n Kind: enum\n Description: Espacamento das acoes.\n - Path: actions.sticky\n Category: actions\n Kind: boolean\n Description: Fixar barra de acoes.\n - Path: actions.divider\n Category: actions\n Kind: boolean\n Description: Exibir divisor acima das acoes.\n - Path: actions.placement\n Category: actions\n Kind: enum\n Description: Posicionamento estrutural das acoes.\n - Path: actions.containerClassName\n Category: actions\n Kind: string\n Description: Classe CSS do container de acoes.\n - Path: actions.containerStyles\n Category: actions\n Kind: object\n Description: Estilos inline do container.\n - Path: actions.mobile\n Category: actions\n Kind: object\n Description: Config para mobile.\n - Path: actions.mobile.position\n Category: actions\n Kind: enum\n Description: Posicao das acoes no mobile.\n - Path: actions.mobile.orientation\n Category: actions\n Kind: enum\n Description: Orientacao no mobile.\n - Path: actions.mobile.collapseToMenu\n Category: actions\n Kind: boolean\n Description: Colapsar acoes em menu.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar botao salvar.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar cancelar.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do cancelar.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do reset.\n - Path: actions.submit\n Category: actions\n Kind: object\n Description: Botao submit.\n - Path: actions.cancel\n Category: actions\n Kind: object\n Description: Botao cancelar.\n - Path: actions.reset\n Category: actions\n Kind: object\n Description: Botao reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Botoes customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuracao de botao customizado.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botao.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Label do botao.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Icone do botao.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilo inline.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botao.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Botao desabilitado.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botao.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento custom.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Estado loading.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botao.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botao cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Label do botao cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Icone do botao cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS do botao cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilo inline do botao cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botao cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao cancelar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botao reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Label do botao reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Icone do botao reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS do botao reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilo inline do botao reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botao reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao reset.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao reset.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID do botao customizado.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao customizado.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Label do botao customizado.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Icone do botao customizado.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS do botao customizado.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilo inline do botao customizado.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor do botao customizado.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao customizado.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao customizado.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao customizado.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao customizado.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao customizado.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao customizado.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao customizado.\n - Path: behavior\n Category: behavior\n Kind: object\n Description: Comportamento do formulario.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Solicita confirmacao ao sair com alteracoes nao salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Mantem historico de alteracoes do formulario.\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Move o foco para o primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Rola a tela ate a primeira area com erro de validacao.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulario apos salvar com sucesso.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: Destino de navegacao apos salvar com sucesso.\n - Path: behavior.reactiveValidation\n Category: behavior\n Kind: boolean\n Description: Ativa validacao reativa durante a digitacao.\n - Path: behavior.reactiveValidationDebounceMs\n Category: behavior\n Kind: number\n Description: Debounce em milissegundos para a validacao reativa.\n - Path: api\n Category: api\n Kind: object\n Description: Configuracao de API do formulario.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: Endpoint usado para persistir os dados do formulario.\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: Endpoint usado para carregar os dados iniciais do formulario.\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Metodo HTTP usado na operacao de salvamento.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Timeout da operacao de API em milissegundos.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Headers HTTP adicionais enviados nas operacoes de API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Campo que representa o identificador primario no payload remoto.\n - Path: api.beforeSave\n Category: api\n Kind: expression\n Description: Hook/callback do host antes de salvar. Nao e Json Logic nem expressao computada serializavel.\n - Path: api.afterLoad\n Category: api\n Kind: expression\n Description: Hook/callback do host apos carregar. Nao e Json Logic nem expressao computada serializavel.\n - Path: messages\n Category: messages\n Kind: object\n Description: Mensagens e i18n do formulario.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso ao atualizar registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso ao criar registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro ao atualizar registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro ao criar registro.\n - Path: messages.confirmations\n Category: messages\n Kind: object\n Description: Mensagens de confirmacao.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Confirmacao de submit.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Confirmacao de cancel.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Confirmacao de reset.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Confirmacao para acao custom.\n - Path: messages.customActions\n Category: messages\n Kind: object\n Description: Mensagens por acao custom.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da acao custom (success/error/confirmation).\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Sucesso para acao custom.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Erro para acao custom.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Confirmacao para acao custom.\n - Path: messages.loading\n Category: messages\n Kind: object\n Description: Mensagens de loading.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem de loading no submit.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem de loading no cancel.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem de loading no reset.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de loading para acao custom.\n - Path: formRules\n Category: rules\n Kind: array\n Description: Regras de layout/comportamento.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID da regra.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome da regra.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descricao da regra.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo de alvo.\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: IDs dos alvos canonicos.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo canonico.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para campos alvo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra.\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formRules[].effect.properties\n Category: rules\n Kind: object\n Description: Propriedades aplicadas quando true.\n - Path: formRules[].effect.propertiesWhenFalse\n Category: rules\n Kind: object\n Description: Propriedades aplicadas quando false.\n - Path: formRulesState\n Category: metadata\n Kind: object\n Description: Estado interno do builder visual de regras, gerado apenas para round-trip do editor.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declaracoes de hooks por estagio.\n - Path: hooks.beforeInit\n Category: hooks\n Kind: array\n Description: Hooks beforeInit.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook.\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook.\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Args do hook.\n - Path: hooks.afterInit\n Category: hooks\n Kind: array\n Description: Hooks afterInit.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos a inicializacao.\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos a inicializacao.\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos a inicializacao em milissegundos.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos a inicializacao.\n - Path: hooks.beforeValidate\n Category: hooks\n Kind: array\n Description: Hooks beforeValidate.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado antes da validacao.\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook antes da validacao.\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook antes da validacao em milissegundos.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook antes da validacao.\n - Path: hooks.afterValidate\n Category: hooks\n Kind: array\n Description: Hooks afterValidate.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos a validacao.\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos a validacao.\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos a validacao em milissegundos.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos a validacao.\n - Path: hooks.beforeSubmit\n Category: hooks\n Kind: array\n Description: Hooks beforeSubmit.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado antes do submit.\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook antes do submit.\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook antes do submit em milissegundos.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook antes do submit.\n - Path: hooks.afterSubmit\n Category: hooks\n Kind: array\n Description: Hooks afterSubmit.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos o submit.\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos o submit.\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos o submit em milissegundos.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos o submit.\n - Path: hooks.onError\n Category: hooks\n Kind: array\n Description: Hooks onError.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado em cenarios de erro.\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook em cenarios de erro.\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook de erro em milissegundos.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook de erro.\n - Path: hints.dataModes.create\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo create de dados.\n - Path: hints.dataModes.edit\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo edit de dados.\n - Path: hints.dataModes.view\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo view de dados.\n - Path: hints.uiModes.presentation\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo de apresentacao da UI.\n - Path: hints.uiModes.readonly\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo somente leitura.\n - Path: hints.uiModes.disabled\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo desabilitado.\n - Path: hints.uiModes.visible\n Category: hints\n Kind: string\n Description: Texto de apoio para a visibilidade dos elementos da UI.\nCapability Notes:\n - ManualForm usa FormConfig interno para metadados e layout.\n - fieldMetadata[] deve seguir o catalogo base de FieldMetadata.\n - Arrays de layout e actions devem ser mesclados por id/label, evitando replace total.\n - ManualFormHeader usa metadata.title/metadata.description como fallback para titulo/descricao.\n - Se controlType nao tiver catalogo dedicado, trate como FieldMetadata base.\n",
4295
4296
  "sourcePointer": "praxis-ui-angular/projects/praxis-manual-form/src/lib/ai/manual-form-ai-capabilities.ts",
4296
- "contentHash": "84aeb0c4af738b0b89f24f48f62f578a9c1474a4c8fc2f0bf890ca577a205fbb",
4297
+ "contentHash": "3d06c45400ad846c00f63a093f2c3dc1fde66b77bb4b301f5dc521952f3f2f89",
4297
4298
  "sourceKind": "component_definition",
4298
4299
  "sourceId": "praxis-manual-form",
4299
4300
  "corpusVersion": "1.0.0"
@@ -1029,7 +1029,13 @@ const MANUAL_FORM_AI_CAPABILITIES = {
1029
1029
  ...generateRulePropertyWhenFalseCapabilities('action', RULE_PROPERTY_SCHEMA.action),
1030
1030
  ...generateRulePropertyWhenFalseCapabilities('row', RULE_PROPERTY_SCHEMA.row),
1031
1031
  ...generateRulePropertyWhenFalseCapabilities('column', RULE_PROPERTY_SCHEMA.column),
1032
- { path: 'formRulesState', category: 'rules', valueKind: 'object', description: 'Estado bruto do visual builder.' },
1032
+ {
1033
+ path: 'formRulesState',
1034
+ category: 'metadata',
1035
+ valueKind: 'object',
1036
+ description: 'Estado interno do builder visual de regras, gerado apenas para round-trip do editor.',
1037
+ safetyNotes: 'Read-only/internal. Nao use como alvo de autoria, patch, exemplo ou operacao de IA; gere somente formRules e deixe o editor materializar formRulesState.',
1038
+ },
1033
1039
  { path: 'hooks', category: 'hooks', valueKind: 'object', description: 'Declaracoes de hooks por estagio.' },
1034
1040
  { path: 'hooks.beforeInit', category: 'hooks', valueKind: 'array', description: 'Hooks beforeInit.' },
1035
1041
  { path: 'hooks.beforeInit[]', category: 'hooks', valueKind: 'array', description: 'Hooks beforeInit.' },
@@ -3454,10 +3460,11 @@ const MANUAL_FORM_EN_US = {
3454
3460
  'praxis.manualForm.editor.rules.apply': 'Apply rules',
3455
3461
  'praxis.manualForm.editor.rules.note': 'Persisted in config; execution depends on the host.',
3456
3462
  'praxis.manualForm.editor.rules.formRulesLabel': 'formRules (JSON)',
3457
- 'praxis.manualForm.editor.rules.formRulesStateLabel': 'formRulesState (JSON)',
3458
- 'praxis.manualForm.editor.rules.formRulesPlaceholder': '[{"id":"rule-1","name":"Required rule","targetType":"field","targets":["field"],"effect":{"condition":"{field} != null","properties":{"required":true}}}]',
3463
+ 'praxis.manualForm.editor.rules.formRulesStateLabel': 'Visual editor internal state (formRulesState - JSON)',
3464
+ 'praxis.manualForm.editor.rules.formRulesPlaceholder': '[{"id":"rule-1","name":"Required rule","targetType":"field","targets":["field"],"effect":{"condition":{"!==":[{"var":"field"},null]},"properties":{"required":true}}}]',
3459
3465
  'praxis.manualForm.editor.rules.tooltip': 'JSON array with rules (id, targetType, targets, effect).',
3460
- 'praxis.manualForm.editor.rules.stateTooltip': 'Raw state from the visual editor (optional).',
3466
+ 'praxis.manualForm.editor.rules.stateTooltip': 'Read-only internal round-trip state for the visual editor; edit formRules instead.',
3467
+ 'praxis.manualForm.editor.rules.formRulesStateReadonlyHint': 'Generated by the visual editor for round-trip; edit formRules instead.',
3461
3468
  'praxis.manualForm.editor.cascade.title': 'Field dependencies',
3462
3469
  'praxis.manualForm.editor.cascade.help': 'Configure native cascades based on metadata.',
3463
3470
  'praxis.manualForm.editor.cascade.note': 'Changes update metadata and are saved in the draft.',
@@ -3592,10 +3599,11 @@ const MANUAL_FORM_PT_BR = {
3592
3599
  'praxis.manualForm.editor.rules.apply': 'Aplicar regras',
3593
3600
  'praxis.manualForm.editor.rules.note': 'Persistido no config; a execução depende do host.',
3594
3601
  'praxis.manualForm.editor.rules.formRulesLabel': 'Regras do formulário (formRules - JSON)',
3595
- 'praxis.manualForm.editor.rules.formRulesStateLabel': 'Estado das regras (formRulesState - JSON)',
3596
- 'praxis.manualForm.editor.rules.formRulesPlaceholder': '[{"id":"rule-1","name":"Obrigatoriedade","targetType":"field","targets":["campo"],"effect":{"condition":"{campo} != null","properties":{"required":true}}}]',
3602
+ 'praxis.manualForm.editor.rules.formRulesStateLabel': 'Estado interno do editor visual (formRulesState - JSON)',
3603
+ 'praxis.manualForm.editor.rules.formRulesPlaceholder': '[{"id":"rule-1","name":"Obrigatoriedade","targetType":"field","targets":["campo"],"effect":{"condition":{"!==":[{"var":"campo"},null]},"properties":{"required":true}}}]',
3597
3604
  'praxis.manualForm.editor.rules.tooltip': 'Array JSON com regras (id, targetType, targets, effect).',
3598
- 'praxis.manualForm.editor.rules.stateTooltip': 'Estado bruto do editor visual (opcional).',
3605
+ 'praxis.manualForm.editor.rules.stateTooltip': 'Estado interno somente leitura para round-trip do editor visual; edite formRules.',
3606
+ 'praxis.manualForm.editor.rules.formRulesStateReadonlyHint': 'Gerado pelo editor visual para round-trip; edite formRules.',
3599
3607
  'praxis.manualForm.editor.cascade.title': 'Dependências entre campos',
3600
3608
  'praxis.manualForm.editor.cascade.help': 'Configure cascatas nativas baseadas em metadados.',
3601
3609
  'praxis.manualForm.editor.cascade.note': 'As alterações atualizam metadados e são salvas no rascunho (draft).',
@@ -3695,7 +3703,7 @@ class ManualFormConfigEditorComponent {
3695
3703
  return this.tx('editor.hooks.tooltip', `JSON array of hooks for ${stage} (id, priority, timeoutMs, args).`).replace('{{stage}}', stage);
3696
3704
  }
3697
3705
  formRulesPlaceholder() {
3698
- return this.tx('editor.rules.formRulesPlaceholder', '[{"id":"rule-1","name":"Required rule","targetType":"field","targets":["field"],"effect":{"condition":"{field} != null","properties":{"required":true}}}]');
3706
+ return this.tx('editor.rules.formRulesPlaceholder', '[{"id":"rule-1","name":"Required rule","targetType":"field","targets":["field"],"effect":{"condition":{"!==":[{"var":"field"},null]},"properties":{"required":true}}}]');
3699
3707
  }
3700
3708
  ngOnInit() {
3701
3709
  this.refresh();
@@ -4763,9 +4771,12 @@ class ManualFormConfigEditorComponent {
4763
4771
  matInput
4764
4772
  rows="6"
4765
4773
  [value]="formRulesStateText"
4774
+ readonly
4775
+ aria-readonly="true"
4766
4776
  (input)="onRulesStateTextChange($any($event.target).value)"
4767
4777
  placeholder='{"nodes":[],"edges":[]}'
4768
4778
  ></textarea>
4779
+ <mat-hint>{{ tx('editor.rules.formRulesStateReadonlyHint', 'Generated by the visual editor for round-trip; edit formRules instead.') }}</mat-hint>
4769
4780
  <button
4770
4781
  mat-icon-button
4771
4782
  matSuffix
@@ -4808,7 +4819,7 @@ class ManualFormConfigEditorComponent {
4808
4819
  </mat-tab>
4809
4820
  </mat-tab-group>
4810
4821
  </div>
4811
- `, isInline: true, styles: [".mf-editor{display:grid;gap:16px;padding:16px;color:var(--md-sys-color-on-surface)}.mf-editor__toolbar{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:12px;background:var(--md-sys-color-surface-container)}.mf-editor__title{display:flex;flex-direction:column;gap:2px;font-weight:600}.mf-editor__subtitle{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.mf-editor__toolbar .spacer{flex:1}.mf-tabs{min-height:420px}.mf-tab{display:grid;gap:16px;padding:14px 6px 0}.mf-editor__list{display:grid;gap:8px;overflow-x:auto}.mf-editor__row{display:grid;grid-template-columns:2.2fr 2fr 1fr repeat(4,minmax(90px,.8fr));align-items:center;gap:8px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);min-width:720px}.mf-editor__row--head{font-weight:600;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface-container)}.mf-editor__filter{display:inline-flex;align-items:center;gap:8px;font-weight:500}.mf-editor__filter input{accent-color:var(--md-sys-color-primary)}.col code{display:inline-block;font-family:inherit;font-size:.85rem;padding:2px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.mf-btn{min-height:36px;padding:0 12px;border-radius:8px;border:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.mf-btn:hover{background:var(--md-sys-color-surface-container)}.mf-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toggle{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant)}.mf-section{display:grid;gap:12px;padding:16px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface)}.mf-section--full{padding:10px}.mf-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.mf-section__header h3{margin:0;font-size:1.05rem;font-weight:600}.mf-help{margin:6px 0 0;font-size:.9rem;color:var(--md-sys-color-on-surface-variant)}.mf-note{padding:10px 12px;border-radius:10px;border:1px dashed var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface-variant);font-size:.9rem}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}.mf-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-action-card,.mf-custom-card,.mf-custom-message-card{display:grid;gap:10px;padding:14px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high)}.mf-action-card__title,.mf-custom-card__title{font-weight:600;color:var(--md-sys-color-on-surface)}.mf-actions-layout{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-toggle-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;align-items:start}.mf-hooks-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.mf-hook-field textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem}.mf-actions-row{display:inline-flex;gap:8px;align-items:center}.mf-actions-row--end{justify-content:flex-end;width:100%}.mf-custom-actions,.mf-custom-messages{display:grid;gap:12px}.mf-custom-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.mf-custom-card__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-messages-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-empty{margin:0;color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: CascadeManagerTabComponent, selector: "praxis-cascade-manager-tab", inputs: ["fields", "connections"], outputs: ["apply", "cancel"] }] });
4822
+ `, isInline: true, styles: [".mf-editor{display:grid;gap:16px;padding:16px;color:var(--md-sys-color-on-surface)}.mf-editor__toolbar{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:12px;background:var(--md-sys-color-surface-container)}.mf-editor__title{display:flex;flex-direction:column;gap:2px;font-weight:600}.mf-editor__subtitle{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.mf-editor__toolbar .spacer{flex:1}.mf-tabs{min-height:420px}.mf-tab{display:grid;gap:16px;padding:14px 6px 0}.mf-editor__list{display:grid;gap:8px;overflow-x:auto}.mf-editor__row{display:grid;grid-template-columns:2.2fr 2fr 1fr repeat(4,minmax(90px,.8fr));align-items:center;gap:8px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);min-width:720px}.mf-editor__row--head{font-weight:600;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface-container)}.mf-editor__filter{display:inline-flex;align-items:center;gap:8px;font-weight:500}.mf-editor__filter input{accent-color:var(--md-sys-color-primary)}.col code{display:inline-block;font-family:inherit;font-size:.85rem;padding:2px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.mf-btn{min-height:36px;padding:0 12px;border-radius:8px;border:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.mf-btn:hover{background:var(--md-sys-color-surface-container)}.mf-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toggle{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant)}.mf-section{display:grid;gap:12px;padding:16px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface)}.mf-section--full{padding:10px}.mf-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.mf-section__header h3{margin:0;font-size:1.05rem;font-weight:600}.mf-help{margin:6px 0 0;font-size:.9rem;color:var(--md-sys-color-on-surface-variant)}.mf-note{padding:10px 12px;border-radius:10px;border:1px dashed var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface-variant);font-size:.9rem}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}.mf-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-action-card,.mf-custom-card,.mf-custom-message-card{display:grid;gap:10px;padding:14px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high)}.mf-action-card__title,.mf-custom-card__title{font-weight:600;color:var(--md-sys-color-on-surface)}.mf-actions-layout{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-toggle-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;align-items:start}.mf-hooks-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.mf-hook-field textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem}.mf-actions-row{display:inline-flex;gap:8px;align-items:center}.mf-actions-row--end{justify-content:flex-end;width:100%}.mf-custom-actions,.mf-custom-messages{display:grid;gap:12px}.mf-custom-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.mf-custom-card__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-messages-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-empty{margin:0;color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: CascadeManagerTabComponent, selector: "praxis-cascade-manager-tab", inputs: ["fields", "connections"], outputs: ["apply", "cancel"] }] });
4812
4823
  }
4813
4824
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ManualFormConfigEditorComponent, decorators: [{
4814
4825
  type: Component,
@@ -5557,9 +5568,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5557
5568
  matInput
5558
5569
  rows="6"
5559
5570
  [value]="formRulesStateText"
5571
+ readonly
5572
+ aria-readonly="true"
5560
5573
  (input)="onRulesStateTextChange($any($event.target).value)"
5561
5574
  placeholder='{"nodes":[],"edges":[]}'
5562
5575
  ></textarea>
5576
+ <mat-hint>{{ tx('editor.rules.formRulesStateReadonlyHint', 'Generated by the visual editor for round-trip; edit formRules instead.') }}</mat-hint>
5563
5577
  <button
5564
5578
  mat-icon-button
5565
5579
  matSuffix
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@praxisui/manual-form",
3
- "version": "9.0.0-beta.27",
3
+ "version": "9.0.0-beta.28",
4
4
  "description": "Manual form toolkit for Praxis UI: container, instance factory and editor bridge for @praxisui/* fields.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/core": "^9.0.0-beta.27",
9
- "@praxisui/dynamic-fields": "^9.0.0-beta.27",
10
- "@praxisui/settings-panel": "^9.0.0-beta.27",
11
- "@praxisui/metadata-editor": "^9.0.0-beta.27",
8
+ "@praxisui/core": "^9.0.0-beta.28",
9
+ "@praxisui/dynamic-fields": "^9.0.0-beta.28",
10
+ "@praxisui/settings-panel": "^9.0.0-beta.28",
11
+ "@praxisui/metadata-editor": "^9.0.0-beta.28",
12
12
  "@angular/cdk": "^21.0.0",
13
13
  "@angular/forms": "^21.0.0",
14
14
  "@angular/material": "^21.0.0",
15
15
  "@angular/router": "^21.0.0",
16
- "@praxisui/ai": "^9.0.0-beta.27",
16
+ "@praxisui/ai": "^9.0.0-beta.28",
17
17
  "rxjs": "~7.8.0"
18
18
  },
19
19
  "dependencies": {