@praxisui/crud 9.0.0-beta.71 → 9.0.0-beta.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-11T00:12:06.404Z",
3
+ "generatedAt": "2026-07-12T01:34:40.567Z",
4
4
  "packageName": "@praxisui/crud",
5
- "packageVersion": "9.0.0-beta.71",
5
+ "packageVersion": "9.0.0-beta.73",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -14,114 +14,144 @@
14
14
  {
15
15
  "name": "metadata",
16
16
  "type": "CrudMetadata | string",
17
- "required": false
17
+ "required": false,
18
+ "description": "Metadados de configuração do CRUD (fonte remota via resource.path ou local via metadata.data)."
18
19
  },
19
20
  {
20
21
  "name": "crudId",
21
22
  "type": "string",
22
- "required": false
23
+ "required": false,
24
+ "description": "Identificador do CRUD (base para tabela/formulário e persistência)."
23
25
  },
24
26
  {
25
27
  "name": "componentInstanceId",
26
28
  "type": "string",
27
- "required": false
29
+ "required": false,
30
+ "description": "Identificador opcional para múltiplas instâncias na mesma rota."
28
31
  },
29
32
  {
30
33
  "name": "context",
31
34
  "type": "Record<string, unknown>",
32
- "required": false
35
+ "required": false,
36
+ "description": "Contexto opaco do host. A implementação atual o expõe como Input e o usa para seeds editoriais do authoring."
33
37
  },
34
38
  {
35
39
  "name": "metadata.queryContext",
36
40
  "type": "PraxisDataQueryContext | null",
37
- "required": false
41
+ "required": false,
42
+ "description": "Contexto semântico de consulta encaminhado para a tabela interna do CRUD. Preferir este contrato para novo authoring remoto."
38
43
  },
39
44
  {
40
45
  "name": "metadata.resource.schemaPath",
41
46
  "type": "string | null",
42
- "required": false
47
+ "required": false,
48
+ "description": "Template canonico opcional usado apenas para resolver /schemas/filtered quando resource.path precisa ser um alvo operacional concreto."
43
49
  },
44
50
  {
45
51
  "name": "metadata.resource.title",
46
52
  "type": "string | null",
47
- "required": false
53
+ "required": false,
54
+ "description": "Titulo documental do recurso usado pelo shell CRUD para derivar titulos contextuais de criacao, edicao e visualizacao quando a action nao informa label."
48
55
  },
49
56
  {
50
57
  "name": "metadata.resource.formTitle",
51
58
  "type": "string | null",
52
- "required": false
59
+ "required": false,
60
+ "description": "Titulo documental especifico para formularios do recurso, usado antes de metadata.resource.title no shell modal/drawer."
53
61
  },
54
62
  {
55
63
  "name": "metadata.filterCriteria",
56
64
  "type": "Record<string, unknown> | null",
57
- "required": false
65
+ "required": false,
66
+ "description": "Bridge declarativa de filtros encaminhada para a tabela interna. Para novo authoring, prefira metadata.queryContext."
58
67
  },
59
68
  {
60
69
  "name": "metadata.form",
61
70
  "type": "FormConfig",
62
- "required": false
71
+ "required": false,
72
+ "description": "Configuração do formulário encaminhada para o PraxisDynamicForm aberto por ações modal/drawer; layout, fieldMetadata, actions e helpPresentation permanecem propriedade do Dynamic Form."
63
73
  },
64
74
  {
65
75
  "name": "metadata.actions[].form",
66
76
  "type": "CrudActionFormContract",
67
- "required": false
77
+ "required": false,
78
+ "description": "Contrato canônico explícito para modal/drawer quando o host precisa informar schemaUrl, submitUrl e submitMethod sem depender do fallback genérico por resource.path."
68
79
  },
69
80
  {
70
81
  "name": "enableCustomization",
71
82
  "type": "boolean",
72
- "required": false
83
+ "required": false,
84
+ "description": "Habilita modo de customização do layout.",
85
+ "default": false
86
+ },
87
+ {
88
+ "name": "authoringCapability",
89
+ "type": "string | null",
90
+ "required": false,
91
+ "description": "Capability publica do contexto corporativo exigida para disponibilizar authoring governado no CRUD e na tabela interna.",
92
+ "default": null
73
93
  }
74
94
  ],
75
95
  "outputs": [
76
96
  {
77
97
  "name": "afterOpen",
78
98
  "type": "{ mode: FormOpenMode; action: string }",
79
- "required": false
99
+ "required": false,
100
+ "description": "Emitido após abrir diálogo."
80
101
  },
81
102
  {
82
103
  "name": "afterClose",
83
104
  "type": "void",
84
- "required": false
105
+ "required": false,
106
+ "description": "Emitido após fechar diálogo."
85
107
  },
86
108
  {
87
109
  "name": "afterSave",
88
110
  "type": "{ id: string | number; data: unknown }",
89
- "required": false
111
+ "required": false,
112
+ "description": "Emitido ao salvar."
90
113
  },
91
114
  {
92
115
  "name": "afterDelete",
93
116
  "type": "{ id: string | number }",
94
- "required": false
117
+ "required": false,
118
+ "description": "Emitido ao deletar."
95
119
  },
96
120
  {
97
121
  "name": "rowClick",
98
122
  "type": "{ row: unknown; index: number }",
99
- "required": false
123
+ "required": false,
124
+ "description": "Encaminha o clique de linha da tabela interna para composição master-detail e seleção local."
100
125
  },
101
126
  {
102
127
  "name": "selectionChange",
103
128
  "type": "unknown",
104
- "required": false
129
+ "required": false,
130
+ "description": "Encaminha a mudança de seleção da tabela interna quando o CRUD é usado como widget composto."
105
131
  },
106
132
  {
107
133
  "name": "error",
108
134
  "type": "unknown",
109
- "required": false
135
+ "required": false,
136
+ "description": "Emitido em erros."
110
137
  },
111
138
  {
112
139
  "name": "configureRequested",
113
140
  "type": "void",
114
- "required": false
141
+ "required": false,
142
+ "description": "Emitido quando o CTA de configuração é acionado em modo de edição."
115
143
  },
116
144
  {
117
145
  "name": "crudAuthoringDocumentApplied",
118
146
  "type": "CrudAuthoringWidgetPersistenceEvent",
119
- "required": false
147
+ "required": false,
148
+ "description": "Emitido quando o editor canônico do CRUD aplica um documento e publica o patch de inputs do widget para hosts como praxis-dynamic-page."
120
149
  },
121
150
  {
122
151
  "name": "crudAuthoringDocumentSaved",
123
152
  "type": "CrudAuthoringWidgetPersistenceEvent",
124
- "required": false
153
+ "required": false,
154
+ "description": "Emitido quando o editor canônico do CRUD salva um documento e publica o patch de inputs do widget para hosts como praxis-dynamic-page."
125
155
  }
126
156
  ],
127
157
  "configSchemaId": "FormConfig",
@@ -136,6 +166,199 @@
136
166
  "stable"
137
167
  ],
138
168
  "lib": "@praxisui/crud",
169
+ "actions": [
170
+ {
171
+ "id": "create",
172
+ "label": "Criar",
173
+ "icon": "add",
174
+ "description": "Emite evento ao abrir fluxo de criação.",
175
+ "emit": "afterOpen",
176
+ "payloadSchema": {
177
+ "type": "object",
178
+ "properties": {
179
+ "action": {
180
+ "type": "string",
181
+ "description": "Ação executada."
182
+ },
183
+ "mode": {
184
+ "type": "string",
185
+ "description": "Modo de abertura."
186
+ }
187
+ },
188
+ "required": [
189
+ "action",
190
+ "mode"
191
+ ],
192
+ "example": {
193
+ "action": "create",
194
+ "mode": "route"
195
+ }
196
+ },
197
+ "scope": "toolbar"
198
+ },
199
+ {
200
+ "id": "view",
201
+ "label": "Visualizar",
202
+ "icon": "visibility",
203
+ "description": "Emite evento ao abrir fluxo de visualização.",
204
+ "emit": "afterOpen",
205
+ "payloadSchema": {
206
+ "type": "object",
207
+ "properties": {
208
+ "action": {
209
+ "type": "string",
210
+ "description": "Ação executada."
211
+ },
212
+ "mode": {
213
+ "type": "string",
214
+ "description": "Modo de abertura."
215
+ }
216
+ },
217
+ "required": [
218
+ "action",
219
+ "mode"
220
+ ],
221
+ "example": {
222
+ "action": "view",
223
+ "mode": "modal"
224
+ }
225
+ },
226
+ "scope": "context"
227
+ },
228
+ {
229
+ "id": "edit",
230
+ "label": "Editar",
231
+ "icon": "edit",
232
+ "description": "Emite evento ao abrir fluxo de edição.",
233
+ "emit": "afterOpen",
234
+ "payloadSchema": {
235
+ "type": "object",
236
+ "properties": {
237
+ "action": {
238
+ "type": "string",
239
+ "description": "Ação executada."
240
+ },
241
+ "mode": {
242
+ "type": "string",
243
+ "description": "Modo de abertura."
244
+ }
245
+ },
246
+ "required": [
247
+ "action",
248
+ "mode"
249
+ ],
250
+ "example": {
251
+ "action": "edit",
252
+ "mode": "drawer"
253
+ }
254
+ },
255
+ "scope": "context"
256
+ },
257
+ {
258
+ "id": "delete",
259
+ "label": "Excluir",
260
+ "icon": "delete",
261
+ "description": "Emite evento após exclusão.",
262
+ "emit": "afterDelete",
263
+ "payloadSchema": {
264
+ "type": "object",
265
+ "properties": {
266
+ "id": {
267
+ "type": "string | number",
268
+ "description": "ID do registro (string ou number)."
269
+ }
270
+ },
271
+ "required": [
272
+ "id"
273
+ ],
274
+ "example": {
275
+ "id": "123"
276
+ }
277
+ },
278
+ "scope": "context"
279
+ },
280
+ {
281
+ "id": "save",
282
+ "label": "Salvar",
283
+ "icon": "save",
284
+ "description": "Emite evento após salvar.",
285
+ "emit": "afterSave",
286
+ "payloadSchema": {
287
+ "type": "object",
288
+ "properties": {
289
+ "id": {
290
+ "type": "string | number",
291
+ "description": "ID do registro (string ou number)."
292
+ },
293
+ "data": {
294
+ "type": "object",
295
+ "description": "Dados salvos."
296
+ }
297
+ },
298
+ "required": [
299
+ "id",
300
+ "data"
301
+ ],
302
+ "example": {
303
+ "id": "123",
304
+ "data": {}
305
+ }
306
+ },
307
+ "scope": "shell"
308
+ },
309
+ {
310
+ "id": "row-click",
311
+ "label": "Clique em linha",
312
+ "icon": "ads_click",
313
+ "description": "Emite evento ao clicar em uma linha da tabela interna do CRUD.",
314
+ "emit": "rowClick",
315
+ "payloadSchema": {
316
+ "type": "object",
317
+ "properties": {
318
+ "row": {
319
+ "type": "object",
320
+ "description": "Registro clicado."
321
+ },
322
+ "index": {
323
+ "type": "number",
324
+ "description": "Índice da linha."
325
+ }
326
+ },
327
+ "required": [
328
+ "row"
329
+ ],
330
+ "example": {
331
+ "row": {},
332
+ "index": 0
333
+ }
334
+ },
335
+ "scope": "context"
336
+ },
337
+ {
338
+ "id": "close",
339
+ "label": "Fechar",
340
+ "icon": "close",
341
+ "description": "Emite evento ao fechar o diálogo.",
342
+ "emit": "afterClose",
343
+ "scope": "shell"
344
+ },
345
+ {
346
+ "id": "configure",
347
+ "label": "Configurar",
348
+ "icon": "tune",
349
+ "description": "Emite evento ao abrir configuração.",
350
+ "emit": "configureRequested",
351
+ "scope": "shell"
352
+ }
353
+ ],
354
+ "configEditor": {
355
+ "component": "[ref:PraxisCrudWidgetConfigEditor]",
356
+ "title": "Configurar CRUD"
357
+ },
358
+ "authoringManifestRef": {
359
+ "componentId": "praxis-crud",
360
+ "source": "PRAXIS_CRUD_AUTHORING_MANIFEST"
361
+ },
139
362
  "source": "projects/praxis-crud/src/lib/praxis-crud.metadata.ts",
140
363
  "exportName": "PRAXIS_CRUD_COMPONENT_METADATA",
141
364
  "capabilities": [
@@ -4797,6 +5020,16 @@
4797
5020
  "type": "Record<string, unknown>",
4798
5021
  "description": "Opaque host context used for authoring seeds and launcher inputs."
4799
5022
  },
5023
+ {
5024
+ "name": "enableCustomization",
5025
+ "type": "boolean",
5026
+ "description": "Explicit host opt-in for CRUD authoring surfaces."
5027
+ },
5028
+ {
5029
+ "name": "authoringCapability",
5030
+ "type": "string | null",
5031
+ "description": "Public runtime capability required before CRUD and delegated table authoring can open."
5032
+ },
4800
5033
  {
4801
5034
  "name": "afterOpen",
4802
5035
  "type": "{ mode: FormOpenMode; action: string }",
@@ -6228,9 +6461,9 @@
6228
6461
  {
6229
6462
  "chunkIndex": 0,
6230
6463
  "chunkKind": "summary",
6231
- "content": "Component ID: praxis-crud\nSelector: praxis-crud\nFriendly Name: Praxis CRUD\nDescription: Tabela com operações de CRUD via metadados.\nLib/Package: @praxisui/crud\nTags: widget, crud, configurable, hasWizard, stable\nInputs:\n - metadata (CrudMetadata | string)\n - crudId (string)\n - componentInstanceId (string)\n - context (Record<string, unknown>)\n - metadata.queryContext (PraxisDataQueryContext | null)\n - metadata.resource.schemaPath (string | null)\n - metadata.resource.title (string | null)\n - metadata.resource.formTitle (string | null)\n - metadata.filterCriteria (Record<string, unknown> | null)\n - metadata.form (FormConfig)\n - metadata.actions[].form (CrudActionFormContract)\n - enableCustomization (boolean)\nOutputs:\n - afterOpen ({ mode: FormOpenMode; action: string })\n - afterClose (void)\n - afterSave ({ id: string | number; data: unknown })\n - afterDelete ({ id: string | number })\n - rowClick ({ row: unknown; index: number })\n - selectionChange (unknown)\n - error (unknown)\n - configureRequested (void)\n - crudAuthoringDocumentApplied (CrudAuthoringWidgetPersistenceEvent)\n - crudAuthoringDocumentSaved (CrudAuthoringWidgetPersistenceEvent)\n",
6232
- "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/praxis-crud.metadata.ts",
6233
- "contentHash": "aaf9272c833dab1a5fb9acd58a538b520551482a7c4c6f237dc1a1b6e503fa9b",
6464
+ "content": "Component ID: praxis-crud\nSelector: praxis-crud\nFriendly Name: Praxis CRUD\nDescription: Tabela com operações de CRUD via metadados.\nLib/Package: @praxisui/crud\nTags: widget, crud, configurable, hasWizard, stable\nInputs:\n - metadata (CrudMetadata | string)\n - crudId (string)\n - componentInstanceId (string)\n - context (Record<string, unknown>)\n - metadata.queryContext (PraxisDataQueryContext | null)\n - metadata.resource.schemaPath (string | null)\n - metadata.resource.title (string | null)\n - metadata.resource.formTitle (string | null)\n - metadata.filterCriteria (Record<string, unknown> | null)\n - metadata.form (FormConfig)\n - metadata.actions[].form (CrudActionFormContract)\n - enableCustomization (boolean)\n - authoringCapability (string | null)\nOutputs:\n - afterOpen ({ mode: FormOpenMode; action: string })\n - afterClose (void)\n - afterSave ({ id: string | number; data: unknown })\n - afterDelete ({ id: string | number })\n - rowClick ({ row: unknown; index: number })\n - selectionChange (unknown)\n - error (unknown)\n - configureRequested (void)\n - crudAuthoringDocumentApplied (CrudAuthoringWidgetPersistenceEvent)\n - crudAuthoringDocumentSaved (CrudAuthoringWidgetPersistenceEvent)\n",
6465
+ "sourcePointer": "projects/praxis-crud/src/lib/praxis-crud.metadata.ts",
6466
+ "contentHash": "bdcc39d2237bf1cea3f5ec621aa5b6fac42f8da6c8467cdbe1682888c722f12d",
6234
6467
  "sourceKind": "component_definition",
6235
6468
  "sourceId": "praxis-crud",
6236
6469
  "corpusVersion": "1.0.0"
@@ -6239,7 +6472,7 @@
6239
6472
  "chunkIndex": 1,
6240
6473
  "chunkKind": "capabilities",
6241
6474
  "content": "Schema Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versão da configuração do formulário para controle de migração.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuração do formulário.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da última atualização da configuração (ISO-8601).\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: ID do schema de origem para reconciliação no servidor.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema usado para compor o formulário.\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema de origem.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operação do schema (ex.: \"get\", \"post\").\n - Path: metadata.schemaContext.schemaType\n Category: metadata\n Kind: enum\n Description: Tipo do schema (response/request).\n - Path: metadata.schemaContext.internal\n Category: metadata\n Kind: boolean\n Description: Indica se o schema é interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema (se aplicável).\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema (se aplicável).\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash dos dados do servidor para detecção de mudanças.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizações manuais aplicadas ao formulário.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Array de metadados dos campos. Usado para referenciar a configuração de campos.\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: helpPresentation\n Category: appearance\n Kind: object\n Description: Politica visual do formulario para exibir hint/helpText dos campos sem alterar a semantica publicada pelos DTOs.\n - Path: helpPresentation.display\n Category: appearance\n Kind: enum\n Description: Define se a ajuda semantica dos campos fica inline, em icone de ajuda, automatica por densidade, ou oculta visualmente.\n - Path: helpPresentation.inlineMaxLength\n Category: appearance\n Kind: number\n Description: Tamanho maximo para manter ajuda inline quando display=\"auto\".\n - Path: helpPresentation.preferPopoverForControls\n Category: appearance\n Kind: array\n Description: Tipos de controle que devem preferir icone de ajuda quando display=\"auto\", como toggle, checkbox ou select.\n - Path: editorialContext\n Category: editorial\n Kind: object\n Description: Contexto editorial compartilhado entre os blocos hospedados antes/depois do formulario.\n - Path: editorialContext.[token]\n Category: editorial\n Kind: string\n Description: Valor simples exposto no contexto editorial.\n - Path: formBlocksBefore\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado antes do formulario.\n - Path: formBlocksBefore.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content.\n - Path: formBlocksBefore.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content editorial.\n - Path: formBlocksBefore.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes do formulario.\n - Path: formBlocksBefore.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes do formulario.\n - Path: formBlocksBefore.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content hospedado antes do formulario.\n - Path: formBlocksBeforeActions\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois das seções e antes da área principal de ações.\n - Path: formBlocksBeforeActions.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes da área principal de ações.\n - Path: formBlocksBeforeActions.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes da área principal de ações.\n - Path: formBlocksBeforeActions.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content antes das ações.\n - Path: formBlocksAfter\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois do formulario inteiro, incluindo a área principal de ações.\n - Path: formBlocksAfter.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content de fechamento.\n - Path: formBlocksAfter.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content de fechamento.\n - Path: formBlocksAfter.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados depois do formulario.\n - Path: formBlocksAfter.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado depois do formulario.\n - Path: formBlocksAfter.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content de fechamento.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID único da seção.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Título exibido para cada seção do formulário.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descrição auxiliar exibida abaixo do título da seção.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Nome do ícone (Material Icons) para o cabeçalho da seção.\n - Path: sections[].sectionHeader\n Category: layout\n Kind: object\n Description: Configuração rica do header visual da seção, com suporte a avatar por imagem, iniciais ou modo automático.\n - Path: sections[].sectionHeader.mode\n Category: layout\n Kind: enum\n Description: Estratégia visual do header da seção.\n - Path: sections[].sectionHeader.sourceField\n Category: layout\n Kind: string\n Description: Campo do formulário usado como origem da imagem do avatar.\n - Path: sections[].sectionHeader.initialsSourceField\n Category: layout\n Kind: string\n Description: Campo textual usado para derivar iniciais do avatar.\n - Path: sections[].sectionHeader.altField\n Category: layout\n Kind: string\n Description: Campo textual usado como texto acessivel do avatar e como fallback textual para iniciais quando initialsSourceField nao estiver definido.\n - Path: sections[].sectionHeader.fallbackIcon\n Category: layout\n Kind: string\n Description: Ícone opcional usado quando o avatar dinâmico estiver vazio ou inválido.\n - Path: sections[].sectionHeader.emptyState\n Category: layout\n Kind: enum\n Description: Comportamento do header quando os campos de origem ainda não possuem valor.\n - Path: sections[].sectionHeader.size\n Category: layout\n Kind: enum\n Description: Tamanho semântico do avatar da seção, materializado pelo runtime via tokens.\n - Path: sections[].sectionHeader.initialsMaxLength\n Category: layout\n Kind: number\n Description: Máximo de letras exibidas no avatar textual.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Define se a seção pode ser colapsada/expandida pelo usuário.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial da seção (colapsada/expandida) quando `collapsible` é true.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após a seção.\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo do título da seção.\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo da descrição da seção.\n - Path: sections[].appearance\n Category: appearance\n Kind: enum\n Description: Preset visual do container/cabeçalho da seção.\n - Path: sections[].stepLabel\n Category: content\n Kind: string\n Description: Rótulo curto do passo exibido antes do título da seção.\n - Path: sections[].titleStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para o título da seção.\n - Path: sections[].descriptionStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para a descrição da seção.\n - Path: sections[].titleColor\n Category: appearance\n Kind: string\n Description: Cor do título da seção (CSS color ou token).\n - Path: sections[].descriptionColor\n Category: appearance\n Kind: string\n Description: Cor da descrição da seção (CSS color ou token).\n - Path: sections[].headerAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento horizontal do conteúdo do cabeçalho da seção.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Texto de tooltip para o cabeçalho da seção.\n - Path: sections[].headerActions\n Category: layout\n Kind: array\n Description: Lista de ações iconográficas renderizadas no canto direito do cabeçalho da seção.\n - Path: sections[].headerActions[].id\n Category: layout\n Kind: string\n Description: ID estável da ação de cabeçalho da seção.\n - Path: sections[].headerActions[].label\n Category: layout\n Kind: string\n Description: Label acessível usada em tooltip e aria-label da ação.\n - Path: sections[].headerActions[].icon\n Category: layout\n Kind: string\n Description: Ícone renderizado na ação do cabeçalho da seção.\n - Path: sections[].headerActions[].action\n Category: layout\n Kind: string\n Description: Nome opcional da ação emitida no customAction; se ausente, o runtime usa o ID.\n - Path: sections[].headerActions[].tooltip\n Category: layout\n Kind: string\n Description: Tooltip opcional da ação; se ausente, o runtime usa a label.\n - Path: sections[].headerActions[].color\n Category: appearance\n Kind: enum\n Description: Tom visual da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].visible\n Category: layout\n Kind: boolean\n Description: Controla a visibilidade da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].disabled\n Category: layout\n Kind: boolean\n Description: Controla o estado desabilitado da ação do cabeçalho da seção.\n - Path: sections[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da seção.\n - Path: sections[].styles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da seção.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID único da linha dentro de uma seção.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Título interno da linha (usado em editores e labels).\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaçamento horizontal (em px) entre colunas nesta linha.\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após esta linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID único da coluna dentro de uma linha.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Título interno da coluna (usado em editores e labels).\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Atributo data-testid aplicado ao container da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Projeção legada/derivada dos itens kind:\"field\" dentro da coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo dentro da projeção legada/derivada da coluna.\n - Path: sections[].rows[].columns[].items\n Category: layout\n Kind: array\n Description: Lista canônica ordenada de itens da coluna: campos e blocos visuais.\n - Path: sections[].rows[].columns[].items[].kind\n Category: layout\n Kind: enum\n Description: Tipo do item de layout da coluna.\n - Path: sections[].rows[].columns[].items[].id\n Category: layout\n Kind: string\n Description: ID estável do item de layout dentro do formulário.\n - Path: sections[].rows[].columns[].items[].fieldName\n Category: layout\n Kind: string\n Description: Nome do campo quando kind é \"field\".\n - Path: sections[].rows[].columns[].items[].document\n Category: editorial\n Kind: object\n Description: RichContentDocument do bloco visual quando kind é \"richContent\".\n - Path: sections[].rows[].columns[].items[].layout\n Category: editorial\n Kind: enum\n Description: Modo de renderização do bloco visual richContent dentro da coluna.\n - Path: sections[].rows[].columns[].items[].rootClassName\n Category: appearance\n Kind: string\n Description: Classe CSS opcional aplicada ao bloco visual richContent.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Largura da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Largura da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Largura da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas médias (md).\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas médias (md).\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento vertical do conteúdo da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding (em px) interno da coluna.\n - Path: sections[].rows[].columns[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada à coluna.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botão de submissão.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de submissão.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de submissão.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de submissão.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botão de submissão.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de submissão.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de submissão.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de submissão.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de submissão.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de submissão.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de submissão.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de submissão.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de submissão.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+s\") para o botão de submissão.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botão de cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botão de cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"esc\") para o botão de cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botão de reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botão de reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+shift+r\") para o botão de reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Lista de botões de ação customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuração de um botão de ação customizado.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID da ação customizada.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade da ação customizada.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Rótulo da ação customizada.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para a ação customizada.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor da ação customizada.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual da ação customizada.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho da ação customizada.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada à ação customizada.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados à ação customizada.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Desabilita a ação customizada.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo do botão da ação customizada.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido na ação customizada.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento na ação customizada.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado para a ação customizada.\n - Path: actions.position\n Category: layout\n Kind: enum\n Description: Posicionamento horizontal da barra de ações.\n - Path: actions.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões dentro da barra de ações (horizontal/vertical).\n - Path: actions.spacing\n Category: layout\n Kind: enum\n Description: Espaçamento entre os botões na barra de ações.\n - Path: actions.sticky\n Category: layout\n Kind: boolean\n Description: Define se a barra de ações deve permanecer visível ao rolar a página.\n - Path: actions.divider\n Category: layout\n Kind: boolean\n Description: Exibe um divisor superior acima da barra de ações.\n - Path: actions.placement\n Category: layout\n Kind: enum\n Description: Localização estrutural da barra de ações no layout.\n - Path: actions.mobile.position\n Category: layout\n Kind: enum\n Description: Posicionamento da barra de ações em dispositivos móveis.\n - Path: actions.mobile.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões em dispositivos móveis.\n - Path: actions.mobile.collapseToMenu\n Category: behavior\n Kind: boolean\n Description: Em mobile, agrupa ações em um menu (se houver muitas).\n - Path: actions.containerClassName\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da barra de ações.\n - Path: actions.containerStyles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da barra de ações.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de submit.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de cancel.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de cancel.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de reset.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Exibe um alerta se o usuário tentar sair com mudanças não salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Habilita rastreamento de histórico para desfazer/refazer (se suportado).\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Ao submeter, foca automaticamente no primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Ao submeter, rola a página para exibir o primeiro erro.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulário após uma submissão bem-sucedida.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: URL para redirecionar após uma submissão bem-sucedida.\n - Path: behavior.reactiveValidation\n Category: validation\n Kind: boolean\n Description: Ativa validação reativa (em tempo real) em `valueChanges`.\n - Path: behavior.reactiveValidationDebounceMs\n Category: validation\n Kind: number\n Description: Debounce (em ms) para a validação reativa.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: URL para onde os dados do formulário serão enviados (POST/PUT/PATCH).\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: URL para buscar dados para popular o formulário (GET).\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Método HTTP para a requisição de salvar.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Tempo limite (em ms) para as requisições API.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Cabeçalhos HTTP personalizados para as requisições API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Nome do campo que representa o ID do registro no payload (para PUT/PATCH).\n - Path: api.beforeSave\n Category: hooks\n Kind: expression\n Description: Hook para pré-processamento de dados antes de enviar para a API.\n - Path: api.afterLoad\n Category: hooks\n Kind: expression\n Description: Hook para pós-processamento de dados após carregar da API.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após atualização de registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após criação de registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após atualização de registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após criação de registro.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de submeter o formulário.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de cancelar.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de resetar o formulário.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para ações customizadas. Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da ação customizada (success/error/confirmation). Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Mensagem de sucesso para a ação customizada.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Mensagem de erro para a ação customizada.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para a ação customizada.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o envio do formulário.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o cancelamento.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o reset do formulário.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem exibida durante a execução de uma ação customizada. Substitua `[actionId]` pelo ID da ação.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID único da regra de layout.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome amigável da regra de layout.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descrição da regra de layout para documentação.\n - Path: formRules[].metadata.origin\n Category: rules\n Kind: enum\n Description: Origem da regra sugerida pela IA.\n - Path: formRules[].metadata.reviewStatus\n Category: rules\n Kind: enum\n Description: Status de revisão humana da regra sugerida pela IA.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo do elemento alvo da regra (campo, seção, ação, linha, coluna ou bloco visual).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra (quando properties não forem informadas).\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: Lista de IDs dos elementos alvo da regra. O tipo do ID depende de `targetType`.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo da regra.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para alvos de campo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formCommandRules\n Category: rules\n Kind: array\n Description: Regras condicionais de comando avaliadas depois que formRules estabilizam valores calculados.\n - Path: formCommandRules[].condition\n Category: rules\n Kind: expression\n Description: Condicao Json Logic avaliada sobre formData estabilizado, incluindo field values calculados.\n - Path: formCommandRules[].effects[].kind\n Category: rules\n Kind: enum\n Description: Tipo do efeito de comando. O primeiro corte suporta apenas global-action.\n - Path: formCommandRules[].effects[].globalAction\n Category: rules\n Kind: object\n Description: GlobalActionRef estruturado executado por GlobalActionService.executeRef quando a regra entra na condicao.\n - Path: formCommandRules[].policy\n Category: rules\n Kind: object\n Description: Politica operacional do comando: trigger, distinct, distinctBy, debounceMs, errorPolicy e runOnInitialEvaluation.\n - Path: formRulesState\n Category: metadata\n Kind: object\n Description: Estado interno do builder visual de regras, gerado apenas para round-trip do editor.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declarações de hooks por estágio do ciclo de vida do formulário.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hints.dataModes.create\n Category: form_config\n Kind: string\n Description: Dica para o modo de criação de dados.\n - Path: hints.dataModes.edit\n Category: form_config\n Kind: string\n Description: Dica para o modo de edição de dados.\n - Path: hints.dataModes.view\n Category: form_config\n Kind: string\n Description: Dica para o modo de visualização de dados.\n - Path: hints.uiModes.presentation\n Category: form_config\n Kind: string\n Description: Dica para o modo de apresentação da UI.\n - Path: hints.uiModes.readonly\n Category: form_config\n Kind: string\n Description: Dica para o modo de somente leitura da UI.\n - Path: hints.uiModes.disabled\n Category: form_config\n Kind: string\n Description: Dica para o modo desabilitado da UI.\n - Path: hints.uiModes.visible\n Category: form_config\n Kind: string\n Description: Dica para o modo de visibilidade da UI.\n - Path: fieldMetadata[].id\n Category: identity\n Kind: string\n Description: Identificador unico da instancia do componente.\n - Path: fieldMetadata[].version\n Category: identity\n Kind: string\n Description: Versao do schema de metadata (migracao).\n - Path: fieldMetadata[].context\n Category: identity\n Kind: enum\n Description: Contexto de uso do componente (form/filter/table/dialog/standalone).\n - Path: fieldMetadata[].createdAt\n Category: misc\n Kind: string\n Description: Timestamp de criacao (ISO).\n - Path: fieldMetadata[].updatedAt\n Category: misc\n Kind: string\n Description: Timestamp de atualizacao (ISO).\n - Path: fieldMetadata[].tags\n Category: identity\n Kind: array\n Description: Tags para categorizacao e busca.\n - Path: fieldMetadata[].cssClass\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao host do componente.\n - Path: fieldMetadata[].style\n Category: appearance\n Kind: object\n Description: Estilos inline (objeto CSS).\n - Path: fieldMetadata[].dataAttributes\n Category: data\n Kind: object\n Description: Data attributes para teste/analytics.\n - Path: fieldMetadata[].name\n Category: identity\n Kind: string\n Description: Identificador único do campo. Essencial para binding.\n - Path: fieldMetadata[].label\n Category: identity\n Kind: string\n Description: Rótulo principal exibido para o usuário.\n - Path: fieldMetadata[].placeholder\n Category: identity\n Kind: string\n Description: Texto temporário exibido quando vazio.\n - Path: fieldMetadata[].hint\n Category: identity\n Kind: string\n Description: Texto de ajuda exibido abaixo do campo.\n - Path: fieldMetadata[].helpText\n Category: identity\n Kind: string\n Description: Texto semântico de ajuda publicado pelo schema/DTO.\n - Path: fieldMetadata[].tooltip\n Category: identity\n Kind: string\n Description: Texto exibido ao passar o mouse.\n - Path: fieldMetadata[].tooltipOnHover\n Category: identity\n Kind: boolean\n Description: Habilita apresentação do tooltip no hover quando suportado pelo renderer.\n - Path: fieldMetadata[].description\n Category: identity\n Kind: string\n Description: Descrição detalhada (usada em documentação ou helps extensos).\n - Path: fieldMetadata[].selectionMode\n Category: behavior\n Kind: enum\n Description: Semântica de seleção explícita para controles de escolha.\n - Path: fieldMetadata[].variant\n Category: appearance\n Kind: string\n Description: Variante visual/semântica do controle.\n - Path: fieldMetadata[].density\n Category: appearance\n Kind: enum\n Description: Densidade visual do shell do controle.\n - Path: fieldMetadata[].links\n Category: identity\n Kind: array\n Description: Links ricos associados ao campo, úteis em consentimentos e conteúdo legal.\n - Path: fieldMetadata[].group\n Category: identity\n Kind: string\n Description: Agrupador lógico do campo.\n - Path: fieldMetadata[].order\n Category: layout\n Kind: number\n Description: Ordem de exibição do campo.\n - Path: fieldMetadata[].width\n Category: layout\n Kind: string\n Description: Largura do campo (ex: 50%, 100px).\n - Path: fieldMetadata[].isFlex\n Category: layout\n Kind: boolean\n Description: Se true, usa flex-grow para preencher espaço.\n - Path: fieldMetadata[].controlType\n Category: behavior\n Kind: enum\n Description: Tipo do componente de UI (input, select, datepicker, etc).\n - Path: fieldMetadata[].dataType\n Category: data\n Kind: enum\n Description: Tipo de dado do campo (text, number, date, etc).\n - Path: fieldMetadata[].source\n Category: data\n Kind: enum\n Description: Origem semântica do campo. Use local para campos do host que não vêm do schema backend.\n - Path: fieldMetadata[].transient\n Category: data\n Kind: boolean\n Description: Marca o campo como temporário/local para preenchimento. O dynamic-form omite do submit por padrão.\n - Path: fieldMetadata[].submitPolicy\n Category: behavior\n Kind: enum\n Description: Política de submit para sobrescrever o padrão de campos locais/transient.\n - Path: fieldMetadata[].materialDesign.appearance\n Category: appearance\n Kind: enum\n Description: Aparência do campo Material (fill/outline).\n - Path: fieldMetadata[].materialDesign.color\n Category: appearance\n Kind: enum\n Description: Tema de cor Material (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.floatLabel\n Category: appearance\n Kind: enum\n Description: Comportamento do rótulo flutuante.\n - Path: fieldMetadata[].materialDesign.subscriptSizing\n Category: appearance\n Kind: enum\n Description: Estratégia de sizing do subscript (erros/hints).\n - Path: fieldMetadata[].materialDesign.hideRequiredMarker\n Category: appearance\n Kind: boolean\n Description: Oculta o asterisco de campo obrigatório.\n - Path: fieldMetadata[].materialDesign.density\n Category: appearance\n Kind: enum\n Description: Densidade do campo Material.\n - Path: fieldMetadata[].materialDesign.disableRipple\n Category: appearance\n Kind: boolean\n Description: Desativa ripple/ondulação em componentes Material.\n - Path: fieldMetadata[].materialDesign.customPalette\n Category: appearance\n Kind: object\n Description: Override de paleta (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.animations\n Category: appearance\n Kind: object\n Description: Configuração de animações (disable, duration, easing).\n - Path: fieldMetadata[].prefixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido antes do valor.\n - Path: fieldMetadata[].suffixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido depois do valor.\n - Path: fieldMetadata[].iconPosition\n Category: appearance\n Kind: enum\n Description: Posição preferencial do ícone principal.\n - Path: fieldMetadata[].iconSize\n Category: appearance\n Kind: enum\n Description: Tamanho do ícone.\n - Path: fieldMetadata[].iconColor\n Category: appearance\n Kind: string\n Description: Cor semântica ou token de cor aplicado ao ícone principal.\n - Path: fieldMetadata[].iconClass\n Category: appearance\n Kind: string\n Description: Classe CSS controlada pelo host para o ícone principal.\n - Path: fieldMetadata[].iconStyle\n Category: appearance\n Kind: string\n Description: Estilo visual semântico do ícone quando o renderer suportar variações.\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\nComponent Capabilities:\n - Path: component\n Category: meta\n Kind: enum\n Description: Identificador fixo do componente.\n - Path: resource\n Category: resource\n Kind: object\n Description: Recurso principal do CRUD.\n - Path: resource.path\n Category: resource\n Kind: string\n Description: Endpoint base do recurso.\n - Path: resource.idField\n Category: resource\n Kind: string\n Description: Campo identificador do recurso.\n - Path: resource.endpointKey\n Category: resource\n Kind: string\n Description: Chave de endpoint (ApiEndpoint).\n - Path: queryContext.meta.domainCatalog\n Category: resource\n Kind: object\n Description: Referencia leve para contexto semantico/governanca resolvido via Domain Catalog; nao materializa regras em FormConfig.\n - Path: queryContext.meta.domainCatalog.schemaVersion\n Category: resource\n Kind: string\n Description: Versao do contrato DomainCatalogContextHint usado em runtime e prompts.\n - Path: queryContext.meta.domainCatalog.resourceKey\n Category: resource\n Kind: string\n Description: ResourceKey semantico estavel usado para resolver vocabulario/governanca de dominio.\n - Path: queryContext.meta.domainCatalog.releaseId\n Category: resource\n Kind: string\n Description: Release opcional do Domain Catalog usada como fonte do contexto.\n - Path: queryContext.meta.domainCatalog.query\n Category: resource\n Kind: string\n Description: Probe de campo/conceito usado para buscar itens relevantes, como cpf, salario ou status.\n - Path: queryContext.meta.domainCatalog.intent\n Category: resource\n Kind: enum\n Description: Intencao de uso do contexto para orientar LLMs e validadores sem expor dados alem do necessario.\n - Path: table\n Category: table\n Kind: object\n Description: TableConfig completo (usar catalogo de tabela).\n - Path: form\n Category: form\n Kind: object\n Description: FormConfig completo (usar catalogo de formulario).\n - Path: defaults\n Category: defaults\n Kind: object\n Description: Defaults aplicados a acoes e UI.\n - Path: defaults.openMode\n Category: defaults\n Kind: enum\n Description: Modo padrao de abertura (route/modal/drawer).\n - Path: defaults.modal\n Category: defaults\n Kind: object\n Description: Config de dialog (DialogConfig).\n - Path: defaults.back\n Category: navigation\n Kind: object\n Description: Config de retorno (BackConfig).\n - Path: defaults.back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno.\n - Path: defaults.back.returnTo\n Category: navigation\n Kind: string\n Description: Rota de retorno quando strategy=navigate.\n - Path: defaults.back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Confirmar ao sair com alteracoes.\n - Path: defaults.header\n Category: defaults\n Kind: object\n Description: Config do header do CRUD.\n - Path: defaults.header.showBack\n Category: defaults\n Kind: boolean\n Description: Exibir botao voltar.\n - Path: defaults.header.backLabel\n Category: defaults\n Kind: string\n Description: Label do botao voltar.\n - Path: defaults.header.variant\n Category: defaults\n Kind: enum\n Description: Variante visual do header.\n - Path: defaults.header.sticky\n Category: defaults\n Kind: boolean\n Description: Header fixo.\n - Path: defaults.header.breadcrumbs\n Category: defaults\n Kind: boolean\n Description: Exibir breadcrumbs.\n - Path: defaults.header.divider\n Category: defaults\n Kind: boolean\n Description: Exibir divisor no header.\n - Path: actions\n Category: actions\n Kind: array\n Description: Acoes disponiveis no CRUD.\n - Path: actions[].id\n Category: actions\n Kind: string\n Description: ID da acao (RowAction/ToolbarAction).\n - Path: actions[].label\n Category: actions\n Kind: string\n Description: Label da acao.\n - Path: actions[].icon\n Category: actions\n Kind: string\n Description: Icone da acao.\n - Path: actions[].color\n Category: actions\n Kind: string\n Description: Cor da acao.\n - Path: actions[].disabled\n Category: actions\n Kind: boolean\n Description: Acao desabilitada.\n - Path: actions[].action\n Category: actions\n Kind: string\n Description: Nome da acao emitida.\n - Path: actions[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip da acao.\n - Path: actions[].requiresConfirmation\n Category: actions\n Kind: boolean\n Description: Exige confirmacao.\n - Path: actions[].visibleWhen\n Category: actions\n Kind: expression\n Description: Condicao de visibilidade (RowAction/ToolbarAction).\n - Path: actions[].separator\n Category: actions\n Kind: boolean\n Description: Separador apos a acao (RowAction).\n - Path: actions[].autoDelete\n Category: actions\n Kind: boolean\n Description: Habilita auto delete (RowAction).\n - Path: actions[].deleteEndpoint\n Category: actions\n Kind: string\n Description: Endpoint custom para delete (RowAction).\n - Path: actions[].type\n Category: actions\n Kind: enum\n Description: Tipo de acao (ToolbarAction).\n - Path: actions[].appearance\n Category: actions\n Kind: enum\n Description: Aparencia do botao (ToolbarAction).\n - Path: actions[].position\n Category: actions\n Kind: enum\n Description: Posicao da acao (ToolbarAction).\n - Path: actions[].order\n Category: actions\n Kind: number\n Description: Ordem de exibicao (ToolbarAction).\n - Path: actions[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ToolbarAction).\n - Path: actions[].children\n Category: actions\n Kind: array\n Description: Sub-acoes (menu).\n - Path: actions[].openMode\n Category: actions\n Kind: enum\n Description: Modo de abertura da acao.\n - Path: actions[].route\n Category: actions\n Kind: string\n Description: Rota para openMode=route.\n - Path: actions[].formId\n Category: actions\n Kind: string\n Description: FormId canonico para modal/drawer; se ausente, o host precisa resolve-lo por override por acao antes da abertura.\n - Path: actions[].params\n Category: actions\n Kind: array\n Description: Mapeamento de parametros.\n - Path: actions[].params[].from\n Category: actions\n Kind: string\n Description: Origem do parametro.\n - Path: actions[].params[].to\n Category: actions\n Kind: enum\n Description: Destino do parametro.\n - Path: actions[].params[].name\n Category: actions\n Kind: string\n Description: Nome do parametro no destino.\n - Path: actions[].form.initialValue\n Category: actions\n Kind: object\n Description: Seed fixo do formulario injetado em inputs.initialValue antes da abertura.\n - Path: actions[].form.layoutPolicy\n Category: actions\n Kind: object\n Description: Politica schema-driven opt-in encaminhada ao Dynamic Form para materializar detalhe ou command form sem FormConfig.sections local; deve acompanhar schemaUrl compativel, especialmente schemaType=request para comandos.\n - Path: actions[].back\n Category: navigation\n Kind: object\n Description: BackConfig por acao.\n - Path: actions[].back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno da acao (auto, close, navigate).\n - Path: actions[].back.returnTo\n Category: navigation\n Kind: string\n Description: Rota ou destino usado quando a estrategia de retorno for navigate.\n - Path: actions[].back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Solicita confirmacao antes de sair com alteracoes nao salvas.\n - Path: i18n\n Category: i18n\n Kind: object\n Description: Mensagens i18n do CRUD.\n - Path: i18n.crudDialog\n Category: i18n\n Kind: object\n Description: Mapa de textos do dialog.\nCapability Notes:\n - CrudMetadata agrega TableConfig e FormConfig; use os catalogos de tabela e formulario para detalhes.\n - actions[] herda campos de RowAction e ToolbarAction; combine com openMode/route/formId quando aplicavel.\n",
6242
- "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/crud-ai-capabilities.ts",
6475
+ "sourcePointer": "projects/praxis-crud/src/lib/ai/crud-ai-capabilities.ts",
6243
6476
  "contentHash": "7e2268c1115853ae78006e346ea21eb67daab02d5297781a186f69d5e977ee90",
6244
6477
  "sourceKind": "component_definition",
6245
6478
  "sourceId": "praxis-crud",
@@ -6248,9 +6481,9 @@
6248
6481
  {
6249
6482
  "chunkIndex": 2,
6250
6483
  "chunkKind": "authoring_manifest",
6251
- "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-crud\",\n \"ownerPackage\": \"@praxisui/crud\",\n \"configSchemaId\": \"CrudMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"metadata\",\n \"type\": \"CrudMetadata | string\",\n \"description\": \"Canonical CRUD metadata or serialized metadata document.\"\n },\n {\n \"name\": \"crudId\",\n \"type\": \"string\",\n \"description\": \"Stable CRUD instance id used for table/form identity and persistence.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional stable host instance id for multiple CRUD widgets on the same route.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context used for authoring seeds and launcher inputs.\"\n },\n {\n \"name\": \"afterOpen\",\n \"type\": \"{ mode: FormOpenMode; action: string }\",\n \"description\": \"Emitted after a CRUD action opens.\"\n },\n {\n \"name\": \"afterSave\",\n \"type\": \"{ id: string | number; data: unknown }\",\n \"description\": \"Emitted after save; CRUD refetches the list.\"\n },\n {\n \"name\": \"afterDelete\",\n \"type\": \"{ id: string | number }\",\n \"description\": \"Emitted after delete; CRUD refetches the list.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"description\": \"Resource path/key, optional schema path template, id field, endpoint key and query context owned by CRUD orchestration.\"\n },\n {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"description\": \"CRUD-hosted list surface and table delegation boundary.\"\n },\n {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"description\": \"Create action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"description\": \"Edit action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"description\": \"View action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"description\": \"Delete action enablement, confirmation, endpoint and capability policy.\"\n },\n {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"description\": \"Route/modal/drawer defaults consumed by CrudLauncherService and DynamicFormDialogHostComponent, including contextual shell titles derived from action label, form title or resource metadata.\"\n },\n {\n \"kind\": \"formBinding\",\n \"resolver\": \"crud-action-form-contract-by-action-id\",\n \"description\": \"CRUD-owned form binding fields: formId, schemaUrl, submitUrl, submitMethod, params and initialValue. Shared FormConfig remains owned by Dynamic Form and is forwarded through CrudMetadata.form when present.\"\n },\n {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"description\": \"CRUD action availability derived from resource capabilities and action permissions.\"\n },\n {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"description\": \"Read-only semantic/governance context resolved from Domain Catalog and referenced from CRUD queryContext.meta.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"description\": \"Delegated form/table/dialog/settings-panel operation owned by the child component manifest.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"resource.bind\",\n \"title\": \"Bind CRUD resource\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"resourceBinding\",\n \"target\": {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourcePath\"\n ],\n \"properties\": {\n \"resourcePath\": {\n \"type\": \"string\"\n },\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"idField\": {\n \"type\": [\n \"string\",\n \"number\"\n ]\n },\n \"endpointKey\": {\n \"type\": \"string\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-resource-bind\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"api_metadata\",\n \"ResourceDiscoveryService\",\n \"GET /{resource}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"PraxisCrudComponent.tableCrudContext\"\n ],\n \"identityKeys\": [\n \"resourcePath\",\n \"resourceKey\",\n \"schemaPath\"\n ],\n \"failureModes\": [\n \"resource-not-found\",\n \"schema-url-not-canonical\",\n \"capabilities-unavailable\",\n \"id-field-missing\"\n ],\n \"description\": \"Binds CRUD to a canonical resource and validates it against api_metadata/resource capabilities before runtime use. Use CrudMetadata.resource.schemaPath when schema discovery must use a templated path while resource.path targets a concrete nested collection.\"\n }\n }\n ],\n \"validators\": [\n \"resource-exists-in-api-metadata\",\n \"resource-path-canonical\",\n \"resource-key-stable\",\n \"id-field-known\",\n \"resource-capabilities-resolvable\"\n ],\n \"affectedPaths\": [\n \"resource.path\",\n \"resource.schemaPath\",\n \"resource.idField\",\n \"resource.endpointKey\",\n \"resource.apiUrlEntry\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\"\n ]\n },\n {\n \"operationId\": \"domain.governanceContext.attach\",\n \"title\": \"Attach Domain Catalog governance context\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"domainGovernanceContext\",\n \"target\": {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourceKey\",\n \"query\"\n ],\n \"properties\": {\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"releaseId\": {\n \"type\": \"string\"\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"itemTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"governance\",\n \"vocabulary\",\n \"relationship\"\n ]\n }\n },\n \"intent\": {\n \"enum\": [\n \"authoring\",\n \"explain\",\n \"validate\",\n \"ai-access-control\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-domain-governance-context-attach\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"DomainCatalogService.getGovernanceContext\",\n \"DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.queryContext.meta.domainCatalog\"\n ],\n \"identityKeys\": [\n \"resourceKey\",\n \"releaseId\",\n \"query\"\n ],\n \"failureModes\": [\n \"resource-key-missing\",\n \"domain-catalog-release-not-found\",\n \"governance-context-empty\",\n \"ai-usage-forbidden\"\n ],\n \"description\": \"Resolves read-only domain vocabulary/governance context and stores only a lightweight reference/probe under queryContext.meta.domainCatalog.\"\n }\n }\n ],\n \"validators\": [\n \"resource-key-stable\",\n \"domain-catalog-context-resolvable\",\n \"domain-catalog-read-only\",\n \"ai-usage-visibility-respected\",\n \"no-form-config-rule-materialization\"\n ],\n \"affectedPaths\": [\n \"queryContext.meta.domainCatalog\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\",\n \"domain-catalog-service-available\"\n ]\n },\n {\n \"operationId\": \"list.surface.configure\",\n \"title\": \"Configure CRUD list surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"listSurface\",\n \"target\": {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"tablePatch\": {\n \"type\": \"object\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n },\n \"filterCriteria\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-list-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"CRUD_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"CrudMetadata.filterCriteria\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"table-operation-not-delegated\",\n \"table-patch-not-supported\",\n \"query-context-invalid\"\n ],\n \"description\": \"Configures CRUD-owned list orchestration while routing table semantics to the praxis-table manifest.\"\n }\n }\n ],\n \"validators\": [\n \"table-child-operation-delegated\",\n \"query-context-valid\",\n \"filter-criteria-bridge-valid\",\n \"crud-context-stable\"\n ],\n \"affectedPaths\": [\n \"table\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"praxis-table-manifest-available\"\n ]\n },\n {\n \"operationId\": \"surface.create.configure\",\n \"title\": \"Configure create surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"createSurface\",\n \"target\": {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\",\n \"openMode\"\n ],\n \"properties\": {\n \"actionId\": {\n \"enum\": [\n \"create\",\n \"edit\",\n \"view\"\n ]\n },\n \"openMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"route\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaUrl\": {\n \"type\": \"string\"\n },\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n },\n \"initialValue\": {\n \"type\": \"object\"\n },\n \"layoutPolicy\": {\n \"type\": \"object\"\n }\n }\n },\n \"params\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"from\",\n \"to\",\n \"name\"\n ],\n \"properties\": {\n \"from\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"enum\": [\n \"routeParam\",\n \"query\",\n \"input\"\n ]\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-create-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"schema-url-not-canonical\",\n \"submit-url-not-canonical\",\n \"resource-create-not-supported\"\n ],\n \"description\": \"Configures create action binding and launcher inputs without editing the child FormConfig.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-create-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.edit.configure\",\n \"title\": \"Configure edit surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"editSurface\",\n \"target\": {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-edit-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource.idField\",\n \"CrudLauncherService.resolveOpenMode\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"id-param-missing\",\n \"open-mode-binding-incomplete\",\n \"resource-edit-not-supported\",\n \"submit-url-not-canonical\"\n ],\n \"description\": \"Configures edit action routing/form binding and ensures id parameter mapping is available to the launcher.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"id-field-known\",\n \"id-param-mapping-valid\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-edit-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.view.configure\",\n \"title\": \"Configure view surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"viewSurface\",\n \"target\": {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-view-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"resource-view-not-supported\",\n \"readonly-form-delegation-missing\"\n ],\n \"description\": \"Configures view action binding and delegates readonly form behavior to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"resource-view-supported\",\n \"form-child-operation-delegated\",\n \"readonly-form-delegation-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"delete.enabled.set\",\n \"title\": \"Configure delete behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"deleteBehavior\",\n \"target\": {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"actionId\": {\n \"type\": \"string\"\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"autoDelete\": {\n \"type\": \"boolean\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-delete-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource\",\n \"GET /{resource}/{id}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].requiresConfirmation\",\n \"CrudMetadata.actions[].autoDelete\",\n \"CrudMetadata.actions[].form\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"delete-action-not-found\",\n \"resource-delete-not-supported\",\n \"destructive-delete-not-confirmed\",\n \"delete-submit-url-not-canonical\"\n ],\n \"description\": \"Enables or disables delete behavior with capability checks and explicit confirmation for destructive changes.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"delete-action-exists\",\n \"resource-delete-supported\",\n \"destructive-delete-confirmed\",\n \"submit-url-canonical\",\n \"permissions-delete-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].requiresConfirmation\",\n \"actions[].autoDelete\",\n \"actions[].form\",\n \"actions[].form.submitUrl\",\n \"actions[].form.submitMethod\",\n \"actions[].form.apiEndpointKey\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\",\n \"explicit-confirmation-provided\"\n ]\n },\n {\n \"operationId\": \"dialog.size.set\",\n \"title\": \"Configure CRUD dialog host defaults\",\n \"scope\": \"interaction\",\n \"targetKind\": \"dialogHost\",\n \"target\": {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"defaultOpenMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"modal\": {\n \"type\": \"object\",\n \"properties\": {\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n },\n \"minWidth\": {\n \"type\": \"string\"\n },\n \"maxWidth\": {\n \"type\": \"string\"\n },\n \"density\": {\n \"type\": \"string\"\n },\n \"canMaximize\": {\n \"type\": \"boolean\"\n },\n \"rememberLastState\": {\n \"type\": \"boolean\"\n },\n \"startMaximized\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnEsc\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnBackdrop\": {\n \"type\": \"boolean\"\n },\n \"fullscreenBreakpoint\": {\n \"type\": \"string\"\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-dialog-host-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.defaults\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DialogService\",\n \"DynamicFormDialogHostComponent\",\n \"CRUD_DRAWER_ADAPTER\"\n ],\n \"writes\": [\n \"CrudMetadata.defaults.openMode\",\n \"CrudMetadata.defaults.modal\",\n \"CrudMetadata.defaults.back\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"open-mode-unsupported\",\n \"drawer-runtime-unavailable\",\n \"modal-size-invalid\",\n \"back-policy-invalid\"\n ],\n \"description\": \"Configures CRUD-owned route/modal/drawer defaults consumed by the launcher, default dialog-backed drawer runtime and optional host drawer adapter.\"\n }\n }\n ],\n \"validators\": [\n \"open-mode-supported\",\n \"modal-size-valid\",\n \"drawer-runtime-available\",\n \"back-policy-valid\",\n \"settings-panel-shell-compatible\"\n ],\n \"affectedPaths\": [\n \"defaults.openMode\",\n \"defaults.modal\",\n \"defaults.back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"permissions.set\",\n \"title\": \"Configure CRUD permissions\",\n \"scope\": \"interaction\",\n \"targetKind\": \"permissions\",\n \"target\": {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"requiredCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"create\",\n \"view\",\n \"edit\",\n \"delete\"\n ]\n }\n },\n \"actionPermissions\": {\n \"type\": \"object\"\n },\n \"denyWhenMissingCapability\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-permissions-set\",\n \"handlerContract\": {\n \"reads\": [\n \"GET /{resource}/capabilities\",\n \"GET /{resource}/{id}/capabilities\",\n \"CrudMetadata.actions\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[].disabled\",\n \"CrudMetadata.actions[].visibleWhen\",\n \"CrudMetadata.actions[].requiresConfirmation\"\n ],\n \"identityKeys\": [\n \"resourcePath\"\n ],\n \"failureModes\": [\n \"capability-not-found\",\n \"action-permission-conflict\",\n \"delete-permission-without-confirmation\"\n ],\n \"description\": \"Aligns CRUD action visibility/disablement with resource capabilities without inventing a second permission source.\"\n }\n }\n ],\n \"validators\": [\n \"resource-capabilities-resolvable\",\n \"action-permission-supported\",\n \"delete-permission-requires-confirmation\",\n \"permissions-do-not-shadow-backend\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].visibleWhen\",\n \"actions[].requiresConfirmation\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"form.childOperation.delegate\",\n \"title\": \"Delegate child form/table/dialog authoring operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"childComponentId\": {\n \"enum\": [\n \"praxis-dynamic-form\",\n \"praxis-table\",\n \"praxis-dialog\",\n \"praxis-settings-panel\"\n ]\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"PRAXIS_DIALOG_AUTHORING_MANIFEST\",\n \"PRAXIS_SETTINGS_PANEL_AUTHORING_MANIFEST\"\n ],\n \"writes\": [\n \"delegatedAuthoringOperations[]\"\n ],\n \"identityKeys\": [\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"child-manifest-missing\",\n \"child-operation-not-found\",\n \"attempted-local-child-config-write\"\n ],\n \"description\": \"Records explicit delegation when requested edits belong to child manifests instead of CRUD orchestration.\"\n }\n }\n ],\n \"validators\": [\n \"child-manifest-available\",\n \"child-operation-known\",\n \"no-local-form-config-write\",\n \"no-local-table-config-write\",\n \"delegation-target-valid\"\n ],\n \"affectedPaths\": [\n \"delegatedAuthoringOperations\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"child-manifest-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"resource-exists-in-api-metadata\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_EXISTS\",\n \"description\": \"Resource must exist in api_metadata or resource discovery.\"\n },\n {\n \"validatorId\": \"resource-path-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_PATH_CANONICAL\",\n \"description\": \"Resource path must be canonical and not a local alias.\"\n },\n {\n \"validatorId\": \"resource-key-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_KEY_STABLE\",\n \"description\": \"Resource key must remain stable for surfaces/actions/capabilities.\"\n },\n {\n \"validatorId\": \"id-field-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_FIELD_KNOWN\",\n \"description\": \"CRUD id field must exist for edit/view/delete flows.\"\n },\n {\n \"validatorId\": \"resource-capabilities-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CAPABILITIES_RESOLVABLE\",\n \"description\": \"Resource capabilities must be resolvable before action enablement is authored.\"\n },\n {\n \"validatorId\": \"domain-catalog-context-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_CONTEXT_RESOLVABLE\",\n \"description\": \"Domain Catalog governance context must resolve for the resource key and requested probe before authoring uses it.\"\n },\n {\n \"validatorId\": \"domain-catalog-read-only\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_READ_ONLY\",\n \"description\": \"Domain Catalog is read-only semantic context; CRUD may reference a probe but must not persist copied catalog rules.\"\n },\n {\n \"validatorId\": \"ai-usage-visibility-respected\",\n \"level\": \"error\",\n \"code\": \"CRUD_AI_USAGE_VISIBILITY_RESPECTED\",\n \"description\": \"Authoring must respect Domain Catalog aiUsage.visibility before exposing field data, prompts or generated patches.\"\n },\n {\n \"validatorId\": \"no-form-config-rule-materialization\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_FORM_RULE_MATERIALIZATION\",\n \"description\": \"Shared domain governance must not be materialized into FormConfig rules unless a backend policy explicitly authorizes it.\"\n },\n {\n \"validatorId\": \"table-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_TABLE_CHILD_DELEGATED\",\n \"description\": \"Table semantics must be delegated to praxis-table.\"\n },\n {\n \"validatorId\": \"query-context-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_QUERY_CONTEXT_VALID\",\n \"description\": \"Query context must be valid for the bound resource.\"\n },\n {\n \"validatorId\": \"filter-criteria-bridge-valid\",\n \"level\": \"warning\",\n \"code\": \"CRUD_FILTER_CRITERIA_BRIDGE_VALID\",\n \"description\": \"filterCriteria is a bridge; prefer queryContext for new remote authoring.\"\n },\n {\n \"validatorId\": \"crud-context-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CONTEXT_STABLE\",\n \"description\": \"Authoring must not break stable crudContext references.\"\n },\n {\n \"validatorId\": \"action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_EXISTS\",\n \"description\": \"Target action must exist or be created through CRUD action orchestration.\"\n },\n {\n \"validatorId\": \"open-mode-binding-complete\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_BINDING_COMPLETE\",\n \"description\": \"route requires route; modal/drawer require formId unless resolved by governed overrides.\"\n },\n {\n \"validatorId\": \"schema-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SCHEMA_URL_CANONICAL\",\n \"description\": \"Schema URLs must be canonical for the bound resource/action.\"\n },\n {\n \"validatorId\": \"submit-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SUBMIT_URL_CANONICAL\",\n \"description\": \"Submit URL and method must be canonical and declared together.\"\n },\n {\n \"validatorId\": \"resource-create-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_CREATE_SUPPORTED\",\n \"description\": \"Create surface requires resource create capability.\"\n },\n {\n \"validatorId\": \"resource-edit-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_EDIT_SUPPORTED\",\n \"description\": \"Edit surface requires resource edit capability.\"\n },\n {\n \"validatorId\": \"resource-view-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_VIEW_SUPPORTED\",\n \"description\": \"View surface requires resource view capability.\"\n },\n {\n \"validatorId\": \"form-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_FORM_CHILD_DELEGATED\",\n \"description\": \"FormConfig and FieldMetadata edits must delegate to dynamic-form/metadata-editor manifests.\"\n },\n {\n \"validatorId\": \"id-param-mapping-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_PARAM_MAPPING_VALID\",\n \"description\": \"Edit/view actions must map resource id into route/query/input as required.\"\n },\n {\n \"validatorId\": \"readonly-form-delegation-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_READONLY_FORM_DELEGATED\",\n \"description\": \"Readonly form behavior belongs to the dynamic-form manifest.\"\n },\n {\n \"validatorId\": \"delete-action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_ACTION_EXISTS\",\n \"description\": \"Delete behavior requires a delete action target.\"\n },\n {\n \"validatorId\": \"resource-delete-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_SUPPORTED\",\n \"description\": \"Delete behavior requires resource delete capability.\"\n },\n {\n \"validatorId\": \"destructive-delete-confirmed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_CONFIRMED\",\n \"description\": \"Destructive delete behavior requires explicit confirmation.\"\n },\n {\n \"validatorId\": \"permissions-delete-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_VALID\",\n \"description\": \"Delete permission cannot bypass resource capabilities or confirmation policy.\"\n },\n {\n \"validatorId\": \"open-mode-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_SUPPORTED\",\n \"description\": \"Open mode must be route, modal or drawer.\"\n },\n {\n \"validatorId\": \"modal-size-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_MODAL_SIZE_VALID\",\n \"description\": \"Modal sizing defaults must be valid DialogConfig values.\"\n },\n {\n \"validatorId\": \"drawer-runtime-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_DRAWER_RUNTIME_AVAILABLE\",\n \"description\": \"Drawer open mode uses the default dialog-backed drawer runtime with CRUD-owned chrome, responsive right-panel sizing, Escape/backdrop handling and semantic close/save results; a host drawer adapter is optional only for shell-specific presentation.\"\n },\n {\n \"validatorId\": \"back-policy-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_BACK_POLICY_VALID\",\n \"description\": \"Back policy must be valid for route/modal/drawer behavior.\"\n },\n {\n \"validatorId\": \"settings-panel-shell-compatible\",\n \"level\": \"warning\",\n \"code\": \"CRUD_SETTINGS_PANEL_COMPATIBLE\",\n \"description\": \"Authoring shell must preserve apply/save/reset semantics.\"\n },\n {\n \"validatorId\": \"action-permission-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_PERMISSION_SUPPORTED\",\n \"description\": \"Action permissions must map to supported resource capabilities.\"\n },\n {\n \"validatorId\": \"delete-permission-requires-confirmation\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_CONFIRMATION\",\n \"description\": \"Delete permission enablement requires confirmation policy.\"\n },\n {\n \"validatorId\": \"permissions-do-not-shadow-backend\",\n \"level\": \"error\",\n \"code\": \"CRUD_PERMISSIONS_NO_BACKEND_SHADOW\",\n \"description\": \"UI permissions must not shadow backend capability denial.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child manifest must be available.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated operation must exist in the child manifest.\"\n },\n {\n \"validatorId\": \"no-local-form-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_FORM_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine FormConfig semantics.\"\n },\n {\n \"validatorId\": \"no-local-table-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_TABLE_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine TableConfig semantics.\"\n },\n {\n \"validatorId\": \"delegation-target-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELEGATION_TARGET_VALID\",\n \"description\": \"Delegation target must be resolvable by the child manifest.\"\n }\n ],\n \"roundTripRequirements\": [\n \"CrudMetadata is the canonical CRUD document shape.\",\n \"CrudAuthoringDocument wraps CrudMetadata without introducing host-local aliases.\",\n \"Resource path and resource key have separate semantics: path is operational, key is discovery/capability identity.\",\n \"Domain Catalog context is referenced through resourceKey/release/probe and stays read-only; CRUD may attach queryContext.meta.domainCatalog but must not copy shared governance rules into FormConfig.\",\n \"Open mode round-trip must preserve route, formId, form contract, params, initialValue and back policy.\",\n \"FormConfig and FieldMetadata edits must delegate to dynamic-form or metadata-editor manifests.\",\n \"TableConfig edits must delegate to praxis-table; CRUD owns only shell orchestration and list surface binding.\",\n \"Delete behavior is destructive and requires explicit confirmation plus backend capability support.\",\n \"crudContext must remain reference-stable across change detection cycles.\"\n ],\n \"examples\": [\n {\n \"id\": \"crud-bind-funcionarios-resource\",\n \"request\": \"Bind this CRUD to funcionarios using id as the identifier.\",\n \"operationId\": \"resource.bind\",\n \"target\": \"resource:funcionarios\",\n \"params\": {\n \"resourcePath\": \"/funcionarios\",\n \"resourceKey\": \"funcionarios\",\n \"idField\": \"id\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-attach-lgpd-cpf-context\",\n \"request\": \"Use the Domain Catalog LGPD context for cpf before changing the employee CRUD.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-list-query-context\",\n \"request\": \"Filter the list by active employees using the canonical query context.\",\n \"operationId\": \"list.surface.configure\",\n \"target\": \"listSurface\",\n \"params\": {\n \"queryContext\": {\n \"filters\": [\n {\n \"field\": \"active\",\n \"operator\": \"eq\",\n \"value\": true\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-create-modal\",\n \"request\": \"Open create in a modal with the employee form.\",\n \"operationId\": \"surface.create.configure\",\n \"target\": \"action:create\",\n \"params\": {\n \"actionId\": \"create\",\n \"openMode\": \"modal\",\n \"formId\": \"employee-create\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-edit-route-with-id\",\n \"request\": \"Edit should navigate to /employees/:id and map the row id.\",\n \"operationId\": \"surface.edit.configure\",\n \"target\": \"action:edit\",\n \"params\": {\n \"actionId\": \"edit\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-view-drawer-readonly\",\n \"request\": \"Open view in a drawer and keep the form readonly.\",\n \"operationId\": \"surface.view.configure\",\n \"target\": \"action:view\",\n \"params\": {\n \"actionId\": \"view\",\n \"openMode\": \"drawer\",\n \"formId\": \"employee-view\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delete-enable-confirmed\",\n \"request\": \"Enable delete but require confirmation.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": true,\n \"autoDelete\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-dialog-size-medium\",\n \"request\": \"Make CRUD modals 900px wide and remember their last state.\",\n \"operationId\": \"dialog.size.set\",\n \"target\": \"dialogHost\",\n \"params\": {\n \"defaultOpenMode\": \"modal\",\n \"modal\": {\n \"width\": \"900px\",\n \"rememberLastState\": true\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-permissions-no-delete\",\n \"request\": \"Hide delete when the resource capabilities do not allow it.\",\n \"operationId\": \"permissions.set\",\n \"target\": \"permissions:delete\",\n \"params\": {\n \"requiredCapabilities\": [\n \"delete\"\n ],\n \"denyWhenMissingCapability\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-form-layout\",\n \"request\": \"Add a new field to the create form.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:field.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Form field semantics belong to dynamic-form\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-table-column\",\n \"request\": \"Add a salary column to the list table.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-table:column.add\",\n \"params\": {\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"Table column semantics belong to praxis-table\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-reject-local-form-rules\",\n \"request\": \"Put this dynamic-form validation rule directly inside CRUD.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:rules.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"rules.add\",\n \"reason\": \"CRUD must not redefine FormConfig rules\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-copy-domain-rule-to-formconfig\",\n \"request\": \"Copy the LGPD rule from Domain Catalog directly into the create form JSON.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-delete-without-capability\",\n \"request\": \"Force delete even though the backend does not expose delete capability.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": false\n },\n \"isPositive\": false\n }\n ]\n}",
6252
- "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/praxis-crud-authoring-manifest.ts",
6253
- "contentHash": "2ba8be4003f9c66e0ce078bdc279a0ef7db0c8479da3d6315133df8e5058410c",
6484
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-crud\",\n \"ownerPackage\": \"@praxisui/crud\",\n \"configSchemaId\": \"CrudMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"metadata\",\n \"type\": \"CrudMetadata | string\",\n \"description\": \"Canonical CRUD metadata or serialized metadata document.\"\n },\n {\n \"name\": \"crudId\",\n \"type\": \"string\",\n \"description\": \"Stable CRUD instance id used for table/form identity and persistence.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional stable host instance id for multiple CRUD widgets on the same route.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context used for authoring seeds and launcher inputs.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Explicit host opt-in for CRUD authoring surfaces.\"\n },\n {\n \"name\": \"authoringCapability\",\n \"type\": \"string | null\",\n \"description\": \"Public runtime capability required before CRUD and delegated table authoring can open.\"\n },\n {\n \"name\": \"afterOpen\",\n \"type\": \"{ mode: FormOpenMode; action: string }\",\n \"description\": \"Emitted after a CRUD action opens.\"\n },\n {\n \"name\": \"afterSave\",\n \"type\": \"{ id: string | number; data: unknown }\",\n \"description\": \"Emitted after save; CRUD refetches the list.\"\n },\n {\n \"name\": \"afterDelete\",\n \"type\": \"{ id: string | number }\",\n \"description\": \"Emitted after delete; CRUD refetches the list.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"description\": \"Resource path/key, optional schema path template, id field, endpoint key and query context owned by CRUD orchestration.\"\n },\n {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"description\": \"CRUD-hosted list surface and table delegation boundary.\"\n },\n {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"description\": \"Create action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"description\": \"Edit action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"description\": \"View action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"description\": \"Delete action enablement, confirmation, endpoint and capability policy.\"\n },\n {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"description\": \"Route/modal/drawer defaults consumed by CrudLauncherService and DynamicFormDialogHostComponent, including contextual shell titles derived from action label, form title or resource metadata.\"\n },\n {\n \"kind\": \"formBinding\",\n \"resolver\": \"crud-action-form-contract-by-action-id\",\n \"description\": \"CRUD-owned form binding fields: formId, schemaUrl, submitUrl, submitMethod, params and initialValue. Shared FormConfig remains owned by Dynamic Form and is forwarded through CrudMetadata.form when present.\"\n },\n {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"description\": \"CRUD action availability derived from resource capabilities and action permissions.\"\n },\n {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"description\": \"Read-only semantic/governance context resolved from Domain Catalog and referenced from CRUD queryContext.meta.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"description\": \"Delegated form/table/dialog/settings-panel operation owned by the child component manifest.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"resource.bind\",\n \"title\": \"Bind CRUD resource\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"resourceBinding\",\n \"target\": {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourcePath\"\n ],\n \"properties\": {\n \"resourcePath\": {\n \"type\": \"string\"\n },\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"idField\": {\n \"type\": [\n \"string\",\n \"number\"\n ]\n },\n \"endpointKey\": {\n \"type\": \"string\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-resource-bind\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"api_metadata\",\n \"ResourceDiscoveryService\",\n \"GET /{resource}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"PraxisCrudComponent.tableCrudContext\"\n ],\n \"identityKeys\": [\n \"resourcePath\",\n \"resourceKey\",\n \"schemaPath\"\n ],\n \"failureModes\": [\n \"resource-not-found\",\n \"schema-url-not-canonical\",\n \"capabilities-unavailable\",\n \"id-field-missing\"\n ],\n \"description\": \"Binds CRUD to a canonical resource and validates it against api_metadata/resource capabilities before runtime use. Use CrudMetadata.resource.schemaPath when schema discovery must use a templated path while resource.path targets a concrete nested collection.\"\n }\n }\n ],\n \"validators\": [\n \"resource-exists-in-api-metadata\",\n \"resource-path-canonical\",\n \"resource-key-stable\",\n \"id-field-known\",\n \"resource-capabilities-resolvable\"\n ],\n \"affectedPaths\": [\n \"resource.path\",\n \"resource.schemaPath\",\n \"resource.idField\",\n \"resource.endpointKey\",\n \"resource.apiUrlEntry\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\"\n ]\n },\n {\n \"operationId\": \"domain.governanceContext.attach\",\n \"title\": \"Attach Domain Catalog governance context\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"domainGovernanceContext\",\n \"target\": {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourceKey\",\n \"query\"\n ],\n \"properties\": {\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"releaseId\": {\n \"type\": \"string\"\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"itemTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"governance\",\n \"vocabulary\",\n \"relationship\"\n ]\n }\n },\n \"intent\": {\n \"enum\": [\n \"authoring\",\n \"explain\",\n \"validate\",\n \"ai-access-control\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-domain-governance-context-attach\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"DomainCatalogService.getGovernanceContext\",\n \"DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.queryContext.meta.domainCatalog\"\n ],\n \"identityKeys\": [\n \"resourceKey\",\n \"releaseId\",\n \"query\"\n ],\n \"failureModes\": [\n \"resource-key-missing\",\n \"domain-catalog-release-not-found\",\n \"governance-context-empty\",\n \"ai-usage-forbidden\"\n ],\n \"description\": \"Resolves read-only domain vocabulary/governance context and stores only a lightweight reference/probe under queryContext.meta.domainCatalog.\"\n }\n }\n ],\n \"validators\": [\n \"resource-key-stable\",\n \"domain-catalog-context-resolvable\",\n \"domain-catalog-read-only\",\n \"ai-usage-visibility-respected\",\n \"no-form-config-rule-materialization\"\n ],\n \"affectedPaths\": [\n \"queryContext.meta.domainCatalog\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\",\n \"domain-catalog-service-available\"\n ]\n },\n {\n \"operationId\": \"list.surface.configure\",\n \"title\": \"Configure CRUD list surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"listSurface\",\n \"target\": {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"tablePatch\": {\n \"type\": \"object\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n },\n \"filterCriteria\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-list-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"CRUD_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"CrudMetadata.filterCriteria\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"table-operation-not-delegated\",\n \"table-patch-not-supported\",\n \"query-context-invalid\"\n ],\n \"description\": \"Configures CRUD-owned list orchestration while routing table semantics to the praxis-table manifest.\"\n }\n }\n ],\n \"validators\": [\n \"table-child-operation-delegated\",\n \"query-context-valid\",\n \"filter-criteria-bridge-valid\",\n \"crud-context-stable\"\n ],\n \"affectedPaths\": [\n \"table\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"praxis-table-manifest-available\"\n ]\n },\n {\n \"operationId\": \"surface.create.configure\",\n \"title\": \"Configure create surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"createSurface\",\n \"target\": {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\",\n \"openMode\"\n ],\n \"properties\": {\n \"actionId\": {\n \"enum\": [\n \"create\",\n \"edit\",\n \"view\"\n ]\n },\n \"openMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"route\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaUrl\": {\n \"type\": \"string\"\n },\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n },\n \"initialValue\": {\n \"type\": \"object\"\n },\n \"layoutPolicy\": {\n \"type\": \"object\"\n }\n }\n },\n \"params\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"from\",\n \"to\",\n \"name\"\n ],\n \"properties\": {\n \"from\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"enum\": [\n \"routeParam\",\n \"query\",\n \"input\"\n ]\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-create-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"schema-url-not-canonical\",\n \"submit-url-not-canonical\",\n \"resource-create-not-supported\"\n ],\n \"description\": \"Configures create action binding and launcher inputs without editing the child FormConfig.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-create-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.edit.configure\",\n \"title\": \"Configure edit surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"editSurface\",\n \"target\": {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-edit-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource.idField\",\n \"CrudLauncherService.resolveOpenMode\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"id-param-missing\",\n \"open-mode-binding-incomplete\",\n \"resource-edit-not-supported\",\n \"submit-url-not-canonical\"\n ],\n \"description\": \"Configures edit action routing/form binding and ensures id parameter mapping is available to the launcher.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"id-field-known\",\n \"id-param-mapping-valid\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-edit-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.view.configure\",\n \"title\": \"Configure view surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"viewSurface\",\n \"target\": {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-view-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"resource-view-not-supported\",\n \"readonly-form-delegation-missing\"\n ],\n \"description\": \"Configures view action binding and delegates readonly form behavior to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"resource-view-supported\",\n \"form-child-operation-delegated\",\n \"readonly-form-delegation-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"delete.enabled.set\",\n \"title\": \"Configure delete behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"deleteBehavior\",\n \"target\": {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"actionId\": {\n \"type\": \"string\"\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"autoDelete\": {\n \"type\": \"boolean\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-delete-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource\",\n \"GET /{resource}/{id}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].requiresConfirmation\",\n \"CrudMetadata.actions[].autoDelete\",\n \"CrudMetadata.actions[].form\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"delete-action-not-found\",\n \"resource-delete-not-supported\",\n \"destructive-delete-not-confirmed\",\n \"delete-submit-url-not-canonical\"\n ],\n \"description\": \"Enables or disables delete behavior with capability checks and explicit confirmation for destructive changes.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"delete-action-exists\",\n \"resource-delete-supported\",\n \"destructive-delete-confirmed\",\n \"submit-url-canonical\",\n \"permissions-delete-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].requiresConfirmation\",\n \"actions[].autoDelete\",\n \"actions[].form\",\n \"actions[].form.submitUrl\",\n \"actions[].form.submitMethod\",\n \"actions[].form.apiEndpointKey\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\",\n \"explicit-confirmation-provided\"\n ]\n },\n {\n \"operationId\": \"dialog.size.set\",\n \"title\": \"Configure CRUD dialog host defaults\",\n \"scope\": \"interaction\",\n \"targetKind\": \"dialogHost\",\n \"target\": {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"defaultOpenMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"modal\": {\n \"type\": \"object\",\n \"properties\": {\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n },\n \"minWidth\": {\n \"type\": \"string\"\n },\n \"maxWidth\": {\n \"type\": \"string\"\n },\n \"density\": {\n \"type\": \"string\"\n },\n \"canMaximize\": {\n \"type\": \"boolean\"\n },\n \"rememberLastState\": {\n \"type\": \"boolean\"\n },\n \"startMaximized\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnEsc\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnBackdrop\": {\n \"type\": \"boolean\"\n },\n \"fullscreenBreakpoint\": {\n \"type\": \"string\"\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-dialog-host-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.defaults\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DialogService\",\n \"DynamicFormDialogHostComponent\",\n \"CRUD_DRAWER_ADAPTER\"\n ],\n \"writes\": [\n \"CrudMetadata.defaults.openMode\",\n \"CrudMetadata.defaults.modal\",\n \"CrudMetadata.defaults.back\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"open-mode-unsupported\",\n \"drawer-runtime-unavailable\",\n \"modal-size-invalid\",\n \"back-policy-invalid\"\n ],\n \"description\": \"Configures CRUD-owned route/modal/drawer defaults consumed by the launcher, default dialog-backed drawer runtime and optional host drawer adapter.\"\n }\n }\n ],\n \"validators\": [\n \"open-mode-supported\",\n \"modal-size-valid\",\n \"drawer-runtime-available\",\n \"back-policy-valid\",\n \"settings-panel-shell-compatible\"\n ],\n \"affectedPaths\": [\n \"defaults.openMode\",\n \"defaults.modal\",\n \"defaults.back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"permissions.set\",\n \"title\": \"Configure CRUD permissions\",\n \"scope\": \"interaction\",\n \"targetKind\": \"permissions\",\n \"target\": {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"requiredCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"create\",\n \"view\",\n \"edit\",\n \"delete\"\n ]\n }\n },\n \"actionPermissions\": {\n \"type\": \"object\"\n },\n \"denyWhenMissingCapability\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-permissions-set\",\n \"handlerContract\": {\n \"reads\": [\n \"GET /{resource}/capabilities\",\n \"GET /{resource}/{id}/capabilities\",\n \"CrudMetadata.actions\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[].disabled\",\n \"CrudMetadata.actions[].visibleWhen\",\n \"CrudMetadata.actions[].requiresConfirmation\"\n ],\n \"identityKeys\": [\n \"resourcePath\"\n ],\n \"failureModes\": [\n \"capability-not-found\",\n \"action-permission-conflict\",\n \"delete-permission-without-confirmation\"\n ],\n \"description\": \"Aligns CRUD action visibility/disablement with resource capabilities without inventing a second permission source.\"\n }\n }\n ],\n \"validators\": [\n \"resource-capabilities-resolvable\",\n \"action-permission-supported\",\n \"delete-permission-requires-confirmation\",\n \"permissions-do-not-shadow-backend\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].visibleWhen\",\n \"actions[].requiresConfirmation\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"form.childOperation.delegate\",\n \"title\": \"Delegate child form/table/dialog authoring operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"childComponentId\": {\n \"enum\": [\n \"praxis-dynamic-form\",\n \"praxis-table\",\n \"praxis-dialog\",\n \"praxis-settings-panel\"\n ]\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"PRAXIS_DIALOG_AUTHORING_MANIFEST\",\n \"PRAXIS_SETTINGS_PANEL_AUTHORING_MANIFEST\"\n ],\n \"writes\": [\n \"delegatedAuthoringOperations[]\"\n ],\n \"identityKeys\": [\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"child-manifest-missing\",\n \"child-operation-not-found\",\n \"attempted-local-child-config-write\"\n ],\n \"description\": \"Records explicit delegation when requested edits belong to child manifests instead of CRUD orchestration.\"\n }\n }\n ],\n \"validators\": [\n \"child-manifest-available\",\n \"child-operation-known\",\n \"no-local-form-config-write\",\n \"no-local-table-config-write\",\n \"delegation-target-valid\"\n ],\n \"affectedPaths\": [\n \"delegatedAuthoringOperations\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"child-manifest-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"resource-exists-in-api-metadata\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_EXISTS\",\n \"description\": \"Resource must exist in api_metadata or resource discovery.\"\n },\n {\n \"validatorId\": \"resource-path-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_PATH_CANONICAL\",\n \"description\": \"Resource path must be canonical and not a local alias.\"\n },\n {\n \"validatorId\": \"resource-key-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_KEY_STABLE\",\n \"description\": \"Resource key must remain stable for surfaces/actions/capabilities.\"\n },\n {\n \"validatorId\": \"id-field-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_FIELD_KNOWN\",\n \"description\": \"CRUD id field must exist for edit/view/delete flows.\"\n },\n {\n \"validatorId\": \"resource-capabilities-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CAPABILITIES_RESOLVABLE\",\n \"description\": \"Resource capabilities must be resolvable before action enablement is authored.\"\n },\n {\n \"validatorId\": \"domain-catalog-context-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_CONTEXT_RESOLVABLE\",\n \"description\": \"Domain Catalog governance context must resolve for the resource key and requested probe before authoring uses it.\"\n },\n {\n \"validatorId\": \"domain-catalog-read-only\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_READ_ONLY\",\n \"description\": \"Domain Catalog is read-only semantic context; CRUD may reference a probe but must not persist copied catalog rules.\"\n },\n {\n \"validatorId\": \"ai-usage-visibility-respected\",\n \"level\": \"error\",\n \"code\": \"CRUD_AI_USAGE_VISIBILITY_RESPECTED\",\n \"description\": \"Authoring must respect Domain Catalog aiUsage.visibility before exposing field data, prompts or generated patches.\"\n },\n {\n \"validatorId\": \"no-form-config-rule-materialization\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_FORM_RULE_MATERIALIZATION\",\n \"description\": \"Shared domain governance must not be materialized into FormConfig rules unless a backend policy explicitly authorizes it.\"\n },\n {\n \"validatorId\": \"table-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_TABLE_CHILD_DELEGATED\",\n \"description\": \"Table semantics must be delegated to praxis-table.\"\n },\n {\n \"validatorId\": \"query-context-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_QUERY_CONTEXT_VALID\",\n \"description\": \"Query context must be valid for the bound resource.\"\n },\n {\n \"validatorId\": \"filter-criteria-bridge-valid\",\n \"level\": \"warning\",\n \"code\": \"CRUD_FILTER_CRITERIA_BRIDGE_VALID\",\n \"description\": \"filterCriteria is a bridge; prefer queryContext for new remote authoring.\"\n },\n {\n \"validatorId\": \"crud-context-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CONTEXT_STABLE\",\n \"description\": \"Authoring must not break stable crudContext references.\"\n },\n {\n \"validatorId\": \"action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_EXISTS\",\n \"description\": \"Target action must exist or be created through CRUD action orchestration.\"\n },\n {\n \"validatorId\": \"open-mode-binding-complete\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_BINDING_COMPLETE\",\n \"description\": \"route requires route; modal/drawer require formId unless resolved by governed overrides.\"\n },\n {\n \"validatorId\": \"schema-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SCHEMA_URL_CANONICAL\",\n \"description\": \"Schema URLs must be canonical for the bound resource/action.\"\n },\n {\n \"validatorId\": \"submit-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SUBMIT_URL_CANONICAL\",\n \"description\": \"Submit URL and method must be canonical and declared together.\"\n },\n {\n \"validatorId\": \"resource-create-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_CREATE_SUPPORTED\",\n \"description\": \"Create surface requires resource create capability.\"\n },\n {\n \"validatorId\": \"resource-edit-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_EDIT_SUPPORTED\",\n \"description\": \"Edit surface requires resource edit capability.\"\n },\n {\n \"validatorId\": \"resource-view-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_VIEW_SUPPORTED\",\n \"description\": \"View surface requires resource view capability.\"\n },\n {\n \"validatorId\": \"form-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_FORM_CHILD_DELEGATED\",\n \"description\": \"FormConfig and FieldMetadata edits must delegate to dynamic-form/metadata-editor manifests.\"\n },\n {\n \"validatorId\": \"id-param-mapping-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_PARAM_MAPPING_VALID\",\n \"description\": \"Edit/view actions must map resource id into route/query/input as required.\"\n },\n {\n \"validatorId\": \"readonly-form-delegation-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_READONLY_FORM_DELEGATED\",\n \"description\": \"Readonly form behavior belongs to the dynamic-form manifest.\"\n },\n {\n \"validatorId\": \"delete-action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_ACTION_EXISTS\",\n \"description\": \"Delete behavior requires a delete action target.\"\n },\n {\n \"validatorId\": \"resource-delete-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_SUPPORTED\",\n \"description\": \"Delete behavior requires resource delete capability.\"\n },\n {\n \"validatorId\": \"destructive-delete-confirmed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_CONFIRMED\",\n \"description\": \"Destructive delete behavior requires explicit confirmation.\"\n },\n {\n \"validatorId\": \"permissions-delete-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_VALID\",\n \"description\": \"Delete permission cannot bypass resource capabilities or confirmation policy.\"\n },\n {\n \"validatorId\": \"open-mode-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_SUPPORTED\",\n \"description\": \"Open mode must be route, modal or drawer.\"\n },\n {\n \"validatorId\": \"modal-size-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_MODAL_SIZE_VALID\",\n \"description\": \"Modal sizing defaults must be valid DialogConfig values.\"\n },\n {\n \"validatorId\": \"drawer-runtime-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_DRAWER_RUNTIME_AVAILABLE\",\n \"description\": \"Drawer open mode uses the default dialog-backed drawer runtime with CRUD-owned chrome, responsive right-panel sizing, Escape/backdrop handling and semantic close/save results; a host drawer adapter is optional only for shell-specific presentation.\"\n },\n {\n \"validatorId\": \"back-policy-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_BACK_POLICY_VALID\",\n \"description\": \"Back policy must be valid for route/modal/drawer behavior.\"\n },\n {\n \"validatorId\": \"settings-panel-shell-compatible\",\n \"level\": \"warning\",\n \"code\": \"CRUD_SETTINGS_PANEL_COMPATIBLE\",\n \"description\": \"Authoring shell must preserve apply/save/reset semantics.\"\n },\n {\n \"validatorId\": \"action-permission-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_PERMISSION_SUPPORTED\",\n \"description\": \"Action permissions must map to supported resource capabilities.\"\n },\n {\n \"validatorId\": \"delete-permission-requires-confirmation\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_CONFIRMATION\",\n \"description\": \"Delete permission enablement requires confirmation policy.\"\n },\n {\n \"validatorId\": \"permissions-do-not-shadow-backend\",\n \"level\": \"error\",\n \"code\": \"CRUD_PERMISSIONS_NO_BACKEND_SHADOW\",\n \"description\": \"UI permissions must not shadow backend capability denial.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child manifest must be available.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated operation must exist in the child manifest.\"\n },\n {\n \"validatorId\": \"no-local-form-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_FORM_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine FormConfig semantics.\"\n },\n {\n \"validatorId\": \"no-local-table-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_TABLE_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine TableConfig semantics.\"\n },\n {\n \"validatorId\": \"delegation-target-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELEGATION_TARGET_VALID\",\n \"description\": \"Delegation target must be resolvable by the child manifest.\"\n }\n ],\n \"roundTripRequirements\": [\n \"CrudMetadata is the canonical CRUD document shape.\",\n \"CrudAuthoringDocument wraps CrudMetadata without introducing host-local aliases.\",\n \"Resource path and resource key have separate semantics: path is operational, key is discovery/capability identity.\",\n \"Domain Catalog context is referenced through resourceKey/release/probe and stays read-only; CRUD may attach queryContext.meta.domainCatalog but must not copy shared governance rules into FormConfig.\",\n \"Open mode round-trip must preserve route, formId, form contract, params, initialValue and back policy.\",\n \"FormConfig and FieldMetadata edits must delegate to dynamic-form or metadata-editor manifests.\",\n \"TableConfig edits must delegate to praxis-table; CRUD owns only shell orchestration and list surface binding.\",\n \"Delete behavior is destructive and requires explicit confirmation plus backend capability support.\",\n \"crudContext must remain reference-stable across change detection cycles.\"\n ],\n \"examples\": [\n {\n \"id\": \"crud-bind-funcionarios-resource\",\n \"request\": \"Bind this CRUD to funcionarios using id as the identifier.\",\n \"operationId\": \"resource.bind\",\n \"target\": \"resource:funcionarios\",\n \"params\": {\n \"resourcePath\": \"/funcionarios\",\n \"resourceKey\": \"funcionarios\",\n \"idField\": \"id\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-attach-lgpd-cpf-context\",\n \"request\": \"Use the Domain Catalog LGPD context for cpf before changing the employee CRUD.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-list-query-context\",\n \"request\": \"Filter the list by active employees using the canonical query context.\",\n \"operationId\": \"list.surface.configure\",\n \"target\": \"listSurface\",\n \"params\": {\n \"queryContext\": {\n \"filters\": [\n {\n \"field\": \"active\",\n \"operator\": \"eq\",\n \"value\": true\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-create-modal\",\n \"request\": \"Open create in a modal with the employee form.\",\n \"operationId\": \"surface.create.configure\",\n \"target\": \"action:create\",\n \"params\": {\n \"actionId\": \"create\",\n \"openMode\": \"modal\",\n \"formId\": \"employee-create\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-edit-route-with-id\",\n \"request\": \"Edit should navigate to /employees/:id and map the row id.\",\n \"operationId\": \"surface.edit.configure\",\n \"target\": \"action:edit\",\n \"params\": {\n \"actionId\": \"edit\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-view-drawer-readonly\",\n \"request\": \"Open view in a drawer and keep the form readonly.\",\n \"operationId\": \"surface.view.configure\",\n \"target\": \"action:view\",\n \"params\": {\n \"actionId\": \"view\",\n \"openMode\": \"drawer\",\n \"formId\": \"employee-view\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delete-enable-confirmed\",\n \"request\": \"Enable delete but require confirmation.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": true,\n \"autoDelete\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-dialog-size-medium\",\n \"request\": \"Make CRUD modals 900px wide and remember their last state.\",\n \"operationId\": \"dialog.size.set\",\n \"target\": \"dialogHost\",\n \"params\": {\n \"defaultOpenMode\": \"modal\",\n \"modal\": {\n \"width\": \"900px\",\n \"rememberLastState\": true\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-permissions-no-delete\",\n \"request\": \"Hide delete when the resource capabilities do not allow it.\",\n \"operationId\": \"permissions.set\",\n \"target\": \"permissions:delete\",\n \"params\": {\n \"requiredCapabilities\": [\n \"delete\"\n ],\n \"denyWhenMissingCapability\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-form-layout\",\n \"request\": \"Add a new field to the create form.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:field.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Form field semantics belong to dynamic-form\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-table-column\",\n \"request\": \"Add a salary column to the list table.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-table:column.add\",\n \"params\": {\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"Table column semantics belong to praxis-table\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-reject-local-form-rules\",\n \"request\": \"Put this dynamic-form validation rule directly inside CRUD.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:rules.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"rules.add\",\n \"reason\": \"CRUD must not redefine FormConfig rules\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-copy-domain-rule-to-formconfig\",\n \"request\": \"Copy the LGPD rule from Domain Catalog directly into the create form JSON.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-delete-without-capability\",\n \"request\": \"Force delete even though the backend does not expose delete capability.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": false\n },\n \"isPositive\": false\n }\n ]\n}",
6485
+ "sourcePointer": "projects/praxis-crud/src/lib/ai/praxis-crud-authoring-manifest.ts",
6486
+ "contentHash": "b62f0204d95b0de9399e48d6f9d1b0d407ca209541a2cb236b47c170105c4857",
6254
6487
  "sourceKind": "component_definition",
6255
6488
  "sourceId": "praxis-crud",
6256
6489
  "corpusVersion": "1.0.0"
@@ -6259,7 +6492,7 @@
6259
6492
  "chunkIndex": 3,
6260
6493
  "chunkKind": "context_pack",
6261
6494
  "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"defaults.openMode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"route\",\n \"label\": \"Route\"\n },\n {\n \"value\": \"modal\",\n \"label\": \"Modal\"\n },\n {\n \"value\": \"drawer\",\n \"label\": \"Drawer\"\n }\n ]\n },\n \"actions[].openMode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"route\",\n \"label\": \"Route\"\n },\n {\n \"value\": \"modal\",\n \"label\": \"Modal\"\n },\n {\n \"value\": \"drawer\",\n \"label\": \"Drawer\"\n }\n ]\n },\n \"actions[].params[].to\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"routeParam\",\n \"label\": \"Route param\"\n },\n {\n \"value\": \"query\",\n \"label\": \"Query param\"\n },\n {\n \"value\": \"input\",\n \"label\": \"Dialog input\"\n }\n ]\n },\n \"defaults.header.variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"ghost\",\n \"label\": \"Ghost\"\n },\n {\n \"value\": \"tonal\",\n \"label\": \"Tonal\"\n },\n {\n \"value\": \"outlined\",\n \"label\": \"Outlined\"\n }\n ]\n },\n \"actions[].type\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"button\",\n \"label\": \"Button\"\n },\n {\n \"value\": \"icon\",\n \"label\": \"Icon\"\n },\n {\n \"value\": \"fab\",\n \"label\": \"Fab\"\n },\n {\n \"value\": \"menu\",\n \"label\": \"Menu\"\n }\n ]\n },\n \"actions[].appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"filled\",\n \"label\": \"Filled\"\n },\n {\n \"value\": \"outlined\",\n \"label\": \"Outlined\"\n },\n {\n \"value\": \"elevated\",\n \"label\": \"Elevated\"\n },\n {\n \"value\": \"text\",\n \"label\": \"Text\"\n },\n {\n \"value\": \"tonal\",\n \"label\": \"Tonal\"\n }\n ]\n },\n \"actions[].position\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n }\n ]\n },\n \"defaults.back.strategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"close\",\n \"label\": \"Close\"\n },\n {\n \"value\": \"navigate\",\n \"label\": \"Navigate\"\n }\n ]\n },\n \"actions[].back.strategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"close\",\n \"label\": \"Close\"\n },\n {\n \"value\": \"navigate\",\n \"label\": \"Navigate\"\n }\n ]\n },\n \"resource.endpointKey\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"humanResources\",\n \"label\": \"Human resources\"\n },\n {\n \"value\": \"uiWrappersTest\",\n \"label\": \"UI wrappers test\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"resource.path.set\",\n \"intentExamples\": [\n \"resource\",\n \"endpoint\",\n \"api\",\n \"path\",\n \"rota\"\n ],\n \"patchTemplate\": {\n \"resource\": {\n \"path\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"resource.idField.set\",\n \"intentExamples\": [\n \"id field\",\n \"chave\",\n \"primary key\"\n ],\n \"patchTemplate\": {\n \"resource\": {\n \"idField\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"defaults.openMode.set\",\n \"intentExamples\": [\n \"open mode\",\n \"open\",\n \"route\",\n \"modal\",\n \"drawer\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"openMode\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"defaults.header.variant.set\",\n \"intentExamples\": [\n \"header\",\n \"variant\",\n \"style\",\n \"back button\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"variant\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.header.backLabel.set\",\n \"intentExamples\": [\n \"back label\",\n \"voltar\",\n \"header label\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"backLabel\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.header.showBack.enable\",\n \"intentExamples\": [\n \"show back\",\n \"back button\",\n \"enable back\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"showBack\": true\n }\n }\n }\n },\n {\n \"id\": \"defaults.header.showBack.disable\",\n \"intentExamples\": [\n \"hide back\",\n \"disable back\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"showBack\": false\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.strategy.set\",\n \"intentExamples\": [\n \"back\",\n \"return\",\n \"navigation\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"strategy\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.returnTo.set\",\n \"intentExamples\": [\n \"return to\",\n \"back route\",\n \"navigate back\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"returnTo\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.confirmOnDirty.enable\",\n \"intentExamples\": [\n \"confirm\",\n \"dirty\",\n \"unsaved\",\n \"confirm exit\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"confirmOnDirty\": true\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.confirmOnDirty.disable\",\n \"intentExamples\": [\n \"no confirm\",\n \"disable confirm\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"confirmOnDirty\": false\n }\n }\n }\n },\n {\n \"id\": \"action.add\",\n \"intentExamples\": [\n \"add action\",\n \"new action\",\n \"create action\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"action\": \"{{params.action}}\",\n \"label\": \"{{value}}\",\n \"icon\": \"{{params.icon}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.label.set\",\n \"intentExamples\": [\n \"label\",\n \"rename action\",\n \"titulo\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.icon.set\",\n \"intentExamples\": [\n \"icon\",\n \"icone\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"icon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.openMode.set\",\n \"intentExamples\": [\n \"open mode\",\n \"route\",\n \"modal\",\n \"drawer\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"openMode\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.route.set\",\n \"intentExamples\": [\n \"route\",\n \"url\",\n \"navigate\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"route\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.formId.set\",\n \"intentExamples\": [\n \"form\",\n \"formId\",\n \"dialog\",\n \"drawer\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"formId\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.params.add\",\n \"intentExamples\": [\n \"param\",\n \"params\",\n \"query\",\n \"route param\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"params\": [\n {\n \"from\": \"{{params.from}}\",\n \"to\": \"{{params.to}}\",\n \"name\": \"{{params.name}}\"\n }\n ]\n }\n ]\n }\n },\n {\n \"id\": \"action.initialValue.set\",\n \"intentExamples\": [\n \"initial value\",\n \"seed\",\n \"default form values\",\n \"prefill\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"form\": {\n \"initialValue\": \"{{value}}\"\n }\n }\n ]\n }\n },\n {\n \"id\": \"action.confirmation.enable\",\n \"intentExamples\": [\n \"confirm\",\n \"confirmation\",\n \"requires confirmation\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"requiresConfirmation\": true\n }\n ]\n }\n },\n {\n \"id\": \"action.confirmation.disable\",\n \"intentExamples\": [\n \"no confirm\",\n \"disable confirmation\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"requiresConfirmation\": false\n }\n ]\n }\n },\n {\n \"id\": \"action.visibleWhen.set\",\n \"intentExamples\": [\n \"visible when\",\n \"visibility\",\n \"show when\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"visibleWhen\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.type.set\",\n \"intentExamples\": [\n \"type\",\n \"button type\",\n \"toolbar\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"type\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.appearance.set\",\n \"intentExamples\": [\n \"appearance\",\n \"variant\",\n \"style\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"appearance\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.position.set\",\n \"intentExamples\": [\n \"position\",\n \"start\",\n \"end\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"position\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.back.strategy.set\",\n \"intentExamples\": [\n \"back\",\n \"return\",\n \"navigation\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"back\": {\n \"strategy\": \"{{value}}\"\n }\n }\n ]\n }\n },\n {\n \"id\": \"ADD_CONDITIONAL_RENDERER\",\n \"intentExamples\": [\n \"conditional renderer\",\n \"renderer condicional\",\n \"badge condicional\",\n \"chip condicional\",\n \"badge se\",\n \"chip se\",\n \"conditional badge\",\n \"conditional chip\"\n ],\n \"patchTemplate\": {\n \"table\": {\n \"columns\": [\n {\n \"field\": \"{{target}}\",\n \"conditionalRenderers\": [\n {\n \"condition\": \"{{params.condition}}\",\n \"renderer\": \"{{params.renderer}}\"\n }\n ]\n }\n ]\n }\n }\n }\n ],\n \"fieldResolvers\": {\n \"actions[]\": [\n \"id\",\n \"label\",\n \"action\"\n ],\n \"resource.path\": [],\n \"table.columns[].field\": [\n \"field\",\n \"header\"\n ]\n },\n \"hints\": [\n \"Use actions[].id as the canonical action key; avoid array indexes.\",\n \"When adding actions, include params.action to describe the underlying CRUD action.\",\n \"openMode route requires actions[].route; modal or drawer require actions[].formId unless the host completes bindings via per-action override before opening.\",\n \"Table and form are full configs; patch nested fields instead of replacing the whole object.\",\n \"Use ADD_CONDITIONAL_RENDERER for table conditional badges/chips (table.columns[].conditionalRenderers).\",\n \"CRUD agrega TableConfig e FormConfig; siga o contrato da tabela para columns/conditionalRenderers.\",\n \"DOC: Widget purpose: CRUD shell that composes a table + optional form from metadata.\",\n \"DOC: Host inputs: metadata (required) and crudId (required). componentInstanceId/context/enableCustomization are optional.\",\n \"DOC: CrudMetadata requires component='praxis-crud' and table (TableConfig).\",\n \"DOC: inner table renders with resource.path (remote) or metadata.data (local). If both are provided, resource.path takes precedence.\",\n \"DOC: If actions open modal/drawer, actions[].formId is required unless a per-action override resolves it before opening; for route mode, actions[].route is required unless override resolves it.\"\n ]\n }\n}",
6262
- "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/crud-context-pack.ts",
6495
+ "sourcePointer": "projects/praxis-crud/src/lib/ai/crud-context-pack.ts",
6263
6496
  "contentHash": "d84846e0e5ca29e261d8ea50aecf22bda4babb0338565f83c487612d9080690d",
6264
6497
  "sourceKind": "component_definition",
6265
6498
  "sourceId": "praxis-crud",
@@ -6269,7 +6502,7 @@
6269
6502
  "chunkIndex": 4,
6270
6503
  "chunkKind": "recipe",
6271
6504
  "content": "{\n \"_comment\": \"Variant focused on CRUD actions and launcher behavior, using inferred canonical actions as the baseline.\",\n \"templateMeta\": {\n \"variantId\": \"actions\",\n \"variantOf\": \"praxis-crud\",\n \"registryKey\": \"praxis-crud\",\n \"tags\": [\n \"actions\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change CRUD actions or routes\",\n \"examplePrompts\": [\n \"add a custom action to archive records\",\n \"change the edit action to open a route\"\n ]\n },\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"defaults\": {\n \"openMode\": \"modal\",\n \"modal\": {\n \"width\": \"860px\",\n \"maxWidth\": \"95vw\",\n \"panelClass\": \"crud-dialog\",\n \"backdropStyle\": \"blur\",\n \"autoFocus\": true,\n \"restoreFocus\": true\n },\n \"back\": {\n \"strategy\": \"auto\",\n \"returnTo\": \"/employees\",\n \"confirmOnDirty\": true\n },\n \"header\": {\n \"showBack\": true,\n \"backLabel\": \"Voltar\",\n \"variant\": \"outlined\",\n \"sticky\": true,\n \"breadcrumbs\": true,\n \"divider\": true\n }\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo colaborador\",\n \"icon\": \"add\",\n \"action\": \"create\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"view\",\n \"label\": \"Visualizar\",\n \"icon\": \"visibility\",\n \"action\": \"view\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\"\n },\n {\n \"id\": \"edit-route\",\n \"label\": \"Editar na rota\",\n \"icon\": \"open_in_new\",\n \"action\": \"edit-route\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n },\n {\n \"from\": \"name\",\n \"to\": \"query\",\n \"name\": \"name\"\n }\n ],\n \"back\": {\n \"strategy\": \"navigate\",\n \"returnTo\": \"/employees\"\n }\n }\n ]\n}\n",
6272
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.actions.json",
6505
+ "sourcePointer": "examples/ai-recipes/praxis-crud.actions.json",
6273
6506
  "contentHash": "2b2c060e71c98f46d48e6f58a966414703faf545554c26639b4811f9f905ea48",
6274
6507
  "sourceKind": "component_definition",
6275
6508
  "sourceId": "praxis-crud",
@@ -6279,7 +6512,7 @@
6279
6512
  "chunkIndex": 5,
6280
6513
  "chunkKind": "recipe",
6281
6514
  "content": "{\n \"_comment\": \"Variant focused on CRUD form configuration.\",\n \"templateMeta\": {\n \"variantId\": \"form\",\n \"variantOf\": \"praxis-crud\",\n \"registryKey\": \"praxis-crud\",\n \"tags\": [\n \"form\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change form layout or fields in CRUD\",\n \"examplePrompts\": [\n \"add a new field to the crud form\",\n \"update validation rules in the form\"\n ]\n },\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"form\": {\n \"metadata\": {\n \"version\": \"2.0\",\n \"source\": \"local\",\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 },\n \"api\": {\n \"saveEndpoint\": \"/api/employees\",\n \"loadEndpoint\": \"/api/employees/${id}\",\n \"saveMethod\": \"POST\",\n \"timeout\": 15000,\n \"headers\": {\n \"X-Module\": \"HR\"\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 \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 200\n },\n \"messages\": {\n \"createRegistrySuccess\": \"Colaborador criado com sucesso.\",\n \"updateRegistrySuccess\": \"Colaborador atualizado com sucesso.\",\n \"createRegistryError\": \"Falha ao criar colaborador.\",\n \"updateRegistryError\": \"Falha ao atualizar colaborador.\",\n \"confirmations\": {\n \"submit\": \"Deseja salvar as alteracoes?\",\n \"cancel\": \"Descartar alteracoes?\",\n \"reset\": \"Limpar o formulario?\"\n },\n \"customActions\": {\n \"archive\": {\n \"confirmation\": \"Arquivar este colaborador?\"\n }\n },\n \"loading\": {\n \"submit\": \"Salvando...\",\n \"cancel\": \"Cancelando...\"\n }\n },\n \"hints\": {\n \"dataModes\": {\n \"create\": \"Preencha os dados para criar um novo colaborador.\",\n \"edit\": \"Atualize os dados e salve as alteracoes.\",\n \"view\": \"Visualize os dados do colaborador.\"\n },\n \"uiModes\": {\n \"presentation\": \"Modo apresentacao mostra somente 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 \"beforeSubmit\": [\n {\n \"id\": \"sanitize-employee\",\n \"priority\": 100,\n \"args\": {\n \"trimStrings\": true\n }\n }\n ],\n \"afterSubmit\": [\n {\n \"id\": \"notify-success\",\n \"args\": {\n \"messageKey\": \"employeeSaved\"\n }\n }\n ],\n \"onError\": [\n {\n \"id\": \"notify-error\",\n \"args\": {\n \"messageKey\": \"employeeSaveError\"\n }\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\": \"Campo ID oculto, gerenciado pelo backend.\"\n },\n {\n \"name\": \"name\",\n \"label\": \"Nome completo\",\n \"controlType\": \"input\",\n \"dataType\": \"text\",\n \"placeholder\": \"Ex.: Ana Souza\",\n \"prefixIcon\": \"person\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 3\n }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"dataType\": \"email\",\n \"placeholder\": \"nome@empresa.com\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"phone\",\n \"label\": \"Telefone\",\n \"controlType\": \"phone\",\n \"placeholder\": \"(11) 99999-0000\",\n \"mask\": \"(99) 99999-9999\"\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Ativo\",\n \"value\": \"ACTIVE\"\n },\n {\n \"text\": \"Inativo\",\n \"value\": \"INACTIVE\"\n },\n {\n \"text\": \"Afastado\",\n \"value\": \"ON_LEAVE\"\n }\n ],\n \"defaultValue\": \"ACTIVE\",\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n },\n {\n \"name\": \"hireDate\",\n \"label\": \"Data de admissao\",\n \"controlType\": \"date\",\n \"dataType\": \"date\"\n },\n {\n \"name\": \"terminationDate\",\n \"label\": \"Data de desligamento\",\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\": \"department\",\n \"label\": \"Departamento\",\n \"controlType\": \"select\",\n \"endpoint\": \"/api/departments\",\n \"valueField\": \"id\",\n \"displayField\": \"name\"\n },\n {\n \"name\": \"role\",\n \"label\": \"Cargo\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Analista\",\n \"value\": \"ANALYST\"\n },\n {\n \"text\": \"Coordenador\",\n \"value\": \"COORD\"\n },\n {\n \"text\": \"Gerente\",\n \"value\": \"MANAGER\"\n }\n ]\n },\n {\n \"name\": \"managerId\",\n \"label\": \"Gestor\",\n \"controlType\": \"autoComplete\",\n \"endpoint\": \"/api/employees?role=manager\",\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"filterField\": \"name\"\n },\n {\n \"name\": \"salary\",\n \"label\": \"Salario\",\n \"controlType\": \"currency\",\n \"dataType\": \"number\",\n \"format\": \"BRL|symbol|2\",\n \"validators\": {\n \"min\": 0\n }\n },\n {\n \"name\": \"workMode\",\n \"label\": \"Regime\",\n \"controlType\": \"radio\",\n \"options\": [\n {\n \"text\": \"CLT\",\n \"value\": \"CLT\"\n },\n {\n \"text\": \"PJ\",\n \"value\": \"PJ\"\n },\n {\n \"text\": \"Estagio\",\n \"value\": \"INTERN\"\n }\n ],\n \"defaultValue\": \"CLT\"\n },\n {\n \"name\": \"notes\",\n \"label\": \"Observacoes\",\n \"controlType\": \"textarea\",\n \"validators\": {\n \"maxLength\": 500\n },\n \"hint\": \"Informacoes adicionais relevantes ao cadastro.\"\n },\n {\n \"name\": \"isActive\",\n \"label\": \"Ativo\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true\n },\n {\n \"name\": \"avatar\",\n \"label\": \"Foto\",\n \"controlType\": \"upload\",\n \"accept\": \".png,.jpg,.jpeg\",\n \"multiple\": false,\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n }\n ],\n \"sections\": [\n {\n \"id\": \"basic\",\n \"title\": \"Dados basicos\",\n \"description\": \"Informacoes pessoais e status.\",\n \"icon\": \"person\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"titleStyle\": \"titleMedium\",\n \"descriptionStyle\": \"bodyMedium\",\n \"rows\": [\n {\n \"id\": \"row-basic-1\",\n \"columns\": [\n {\n \"id\": \"col-basic-1\",\n \"fields\": [\n \"name\",\n \"email\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n },\n \"padding\": 8\n },\n {\n \"id\": \"col-basic-2\",\n \"fields\": [\n \"status\",\n \"hireDate\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-basic-2\",\n \"columns\": [\n {\n \"id\": \"col-basic-3\",\n \"fields\": [\n \"phone\",\n \"managerId\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-basic-4\",\n \"fields\": [\n \"department\",\n \"role\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"employment\",\n \"title\": \"Contrato\",\n \"icon\": \"badge\",\n \"rows\": [\n {\n \"id\": \"row-employment-1\",\n \"columns\": [\n {\n \"id\": \"col-employment-1\",\n \"fields\": [\n \"salary\",\n \"workMode\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-employment-2\",\n \"fields\": [\n \"terminationDate\",\n \"notes\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"attachments\",\n \"title\": \"Arquivos\",\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 ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n },\n \"align\": \"center\"\n }\n ]\n }\n ]\n }\n ],\n \"actions\": {\n \"submit\": {\n \"visible\": true,\n \"label\": \"Salvar\",\n \"color\": \"primary\",\n \"variant\": \"raised\",\n \"type\": \"submit\",\n \"shortcut\": \"Ctrl+S\"\n },\n \"cancel\": {\n \"visible\": true,\n \"label\": \"Cancelar\",\n \"type\": \"button\"\n },\n \"reset\": {\n \"visible\": true,\n \"label\": \"Limpar\",\n \"type\": \"reset\"\n },\n \"custom\": [\n {\n \"id\": \"archive\",\n \"visible\": true,\n \"label\": \"Arquivar\",\n \"icon\": \"archive\",\n \"color\": \"warn\",\n \"variant\": \"stroked\",\n \"action\": \"archive\"\n }\n ],\n \"position\": \"right\",\n \"orientation\": \"horizontal\",\n \"spacing\": \"normal\",\n \"sticky\": true,\n \"divider\": true,\n \"placement\": \"afterSections\",\n \"mobile\": {\n \"position\": \"center\",\n \"orientation\": \"vertical\",\n \"collapseToMenu\": true\n }\n },\n \"formRules\": [\n {\n \"id\": \"hide-salary-inactive\",\n \"name\": \"Ocultar salario para inativos\",\n \"targetType\": \"field\",\n \"targets\": [\n \"salary\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"properties\": {\n \"visible\": false\n }\n }\n },\n {\n \"id\": \"require-termination-date\",\n \"name\": \"Exigir data de desligamento\",\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 \"required\": true,\n \"visible\": true\n }\n }\n }\n ]\n }\n}\n",
6282
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.form.json",
6515
+ "sourcePointer": "examples/ai-recipes/praxis-crud.form.json",
6283
6516
  "contentHash": "8227063c2eabebd47184ba13c83450b8cfbf880aaa61540075c2cf1a5c7d8227",
6284
6517
  "sourceKind": "component_definition",
6285
6518
  "sourceId": "praxis-crud",
@@ -6289,7 +6522,7 @@
6289
6522
  "chunkIndex": 6,
6290
6523
  "chunkKind": "recipe",
6291
6524
  "content": "{\n \"_comment\": \"Receita de CRUD alinhada ao PraxisCrud, usando acoes canonicas inferidas como baseline.\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-crud\",\n \"defaultVariantId\": \"table\",\n \"variants\": [\n {\n \"id\": \"table\",\n \"registryKey\": \"praxis-crud\",\n \"variantId\": \"table\",\n \"aiDescription\": \"CRUD table configuration only.\",\n \"tags\": [\n \"table\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change table columns or behavior inside CRUD\",\n \"examplePrompts\": [\n \"adjust the columns shown in the crud table\",\n \"enable selection in the crud table\"\n ]\n },\n {\n \"id\": \"form\",\n \"registryKey\": \"praxis-crud\",\n \"variantId\": \"form\",\n \"aiDescription\": \"CRUD form configuration only.\",\n \"tags\": [\n \"form\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change form layout or fields in CRUD\",\n \"examplePrompts\": [\n \"add a new field to the crud form\",\n \"update validation rules in the form\"\n ]\n },\n {\n \"id\": \"actions\",\n \"registryKey\": \"praxis-crud\",\n \"variantId\": \"actions\",\n \"aiDescription\": \"CRUD actions and modal behavior.\",\n \"tags\": [\n \"actions\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change CRUD actions or routes\",\n \"examplePrompts\": [\n \"add a custom action to archive records\",\n \"change the edit action to open a route\"\n ]\n }\n ]\n },\n \"component\": \"praxis-crud\",\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"defaults\": {\n \"openMode\": \"modal\",\n \"modal\": {\n \"width\": \"860px\",\n \"maxWidth\": \"95vw\",\n \"panelClass\": \"crud-dialog\",\n \"backdropStyle\": \"blur\",\n \"autoFocus\": true,\n \"restoreFocus\": true\n },\n \"back\": {\n \"strategy\": \"auto\",\n \"returnTo\": \"/employees\",\n \"confirmOnDirty\": true\n },\n \"header\": {\n \"showBack\": true,\n \"backLabel\": \"Voltar\",\n \"variant\": \"outlined\",\n \"sticky\": true,\n \"breadcrumbs\": true,\n \"divider\": true\n }\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo colaborador\",\n \"icon\": \"add\",\n \"action\": \"create\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"view\",\n \"label\": \"Visualizar\",\n \"icon\": \"visibility\",\n \"action\": \"view\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\"\n },\n {\n \"id\": \"edit-route\",\n \"label\": \"Editar na rota\",\n \"icon\": \"open_in_new\",\n \"action\": \"edit-route\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n },\n {\n \"from\": \"name\",\n \"to\": \"query\",\n \"name\": \"name\"\n }\n ],\n \"back\": {\n \"strategy\": \"navigate\",\n \"returnTo\": \"/employees\"\n }\n }\n ],\n \"table\": {\n \"meta\": {\n \"version\": \"2.0.0\",\n \"id\": \"employees-table\",\n \"name\": \"Colaboradores\",\n \"description\": \"Listagem de colaboradores ativos e inativos\",\n \"idField\": \"id\"\n },\n \"columns\": [\n {\n \"field\": \"id\",\n \"header\": \"ID\",\n \"type\": \"string\",\n \"width\": \"80px\",\n \"visible\": false\n },\n {\n \"field\": \"name\",\n \"header\": \"Nome\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"resizable\": true,\n \"sticky\": \"start\"\n },\n {\n \"field\": \"email\",\n \"header\": \"Email\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"status\",\n \"header\": \"Status\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"valueMapping\": {\n \"ACTIVE\": \"Ativo\",\n \"INACTIVE\": \"Inativo\",\n \"ON_LEAVE\": \"Afastado\"\n },\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"textField\": \"statusLabel\",\n \"color\": \"success\",\n \"variant\": \"filled\"\n }\n },\n \"conditionalRenderers\": [\n {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"text\": \"Inativo\",\n \"color\": \"warn\",\n \"variant\": \"filled\"\n }\n },\n \"description\": \"Status inativo\",\n \"enabled\": true\n },\n {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"ON_LEAVE\"\n ]\n },\n \"renderer\": {\n \"type\": \"chip\",\n \"chip\": {\n \"text\": \"Afastado\",\n \"color\": \"accent\",\n \"variant\": \"outlined\"\n }\n },\n \"description\": \"Status afastado\",\n \"enabled\": true\n }\n ]\n },\n {\n \"field\": \"hireDate\",\n \"header\": \"Admissao\",\n \"type\": \"date\",\n \"format\": \"dd/MM/yyyy\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"salary\",\n \"header\": \"Salario\",\n \"type\": \"currency\",\n \"format\": \"BRL|symbol|2\",\n \"align\": \"right\",\n \"sortable\": true,\n \"filterable\": true\n }\n ],\n \"toolbar\": {\n \"visible\": true,\n \"position\": \"top\",\n \"title\": \"Colaboradores\",\n \"subtitle\": \"Gerencie cadastro, status e remuneracao\",\n \"layout\": {\n \"alignment\": \"space-between\",\n \"showSeparator\": true\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo\",\n \"icon\": \"add\",\n \"type\": \"button\",\n \"color\": \"primary\",\n \"position\": \"end\",\n \"action\": \"create\"\n },\n {\n \"id\": \"export\",\n \"label\": \"Exportar\",\n \"icon\": \"download\",\n \"type\": \"menu\",\n \"position\": \"end\",\n \"action\": \"export\",\n \"children\": [\n {\n \"id\": \"export-csv\",\n \"label\": \"CSV\",\n \"icon\": \"table_view\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportCsv\"\n },\n {\n \"id\": \"export-excel\",\n \"label\": \"Excel\",\n \"icon\": \"grid_on\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportExcel\"\n }\n ]\n }\n ],\n \"filters\": {\n \"enabled\": true,\n \"showAdvancedButton\": true\n },\n \"settingsMenu\": {\n \"enabled\": true,\n \"options\": [\n {\n \"id\": \"density\",\n \"label\": \"Densidade\",\n \"type\": \"select\",\n \"options\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n }\n ]\n }\n },\n \"behavior\": {\n \"pagination\": {\n \"enabled\": true,\n \"pageSize\": 20,\n \"pageSizeOptions\": [\n 10,\n 20,\n 50\n ],\n \"showFirstLastButtons\": true,\n \"showPageNumbers\": true,\n \"showPageInfo\": true,\n \"position\": \"bottom\",\n \"style\": \"default\",\n \"strategy\": \"server\"\n },\n \"sorting\": {\n \"enabled\": true,\n \"defaultSort\": {\n \"column\": \"name\",\n \"direction\": \"asc\"\n },\n \"multiSort\": false,\n \"strategy\": \"server\",\n \"showSortIndicators\": true,\n \"indicatorPosition\": \"end\",\n \"allowClearSort\": true\n },\n \"filtering\": {\n \"enabled\": true,\n \"columnFilters\": {\n \"enabled\": true,\n \"defaultType\": \"text\",\n \"position\": \"header\"\n },\n \"advancedFilters\": {\n \"enabled\": true,\n \"queryBuilder\": true,\n \"savePresets\": true\n },\n \"strategy\": \"server\",\n \"debounceTime\": 300\n },\n \"selection\": {\n \"enabled\": true,\n \"type\": \"multiple\",\n \"mode\": \"checkbox\",\n \"allowSelectAll\": true,\n \"checkboxPosition\": \"start\",\n \"persistSelection\": false,\n \"persistOnDataUpdate\": false\n },\n \"interaction\": {\n \"rowClick\": {\n \"enabled\": true,\n \"action\": \"view\"\n },\n \"rowDoubleClick\": {\n \"enabled\": true,\n \"action\": \"edit\"\n },\n \"hover\": {\n \"enabled\": true,\n \"highlightRow\": true,\n \"showActionsOnHover\": true\n },\n \"keyboard\": {\n \"enabled\": true\n }\n }\n },\n \"actions\": {\n \"row\": {\n \"enabled\": true,\n \"position\": \"end\",\n \"display\": \"icons\",\n \"trigger\": \"hover\",\n \"width\": \"140px\",\n \"actions\": [\n {\n \"id\": \"view\",\n \"label\": \"Ver\",\n \"icon\": \"visibility\",\n \"action\": \"view\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\",\n \"requiresConfirmation\": true\n }\n ],\n \"header\": {\n \"label\": \"Acoes\",\n \"align\": \"center\"\n }\n },\n \"bulk\": {\n \"enabled\": true,\n \"position\": \"toolbar\",\n \"actions\": [\n {\n \"id\": \"bulk-delete\",\n \"label\": \"Excluir selecionados\",\n \"icon\": \"delete\",\n \"action\": \"deleteSelected\",\n \"requiresConfirmation\": true,\n \"minSelections\": 1\n }\n ],\n \"floating\": {\n \"position\": \"bottom-right\",\n \"hideWhenEmpty\": true\n }\n },\n \"confirmations\": {\n \"default\": {\n \"title\": \"Confirmar acao\",\n \"message\": \"Deseja continuar?\",\n \"confirmText\": \"Confirmar\",\n \"cancelText\": \"Cancelar\"\n },\n \"specific\": {\n \"delete\": {\n \"title\": \"Excluir colaborador\",\n \"message\": \"Esta acao nao pode ser desfeita.\",\n \"confirmText\": \"Excluir\",\n \"cancelText\": \"Cancelar\"\n }\n }\n }\n },\n \"export\": {\n \"enabled\": true,\n \"formats\": [\n \"csv\",\n \"excel\"\n ],\n \"general\": {\n \"includeHeaders\": true,\n \"respectFilters\": true,\n \"applyFormatting\": true,\n \"defaultFileName\": \"colaboradores\",\n \"includeColumns\": [\n \"id\",\n \"name\",\n \"email\",\n \"status\",\n \"hireDate\",\n \"salary\"\n ]\n },\n \"excel\": {\n \"sheetName\": \"Colaboradores\",\n \"includeFormulas\": false,\n \"freezeHeaders\": true,\n \"autoFitColumns\": true\n },\n \"csv\": {\n \"delimiter\": \";\",\n \"escapeChar\": \"\\\"\",\n \"encoding\": \"utf-8\",\n \"includeBOM\": true\n }\n },\n \"messages\": {\n \"states\": {\n \"loading\": \"Carregando colaboradores...\",\n \"empty\": \"Nenhum colaborador encontrado.\",\n \"error\": \"Erro ao carregar dados.\",\n \"noResults\": \"Sem resultados para o filtro atual.\",\n \"loadingMore\": \"Carregando mais registros...\"\n },\n \"actions\": {\n \"confirmations\": {\n \"delete\": \"Excluir este colaborador?\",\n \"deleteMultiple\": \"Excluir os colaboradores selecionados?\",\n \"save\": \"Salvar alteracoes?\",\n \"cancel\": \"Cancelar edicao?\",\n \"export\": \"Exportar dados agora?\"\n },\n \"success\": {\n \"save\": \"Colaborador salvo com sucesso.\",\n \"delete\": \"Colaborador excluido.\",\n \"export\": \"Exportacao concluida.\"\n },\n \"errors\": {\n \"save\": \"Falha ao salvar.\",\n \"delete\": \"Falha ao excluir.\",\n \"export\": \"Falha ao exportar.\"\n }\n }\n },\n \"localization\": {\n \"locale\": \"pt-BR\",\n \"direction\": \"ltr\",\n \"dateTime\": {\n \"dateFormat\": \"dd/MM/yyyy\",\n \"timeFormat\": \"HH:mm\",\n \"dateTimeFormat\": \"dd/MM/yyyy HH:mm\",\n \"firstDayOfWeek\": 1\n }\n },\n \"appearance\": {\n \"density\": \"comfortable\",\n \"borders\": {\n \"showRowBorders\": true,\n \"showColumnBorders\": false,\n \"showOuterBorder\": true,\n \"style\": \"solid\",\n \"width\": 1,\n \"color\": \"#e0e0e0\"\n }\n }\n },\n \"form\": {\n \"metadata\": {\n \"version\": \"2.0\",\n \"source\": \"local\",\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 },\n \"api\": {\n \"saveEndpoint\": \"/api/employees\",\n \"loadEndpoint\": \"/api/employees/${id}\",\n \"saveMethod\": \"POST\",\n \"timeout\": 15000,\n \"headers\": {\n \"X-Module\": \"HR\"\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 \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 200\n },\n \"messages\": {\n \"createRegistrySuccess\": \"Colaborador criado com sucesso.\",\n \"updateRegistrySuccess\": \"Colaborador atualizado com sucesso.\",\n \"createRegistryError\": \"Falha ao criar colaborador.\",\n \"updateRegistryError\": \"Falha ao atualizar colaborador.\",\n \"confirmations\": {\n \"submit\": \"Deseja salvar as alteracoes?\",\n \"cancel\": \"Descartar alteracoes?\",\n \"reset\": \"Limpar o formulario?\"\n },\n \"customActions\": {\n \"archive\": {\n \"confirmation\": \"Arquivar este colaborador?\"\n }\n },\n \"loading\": {\n \"submit\": \"Salvando...\",\n \"cancel\": \"Cancelando...\"\n }\n },\n \"hints\": {\n \"dataModes\": {\n \"create\": \"Preencha os dados para criar um novo colaborador.\",\n \"edit\": \"Atualize os dados e salve as alteracoes.\",\n \"view\": \"Visualize os dados do colaborador.\"\n },\n \"uiModes\": {\n \"presentation\": \"Modo apresentacao mostra somente 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 \"beforeSubmit\": [\n {\n \"id\": \"sanitize-employee\",\n \"priority\": 100,\n \"args\": {\n \"trimStrings\": true\n }\n }\n ],\n \"afterSubmit\": [\n {\n \"id\": \"notify-success\",\n \"args\": {\n \"messageKey\": \"employeeSaved\"\n }\n }\n ],\n \"onError\": [\n {\n \"id\": \"notify-error\",\n \"args\": {\n \"messageKey\": \"employeeSaveError\"\n }\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\": \"Campo ID oculto, gerenciado pelo backend.\"\n },\n {\n \"name\": \"name\",\n \"label\": \"Nome completo\",\n \"controlType\": \"input\",\n \"dataType\": \"text\",\n \"placeholder\": \"Ex.: Ana Souza\",\n \"prefixIcon\": \"person\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 3\n }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"dataType\": \"email\",\n \"placeholder\": \"nome@empresa.com\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"phone\",\n \"label\": \"Telefone\",\n \"controlType\": \"phone\",\n \"placeholder\": \"(11) 99999-0000\",\n \"mask\": \"(99) 99999-9999\"\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Ativo\",\n \"value\": \"ACTIVE\"\n },\n {\n \"text\": \"Inativo\",\n \"value\": \"INACTIVE\"\n },\n {\n \"text\": \"Afastado\",\n \"value\": \"ON_LEAVE\"\n }\n ],\n \"defaultValue\": \"ACTIVE\",\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n },\n {\n \"name\": \"hireDate\",\n \"label\": \"Data de admissao\",\n \"controlType\": \"date\",\n \"dataType\": \"date\"\n },\n {\n \"name\": \"terminationDate\",\n \"label\": \"Data de desligamento\",\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\": \"department\",\n \"label\": \"Departamento\",\n \"controlType\": \"select\",\n \"endpoint\": \"/api/departments\",\n \"valueField\": \"id\",\n \"displayField\": \"name\"\n },\n {\n \"name\": \"role\",\n \"label\": \"Cargo\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Analista\",\n \"value\": \"ANALYST\"\n },\n {\n \"text\": \"Coordenador\",\n \"value\": \"COORD\"\n },\n {\n \"text\": \"Gerente\",\n \"value\": \"MANAGER\"\n }\n ]\n },\n {\n \"name\": \"managerId\",\n \"label\": \"Gestor\",\n \"controlType\": \"autoComplete\",\n \"endpoint\": \"/api/employees?role=manager\",\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"filterField\": \"name\"\n },\n {\n \"name\": \"salary\",\n \"label\": \"Salario\",\n \"controlType\": \"currency\",\n \"dataType\": \"number\",\n \"format\": \"BRL|symbol|2\",\n \"validators\": {\n \"min\": 0\n }\n },\n {\n \"name\": \"workMode\",\n \"label\": \"Regime\",\n \"controlType\": \"radio\",\n \"options\": [\n {\n \"text\": \"CLT\",\n \"value\": \"CLT\"\n },\n {\n \"text\": \"PJ\",\n \"value\": \"PJ\"\n },\n {\n \"text\": \"Estagio\",\n \"value\": \"INTERN\"\n }\n ],\n \"defaultValue\": \"CLT\"\n },\n {\n \"name\": \"notes\",\n \"label\": \"Observacoes\",\n \"controlType\": \"textarea\",\n \"validators\": {\n \"maxLength\": 500\n },\n \"hint\": \"Informacoes adicionais relevantes ao cadastro.\"\n },\n {\n \"name\": \"isActive\",\n \"label\": \"Ativo\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true\n },\n {\n \"name\": \"avatar\",\n \"label\": \"Foto\",\n \"controlType\": \"upload\",\n \"accept\": \".png,.jpg,.jpeg\",\n \"multiple\": false,\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n }\n ],\n \"sections\": [\n {\n \"id\": \"basic\",\n \"title\": \"Dados basicos\",\n \"description\": \"Informacoes pessoais e status.\",\n \"icon\": \"person\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"titleStyle\": \"titleMedium\",\n \"descriptionStyle\": \"bodyMedium\",\n \"rows\": [\n {\n \"id\": \"row-basic-1\",\n \"columns\": [\n {\n \"id\": \"col-basic-1\",\n \"fields\": [\n \"name\",\n \"email\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n },\n \"padding\": 8\n },\n {\n \"id\": \"col-basic-2\",\n \"fields\": [\n \"status\",\n \"hireDate\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-basic-2\",\n \"columns\": [\n {\n \"id\": \"col-basic-3\",\n \"fields\": [\n \"phone\",\n \"managerId\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-basic-4\",\n \"fields\": [\n \"department\",\n \"role\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"employment\",\n \"title\": \"Contrato\",\n \"icon\": \"badge\",\n \"rows\": [\n {\n \"id\": \"row-employment-1\",\n \"columns\": [\n {\n \"id\": \"col-employment-1\",\n \"fields\": [\n \"salary\",\n \"workMode\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-employment-2\",\n \"fields\": [\n \"terminationDate\",\n \"notes\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"attachments\",\n \"title\": \"Arquivos\",\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 ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n },\n \"align\": \"center\"\n }\n ]\n }\n ]\n }\n ],\n \"actions\": {\n \"submit\": {\n \"visible\": true,\n \"label\": \"Salvar\",\n \"color\": \"primary\",\n \"variant\": \"raised\",\n \"type\": \"submit\",\n \"shortcut\": \"Ctrl+S\"\n },\n \"cancel\": {\n \"visible\": true,\n \"label\": \"Cancelar\",\n \"type\": \"button\"\n },\n \"reset\": {\n \"visible\": true,\n \"label\": \"Limpar\",\n \"type\": \"reset\"\n },\n \"custom\": [\n {\n \"id\": \"archive\",\n \"visible\": true,\n \"label\": \"Arquivar\",\n \"icon\": \"archive\",\n \"color\": \"warn\",\n \"variant\": \"stroked\",\n \"action\": \"archive\"\n }\n ],\n \"position\": \"right\",\n \"orientation\": \"horizontal\",\n \"spacing\": \"normal\",\n \"sticky\": true,\n \"divider\": true,\n \"placement\": \"afterSections\",\n \"mobile\": {\n \"position\": \"center\",\n \"orientation\": \"vertical\",\n \"collapseToMenu\": true\n }\n },\n \"formRules\": [\n {\n \"id\": \"hide-salary-inactive\",\n \"name\": \"Ocultar salario para inativos\",\n \"targetType\": \"field\",\n \"targets\": [\n \"salary\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"properties\": {\n \"visible\": false\n }\n }\n },\n {\n \"id\": \"require-termination-date\",\n \"name\": \"Exigir data de desligamento\",\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 \"required\": true,\n \"visible\": true\n }\n }\n }\n ]\n },\n \"i18n\": {\n \"crudDialog\": {\n \"createTitle\": \"Novo colaborador\",\n \"editTitle\": \"Editar colaborador\",\n \"viewTitle\": \"Detalhes do colaborador\",\n \"deleteTitle\": \"Confirmar exclusao\",\n \"deleteConfirm\": \"Tem certeza que deseja excluir este colaborador?\"\n }\n }\n}\n",
6292
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.json",
6525
+ "sourcePointer": "examples/ai-recipes/praxis-crud.json",
6293
6526
  "contentHash": "06e59c307b678f36ea3defd5575431711bde03ab88ec6d964b30fed6b9010424",
6294
6527
  "sourceKind": "component_definition",
6295
6528
  "sourceId": "praxis-crud",
@@ -6299,7 +6532,7 @@
6299
6532
  "chunkIndex": 7,
6300
6533
  "chunkKind": "recipe",
6301
6534
  "content": "{\n \"_comment\": \"Variant focused on CRUD table configuration.\",\n \"templateMeta\": {\n \"variantId\": \"table\",\n \"variantOf\": \"praxis-crud\",\n \"registryKey\": \"praxis-crud\",\n \"tags\": [\n \"table\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change table columns or behavior inside CRUD\",\n \"examplePrompts\": [\n \"adjust the columns shown in the crud table\",\n \"enable selection in the crud table\"\n ]\n },\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"table\": {\n \"meta\": {\n \"version\": \"2.0.0\",\n \"id\": \"employees-table\",\n \"name\": \"Colaboradores\",\n \"description\": \"Listagem de colaboradores ativos e inativos\",\n \"idField\": \"id\"\n },\n \"columns\": [\n {\n \"field\": \"id\",\n \"header\": \"ID\",\n \"type\": \"string\",\n \"width\": \"80px\",\n \"visible\": false\n },\n {\n \"field\": \"name\",\n \"header\": \"Nome\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"resizable\": true,\n \"sticky\": \"start\"\n },\n {\n \"field\": \"email\",\n \"header\": \"Email\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"status\",\n \"header\": \"Status\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"valueMapping\": {\n \"ACTIVE\": \"Ativo\",\n \"INACTIVE\": \"Inativo\",\n \"ON_LEAVE\": \"Afastado\"\n },\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"textField\": \"statusLabel\",\n \"color\": \"success\",\n \"variant\": \"filled\"\n }\n },\n \"conditionalRenderers\": [\n {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"INACTIVE\"\n ]\n },\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"text\": \"Inativo\",\n \"color\": \"warn\",\n \"variant\": \"filled\"\n }\n },\n \"description\": \"Status inativo\",\n \"enabled\": true\n },\n {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"status\"\n },\n \"ON_LEAVE\"\n ]\n },\n \"renderer\": {\n \"type\": \"chip\",\n \"chip\": {\n \"text\": \"Afastado\",\n \"color\": \"accent\",\n \"variant\": \"outlined\"\n }\n },\n \"description\": \"Status afastado\",\n \"enabled\": true\n }\n ]\n },\n {\n \"field\": \"hireDate\",\n \"header\": \"Admissao\",\n \"type\": \"date\",\n \"format\": \"dd/MM/yyyy\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"salary\",\n \"header\": \"Salario\",\n \"type\": \"currency\",\n \"format\": \"BRL|symbol|2\",\n \"align\": \"right\",\n \"sortable\": true,\n \"filterable\": true\n }\n ],\n \"toolbar\": {\n \"visible\": true,\n \"position\": \"top\",\n \"title\": \"Colaboradores\",\n \"subtitle\": \"Gerencie cadastro, status e remuneracao\",\n \"layout\": {\n \"alignment\": \"space-between\",\n \"showSeparator\": true\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo\",\n \"icon\": \"add\",\n \"type\": \"button\",\n \"color\": \"primary\",\n \"position\": \"end\",\n \"action\": \"create\"\n },\n {\n \"id\": \"export\",\n \"label\": \"Exportar\",\n \"icon\": \"download\",\n \"type\": \"menu\",\n \"position\": \"end\",\n \"action\": \"export\",\n \"children\": [\n {\n \"id\": \"export-csv\",\n \"label\": \"CSV\",\n \"icon\": \"table_view\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportCsv\"\n },\n {\n \"id\": \"export-excel\",\n \"label\": \"Excel\",\n \"icon\": \"grid_on\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportExcel\"\n }\n ]\n }\n ],\n \"filters\": {\n \"enabled\": true,\n \"showAdvancedButton\": true\n },\n \"settingsMenu\": {\n \"enabled\": true,\n \"options\": [\n {\n \"id\": \"density\",\n \"label\": \"Densidade\",\n \"type\": \"select\",\n \"options\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n }\n ]\n }\n },\n \"behavior\": {\n \"pagination\": {\n \"enabled\": true,\n \"pageSize\": 20,\n \"pageSizeOptions\": [\n 10,\n 20,\n 50\n ],\n \"showFirstLastButtons\": true,\n \"showPageNumbers\": true,\n \"showPageInfo\": true,\n \"position\": \"bottom\",\n \"style\": \"default\",\n \"strategy\": \"server\"\n },\n \"sorting\": {\n \"enabled\": true,\n \"defaultSort\": {\n \"column\": \"name\",\n \"direction\": \"asc\"\n },\n \"multiSort\": false,\n \"strategy\": \"server\",\n \"showSortIndicators\": true,\n \"indicatorPosition\": \"end\",\n \"allowClearSort\": true\n },\n \"filtering\": {\n \"enabled\": true,\n \"columnFilters\": {\n \"enabled\": true,\n \"defaultType\": \"text\",\n \"position\": \"header\"\n },\n \"advancedFilters\": {\n \"enabled\": true,\n \"queryBuilder\": true,\n \"savePresets\": true\n },\n \"strategy\": \"server\",\n \"debounceTime\": 300\n },\n \"selection\": {\n \"enabled\": true,\n \"type\": \"multiple\",\n \"mode\": \"checkbox\",\n \"allowSelectAll\": true,\n \"checkboxPosition\": \"start\",\n \"persistSelection\": false,\n \"persistOnDataUpdate\": false\n },\n \"interaction\": {\n \"rowClick\": {\n \"enabled\": true,\n \"action\": \"view\"\n },\n \"rowDoubleClick\": {\n \"enabled\": true,\n \"action\": \"edit\"\n },\n \"hover\": {\n \"enabled\": true,\n \"highlightRow\": true,\n \"showActionsOnHover\": true\n },\n \"keyboard\": {\n \"enabled\": true\n }\n }\n },\n \"actions\": {\n \"row\": {\n \"enabled\": true,\n \"position\": \"end\",\n \"display\": \"icons\",\n \"trigger\": \"hover\",\n \"width\": \"140px\",\n \"actions\": [\n {\n \"id\": \"view\",\n \"label\": \"Ver\",\n \"icon\": \"visibility\",\n \"action\": \"view\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\",\n \"requiresConfirmation\": true\n }\n ],\n \"header\": {\n \"label\": \"Acoes\",\n \"align\": \"center\"\n }\n },\n \"bulk\": {\n \"enabled\": true,\n \"position\": \"toolbar\",\n \"actions\": [\n {\n \"id\": \"bulk-delete\",\n \"label\": \"Excluir selecionados\",\n \"icon\": \"delete\",\n \"action\": \"deleteSelected\",\n \"requiresConfirmation\": true,\n \"minSelections\": 1\n }\n ],\n \"floating\": {\n \"position\": \"bottom-right\",\n \"hideWhenEmpty\": true\n }\n },\n \"confirmations\": {\n \"default\": {\n \"title\": \"Confirmar acao\",\n \"message\": \"Deseja continuar?\",\n \"confirmText\": \"Confirmar\",\n \"cancelText\": \"Cancelar\"\n },\n \"specific\": {\n \"delete\": {\n \"title\": \"Excluir colaborador\",\n \"message\": \"Esta acao nao pode ser desfeita.\",\n \"confirmText\": \"Excluir\",\n \"cancelText\": \"Cancelar\"\n }\n }\n }\n },\n \"export\": {\n \"enabled\": true,\n \"formats\": [\n \"csv\",\n \"excel\"\n ],\n \"general\": {\n \"includeHeaders\": true,\n \"respectFilters\": true,\n \"applyFormatting\": true,\n \"defaultFileName\": \"colaboradores\",\n \"includeColumns\": [\n \"id\",\n \"name\",\n \"email\",\n \"status\",\n \"hireDate\",\n \"salary\"\n ]\n },\n \"excel\": {\n \"sheetName\": \"Colaboradores\",\n \"includeFormulas\": false,\n \"freezeHeaders\": true,\n \"autoFitColumns\": true\n },\n \"csv\": {\n \"delimiter\": \";\",\n \"escapeChar\": \"\\\"\",\n \"encoding\": \"utf-8\",\n \"includeBOM\": true\n }\n },\n \"messages\": {\n \"states\": {\n \"loading\": \"Carregando colaboradores...\",\n \"empty\": \"Nenhum colaborador encontrado.\",\n \"error\": \"Erro ao carregar dados.\",\n \"noResults\": \"Sem resultados para o filtro atual.\",\n \"loadingMore\": \"Carregando mais registros...\"\n },\n \"actions\": {\n \"confirmations\": {\n \"delete\": \"Excluir este colaborador?\",\n \"deleteMultiple\": \"Excluir os colaboradores selecionados?\",\n \"save\": \"Salvar alteracoes?\",\n \"cancel\": \"Cancelar edicao?\",\n \"export\": \"Exportar dados agora?\"\n },\n \"success\": {\n \"save\": \"Colaborador salvo com sucesso.\",\n \"delete\": \"Colaborador excluido.\",\n \"export\": \"Exportacao concluida.\"\n },\n \"errors\": {\n \"save\": \"Falha ao salvar.\",\n \"delete\": \"Falha ao excluir.\",\n \"export\": \"Falha ao exportar.\"\n }\n }\n },\n \"localization\": {\n \"locale\": \"pt-BR\",\n \"direction\": \"ltr\",\n \"dateTime\": {\n \"dateFormat\": \"dd/MM/yyyy\",\n \"timeFormat\": \"HH:mm\",\n \"dateTimeFormat\": \"dd/MM/yyyy HH:mm\",\n \"firstDayOfWeek\": 1\n }\n },\n \"appearance\": {\n \"density\": \"comfortable\",\n \"borders\": {\n \"showRowBorders\": true,\n \"showColumnBorders\": false,\n \"showOuterBorder\": true,\n \"style\": \"solid\",\n \"width\": 1,\n \"color\": \"#e0e0e0\"\n }\n }\n }\n}\n",
6302
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.table.json",
6535
+ "sourcePointer": "examples/ai-recipes/praxis-crud.table.json",
6303
6536
  "contentHash": "cf2d27ab74a88936603ef2278f9666e25212438a5a625b27945d198eae6bccbd",
6304
6537
  "sourceKind": "component_definition",
6305
6538
  "sourceId": "praxis-crud",
@@ -6315,77 +6548,93 @@
6315
6548
  {
6316
6549
  "name": "data",
6317
6550
  "type": "CrudDialogData",
6318
- "required": false
6551
+ "required": false,
6552
+ "description": "Dialog payload with metadata, action, and inputs.",
6553
+ "label": "Dialog Data"
6319
6554
  },
6320
6555
  {
6321
6556
  "name": "data.metadata",
6322
6557
  "type": "CrudMetadata",
6323
- "required": false
6558
+ "required": false,
6559
+ "description": "CRUD metadata with resource, table, and defaults."
6324
6560
  },
6325
6561
  {
6326
6562
  "name": "data.metadata.form",
6327
6563
  "type": "FormConfig",
6328
- "required": false
6564
+ "required": false,
6565
+ "description": "Form configuration forwarded to PraxisDynamicForm for modal and drawer CRUD actions. Its title is used as dialog title fallback when the action does not provide a label."
6329
6566
  },
6330
6567
  {
6331
6568
  "name": "data.action",
6332
6569
  "type": "CrudAction",
6333
- "required": false
6570
+ "required": false,
6571
+ "description": "Action definition for create/edit/view."
6334
6572
  },
6335
6573
  {
6336
6574
  "name": "data.inputs",
6337
6575
  "type": "Record<string, unknown>",
6338
- "required": false
6576
+ "required": false,
6577
+ "description": "Input values used to resolve resourceId and params."
6339
6578
  },
6340
6579
  {
6341
6580
  "name": "data.inputs.layoutPolicy",
6342
6581
  "type": "DynamicFormLayoutPolicy",
6343
- "required": false
6582
+ "required": false,
6583
+ "description": "Optional schema-driven layout policy forwarded to PraxisDynamicForm."
6344
6584
  },
6345
6585
  {
6346
6586
  "name": "data.metadata.resource.path",
6347
6587
  "type": "string",
6348
- "required": false
6588
+ "required": false,
6589
+ "description": "Resource path used by the form and humanized as the last dialog title fallback for create, edit and view actions."
6349
6590
  },
6350
6591
  {
6351
6592
  "name": "data.metadata.resource.title",
6352
6593
  "type": "string | null",
6353
- "required": false
6594
+ "required": false,
6595
+ "description": "Business title used to derive contextual create, edit and view dialog titles when the action does not provide a label."
6354
6596
  },
6355
6597
  {
6356
6598
  "name": "data.metadata.resource.formTitle",
6357
6599
  "type": "string | null",
6358
- "required": false
6600
+ "required": false,
6601
+ "description": "Optional form-specific business title used before the generic resource title for CRUD dialog chrome."
6359
6602
  },
6360
6603
  {
6361
6604
  "name": "data.metadata.resource.endpointKey",
6362
6605
  "type": "ApiEndpoint",
6363
- "required": false
6606
+ "required": false,
6607
+ "description": "Endpoint key for API routing."
6364
6608
  },
6365
6609
  {
6366
6610
  "name": "data.metadata.resource.idField",
6367
6611
  "type": "string | number",
6368
- "required": false
6612
+ "required": false,
6613
+ "description": "Field name used as resource identifier."
6369
6614
  },
6370
6615
  {
6371
6616
  "name": "data.metadata.defaults.modal",
6372
6617
  "type": "DialogConfig",
6373
- "required": false
6618
+ "required": false,
6619
+ "description": "Dialog defaults (size, behavior)."
6374
6620
  },
6375
6621
  {
6376
6622
  "name": "data.metadata.defaults.back",
6377
6623
  "type": "BackConfig",
6378
- "required": false
6624
+ "required": false,
6625
+ "description": "Default back navigation settings."
6379
6626
  },
6380
6627
  {
6381
6628
  "name": "data.action.formId",
6382
6629
  "type": "string",
6383
- "required": false
6630
+ "required": false,
6631
+ "description": "Form ID used for dialog state and storage."
6384
6632
  },
6385
6633
  {
6386
6634
  "name": "data.action.action",
6387
6635
  "type": "string",
6388
- "required": false
6636
+ "required": false,
6637
+ "description": "Action type (create/edit/view)."
6389
6638
  }
6390
6639
  ],
6391
6640
  "outputs": [],
@@ -10708,7 +10957,7 @@
10708
10957
  "chunkIndex": 0,
10709
10958
  "chunkKind": "summary",
10710
10959
  "content": "Component ID: praxis-dynamic-form-dialog-host\nSelector: praxis-dynamic-form-dialog-host\nFriendly Name: Praxis Dynamic Form Dialog Host\nDescription: Dialog host that renders PraxisDynamicForm for CRUD actions.\nCategory: form\nLib/Package: @praxisui/crud\nTags: dialog, crud, form, host\nInputs:\n - data (CrudDialogData)\n - data.metadata (CrudMetadata)\n - data.metadata.form (FormConfig)\n - data.action (CrudAction)\n - data.inputs (Record<string, unknown>)\n - data.inputs.layoutPolicy (DynamicFormLayoutPolicy)\n - data.metadata.resource.path (string)\n - data.metadata.resource.title (string | null)\n - data.metadata.resource.formTitle (string | null)\n - data.metadata.resource.endpointKey (ApiEndpoint)\n - data.metadata.resource.idField (string | number)\n - data.metadata.defaults.modal (DialogConfig)\n - data.metadata.defaults.back (BackConfig)\n - data.action.formId (string)\n - data.action.action (string)\n",
10711
- "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
10960
+ "sourcePointer": "projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
10712
10961
  "contentHash": "9264365b82044e927a733022524e3f77ba7ee5f29fdee263866c4f682a0b8592",
10713
10962
  "sourceKind": "component_definition",
10714
10963
  "sourceId": "praxis-dynamic-form-dialog-host",
@@ -10718,7 +10967,7 @@
10718
10967
  "chunkIndex": 1,
10719
10968
  "chunkKind": "capabilities",
10720
10969
  "content": "Schema Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versão da configuração do formulário para controle de migração.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuração do formulário.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da última atualização da configuração (ISO-8601).\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: ID do schema de origem para reconciliação no servidor.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema usado para compor o formulário.\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema de origem.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operação do schema (ex.: \"get\", \"post\").\n - Path: metadata.schemaContext.schemaType\n Category: metadata\n Kind: enum\n Description: Tipo do schema (response/request).\n - Path: metadata.schemaContext.internal\n Category: metadata\n Kind: boolean\n Description: Indica se o schema é interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema (se aplicável).\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema (se aplicável).\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash dos dados do servidor para detecção de mudanças.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizações manuais aplicadas ao formulário.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Array de metadados dos campos. Usado para referenciar a configuração de campos.\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: helpPresentation\n Category: appearance\n Kind: object\n Description: Politica visual do formulario para exibir hint/helpText dos campos sem alterar a semantica publicada pelos DTOs.\n - Path: helpPresentation.display\n Category: appearance\n Kind: enum\n Description: Define se a ajuda semantica dos campos fica inline, em icone de ajuda, automatica por densidade, ou oculta visualmente.\n - Path: helpPresentation.inlineMaxLength\n Category: appearance\n Kind: number\n Description: Tamanho maximo para manter ajuda inline quando display=\"auto\".\n - Path: helpPresentation.preferPopoverForControls\n Category: appearance\n Kind: array\n Description: Tipos de controle que devem preferir icone de ajuda quando display=\"auto\", como toggle, checkbox ou select.\n - Path: editorialContext\n Category: editorial\n Kind: object\n Description: Contexto editorial compartilhado entre os blocos hospedados antes/depois do formulario.\n - Path: editorialContext.[token]\n Category: editorial\n Kind: string\n Description: Valor simples exposto no contexto editorial.\n - Path: formBlocksBefore\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado antes do formulario.\n - Path: formBlocksBefore.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content.\n - Path: formBlocksBefore.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content editorial.\n - Path: formBlocksBefore.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes do formulario.\n - Path: formBlocksBefore.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes do formulario.\n - Path: formBlocksBefore.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content hospedado antes do formulario.\n - Path: formBlocksBeforeActions\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois das seções e antes da área principal de ações.\n - Path: formBlocksBeforeActions.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content antes das ações.\n - Path: formBlocksBeforeActions.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados antes da área principal de ações.\n - Path: formBlocksBeforeActions.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado antes da área principal de ações.\n - Path: formBlocksBeforeActions.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content antes das ações.\n - Path: formBlocksAfter\n Category: editorial\n Kind: object\n Description: RichContentDocument renderizado depois do formulario inteiro, incluindo a área principal de ações.\n - Path: formBlocksAfter.kind\n Category: editorial\n Kind: string\n Description: Kind canonico do documento rich content de fechamento.\n - Path: formBlocksAfter.version\n Category: editorial\n Kind: string\n Description: Versao do documento rich content de fechamento.\n - Path: formBlocksAfter.nodes\n Category: editorial\n Kind: array\n Description: Lista de RichBlockNode renderizados depois do formulario.\n - Path: formBlocksAfter.nodes[]\n Category: editorial\n Kind: object\n Description: RichBlockNode editorial hospedado depois do formulario.\n - Path: formBlocksAfter.context\n Category: editorial\n Kind: object\n Description: Contexto base opcional do documento rich content de fechamento.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID único da seção.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Título exibido para cada seção do formulário.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descrição auxiliar exibida abaixo do título da seção.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Nome do ícone (Material Icons) para o cabeçalho da seção.\n - Path: sections[].sectionHeader\n Category: layout\n Kind: object\n Description: Configuração rica do header visual da seção, com suporte a avatar por imagem, iniciais ou modo automático.\n - Path: sections[].sectionHeader.mode\n Category: layout\n Kind: enum\n Description: Estratégia visual do header da seção.\n - Path: sections[].sectionHeader.sourceField\n Category: layout\n Kind: string\n Description: Campo do formulário usado como origem da imagem do avatar.\n - Path: sections[].sectionHeader.initialsSourceField\n Category: layout\n Kind: string\n Description: Campo textual usado para derivar iniciais do avatar.\n - Path: sections[].sectionHeader.altField\n Category: layout\n Kind: string\n Description: Campo textual usado como texto acessivel do avatar e como fallback textual para iniciais quando initialsSourceField nao estiver definido.\n - Path: sections[].sectionHeader.fallbackIcon\n Category: layout\n Kind: string\n Description: Ícone opcional usado quando o avatar dinâmico estiver vazio ou inválido.\n - Path: sections[].sectionHeader.emptyState\n Category: layout\n Kind: enum\n Description: Comportamento do header quando os campos de origem ainda não possuem valor.\n - Path: sections[].sectionHeader.size\n Category: layout\n Kind: enum\n Description: Tamanho semântico do avatar da seção, materializado pelo runtime via tokens.\n - Path: sections[].sectionHeader.initialsMaxLength\n Category: layout\n Kind: number\n Description: Máximo de letras exibidas no avatar textual.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Define se a seção pode ser colapsada/expandida pelo usuário.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial da seção (colapsada/expandida) quando `collapsible` é true.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após a seção.\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo do título da seção.\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) abaixo da descrição da seção.\n - Path: sections[].appearance\n Category: appearance\n Kind: enum\n Description: Preset visual do container/cabeçalho da seção.\n - Path: sections[].stepLabel\n Category: content\n Kind: string\n Description: Rótulo curto do passo exibido antes do título da seção.\n - Path: sections[].titleStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para o título da seção.\n - Path: sections[].descriptionStyle\n Category: appearance\n Kind: enum\n Description: Preset de tipografia para a descrição da seção.\n - Path: sections[].titleColor\n Category: appearance\n Kind: string\n Description: Cor do título da seção (CSS color ou token).\n - Path: sections[].descriptionColor\n Category: appearance\n Kind: string\n Description: Cor da descrição da seção (CSS color ou token).\n - Path: sections[].headerAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento horizontal do conteúdo do cabeçalho da seção.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Texto de tooltip para o cabeçalho da seção.\n - Path: sections[].headerActions\n Category: layout\n Kind: array\n Description: Lista de ações iconográficas renderizadas no canto direito do cabeçalho da seção.\n - Path: sections[].headerActions[].id\n Category: layout\n Kind: string\n Description: ID estável da ação de cabeçalho da seção.\n - Path: sections[].headerActions[].label\n Category: layout\n Kind: string\n Description: Label acessível usada em tooltip e aria-label da ação.\n - Path: sections[].headerActions[].icon\n Category: layout\n Kind: string\n Description: Ícone renderizado na ação do cabeçalho da seção.\n - Path: sections[].headerActions[].action\n Category: layout\n Kind: string\n Description: Nome opcional da ação emitida no customAction; se ausente, o runtime usa o ID.\n - Path: sections[].headerActions[].tooltip\n Category: layout\n Kind: string\n Description: Tooltip opcional da ação; se ausente, o runtime usa a label.\n - Path: sections[].headerActions[].color\n Category: appearance\n Kind: enum\n Description: Tom visual da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].visible\n Category: layout\n Kind: boolean\n Description: Controla a visibilidade da ação do cabeçalho da seção.\n - Path: sections[].headerActions[].disabled\n Category: layout\n Kind: boolean\n Description: Controla o estado desabilitado da ação do cabeçalho da seção.\n - Path: sections[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da seção.\n - Path: sections[].styles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da seção.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID único da linha dentro de uma seção.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Título interno da linha (usado em editores e labels).\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaçamento horizontal (em px) entre colunas nesta linha.\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaçamento vertical (em px) após esta linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID único da coluna dentro de uma linha.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Título interno da coluna (usado em editores e labels).\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Atributo data-testid aplicado ao container da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Projeção legada/derivada dos itens kind:\"field\" dentro da coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo dentro da projeção legada/derivada da coluna.\n - Path: sections[].rows[].columns[].items\n Category: layout\n Kind: array\n Description: Lista canônica ordenada de itens da coluna: campos e blocos visuais.\n - Path: sections[].rows[].columns[].items[].kind\n Category: layout\n Kind: enum\n Description: Tipo do item de layout da coluna.\n - Path: sections[].rows[].columns[].items[].id\n Category: layout\n Kind: string\n Description: ID estável do item de layout dentro do formulário.\n - Path: sections[].rows[].columns[].items[].fieldName\n Category: layout\n Kind: string\n Description: Nome do campo quando kind é \"field\".\n - Path: sections[].rows[].columns[].items[].document\n Category: editorial\n Kind: object\n Description: RichContentDocument do bloco visual quando kind é \"richContent\".\n - Path: sections[].rows[].columns[].items[].layout\n Category: editorial\n Kind: enum\n Description: Modo de renderização do bloco visual richContent dentro da coluna.\n - Path: sections[].rows[].columns[].items[].rootClassName\n Category: appearance\n Kind: string\n Description: Classe CSS opcional aplicada ao bloco visual richContent.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Largura da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Largura da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Largura da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Largura da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra pequenas (xs) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset da coluna para telas pequenas (sm) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset da coluna para telas médias (md) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset da coluna para telas grandes (lg) no grid system (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset da coluna para telas extra grandes (xl) no grid system (1-12).\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas médias (md).\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Ordem visual da coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra pequenas (xs).\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas pequenas (sm).\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas médias (md).\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas grandes (lg).\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Oculta a coluna para telas extra grandes (xl).\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento vertical do conteúdo da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding (em px) interno da coluna.\n - Path: sections[].rows[].columns[].className\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada à coluna.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botão de submissão.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de submissão.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de submissão.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de submissão.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botão de submissão.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de submissão.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de submissão.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de submissão.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de submissão.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de submissão.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de submissão.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de submissão.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de submissão.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+s\") para o botão de submissão.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botão de cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botão de cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"esc\") para o botão de cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botão de reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botão de reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Rótulo do botão de reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para o botão de reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botão de reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botão de reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho do botão de reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada ao botão de reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados ao botão de reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Desabilita o botão de reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo do botão de reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido no botão de reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento no botão de reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ex.: \"ctrl+shift+r\") para o botão de reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Lista de botões de ação customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuração de um botão de ação customizado.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID da ação customizada.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade da ação customizada.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Rótulo da ação customizada.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Ícone (Material Icons) para a ação customizada.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor da ação customizada.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual da ação customizada.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho da ação customizada.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS aplicada à ação customizada.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilos inline aplicados à ação customizada.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Desabilita a ação customizada.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo do botão da ação customizada.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Evento customizado disparado ao clicar.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip exibido na ação customizada.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Exibe estado de carregamento na ação customizada.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado para a ação customizada.\n - Path: actions.position\n Category: layout\n Kind: enum\n Description: Posicionamento horizontal da barra de ações.\n - Path: actions.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões dentro da barra de ações (horizontal/vertical).\n - Path: actions.spacing\n Category: layout\n Kind: enum\n Description: Espaçamento entre os botões na barra de ações.\n - Path: actions.sticky\n Category: layout\n Kind: boolean\n Description: Define se a barra de ações deve permanecer visível ao rolar a página.\n - Path: actions.divider\n Category: layout\n Kind: boolean\n Description: Exibe um divisor superior acima da barra de ações.\n - Path: actions.placement\n Category: layout\n Kind: enum\n Description: Localização estrutural da barra de ações no layout.\n - Path: actions.mobile.position\n Category: layout\n Kind: enum\n Description: Posicionamento da barra de ações em dispositivos móveis.\n - Path: actions.mobile.orientation\n Category: layout\n Kind: enum\n Description: Orientação dos botões em dispositivos móveis.\n - Path: actions.mobile.collapseToMenu\n Category: behavior\n Kind: boolean\n Description: Em mobile, agrupa ações em um menu (se houver muitas).\n - Path: actions.containerClassName\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao container da barra de ações.\n - Path: actions.containerStyles\n Category: appearance\n Kind: object\n Description: Estilos inline aplicados ao container da barra de ações.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de submit.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de cancel.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de cancel.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: controla visibilidade do botão de reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: rótulo do botão de reset.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Exibe um alerta se o usuário tentar sair com mudanças não salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Habilita rastreamento de histórico para desfazer/refazer (se suportado).\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Ao submeter, foca automaticamente no primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Ao submeter, rola a página para exibir o primeiro erro.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulário após uma submissão bem-sucedida.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: URL para redirecionar após uma submissão bem-sucedida.\n - Path: behavior.reactiveValidation\n Category: validation\n Kind: boolean\n Description: Ativa validação reativa (em tempo real) em `valueChanges`.\n - Path: behavior.reactiveValidationDebounceMs\n Category: validation\n Kind: number\n Description: Debounce (em ms) para a validação reativa.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: URL para onde os dados do formulário serão enviados (POST/PUT/PATCH).\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: URL para buscar dados para popular o formulário (GET).\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Método HTTP para a requisição de salvar.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Tempo limite (em ms) para as requisições API.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Cabeçalhos HTTP personalizados para as requisições API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Nome do campo que representa o ID do registro no payload (para PUT/PATCH).\n - Path: api.beforeSave\n Category: hooks\n Kind: expression\n Description: Hook para pré-processamento de dados antes de enviar para a API.\n - Path: api.afterLoad\n Category: hooks\n Kind: expression\n Description: Hook para pós-processamento de dados após carregar da API.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após atualização de registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso após criação de registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após atualização de registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro após criação de registro.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de submeter o formulário.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de cancelar.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Mensagem de confirmação antes de resetar o formulário.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para ações customizadas. Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da ação customizada (success/error/confirmation). Substitua `[actionId]` pelo ID da ação.\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Mensagem de sucesso para a ação customizada.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Mensagem de erro para a ação customizada.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Mensagem de confirmação para a ação customizada.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o envio do formulário.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o cancelamento.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem exibida durante o reset do formulário.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem exibida durante a execução de uma ação customizada. Substitua `[actionId]` pelo ID da ação.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID único da regra de layout.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome amigável da regra de layout.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descrição da regra de layout para documentação.\n - Path: formRules[].metadata.origin\n Category: rules\n Kind: enum\n Description: Origem da regra sugerida pela IA.\n - Path: formRules[].metadata.reviewStatus\n Category: rules\n Kind: enum\n Description: Status de revisão humana da regra sugerida pela IA.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo do elemento alvo da regra (campo, seção, ação, linha, coluna ou bloco visual).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra (quando properties não forem informadas).\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: Lista de IDs dos elementos alvo da regra. O tipo do ID depende de `targetType`.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo da regra.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para alvos de campo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formCommandRules\n Category: rules\n Kind: array\n Description: Regras condicionais de comando avaliadas depois que formRules estabilizam valores calculados.\n - Path: formCommandRules[].condition\n Category: rules\n Kind: expression\n Description: Condicao Json Logic avaliada sobre formData estabilizado, incluindo field values calculados.\n - Path: formCommandRules[].effects[].kind\n Category: rules\n Kind: enum\n Description: Tipo do efeito de comando. O primeiro corte suporta apenas global-action.\n - Path: formCommandRules[].effects[].globalAction\n Category: rules\n Kind: object\n Description: GlobalActionRef estruturado executado por GlobalActionService.executeRef quando a regra entra na condicao.\n - Path: formCommandRules[].policy\n Category: rules\n Kind: object\n Description: Politica operacional do comando: trigger, distinct, distinctBy, debounceMs, errorPolicy e runOnInitialEvaluation.\n - Path: formRulesState\n Category: metadata\n Kind: object\n Description: Estado interno do builder visual de regras, gerado apenas para round-trip do editor.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declarações de hooks por estágio do ciclo de vida do formulário.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Declarações de hooks para onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook (registrado no host).\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook (maior executa primeiro).\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout em ms para a execucao do hook.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos adicionais passados ao hook.\n - Path: hints.dataModes.create\n Category: form_config\n Kind: string\n Description: Dica para o modo de criação de dados.\n - Path: hints.dataModes.edit\n Category: form_config\n Kind: string\n Description: Dica para o modo de edição de dados.\n - Path: hints.dataModes.view\n Category: form_config\n Kind: string\n Description: Dica para o modo de visualização de dados.\n - Path: hints.uiModes.presentation\n Category: form_config\n Kind: string\n Description: Dica para o modo de apresentação da UI.\n - Path: hints.uiModes.readonly\n Category: form_config\n Kind: string\n Description: Dica para o modo de somente leitura da UI.\n - Path: hints.uiModes.disabled\n Category: form_config\n Kind: string\n Description: Dica para o modo desabilitado da UI.\n - Path: hints.uiModes.visible\n Category: form_config\n Kind: string\n Description: Dica para o modo de visibilidade da UI.\n - Path: fieldMetadata[].id\n Category: identity\n Kind: string\n Description: Identificador unico da instancia do componente.\n - Path: fieldMetadata[].version\n Category: identity\n Kind: string\n Description: Versao do schema de metadata (migracao).\n - Path: fieldMetadata[].context\n Category: identity\n Kind: enum\n Description: Contexto de uso do componente (form/filter/table/dialog/standalone).\n - Path: fieldMetadata[].createdAt\n Category: misc\n Kind: string\n Description: Timestamp de criacao (ISO).\n - Path: fieldMetadata[].updatedAt\n Category: misc\n Kind: string\n Description: Timestamp de atualizacao (ISO).\n - Path: fieldMetadata[].tags\n Category: identity\n Kind: array\n Description: Tags para categorizacao e busca.\n - Path: fieldMetadata[].cssClass\n Category: appearance\n Kind: string\n Description: Classe CSS aplicada ao host do componente.\n - Path: fieldMetadata[].style\n Category: appearance\n Kind: object\n Description: Estilos inline (objeto CSS).\n - Path: fieldMetadata[].dataAttributes\n Category: data\n Kind: object\n Description: Data attributes para teste/analytics.\n - Path: fieldMetadata[].name\n Category: identity\n Kind: string\n Description: Identificador único do campo. Essencial para binding.\n - Path: fieldMetadata[].label\n Category: identity\n Kind: string\n Description: Rótulo principal exibido para o usuário.\n - Path: fieldMetadata[].placeholder\n Category: identity\n Kind: string\n Description: Texto temporário exibido quando vazio.\n - Path: fieldMetadata[].hint\n Category: identity\n Kind: string\n Description: Texto de ajuda exibido abaixo do campo.\n - Path: fieldMetadata[].helpText\n Category: identity\n Kind: string\n Description: Texto semântico de ajuda publicado pelo schema/DTO.\n - Path: fieldMetadata[].tooltip\n Category: identity\n Kind: string\n Description: Texto exibido ao passar o mouse.\n - Path: fieldMetadata[].tooltipOnHover\n Category: identity\n Kind: boolean\n Description: Habilita apresentação do tooltip no hover quando suportado pelo renderer.\n - Path: fieldMetadata[].description\n Category: identity\n Kind: string\n Description: Descrição detalhada (usada em documentação ou helps extensos).\n - Path: fieldMetadata[].selectionMode\n Category: behavior\n Kind: enum\n Description: Semântica de seleção explícita para controles de escolha.\n - Path: fieldMetadata[].variant\n Category: appearance\n Kind: string\n Description: Variante visual/semântica do controle.\n - Path: fieldMetadata[].density\n Category: appearance\n Kind: enum\n Description: Densidade visual do shell do controle.\n - Path: fieldMetadata[].links\n Category: identity\n Kind: array\n Description: Links ricos associados ao campo, úteis em consentimentos e conteúdo legal.\n - Path: fieldMetadata[].group\n Category: identity\n Kind: string\n Description: Agrupador lógico do campo.\n - Path: fieldMetadata[].order\n Category: layout\n Kind: number\n Description: Ordem de exibição do campo.\n - Path: fieldMetadata[].width\n Category: layout\n Kind: string\n Description: Largura do campo (ex: 50%, 100px).\n - Path: fieldMetadata[].isFlex\n Category: layout\n Kind: boolean\n Description: Se true, usa flex-grow para preencher espaço.\n - Path: fieldMetadata[].controlType\n Category: behavior\n Kind: enum\n Description: Tipo do componente de UI (input, select, datepicker, etc).\n - Path: fieldMetadata[].dataType\n Category: data\n Kind: enum\n Description: Tipo de dado do campo (text, number, date, etc).\n - Path: fieldMetadata[].source\n Category: data\n Kind: enum\n Description: Origem semântica do campo. Use local para campos do host que não vêm do schema backend.\n - Path: fieldMetadata[].transient\n Category: data\n Kind: boolean\n Description: Marca o campo como temporário/local para preenchimento. O dynamic-form omite do submit por padrão.\n - Path: fieldMetadata[].submitPolicy\n Category: behavior\n Kind: enum\n Description: Política de submit para sobrescrever o padrão de campos locais/transient.\n - Path: fieldMetadata[].materialDesign.appearance\n Category: appearance\n Kind: enum\n Description: Aparência do campo Material (fill/outline).\n - Path: fieldMetadata[].materialDesign.color\n Category: appearance\n Kind: enum\n Description: Tema de cor Material (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.floatLabel\n Category: appearance\n Kind: enum\n Description: Comportamento do rótulo flutuante.\n - Path: fieldMetadata[].materialDesign.subscriptSizing\n Category: appearance\n Kind: enum\n Description: Estratégia de sizing do subscript (erros/hints).\n - Path: fieldMetadata[].materialDesign.hideRequiredMarker\n Category: appearance\n Kind: boolean\n Description: Oculta o asterisco de campo obrigatório.\n - Path: fieldMetadata[].materialDesign.density\n Category: appearance\n Kind: enum\n Description: Densidade do campo Material.\n - Path: fieldMetadata[].materialDesign.disableRipple\n Category: appearance\n Kind: boolean\n Description: Desativa ripple/ondulação em componentes Material.\n - Path: fieldMetadata[].materialDesign.customPalette\n Category: appearance\n Kind: object\n Description: Override de paleta (primary/accent/warn).\n - Path: fieldMetadata[].materialDesign.animations\n Category: appearance\n Kind: object\n Description: Configuração de animações (disable, duration, easing).\n - Path: fieldMetadata[].prefixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido antes do valor.\n - Path: fieldMetadata[].suffixIcon\n Category: appearance\n Kind: string\n Description: Ícone exibido depois do valor.\n - Path: fieldMetadata[].iconPosition\n Category: appearance\n Kind: enum\n Description: Posição preferencial do ícone principal.\n - Path: fieldMetadata[].iconSize\n Category: appearance\n Kind: enum\n Description: Tamanho do ícone.\n - Path: fieldMetadata[].iconColor\n Category: appearance\n Kind: string\n Description: Cor semântica ou token de cor aplicado ao ícone principal.\n - Path: fieldMetadata[].iconClass\n Category: appearance\n Kind: string\n Description: Classe CSS controlada pelo host para o ícone principal.\n - Path: fieldMetadata[].iconStyle\n Category: appearance\n Kind: string\n Description: Estilo visual semântico do ícone quando o renderer suportar variações.\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\nComponent Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.layoutPolicy\n Category: inputs\n Kind: object\n Description: Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.\n - Path: inputs.layoutPolicy.source\n Category: inputs\n Kind: enum\n Description: Define se o layout vem de configuracao authorada ou do schema.\n - Path: inputs.layoutPolicy.preset\n Category: inputs\n Kind: enum\n Description: Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit.\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n - Path: inputs.layoutPolicy.persistence\n Category: inputs\n Kind: enum\n Description: Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito.\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n - Path: inputs.fieldIconPolicy\n Category: inputs\n Kind: enum\n Description: Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
10721
- "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
10970
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
10722
10971
  "contentHash": "c05a6371db5ac065bf75223cf06663456383933d63d8fe60f7d4588cffb5ac69",
10723
10972
  "sourceKind": "component_definition",
10724
10973
  "sourceId": "praxis-dynamic-form-dialog-host",
@@ -10728,7 +10977,7 @@
10728
10977
  "chunkIndex": 2,
10729
10978
  "chunkKind": "context_pack",
10730
10979
  "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {},\n \"actionCatalog\": [\n {\n \"id\": \"inputs.formId.set\",\n \"intentExamples\": [\n \"form id\",\n \"formulario\",\n \"identificador\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"formId\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.resourcePath.set\",\n \"intentExamples\": [\n \"resource path\",\n \"endpoint\",\n \"api\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"resourcePath\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.mode.set\",\n \"intentExamples\": [\n \"modo\",\n \"mode\",\n \"create\",\n \"edit\",\n \"view\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"mode\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.schemaSource.set\",\n \"intentExamples\": [\n \"schema source\",\n \"schema\",\n \"resource\",\n \"filter\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"schemaSource\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.layoutPolicy.schemaDetail\",\n \"intentExamples\": [\n \"layout schema detail\",\n \"detalhe agrupado\",\n \"readonly agrupado\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"layoutPolicy\": {\n \"source\": \"schema\",\n \"intent\": \"detail\",\n \"preset\": \"compactPresentation\",\n \"lifecycle\": \"live\",\n \"persistence\": \"transient\",\n \"schemaOperation\": \"detail\",\n \"schemaType\": \"response\"\n }\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.enable\",\n \"intentExamples\": [\n \"enable edit\",\n \"modo edicao\",\n \"edit layout\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": true\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.disable\",\n \"intentExamples\": [\n \"disable edit\",\n \"somente leitura\",\n \"no edit\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": false\n }\n }\n }\n ],\n \"fieldResolvers\": {},\n \"hints\": [\n \"Dialog host: patches operate over inputs.*.\",\n \"Use mode=create|edit|view and schemaSource=resource|filter.\"\n ]\n }\n}",
10731
- "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/dynamic-form-dialog-host-context-pack.ts",
10980
+ "sourcePointer": "projects/praxis-crud/src/lib/ai/dynamic-form-dialog-host-context-pack.ts",
10732
10981
  "contentHash": "764c843c42c97c7f28ddc4e35455b4faff7d2ea90d4120572bef2b97c4b08ee9",
10733
10982
  "sourceKind": "component_definition",
10734
10983
  "sourceId": "praxis-dynamic-form-dialog-host",