@praxisui/manual-form 9.0.0-beta.7 → 9.0.0-beta.71

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.
@@ -0,0 +1,4336 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "generatedAt": "2026-07-11T00:12:06.404Z",
4
+ "packageName": "@praxisui/manual-form",
5
+ "packageVersion": "9.0.0-beta.71",
6
+ "sourceRegistry": "praxis-component-registry-ingestion",
7
+ "sourceRegistryVersion": "1.0.0",
8
+ "componentCount": 1,
9
+ "components": {
10
+ "praxis-manual-form": {
11
+ "id": "praxis-manual-form",
12
+ "description": "Form builder with manual field selection and layout controls.",
13
+ "category": "form",
14
+ "inputs": [],
15
+ "outputs": [],
16
+ "configSchemaId": null,
17
+ "selector": "praxis-manual-form",
18
+ "friendlyName": "Praxis Manual Form",
19
+ "tags": [
20
+ "widget",
21
+ "form",
22
+ "configurable"
23
+ ],
24
+ "lib": "@praxisui/manual-form",
25
+ "source": "projects/praxis-manual-form/src/lib/praxis-manual-form.metadata.ts",
26
+ "exportName": "PRAXIS_MANUAL_FORM_COMPONENT_METADATA",
27
+ "componentCapabilities": [
28
+ {
29
+ "path": "metadata.version",
30
+ "category": "metadata",
31
+ "valueKind": "string",
32
+ "description": "Versao da configuracao do formulario."
33
+ },
34
+ {
35
+ "path": "metadata.source",
36
+ "category": "metadata",
37
+ "valueKind": "enum",
38
+ "allowedValues": [
39
+ "local",
40
+ "server",
41
+ "default"
42
+ ],
43
+ "description": "Origem da configuracao."
44
+ },
45
+ {
46
+ "path": "metadata.title",
47
+ "category": "metadata",
48
+ "valueKind": "string",
49
+ "description": "Titulo exibido no cabecalho quando formTitle nao for informado."
50
+ },
51
+ {
52
+ "path": "metadata.description",
53
+ "category": "metadata",
54
+ "valueKind": "string",
55
+ "description": "Descricao exibida no cabecalho quando formDescription nao for informado."
56
+ },
57
+ {
58
+ "path": "metadata.lastUpdated",
59
+ "category": "metadata",
60
+ "valueKind": "string",
61
+ "description": "Timestamp da ultima atualizacao.",
62
+ "safetyNotes": "Valor de auditoria; preferir preenchimento pelo host."
63
+ },
64
+ {
65
+ "path": "metadata.schemaId",
66
+ "category": "metadata",
67
+ "valueKind": "string",
68
+ "description": "Identificador do schema usado na composicao."
69
+ },
70
+ {
71
+ "path": "metadata.serverHash",
72
+ "category": "metadata",
73
+ "valueKind": "string",
74
+ "description": "Hash do schema/servidor para reconciliacao."
75
+ },
76
+ {
77
+ "path": "metadata.schemaContext",
78
+ "category": "metadata",
79
+ "valueKind": "object",
80
+ "description": "Contexto do schema (path/operation/schemaType)."
81
+ },
82
+ {
83
+ "path": "metadata.schemaContext.path",
84
+ "category": "metadata",
85
+ "valueKind": "string",
86
+ "description": "Path do schema usado para compor o formulario."
87
+ },
88
+ {
89
+ "path": "metadata.schemaContext.operation",
90
+ "category": "metadata",
91
+ "valueKind": "string",
92
+ "description": "Operacao do schema (ex: GET/POST)."
93
+ },
94
+ {
95
+ "path": "metadata.schemaContext.schemaType",
96
+ "category": "metadata",
97
+ "valueKind": "enum",
98
+ "allowedValues": [
99
+ "response",
100
+ "request"
101
+ ],
102
+ "description": "Tipo do schema (response/request)."
103
+ },
104
+ {
105
+ "path": "metadata.schemaContext.internal",
106
+ "category": "metadata",
107
+ "valueKind": "boolean",
108
+ "description": "Marca schema como interno."
109
+ },
110
+ {
111
+ "path": "metadata.schemaContext.tenant",
112
+ "category": "metadata",
113
+ "valueKind": "string",
114
+ "description": "Tenant do schema."
115
+ },
116
+ {
117
+ "path": "metadata.schemaContext.locale",
118
+ "category": "metadata",
119
+ "valueKind": "string",
120
+ "description": "Locale do schema."
121
+ },
122
+ {
123
+ "path": "metadata.customizations",
124
+ "category": "metadata",
125
+ "valueKind": "array",
126
+ "description": "Log de customizacoes.",
127
+ "safetyNotes": "Usado para auditoria; nao gerar automaticamente."
128
+ },
129
+ {
130
+ "path": "metadata.customizations[]",
131
+ "category": "metadata",
132
+ "valueKind": "object",
133
+ "description": "Registro de customizacao."
134
+ },
135
+ {
136
+ "path": "metadata.customizations[].fieldName",
137
+ "category": "metadata",
138
+ "valueKind": "string",
139
+ "description": "Campo customizado."
140
+ },
141
+ {
142
+ "path": "metadata.customizations[].property",
143
+ "category": "metadata",
144
+ "valueKind": "string",
145
+ "description": "Propriedade alterada."
146
+ },
147
+ {
148
+ "path": "metadata.customizations[].oldValue",
149
+ "category": "metadata",
150
+ "valueKind": "object",
151
+ "description": "Valor anterior."
152
+ },
153
+ {
154
+ "path": "metadata.customizations[].newValue",
155
+ "category": "metadata",
156
+ "valueKind": "object",
157
+ "description": "Novo valor."
158
+ },
159
+ {
160
+ "path": "metadata.customizations[].timestamp",
161
+ "category": "metadata",
162
+ "valueKind": "string",
163
+ "description": "Timestamp da alteracao (ISO)."
164
+ },
165
+ {
166
+ "path": "metadata.customizations[].source",
167
+ "category": "metadata",
168
+ "valueKind": "enum",
169
+ "allowedValues": [
170
+ "user",
171
+ "server",
172
+ "system"
173
+ ],
174
+ "description": "Origem da alteracao."
175
+ },
176
+ {
177
+ "path": "fieldMetadata",
178
+ "category": "fields",
179
+ "valueKind": "array",
180
+ "critical": true,
181
+ "description": "Metadados dos campos (FieldMetadata).",
182
+ "safetyNotes": "Use o catalogo base FieldMetadata para detalhes de campos."
183
+ },
184
+ {
185
+ "path": "fieldMetadata[]",
186
+ "category": "fields",
187
+ "valueKind": "object",
188
+ "critical": true,
189
+ "description": "Item de metadados do campo (FieldMetadata).",
190
+ "safetyNotes": "Use o catalogo base FieldMetadata para detalhes de campos."
191
+ },
192
+ {
193
+ "path": "sections[]",
194
+ "category": "layout",
195
+ "valueKind": "object",
196
+ "description": "Secao do formulario."
197
+ },
198
+ {
199
+ "path": "sections[].id",
200
+ "category": "layout",
201
+ "valueKind": "string",
202
+ "description": "ID da secao."
203
+ },
204
+ {
205
+ "path": "sections[].title",
206
+ "category": "layout",
207
+ "valueKind": "string",
208
+ "description": "Titulo da secao."
209
+ },
210
+ {
211
+ "path": "sections[].description",
212
+ "category": "layout",
213
+ "valueKind": "string",
214
+ "description": "Descricao da secao."
215
+ },
216
+ {
217
+ "path": "sections[].icon",
218
+ "category": "layout",
219
+ "valueKind": "string",
220
+ "description": "Icone da secao."
221
+ },
222
+ {
223
+ "path": "sections[].collapsible",
224
+ "category": "layout",
225
+ "valueKind": "boolean",
226
+ "description": "Secao recolhivel."
227
+ },
228
+ {
229
+ "path": "sections[].collapsed",
230
+ "category": "layout",
231
+ "valueKind": "boolean",
232
+ "description": "Estado inicial recolhido."
233
+ },
234
+ {
235
+ "path": "sections[].gapBottom",
236
+ "category": "layout",
237
+ "valueKind": "number",
238
+ "description": "Espaco extra apos a secao (px)."
239
+ },
240
+ {
241
+ "path": "sections[].titleGapBottom",
242
+ "category": "layout",
243
+ "valueKind": "number",
244
+ "description": "Espaco abaixo do titulo (px)."
245
+ },
246
+ {
247
+ "path": "sections[].descriptionGapBottom",
248
+ "category": "layout",
249
+ "valueKind": "number",
250
+ "description": "Espaco abaixo da descricao (px)."
251
+ },
252
+ {
253
+ "path": "sections[].titleStyle",
254
+ "category": "layout",
255
+ "valueKind": "enum",
256
+ "allowedValues": [
257
+ "titleLarge",
258
+ "titleMedium",
259
+ "titleSmall",
260
+ "headlineSmall"
261
+ ],
262
+ "description": "Preset tipografico do titulo."
263
+ },
264
+ {
265
+ "path": "sections[].descriptionStyle",
266
+ "category": "layout",
267
+ "valueKind": "enum",
268
+ "allowedValues": [
269
+ "bodyLarge",
270
+ "bodyMedium",
271
+ "bodySmall"
272
+ ],
273
+ "description": "Preset tipografico da descricao."
274
+ },
275
+ {
276
+ "path": "sections[].titleColor",
277
+ "category": "layout",
278
+ "valueKind": "string",
279
+ "description": "Cor do titulo."
280
+ },
281
+ {
282
+ "path": "sections[].descriptionColor",
283
+ "category": "layout",
284
+ "valueKind": "string",
285
+ "description": "Cor da descricao."
286
+ },
287
+ {
288
+ "path": "sections[].headerAlign",
289
+ "category": "layout",
290
+ "valueKind": "enum",
291
+ "allowedValues": [
292
+ "start",
293
+ "center"
294
+ ],
295
+ "description": "Alinhamento do header."
296
+ },
297
+ {
298
+ "path": "sections[].headerTooltip",
299
+ "category": "layout",
300
+ "valueKind": "string",
301
+ "description": "Tooltip do header da secao."
302
+ },
303
+ {
304
+ "path": "sections[].rows[]",
305
+ "category": "layout",
306
+ "valueKind": "object",
307
+ "description": "Linha da secao."
308
+ },
309
+ {
310
+ "path": "sections[].rows[].id",
311
+ "category": "layout",
312
+ "valueKind": "string",
313
+ "description": "ID da linha."
314
+ },
315
+ {
316
+ "path": "sections[].rows[].title",
317
+ "category": "layout",
318
+ "valueKind": "string",
319
+ "description": "Titulo da linha."
320
+ },
321
+ {
322
+ "path": "sections[].rows[].gap",
323
+ "category": "layout",
324
+ "valueKind": "number",
325
+ "description": "Espaco horizontal entre colunas (px)."
326
+ },
327
+ {
328
+ "path": "sections[].rows[].rowGap",
329
+ "category": "layout",
330
+ "valueKind": "number",
331
+ "description": "Espaco vertical apos a linha (px)."
332
+ },
333
+ {
334
+ "path": "sections[].rows[].columns[]",
335
+ "category": "layout",
336
+ "valueKind": "object",
337
+ "description": "Coluna da linha."
338
+ },
339
+ {
340
+ "path": "sections[].rows[].columns[].id",
341
+ "category": "layout",
342
+ "valueKind": "string",
343
+ "description": "ID da coluna."
344
+ },
345
+ {
346
+ "path": "sections[].rows[].columns[].title",
347
+ "category": "layout",
348
+ "valueKind": "string",
349
+ "description": "Titulo da coluna."
350
+ },
351
+ {
352
+ "path": "sections[].rows[].columns[].fields",
353
+ "category": "layout",
354
+ "valueKind": "array",
355
+ "description": "Campos associados a coluna."
356
+ },
357
+ {
358
+ "path": "sections[].rows[].columns[].fields[]",
359
+ "category": "layout",
360
+ "valueKind": "string",
361
+ "description": "Nome do campo na coluna.",
362
+ "safetyNotes": "Use nomes presentes em fieldMetadata[].name."
363
+ },
364
+ {
365
+ "path": "sections[].rows[].columns[].span",
366
+ "category": "layout",
367
+ "valueKind": "object",
368
+ "description": "Span responsivo."
369
+ },
370
+ {
371
+ "path": "sections[].rows[].columns[].span.xs",
372
+ "category": "layout",
373
+ "valueKind": "number",
374
+ "description": "Span xs (1-12)."
375
+ },
376
+ {
377
+ "path": "sections[].rows[].columns[].span.sm",
378
+ "category": "layout",
379
+ "valueKind": "number",
380
+ "description": "Span sm (1-12)."
381
+ },
382
+ {
383
+ "path": "sections[].rows[].columns[].span.md",
384
+ "category": "layout",
385
+ "valueKind": "number",
386
+ "description": "Span md (1-12)."
387
+ },
388
+ {
389
+ "path": "sections[].rows[].columns[].span.lg",
390
+ "category": "layout",
391
+ "valueKind": "number",
392
+ "description": "Span lg (1-12)."
393
+ },
394
+ {
395
+ "path": "sections[].rows[].columns[].span.xl",
396
+ "category": "layout",
397
+ "valueKind": "number",
398
+ "description": "Span xl (1-12)."
399
+ },
400
+ {
401
+ "path": "sections[].rows[].columns[].offset",
402
+ "category": "layout",
403
+ "valueKind": "object",
404
+ "description": "Offset responsivo."
405
+ },
406
+ {
407
+ "path": "sections[].rows[].columns[].offset.xs",
408
+ "category": "layout",
409
+ "valueKind": "number",
410
+ "description": "Offset xs (1-12)."
411
+ },
412
+ {
413
+ "path": "sections[].rows[].columns[].offset.sm",
414
+ "category": "layout",
415
+ "valueKind": "number",
416
+ "description": "Offset sm (1-12)."
417
+ },
418
+ {
419
+ "path": "sections[].rows[].columns[].offset.md",
420
+ "category": "layout",
421
+ "valueKind": "number",
422
+ "description": "Offset md (1-12)."
423
+ },
424
+ {
425
+ "path": "sections[].rows[].columns[].offset.lg",
426
+ "category": "layout",
427
+ "valueKind": "number",
428
+ "description": "Offset lg (1-12)."
429
+ },
430
+ {
431
+ "path": "sections[].rows[].columns[].offset.xl",
432
+ "category": "layout",
433
+ "valueKind": "number",
434
+ "description": "Offset xl (1-12)."
435
+ },
436
+ {
437
+ "path": "sections[].rows[].columns[].order",
438
+ "category": "layout",
439
+ "valueKind": "object",
440
+ "description": "Order responsivo."
441
+ },
442
+ {
443
+ "path": "sections[].rows[].columns[].order.xs",
444
+ "category": "layout",
445
+ "valueKind": "number",
446
+ "description": "Order xs."
447
+ },
448
+ {
449
+ "path": "sections[].rows[].columns[].order.sm",
450
+ "category": "layout",
451
+ "valueKind": "number",
452
+ "description": "Order sm."
453
+ },
454
+ {
455
+ "path": "sections[].rows[].columns[].order.md",
456
+ "category": "layout",
457
+ "valueKind": "number",
458
+ "description": "Order md."
459
+ },
460
+ {
461
+ "path": "sections[].rows[].columns[].order.lg",
462
+ "category": "layout",
463
+ "valueKind": "number",
464
+ "description": "Order lg."
465
+ },
466
+ {
467
+ "path": "sections[].rows[].columns[].order.xl",
468
+ "category": "layout",
469
+ "valueKind": "number",
470
+ "description": "Order xl."
471
+ },
472
+ {
473
+ "path": "sections[].rows[].columns[].hidden",
474
+ "category": "layout",
475
+ "valueKind": "object",
476
+ "description": "Hidden responsivo."
477
+ },
478
+ {
479
+ "path": "sections[].rows[].columns[].hidden.xs",
480
+ "category": "layout",
481
+ "valueKind": "boolean",
482
+ "description": "Ocultar no xs."
483
+ },
484
+ {
485
+ "path": "sections[].rows[].columns[].hidden.sm",
486
+ "category": "layout",
487
+ "valueKind": "boolean",
488
+ "description": "Ocultar no sm."
489
+ },
490
+ {
491
+ "path": "sections[].rows[].columns[].hidden.md",
492
+ "category": "layout",
493
+ "valueKind": "boolean",
494
+ "description": "Ocultar no md."
495
+ },
496
+ {
497
+ "path": "sections[].rows[].columns[].hidden.lg",
498
+ "category": "layout",
499
+ "valueKind": "boolean",
500
+ "description": "Ocultar no lg."
501
+ },
502
+ {
503
+ "path": "sections[].rows[].columns[].hidden.xl",
504
+ "category": "layout",
505
+ "valueKind": "boolean",
506
+ "description": "Ocultar no xl."
507
+ },
508
+ {
509
+ "path": "sections[].rows[].columns[].align",
510
+ "category": "layout",
511
+ "valueKind": "enum",
512
+ "allowedValues": [
513
+ "start",
514
+ "center",
515
+ "end",
516
+ "stretch"
517
+ ],
518
+ "description": "Alinhamento da coluna."
519
+ },
520
+ {
521
+ "path": "sections[].rows[].columns[].padding",
522
+ "category": "layout",
523
+ "valueKind": "number",
524
+ "description": "Padding da coluna (px)."
525
+ },
526
+ {
527
+ "path": "sections[].rows[].columns[].className",
528
+ "category": "layout",
529
+ "valueKind": "string",
530
+ "description": "Classe CSS da coluna."
531
+ },
532
+ {
533
+ "path": "sections[].rows[].columns[].testId",
534
+ "category": "layout",
535
+ "valueKind": "string",
536
+ "description": "Test id da coluna."
537
+ },
538
+ {
539
+ "path": "actions",
540
+ "category": "actions",
541
+ "valueKind": "object",
542
+ "description": "Layout de acoes do formulario."
543
+ },
544
+ {
545
+ "path": "actions.position",
546
+ "category": "actions",
547
+ "valueKind": "enum",
548
+ "allowedValues": [
549
+ "left",
550
+ "center",
551
+ "right",
552
+ "justified",
553
+ "split"
554
+ ],
555
+ "description": "Posicao das acoes."
556
+ },
557
+ {
558
+ "path": "actions.orientation",
559
+ "category": "actions",
560
+ "valueKind": "enum",
561
+ "allowedValues": [
562
+ "horizontal",
563
+ "vertical"
564
+ ],
565
+ "description": "Orientacao das acoes."
566
+ },
567
+ {
568
+ "path": "actions.spacing",
569
+ "category": "actions",
570
+ "valueKind": "enum",
571
+ "allowedValues": [
572
+ "compact",
573
+ "normal",
574
+ "spacious"
575
+ ],
576
+ "description": "Espacamento das acoes."
577
+ },
578
+ {
579
+ "path": "actions.sticky",
580
+ "category": "actions",
581
+ "valueKind": "boolean",
582
+ "description": "Fixar barra de acoes."
583
+ },
584
+ {
585
+ "path": "actions.divider",
586
+ "category": "actions",
587
+ "valueKind": "boolean",
588
+ "description": "Exibir divisor acima das acoes."
589
+ },
590
+ {
591
+ "path": "actions.placement",
592
+ "category": "actions",
593
+ "valueKind": "enum",
594
+ "allowedValues": [
595
+ "insideLastSection",
596
+ "afterSections",
597
+ "top"
598
+ ],
599
+ "description": "Posicionamento estrutural das acoes."
600
+ },
601
+ {
602
+ "path": "actions.containerClassName",
603
+ "category": "actions",
604
+ "valueKind": "string",
605
+ "description": "Classe CSS do container de acoes."
606
+ },
607
+ {
608
+ "path": "actions.containerStyles",
609
+ "category": "actions",
610
+ "valueKind": "object",
611
+ "description": "Estilos inline do container."
612
+ },
613
+ {
614
+ "path": "actions.mobile",
615
+ "category": "actions",
616
+ "valueKind": "object",
617
+ "description": "Config para mobile."
618
+ },
619
+ {
620
+ "path": "actions.mobile.position",
621
+ "category": "actions",
622
+ "valueKind": "enum",
623
+ "allowedValues": [
624
+ "left",
625
+ "center",
626
+ "right",
627
+ "justified"
628
+ ],
629
+ "description": "Posicao das acoes no mobile."
630
+ },
631
+ {
632
+ "path": "actions.mobile.orientation",
633
+ "category": "actions",
634
+ "valueKind": "enum",
635
+ "allowedValues": [
636
+ "horizontal",
637
+ "vertical"
638
+ ],
639
+ "description": "Orientacao no mobile."
640
+ },
641
+ {
642
+ "path": "actions.mobile.collapseToMenu",
643
+ "category": "actions",
644
+ "valueKind": "boolean",
645
+ "description": "Colapsar acoes em menu."
646
+ },
647
+ {
648
+ "path": "actions.showSaveButton",
649
+ "category": "actions",
650
+ "valueKind": "boolean",
651
+ "description": "Legacy: mostrar botao salvar."
652
+ },
653
+ {
654
+ "path": "actions.submitButtonLabel",
655
+ "category": "actions",
656
+ "valueKind": "string",
657
+ "description": "Legacy: texto do submit."
658
+ },
659
+ {
660
+ "path": "actions.showCancelButton",
661
+ "category": "actions",
662
+ "valueKind": "boolean",
663
+ "description": "Legacy: mostrar cancelar."
664
+ },
665
+ {
666
+ "path": "actions.cancelButtonLabel",
667
+ "category": "actions",
668
+ "valueKind": "string",
669
+ "description": "Legacy: texto do cancelar."
670
+ },
671
+ {
672
+ "path": "actions.showResetButton",
673
+ "category": "actions",
674
+ "valueKind": "boolean",
675
+ "description": "Legacy: mostrar reset."
676
+ },
677
+ {
678
+ "path": "actions.resetButtonLabel",
679
+ "category": "actions",
680
+ "valueKind": "string",
681
+ "description": "Legacy: texto do reset."
682
+ },
683
+ {
684
+ "path": "actions.submit",
685
+ "category": "actions",
686
+ "valueKind": "object",
687
+ "description": "Botao submit."
688
+ },
689
+ {
690
+ "path": "actions.cancel",
691
+ "category": "actions",
692
+ "valueKind": "object",
693
+ "description": "Botao cancelar."
694
+ },
695
+ {
696
+ "path": "actions.reset",
697
+ "category": "actions",
698
+ "valueKind": "object",
699
+ "description": "Botao reset."
700
+ },
701
+ {
702
+ "path": "actions.custom",
703
+ "category": "actions",
704
+ "valueKind": "array",
705
+ "description": "Botoes customizados."
706
+ },
707
+ {
708
+ "path": "actions.custom[]",
709
+ "category": "actions",
710
+ "valueKind": "object",
711
+ "description": "Configuracao de botao customizado.",
712
+ "safetyNotes": "Requer action handler registrado no host."
713
+ },
714
+ {
715
+ "path": "actions.submit.id",
716
+ "category": "actions",
717
+ "valueKind": "string",
718
+ "description": "ID do botao."
719
+ },
720
+ {
721
+ "path": "actions.submit.visible",
722
+ "category": "actions",
723
+ "valueKind": "boolean",
724
+ "description": "Visibilidade."
725
+ },
726
+ {
727
+ "path": "actions.submit.label",
728
+ "category": "actions",
729
+ "valueKind": "string",
730
+ "description": "Label do botao."
731
+ },
732
+ {
733
+ "path": "actions.submit.icon",
734
+ "category": "actions",
735
+ "valueKind": "string",
736
+ "description": "Icone do botao."
737
+ },
738
+ {
739
+ "path": "actions.submit.className",
740
+ "category": "actions",
741
+ "valueKind": "string",
742
+ "description": "Classe CSS."
743
+ },
744
+ {
745
+ "path": "actions.submit.style",
746
+ "category": "actions",
747
+ "valueKind": "object",
748
+ "description": "Estilo inline."
749
+ },
750
+ {
751
+ "path": "actions.submit.color",
752
+ "category": "actions",
753
+ "valueKind": "enum",
754
+ "allowedValues": [
755
+ "primary",
756
+ "accent",
757
+ "warn",
758
+ "basic"
759
+ ],
760
+ "description": "Cor do botao."
761
+ },
762
+ {
763
+ "path": "actions.submit.disabled",
764
+ "category": "actions",
765
+ "valueKind": "boolean",
766
+ "description": "Botao desabilitado."
767
+ },
768
+ {
769
+ "path": "actions.submit.type",
770
+ "category": "actions",
771
+ "valueKind": "enum",
772
+ "allowedValues": [
773
+ "button",
774
+ "submit",
775
+ "reset"
776
+ ],
777
+ "description": "Tipo do botao."
778
+ },
779
+ {
780
+ "path": "actions.submit.action",
781
+ "category": "actions",
782
+ "valueKind": "string",
783
+ "description": "Evento custom.",
784
+ "safetyNotes": "Requer handler registrado no host."
785
+ },
786
+ {
787
+ "path": "actions.submit.tooltip",
788
+ "category": "actions",
789
+ "valueKind": "string",
790
+ "description": "Tooltip."
791
+ },
792
+ {
793
+ "path": "actions.submit.loading",
794
+ "category": "actions",
795
+ "valueKind": "boolean",
796
+ "description": "Estado loading."
797
+ },
798
+ {
799
+ "path": "actions.submit.size",
800
+ "category": "actions",
801
+ "valueKind": "enum",
802
+ "allowedValues": [
803
+ "small",
804
+ "medium",
805
+ "large"
806
+ ],
807
+ "description": "Tamanho do botao."
808
+ },
809
+ {
810
+ "path": "actions.submit.variant",
811
+ "category": "actions",
812
+ "valueKind": "enum",
813
+ "allowedValues": [
814
+ "raised",
815
+ "stroked",
816
+ "flat",
817
+ "fab"
818
+ ],
819
+ "description": "Variante visual."
820
+ },
821
+ {
822
+ "path": "actions.submit.shortcut",
823
+ "category": "actions",
824
+ "valueKind": "string",
825
+ "description": "Atalho de teclado."
826
+ },
827
+ {
828
+ "path": "actions.cancel.id",
829
+ "category": "actions",
830
+ "valueKind": "string",
831
+ "description": "ID do botao cancelar."
832
+ },
833
+ {
834
+ "path": "actions.cancel.visible",
835
+ "category": "actions",
836
+ "valueKind": "boolean",
837
+ "description": "Visibilidade do botao cancelar."
838
+ },
839
+ {
840
+ "path": "actions.cancel.label",
841
+ "category": "actions",
842
+ "valueKind": "string",
843
+ "description": "Label do botao cancelar."
844
+ },
845
+ {
846
+ "path": "actions.cancel.icon",
847
+ "category": "actions",
848
+ "valueKind": "string",
849
+ "description": "Icone do botao cancelar."
850
+ },
851
+ {
852
+ "path": "actions.cancel.className",
853
+ "category": "actions",
854
+ "valueKind": "string",
855
+ "description": "Classe CSS do botao cancelar."
856
+ },
857
+ {
858
+ "path": "actions.cancel.style",
859
+ "category": "actions",
860
+ "valueKind": "object",
861
+ "description": "Estilo inline do botao cancelar."
862
+ },
863
+ {
864
+ "path": "actions.cancel.color",
865
+ "category": "actions",
866
+ "valueKind": "enum",
867
+ "allowedValues": [
868
+ "primary",
869
+ "accent",
870
+ "warn",
871
+ "basic"
872
+ ],
873
+ "description": "Cor do botao cancelar."
874
+ },
875
+ {
876
+ "path": "actions.cancel.disabled",
877
+ "category": "actions",
878
+ "valueKind": "boolean",
879
+ "description": "Estado desabilitado do botao cancelar."
880
+ },
881
+ {
882
+ "path": "actions.cancel.type",
883
+ "category": "actions",
884
+ "valueKind": "enum",
885
+ "allowedValues": [
886
+ "button",
887
+ "submit",
888
+ "reset"
889
+ ],
890
+ "description": "Tipo HTML do botao cancelar."
891
+ },
892
+ {
893
+ "path": "actions.cancel.action",
894
+ "category": "actions",
895
+ "valueKind": "string",
896
+ "description": "Acao customizada disparada pelo botao cancelar.",
897
+ "safetyNotes": "Requer handler registrado no host."
898
+ },
899
+ {
900
+ "path": "actions.cancel.tooltip",
901
+ "category": "actions",
902
+ "valueKind": "string",
903
+ "description": "Tooltip do botao cancelar."
904
+ },
905
+ {
906
+ "path": "actions.cancel.loading",
907
+ "category": "actions",
908
+ "valueKind": "boolean",
909
+ "description": "Estado de loading do botao cancelar."
910
+ },
911
+ {
912
+ "path": "actions.cancel.size",
913
+ "category": "actions",
914
+ "valueKind": "enum",
915
+ "allowedValues": [
916
+ "small",
917
+ "medium",
918
+ "large"
919
+ ],
920
+ "description": "Tamanho visual do botao cancelar."
921
+ },
922
+ {
923
+ "path": "actions.cancel.variant",
924
+ "category": "actions",
925
+ "valueKind": "enum",
926
+ "allowedValues": [
927
+ "raised",
928
+ "stroked",
929
+ "flat",
930
+ "fab"
931
+ ],
932
+ "description": "Variante visual do botao cancelar."
933
+ },
934
+ {
935
+ "path": "actions.cancel.shortcut",
936
+ "category": "actions",
937
+ "valueKind": "string",
938
+ "description": "Atalho de teclado do botao cancelar."
939
+ },
940
+ {
941
+ "path": "actions.reset.id",
942
+ "category": "actions",
943
+ "valueKind": "string",
944
+ "description": "ID do botao reset."
945
+ },
946
+ {
947
+ "path": "actions.reset.visible",
948
+ "category": "actions",
949
+ "valueKind": "boolean",
950
+ "description": "Visibilidade do botao reset."
951
+ },
952
+ {
953
+ "path": "actions.reset.label",
954
+ "category": "actions",
955
+ "valueKind": "string",
956
+ "description": "Label do botao reset."
957
+ },
958
+ {
959
+ "path": "actions.reset.icon",
960
+ "category": "actions",
961
+ "valueKind": "string",
962
+ "description": "Icone do botao reset."
963
+ },
964
+ {
965
+ "path": "actions.reset.className",
966
+ "category": "actions",
967
+ "valueKind": "string",
968
+ "description": "Classe CSS do botao reset."
969
+ },
970
+ {
971
+ "path": "actions.reset.style",
972
+ "category": "actions",
973
+ "valueKind": "object",
974
+ "description": "Estilo inline do botao reset."
975
+ },
976
+ {
977
+ "path": "actions.reset.color",
978
+ "category": "actions",
979
+ "valueKind": "enum",
980
+ "allowedValues": [
981
+ "primary",
982
+ "accent",
983
+ "warn",
984
+ "basic"
985
+ ],
986
+ "description": "Cor do botao reset."
987
+ },
988
+ {
989
+ "path": "actions.reset.disabled",
990
+ "category": "actions",
991
+ "valueKind": "boolean",
992
+ "description": "Estado desabilitado do botao reset."
993
+ },
994
+ {
995
+ "path": "actions.reset.type",
996
+ "category": "actions",
997
+ "valueKind": "enum",
998
+ "allowedValues": [
999
+ "button",
1000
+ "submit",
1001
+ "reset"
1002
+ ],
1003
+ "description": "Tipo HTML do botao reset."
1004
+ },
1005
+ {
1006
+ "path": "actions.reset.action",
1007
+ "category": "actions",
1008
+ "valueKind": "string",
1009
+ "description": "Acao customizada disparada pelo botao reset.",
1010
+ "safetyNotes": "Requer handler registrado no host."
1011
+ },
1012
+ {
1013
+ "path": "actions.reset.tooltip",
1014
+ "category": "actions",
1015
+ "valueKind": "string",
1016
+ "description": "Tooltip do botao reset."
1017
+ },
1018
+ {
1019
+ "path": "actions.reset.loading",
1020
+ "category": "actions",
1021
+ "valueKind": "boolean",
1022
+ "description": "Estado de loading do botao reset."
1023
+ },
1024
+ {
1025
+ "path": "actions.reset.size",
1026
+ "category": "actions",
1027
+ "valueKind": "enum",
1028
+ "allowedValues": [
1029
+ "small",
1030
+ "medium",
1031
+ "large"
1032
+ ],
1033
+ "description": "Tamanho visual do botao reset."
1034
+ },
1035
+ {
1036
+ "path": "actions.reset.variant",
1037
+ "category": "actions",
1038
+ "valueKind": "enum",
1039
+ "allowedValues": [
1040
+ "raised",
1041
+ "stroked",
1042
+ "flat",
1043
+ "fab"
1044
+ ],
1045
+ "description": "Variante visual do botao reset."
1046
+ },
1047
+ {
1048
+ "path": "actions.reset.shortcut",
1049
+ "category": "actions",
1050
+ "valueKind": "string",
1051
+ "description": "Atalho de teclado do botao reset."
1052
+ },
1053
+ {
1054
+ "path": "actions.custom[].id",
1055
+ "category": "actions",
1056
+ "valueKind": "string",
1057
+ "description": "ID do botao customizado."
1058
+ },
1059
+ {
1060
+ "path": "actions.custom[].visible",
1061
+ "category": "actions",
1062
+ "valueKind": "boolean",
1063
+ "description": "Visibilidade do botao customizado."
1064
+ },
1065
+ {
1066
+ "path": "actions.custom[].label",
1067
+ "category": "actions",
1068
+ "valueKind": "string",
1069
+ "description": "Label do botao customizado."
1070
+ },
1071
+ {
1072
+ "path": "actions.custom[].icon",
1073
+ "category": "actions",
1074
+ "valueKind": "string",
1075
+ "description": "Icone do botao customizado."
1076
+ },
1077
+ {
1078
+ "path": "actions.custom[].className",
1079
+ "category": "actions",
1080
+ "valueKind": "string",
1081
+ "description": "Classe CSS do botao customizado."
1082
+ },
1083
+ {
1084
+ "path": "actions.custom[].style",
1085
+ "category": "actions",
1086
+ "valueKind": "object",
1087
+ "description": "Estilo inline do botao customizado."
1088
+ },
1089
+ {
1090
+ "path": "actions.custom[].color",
1091
+ "category": "actions",
1092
+ "valueKind": "enum",
1093
+ "allowedValues": [
1094
+ "primary",
1095
+ "accent",
1096
+ "warn",
1097
+ "basic"
1098
+ ],
1099
+ "description": "Cor do botao customizado."
1100
+ },
1101
+ {
1102
+ "path": "actions.custom[].disabled",
1103
+ "category": "actions",
1104
+ "valueKind": "boolean",
1105
+ "description": "Estado desabilitado do botao customizado."
1106
+ },
1107
+ {
1108
+ "path": "actions.custom[].type",
1109
+ "category": "actions",
1110
+ "valueKind": "enum",
1111
+ "allowedValues": [
1112
+ "button",
1113
+ "submit",
1114
+ "reset"
1115
+ ],
1116
+ "description": "Tipo HTML do botao customizado."
1117
+ },
1118
+ {
1119
+ "path": "actions.custom[].action",
1120
+ "category": "actions",
1121
+ "valueKind": "string",
1122
+ "description": "Acao customizada disparada pelo botao.",
1123
+ "safetyNotes": "Requer handler registrado no host."
1124
+ },
1125
+ {
1126
+ "path": "actions.custom[].tooltip",
1127
+ "category": "actions",
1128
+ "valueKind": "string",
1129
+ "description": "Tooltip do botao customizado."
1130
+ },
1131
+ {
1132
+ "path": "actions.custom[].loading",
1133
+ "category": "actions",
1134
+ "valueKind": "boolean",
1135
+ "description": "Estado de loading do botao customizado."
1136
+ },
1137
+ {
1138
+ "path": "actions.custom[].size",
1139
+ "category": "actions",
1140
+ "valueKind": "enum",
1141
+ "allowedValues": [
1142
+ "small",
1143
+ "medium",
1144
+ "large"
1145
+ ],
1146
+ "description": "Tamanho visual do botao customizado."
1147
+ },
1148
+ {
1149
+ "path": "actions.custom[].variant",
1150
+ "category": "actions",
1151
+ "valueKind": "enum",
1152
+ "allowedValues": [
1153
+ "raised",
1154
+ "stroked",
1155
+ "flat",
1156
+ "fab"
1157
+ ],
1158
+ "description": "Variante visual do botao customizado."
1159
+ },
1160
+ {
1161
+ "path": "actions.custom[].shortcut",
1162
+ "category": "actions",
1163
+ "valueKind": "string",
1164
+ "description": "Atalho de teclado do botao customizado."
1165
+ },
1166
+ {
1167
+ "path": "behavior",
1168
+ "category": "behavior",
1169
+ "valueKind": "object",
1170
+ "description": "Comportamento do formulario."
1171
+ },
1172
+ {
1173
+ "path": "behavior.confirmOnUnsavedChanges",
1174
+ "category": "behavior",
1175
+ "valueKind": "boolean",
1176
+ "description": "Solicita confirmacao ao sair com alteracoes nao salvas."
1177
+ },
1178
+ {
1179
+ "path": "behavior.trackHistory",
1180
+ "category": "behavior",
1181
+ "valueKind": "boolean",
1182
+ "description": "Mantem historico de alteracoes do formulario."
1183
+ },
1184
+ {
1185
+ "path": "behavior.focusFirstError",
1186
+ "category": "behavior",
1187
+ "valueKind": "boolean",
1188
+ "description": "Move o foco para o primeiro campo com erro."
1189
+ },
1190
+ {
1191
+ "path": "behavior.scrollToErrors",
1192
+ "category": "behavior",
1193
+ "valueKind": "boolean",
1194
+ "description": "Rola a tela ate a primeira area com erro de validacao."
1195
+ },
1196
+ {
1197
+ "path": "behavior.clearAfterSave",
1198
+ "category": "behavior",
1199
+ "valueKind": "boolean",
1200
+ "description": "Limpa o formulario apos salvar com sucesso."
1201
+ },
1202
+ {
1203
+ "path": "behavior.redirectAfterSave",
1204
+ "category": "behavior",
1205
+ "valueKind": "string",
1206
+ "description": "Destino de navegacao apos salvar com sucesso."
1207
+ },
1208
+ {
1209
+ "path": "behavior.reactiveValidation",
1210
+ "category": "behavior",
1211
+ "valueKind": "boolean",
1212
+ "description": "Ativa validacao reativa durante a digitacao."
1213
+ },
1214
+ {
1215
+ "path": "behavior.reactiveValidationDebounceMs",
1216
+ "category": "behavior",
1217
+ "valueKind": "number",
1218
+ "description": "Debounce em milissegundos para a validacao reativa."
1219
+ },
1220
+ {
1221
+ "path": "api",
1222
+ "category": "api",
1223
+ "valueKind": "object",
1224
+ "description": "Configuracao de API do formulario."
1225
+ },
1226
+ {
1227
+ "path": "api.saveEndpoint",
1228
+ "category": "api",
1229
+ "valueKind": "string",
1230
+ "description": "Endpoint usado para persistir os dados do formulario."
1231
+ },
1232
+ {
1233
+ "path": "api.loadEndpoint",
1234
+ "category": "api",
1235
+ "valueKind": "string",
1236
+ "description": "Endpoint usado para carregar os dados iniciais do formulario."
1237
+ },
1238
+ {
1239
+ "path": "api.saveMethod",
1240
+ "category": "api",
1241
+ "valueKind": "enum",
1242
+ "allowedValues": [
1243
+ "POST",
1244
+ "PUT",
1245
+ "PATCH"
1246
+ ],
1247
+ "description": "Metodo HTTP usado na operacao de salvamento."
1248
+ },
1249
+ {
1250
+ "path": "api.timeout",
1251
+ "category": "api",
1252
+ "valueKind": "number",
1253
+ "description": "Timeout da operacao de API em milissegundos."
1254
+ },
1255
+ {
1256
+ "path": "api.headers",
1257
+ "category": "api",
1258
+ "valueKind": "object",
1259
+ "description": "Headers HTTP adicionais enviados nas operacoes de API."
1260
+ },
1261
+ {
1262
+ "path": "api.idField",
1263
+ "category": "api",
1264
+ "valueKind": "string",
1265
+ "description": "Campo que representa o identificador primario no payload remoto."
1266
+ },
1267
+ {
1268
+ "path": "api.beforeSave",
1269
+ "category": "api",
1270
+ "valueKind": "expression",
1271
+ "description": "Hook/callback do host antes de salvar. Nao e Json Logic nem expressao computada serializavel.",
1272
+ "safetyNotes": "Deve ser fornecido pelo host."
1273
+ },
1274
+ {
1275
+ "path": "api.afterLoad",
1276
+ "category": "api",
1277
+ "valueKind": "expression",
1278
+ "description": "Hook/callback do host apos carregar. Nao e Json Logic nem expressao computada serializavel.",
1279
+ "safetyNotes": "Deve ser fornecido pelo host."
1280
+ },
1281
+ {
1282
+ "path": "messages",
1283
+ "category": "messages",
1284
+ "valueKind": "object",
1285
+ "description": "Mensagens e i18n do formulario."
1286
+ },
1287
+ {
1288
+ "path": "messages.updateRegistrySuccess",
1289
+ "category": "messages",
1290
+ "valueKind": "string",
1291
+ "description": "Mensagem de sucesso ao atualizar registro."
1292
+ },
1293
+ {
1294
+ "path": "messages.createRegistrySuccess",
1295
+ "category": "messages",
1296
+ "valueKind": "string",
1297
+ "description": "Mensagem de sucesso ao criar registro."
1298
+ },
1299
+ {
1300
+ "path": "messages.updateRegistryError",
1301
+ "category": "messages",
1302
+ "valueKind": "string",
1303
+ "description": "Mensagem de erro ao atualizar registro."
1304
+ },
1305
+ {
1306
+ "path": "messages.createRegistryError",
1307
+ "category": "messages",
1308
+ "valueKind": "string",
1309
+ "description": "Mensagem de erro ao criar registro."
1310
+ },
1311
+ {
1312
+ "path": "messages.confirmations",
1313
+ "category": "messages",
1314
+ "valueKind": "object",
1315
+ "description": "Mensagens de confirmacao."
1316
+ },
1317
+ {
1318
+ "path": "messages.confirmations.submit",
1319
+ "category": "messages",
1320
+ "valueKind": "string",
1321
+ "description": "Confirmacao de submit."
1322
+ },
1323
+ {
1324
+ "path": "messages.confirmations.cancel",
1325
+ "category": "messages",
1326
+ "valueKind": "string",
1327
+ "description": "Confirmacao de cancel."
1328
+ },
1329
+ {
1330
+ "path": "messages.confirmations.reset",
1331
+ "category": "messages",
1332
+ "valueKind": "string",
1333
+ "description": "Confirmacao de reset."
1334
+ },
1335
+ {
1336
+ "path": "messages.confirmations.[actionId]",
1337
+ "category": "messages",
1338
+ "valueKind": "string",
1339
+ "description": "Confirmacao para acao custom."
1340
+ },
1341
+ {
1342
+ "path": "messages.customActions",
1343
+ "category": "messages",
1344
+ "valueKind": "object",
1345
+ "description": "Mensagens por acao custom."
1346
+ },
1347
+ {
1348
+ "path": "messages.customActions.[actionId]",
1349
+ "category": "messages",
1350
+ "valueKind": "object",
1351
+ "description": "Mensagens da acao custom (success/error/confirmation)."
1352
+ },
1353
+ {
1354
+ "path": "messages.customActions.[actionId].success",
1355
+ "category": "messages",
1356
+ "valueKind": "string",
1357
+ "description": "Sucesso para acao custom."
1358
+ },
1359
+ {
1360
+ "path": "messages.customActions.[actionId].error",
1361
+ "category": "messages",
1362
+ "valueKind": "string",
1363
+ "description": "Erro para acao custom."
1364
+ },
1365
+ {
1366
+ "path": "messages.customActions.[actionId].confirmation",
1367
+ "category": "messages",
1368
+ "valueKind": "string",
1369
+ "description": "Confirmacao para acao custom."
1370
+ },
1371
+ {
1372
+ "path": "messages.loading",
1373
+ "category": "messages",
1374
+ "valueKind": "object",
1375
+ "description": "Mensagens de loading."
1376
+ },
1377
+ {
1378
+ "path": "messages.loading.submit",
1379
+ "category": "messages",
1380
+ "valueKind": "string",
1381
+ "description": "Mensagem de loading no submit."
1382
+ },
1383
+ {
1384
+ "path": "messages.loading.cancel",
1385
+ "category": "messages",
1386
+ "valueKind": "string",
1387
+ "description": "Mensagem de loading no cancel."
1388
+ },
1389
+ {
1390
+ "path": "messages.loading.reset",
1391
+ "category": "messages",
1392
+ "valueKind": "string",
1393
+ "description": "Mensagem de loading no reset."
1394
+ },
1395
+ {
1396
+ "path": "messages.loading.[actionId]",
1397
+ "category": "messages",
1398
+ "valueKind": "string",
1399
+ "description": "Mensagem de loading para acao custom."
1400
+ },
1401
+ {
1402
+ "path": "formRules",
1403
+ "category": "rules",
1404
+ "valueKind": "array",
1405
+ "description": "Regras de layout/comportamento."
1406
+ },
1407
+ {
1408
+ "path": "formRules[].id",
1409
+ "category": "rules",
1410
+ "valueKind": "string",
1411
+ "description": "ID da regra."
1412
+ },
1413
+ {
1414
+ "path": "formRules[].name",
1415
+ "category": "rules",
1416
+ "valueKind": "string",
1417
+ "description": "Nome da regra."
1418
+ },
1419
+ {
1420
+ "path": "formRules[].description",
1421
+ "category": "rules",
1422
+ "valueKind": "string",
1423
+ "description": "Descricao da regra."
1424
+ },
1425
+ {
1426
+ "path": "formRules[].targetType",
1427
+ "category": "rules",
1428
+ "valueKind": "enum",
1429
+ "allowedValues": [
1430
+ "field",
1431
+ "section",
1432
+ "action",
1433
+ "row",
1434
+ "column",
1435
+ "visualBlock"
1436
+ ],
1437
+ "description": "Tipo de alvo."
1438
+ },
1439
+ {
1440
+ "path": "formRules[].targets",
1441
+ "category": "rules",
1442
+ "valueKind": "array",
1443
+ "description": "IDs dos alvos canonicos."
1444
+ },
1445
+ {
1446
+ "path": "formRules[].targets[]",
1447
+ "category": "rules",
1448
+ "valueKind": "string",
1449
+ "description": "ID do alvo canonico."
1450
+ },
1451
+ {
1452
+ "path": "formRules[].targetFields",
1453
+ "category": "rules",
1454
+ "valueKind": "array",
1455
+ "description": "Alias legado para campos alvo."
1456
+ },
1457
+ {
1458
+ "path": "formRules[].targetFields[]",
1459
+ "category": "rules",
1460
+ "valueKind": "string",
1461
+ "description": "ID do campo alvo (alias legado)."
1462
+ },
1463
+ {
1464
+ "path": "formRules[].context",
1465
+ "category": "rules",
1466
+ "valueKind": "enum",
1467
+ "allowedValues": [
1468
+ "visibility",
1469
+ "readOnly",
1470
+ "style",
1471
+ "validation",
1472
+ "notification"
1473
+ ],
1474
+ "description": "Contexto legado da regra."
1475
+ },
1476
+ {
1477
+ "path": "formRules[].effect.condition",
1478
+ "category": "rules",
1479
+ "valueKind": "expression",
1480
+ "description": "Condicao canonica da regra, expressa em Json Logic."
1481
+ },
1482
+ {
1483
+ "path": "formRules[].effect.properties",
1484
+ "category": "rules",
1485
+ "valueKind": "object",
1486
+ "description": "Propriedades aplicadas quando true."
1487
+ },
1488
+ {
1489
+ "path": "formRules[].effect.propertiesWhenFalse",
1490
+ "category": "rules",
1491
+ "valueKind": "object",
1492
+ "description": "Propriedades aplicadas quando false."
1493
+ },
1494
+ {
1495
+ "path": "formRulesState",
1496
+ "category": "metadata",
1497
+ "valueKind": "object",
1498
+ "description": "Estado interno do builder visual de regras, gerado apenas para round-trip do editor.",
1499
+ "safetyNotes": "Read-only/internal. Nao use como alvo de autoria, patch, exemplo ou operacao de IA; gere somente formRules e deixe o editor materializar formRulesState."
1500
+ },
1501
+ {
1502
+ "path": "hooks",
1503
+ "category": "hooks",
1504
+ "valueKind": "object",
1505
+ "description": "Declaracoes de hooks por estagio."
1506
+ },
1507
+ {
1508
+ "path": "hooks.beforeInit",
1509
+ "category": "hooks",
1510
+ "valueKind": "array",
1511
+ "description": "Hooks beforeInit."
1512
+ },
1513
+ {
1514
+ "path": "hooks.beforeInit[]",
1515
+ "category": "hooks",
1516
+ "valueKind": "array",
1517
+ "description": "Hooks beforeInit."
1518
+ },
1519
+ {
1520
+ "path": "hooks.beforeInit[].id",
1521
+ "category": "hooks",
1522
+ "valueKind": "string",
1523
+ "description": "ID do hook."
1524
+ },
1525
+ {
1526
+ "path": "hooks.beforeInit[].priority",
1527
+ "category": "hooks",
1528
+ "valueKind": "number",
1529
+ "description": "Prioridade do hook."
1530
+ },
1531
+ {
1532
+ "path": "hooks.beforeInit[].timeoutMs",
1533
+ "category": "hooks",
1534
+ "valueKind": "number",
1535
+ "description": "Timeout do hook."
1536
+ },
1537
+ {
1538
+ "path": "hooks.beforeInit[].args",
1539
+ "category": "hooks",
1540
+ "valueKind": "object",
1541
+ "description": "Args do hook."
1542
+ },
1543
+ {
1544
+ "path": "hooks.afterInit",
1545
+ "category": "hooks",
1546
+ "valueKind": "array",
1547
+ "description": "Hooks afterInit."
1548
+ },
1549
+ {
1550
+ "path": "hooks.afterInit[]",
1551
+ "category": "hooks",
1552
+ "valueKind": "array",
1553
+ "description": "Hooks afterInit."
1554
+ },
1555
+ {
1556
+ "path": "hooks.afterInit[].id",
1557
+ "category": "hooks",
1558
+ "valueKind": "string",
1559
+ "description": "ID do hook executado apos a inicializacao."
1560
+ },
1561
+ {
1562
+ "path": "hooks.afterInit[].priority",
1563
+ "category": "hooks",
1564
+ "valueKind": "number",
1565
+ "description": "Prioridade de execucao do hook apos a inicializacao."
1566
+ },
1567
+ {
1568
+ "path": "hooks.afterInit[].timeoutMs",
1569
+ "category": "hooks",
1570
+ "valueKind": "number",
1571
+ "description": "Timeout do hook apos a inicializacao em milissegundos."
1572
+ },
1573
+ {
1574
+ "path": "hooks.afterInit[].args",
1575
+ "category": "hooks",
1576
+ "valueKind": "object",
1577
+ "description": "Argumentos configurados para o hook apos a inicializacao."
1578
+ },
1579
+ {
1580
+ "path": "hooks.beforeValidate",
1581
+ "category": "hooks",
1582
+ "valueKind": "array",
1583
+ "description": "Hooks beforeValidate."
1584
+ },
1585
+ {
1586
+ "path": "hooks.beforeValidate[]",
1587
+ "category": "hooks",
1588
+ "valueKind": "array",
1589
+ "description": "Hooks beforeValidate."
1590
+ },
1591
+ {
1592
+ "path": "hooks.beforeValidate[].id",
1593
+ "category": "hooks",
1594
+ "valueKind": "string",
1595
+ "description": "ID do hook executado antes da validacao."
1596
+ },
1597
+ {
1598
+ "path": "hooks.beforeValidate[].priority",
1599
+ "category": "hooks",
1600
+ "valueKind": "number",
1601
+ "description": "Prioridade de execucao do hook antes da validacao."
1602
+ },
1603
+ {
1604
+ "path": "hooks.beforeValidate[].timeoutMs",
1605
+ "category": "hooks",
1606
+ "valueKind": "number",
1607
+ "description": "Timeout do hook antes da validacao em milissegundos."
1608
+ },
1609
+ {
1610
+ "path": "hooks.beforeValidate[].args",
1611
+ "category": "hooks",
1612
+ "valueKind": "object",
1613
+ "description": "Argumentos configurados para o hook antes da validacao."
1614
+ },
1615
+ {
1616
+ "path": "hooks.afterValidate",
1617
+ "category": "hooks",
1618
+ "valueKind": "array",
1619
+ "description": "Hooks afterValidate."
1620
+ },
1621
+ {
1622
+ "path": "hooks.afterValidate[]",
1623
+ "category": "hooks",
1624
+ "valueKind": "array",
1625
+ "description": "Hooks afterValidate."
1626
+ },
1627
+ {
1628
+ "path": "hooks.afterValidate[].id",
1629
+ "category": "hooks",
1630
+ "valueKind": "string",
1631
+ "description": "ID do hook executado apos a validacao."
1632
+ },
1633
+ {
1634
+ "path": "hooks.afterValidate[].priority",
1635
+ "category": "hooks",
1636
+ "valueKind": "number",
1637
+ "description": "Prioridade de execucao do hook apos a validacao."
1638
+ },
1639
+ {
1640
+ "path": "hooks.afterValidate[].timeoutMs",
1641
+ "category": "hooks",
1642
+ "valueKind": "number",
1643
+ "description": "Timeout do hook apos a validacao em milissegundos."
1644
+ },
1645
+ {
1646
+ "path": "hooks.afterValidate[].args",
1647
+ "category": "hooks",
1648
+ "valueKind": "object",
1649
+ "description": "Argumentos configurados para o hook apos a validacao."
1650
+ },
1651
+ {
1652
+ "path": "hooks.beforeSubmit",
1653
+ "category": "hooks",
1654
+ "valueKind": "array",
1655
+ "description": "Hooks beforeSubmit."
1656
+ },
1657
+ {
1658
+ "path": "hooks.beforeSubmit[]",
1659
+ "category": "hooks",
1660
+ "valueKind": "array",
1661
+ "description": "Hooks beforeSubmit."
1662
+ },
1663
+ {
1664
+ "path": "hooks.beforeSubmit[].id",
1665
+ "category": "hooks",
1666
+ "valueKind": "string",
1667
+ "description": "ID do hook executado antes do submit."
1668
+ },
1669
+ {
1670
+ "path": "hooks.beforeSubmit[].priority",
1671
+ "category": "hooks",
1672
+ "valueKind": "number",
1673
+ "description": "Prioridade de execucao do hook antes do submit."
1674
+ },
1675
+ {
1676
+ "path": "hooks.beforeSubmit[].timeoutMs",
1677
+ "category": "hooks",
1678
+ "valueKind": "number",
1679
+ "description": "Timeout do hook antes do submit em milissegundos."
1680
+ },
1681
+ {
1682
+ "path": "hooks.beforeSubmit[].args",
1683
+ "category": "hooks",
1684
+ "valueKind": "object",
1685
+ "description": "Argumentos configurados para o hook antes do submit."
1686
+ },
1687
+ {
1688
+ "path": "hooks.afterSubmit",
1689
+ "category": "hooks",
1690
+ "valueKind": "array",
1691
+ "description": "Hooks afterSubmit."
1692
+ },
1693
+ {
1694
+ "path": "hooks.afterSubmit[]",
1695
+ "category": "hooks",
1696
+ "valueKind": "array",
1697
+ "description": "Hooks afterSubmit."
1698
+ },
1699
+ {
1700
+ "path": "hooks.afterSubmit[].id",
1701
+ "category": "hooks",
1702
+ "valueKind": "string",
1703
+ "description": "ID do hook executado apos o submit."
1704
+ },
1705
+ {
1706
+ "path": "hooks.afterSubmit[].priority",
1707
+ "category": "hooks",
1708
+ "valueKind": "number",
1709
+ "description": "Prioridade de execucao do hook apos o submit."
1710
+ },
1711
+ {
1712
+ "path": "hooks.afterSubmit[].timeoutMs",
1713
+ "category": "hooks",
1714
+ "valueKind": "number",
1715
+ "description": "Timeout do hook apos o submit em milissegundos."
1716
+ },
1717
+ {
1718
+ "path": "hooks.afterSubmit[].args",
1719
+ "category": "hooks",
1720
+ "valueKind": "object",
1721
+ "description": "Argumentos configurados para o hook apos o submit."
1722
+ },
1723
+ {
1724
+ "path": "hooks.onError",
1725
+ "category": "hooks",
1726
+ "valueKind": "array",
1727
+ "description": "Hooks onError."
1728
+ },
1729
+ {
1730
+ "path": "hooks.onError[]",
1731
+ "category": "hooks",
1732
+ "valueKind": "array",
1733
+ "description": "Hooks onError."
1734
+ },
1735
+ {
1736
+ "path": "hooks.onError[].id",
1737
+ "category": "hooks",
1738
+ "valueKind": "string",
1739
+ "description": "ID do hook executado em cenarios de erro."
1740
+ },
1741
+ {
1742
+ "path": "hooks.onError[].priority",
1743
+ "category": "hooks",
1744
+ "valueKind": "number",
1745
+ "description": "Prioridade de execucao do hook em cenarios de erro."
1746
+ },
1747
+ {
1748
+ "path": "hooks.onError[].timeoutMs",
1749
+ "category": "hooks",
1750
+ "valueKind": "number",
1751
+ "description": "Timeout do hook de erro em milissegundos."
1752
+ },
1753
+ {
1754
+ "path": "hooks.onError[].args",
1755
+ "category": "hooks",
1756
+ "valueKind": "object",
1757
+ "description": "Argumentos configurados para o hook de erro."
1758
+ },
1759
+ {
1760
+ "path": "hints.dataModes.create",
1761
+ "category": "hints",
1762
+ "valueKind": "string",
1763
+ "description": "Texto de apoio para o modo create de dados."
1764
+ },
1765
+ {
1766
+ "path": "hints.dataModes.edit",
1767
+ "category": "hints",
1768
+ "valueKind": "string",
1769
+ "description": "Texto de apoio para o modo edit de dados."
1770
+ },
1771
+ {
1772
+ "path": "hints.dataModes.view",
1773
+ "category": "hints",
1774
+ "valueKind": "string",
1775
+ "description": "Texto de apoio para o modo view de dados."
1776
+ },
1777
+ {
1778
+ "path": "hints.uiModes.presentation",
1779
+ "category": "hints",
1780
+ "valueKind": "string",
1781
+ "description": "Texto de apoio para o modo de apresentacao da UI."
1782
+ },
1783
+ {
1784
+ "path": "hints.uiModes.readonly",
1785
+ "category": "hints",
1786
+ "valueKind": "string",
1787
+ "description": "Texto de apoio para o modo somente leitura."
1788
+ },
1789
+ {
1790
+ "path": "hints.uiModes.disabled",
1791
+ "category": "hints",
1792
+ "valueKind": "string",
1793
+ "description": "Texto de apoio para o modo desabilitado."
1794
+ },
1795
+ {
1796
+ "path": "hints.uiModes.visible",
1797
+ "category": "hints",
1798
+ "valueKind": "string",
1799
+ "description": "Texto de apoio para a visibilidade dos elementos da UI."
1800
+ }
1801
+ ],
1802
+ "componentCapabilityNotes": [
1803
+ "ManualForm usa FormConfig interno para metadados e layout.",
1804
+ "fieldMetadata[] deve seguir o catalogo base de FieldMetadata.",
1805
+ "Arrays de layout e actions devem ser mesclados por id/label, evitando replace total.",
1806
+ "ManualFormHeader usa metadata.title/metadata.description como fallback para titulo/descricao.",
1807
+ "Se controlType nao tiver catalogo dedicado, trate como FieldMetadata base."
1808
+ ],
1809
+ "componentContext": {
1810
+ "version": "v1",
1811
+ "optionsByPath": {
1812
+ "fieldMetadata[].controlType": {
1813
+ "mode": "enum",
1814
+ "options": [
1815
+ {
1816
+ "value": "input",
1817
+ "label": "Input"
1818
+ },
1819
+ {
1820
+ "value": "textarea",
1821
+ "label": "Textarea"
1822
+ },
1823
+ {
1824
+ "value": "email",
1825
+ "label": "Email"
1826
+ },
1827
+ {
1828
+ "value": "password",
1829
+ "label": "Password"
1830
+ },
1831
+ {
1832
+ "value": "search",
1833
+ "label": "Search"
1834
+ },
1835
+ {
1836
+ "value": "url",
1837
+ "label": "URL"
1838
+ },
1839
+ {
1840
+ "value": "phone",
1841
+ "label": "Phone"
1842
+ },
1843
+ {
1844
+ "value": "cpfCnpjInput",
1845
+ "label": "CPF/CNPJ"
1846
+ },
1847
+ {
1848
+ "value": "numericTextBox",
1849
+ "label": "Number"
1850
+ },
1851
+ {
1852
+ "value": "currency",
1853
+ "label": "Currency"
1854
+ },
1855
+ {
1856
+ "value": "priceRange",
1857
+ "label": "Price range"
1858
+ },
1859
+ {
1860
+ "value": "date",
1861
+ "label": "Date picker"
1862
+ },
1863
+ {
1864
+ "value": "dateRange",
1865
+ "label": "Date range"
1866
+ },
1867
+ {
1868
+ "value": "dateInput",
1869
+ "label": "Date input"
1870
+ },
1871
+ {
1872
+ "value": "dateTime",
1873
+ "label": "Datetime"
1874
+ },
1875
+ {
1876
+ "value": "dateTimeRange",
1877
+ "label": "Datetime range"
1878
+ },
1879
+ {
1880
+ "value": "dateTimeLocal",
1881
+ "label": "Datetime local"
1882
+ },
1883
+ {
1884
+ "value": "time",
1885
+ "label": "Time input"
1886
+ },
1887
+ {
1888
+ "value": "timePicker",
1889
+ "label": "Time picker"
1890
+ },
1891
+ {
1892
+ "value": "timeRange",
1893
+ "label": "Time range"
1894
+ },
1895
+ {
1896
+ "value": "week",
1897
+ "label": "Week input"
1898
+ },
1899
+ {
1900
+ "value": "month",
1901
+ "label": "Month input"
1902
+ },
1903
+ {
1904
+ "value": "year",
1905
+ "label": "Year input"
1906
+ },
1907
+ {
1908
+ "value": "select",
1909
+ "label": "Select"
1910
+ },
1911
+ {
1912
+ "value": "multiSelect",
1913
+ "label": "Multi select"
1914
+ },
1915
+ {
1916
+ "value": "multiSelectTree",
1917
+ "label": "Multi select tree"
1918
+ },
1919
+ {
1920
+ "value": "treeSelect",
1921
+ "label": "Tree select"
1922
+ },
1923
+ {
1924
+ "value": "transferList",
1925
+ "label": "Transfer list"
1926
+ },
1927
+ {
1928
+ "value": "autoComplete",
1929
+ "label": "Autocomplete"
1930
+ },
1931
+ {
1932
+ "value": "searchable-select",
1933
+ "label": "Searchable select"
1934
+ },
1935
+ {
1936
+ "value": "async-select",
1937
+ "label": "Async select"
1938
+ },
1939
+ {
1940
+ "value": "radio",
1941
+ "label": "Radio group"
1942
+ },
1943
+ {
1944
+ "value": "checkbox",
1945
+ "label": "Checkbox group"
1946
+ },
1947
+ {
1948
+ "value": "selectionList",
1949
+ "label": "Selection list"
1950
+ },
1951
+ {
1952
+ "value": "toggle",
1953
+ "label": "Toggle"
1954
+ },
1955
+ {
1956
+ "value": "buttonToggle",
1957
+ "label": "Button toggle"
1958
+ },
1959
+ {
1960
+ "value": "slider",
1961
+ "label": "Slider"
1962
+ },
1963
+ {
1964
+ "value": "rangeSlider",
1965
+ "label": "Range slider"
1966
+ },
1967
+ {
1968
+ "value": "rating",
1969
+ "label": "Rating"
1970
+ },
1971
+ {
1972
+ "value": "chipInput",
1973
+ "label": "Chips"
1974
+ },
1975
+ {
1976
+ "value": "chipList",
1977
+ "label": "Chip list"
1978
+ },
1979
+ {
1980
+ "value": "upload",
1981
+ "label": "File upload"
1982
+ },
1983
+ {
1984
+ "value": "color",
1985
+ "label": "Color input"
1986
+ },
1987
+ {
1988
+ "value": "colorPicker",
1989
+ "label": "Color picker"
1990
+ },
1991
+ {
1992
+ "value": "cronBuilder",
1993
+ "label": "Cron builder"
1994
+ }
1995
+ ]
1996
+ },
1997
+ "fieldMetadata[].source": {
1998
+ "mode": "enum",
1999
+ "options": [
2000
+ {
2001
+ "value": "schema",
2002
+ "label": "Schema field"
2003
+ },
2004
+ {
2005
+ "value": "local",
2006
+ "label": "Local field"
2007
+ }
2008
+ ]
2009
+ },
2010
+ "fieldMetadata[].submitPolicy": {
2011
+ "mode": "enum",
2012
+ "options": [
2013
+ {
2014
+ "value": "omit",
2015
+ "label": "Omit from submit payload"
2016
+ },
2017
+ {
2018
+ "value": "include",
2019
+ "label": "Include in submit payload"
2020
+ },
2021
+ {
2022
+ "value": "includeWhenDirty",
2023
+ "label": "Include only when dirty"
2024
+ }
2025
+ ]
2026
+ },
2027
+ "fieldMetadata[].materialDesign.appearance": {
2028
+ "mode": "enum",
2029
+ "options": [
2030
+ {
2031
+ "value": "fill",
2032
+ "label": "Fill"
2033
+ },
2034
+ {
2035
+ "value": "outline",
2036
+ "label": "Outline"
2037
+ }
2038
+ ]
2039
+ },
2040
+ "fieldMetadata[].materialDesign.color": {
2041
+ "mode": "enum",
2042
+ "options": [
2043
+ {
2044
+ "value": "primary",
2045
+ "label": "Primary"
2046
+ },
2047
+ {
2048
+ "value": "accent",
2049
+ "label": "Accent"
2050
+ },
2051
+ {
2052
+ "value": "warn",
2053
+ "label": "Warn"
2054
+ }
2055
+ ]
2056
+ },
2057
+ "fieldMetadata[].materialDesign.floatLabel": {
2058
+ "mode": "enum",
2059
+ "options": [
2060
+ {
2061
+ "value": "auto",
2062
+ "label": "Auto"
2063
+ },
2064
+ {
2065
+ "value": "always",
2066
+ "label": "Always"
2067
+ }
2068
+ ]
2069
+ },
2070
+ "fieldMetadata[].materialDesign.density": {
2071
+ "mode": "enum",
2072
+ "options": [
2073
+ {
2074
+ "value": "comfortable",
2075
+ "label": "Comfortable"
2076
+ },
2077
+ {
2078
+ "value": "compact",
2079
+ "label": "Compact"
2080
+ },
2081
+ {
2082
+ "value": "dense",
2083
+ "label": "Dense"
2084
+ }
2085
+ ]
2086
+ },
2087
+ "actions.position": {
2088
+ "mode": "enum",
2089
+ "options": [
2090
+ {
2091
+ "value": "left",
2092
+ "label": "Left"
2093
+ },
2094
+ {
2095
+ "value": "center",
2096
+ "label": "Center"
2097
+ },
2098
+ {
2099
+ "value": "right",
2100
+ "label": "Right"
2101
+ },
2102
+ {
2103
+ "value": "justified",
2104
+ "label": "Justified"
2105
+ },
2106
+ {
2107
+ "value": "split",
2108
+ "label": "Split"
2109
+ }
2110
+ ]
2111
+ },
2112
+ "actions.orientation": {
2113
+ "mode": "enum",
2114
+ "options": [
2115
+ {
2116
+ "value": "horizontal",
2117
+ "label": "Horizontal"
2118
+ },
2119
+ {
2120
+ "value": "vertical",
2121
+ "label": "Vertical"
2122
+ }
2123
+ ]
2124
+ },
2125
+ "actions.spacing": {
2126
+ "mode": "enum",
2127
+ "options": [
2128
+ {
2129
+ "value": "compact",
2130
+ "label": "Compact"
2131
+ },
2132
+ {
2133
+ "value": "normal",
2134
+ "label": "Normal"
2135
+ },
2136
+ {
2137
+ "value": "spacious",
2138
+ "label": "Spacious"
2139
+ }
2140
+ ]
2141
+ },
2142
+ "actions.placement": {
2143
+ "mode": "enum",
2144
+ "options": [
2145
+ {
2146
+ "value": "insideLastSection",
2147
+ "label": "Inside last section"
2148
+ },
2149
+ {
2150
+ "value": "afterSections",
2151
+ "label": "After sections"
2152
+ },
2153
+ {
2154
+ "value": "top",
2155
+ "label": "Top"
2156
+ }
2157
+ ]
2158
+ },
2159
+ "actions.submit.type": {
2160
+ "mode": "enum",
2161
+ "options": [
2162
+ {
2163
+ "value": "button",
2164
+ "label": "Button"
2165
+ },
2166
+ {
2167
+ "value": "submit",
2168
+ "label": "Submit"
2169
+ },
2170
+ {
2171
+ "value": "reset",
2172
+ "label": "Reset"
2173
+ }
2174
+ ]
2175
+ },
2176
+ "actions.submit.variant": {
2177
+ "mode": "enum",
2178
+ "options": [
2179
+ {
2180
+ "value": "raised",
2181
+ "label": "Raised"
2182
+ },
2183
+ {
2184
+ "value": "stroked",
2185
+ "label": "Stroked"
2186
+ },
2187
+ {
2188
+ "value": "flat",
2189
+ "label": "Flat"
2190
+ },
2191
+ {
2192
+ "value": "fab",
2193
+ "label": "Fab"
2194
+ }
2195
+ ]
2196
+ },
2197
+ "actions.submit.size": {
2198
+ "mode": "enum",
2199
+ "options": [
2200
+ {
2201
+ "value": "small",
2202
+ "label": "Small"
2203
+ },
2204
+ {
2205
+ "value": "medium",
2206
+ "label": "Medium"
2207
+ },
2208
+ {
2209
+ "value": "large",
2210
+ "label": "Large"
2211
+ }
2212
+ ]
2213
+ },
2214
+ "actions.submit.color": {
2215
+ "mode": "enum",
2216
+ "options": [
2217
+ {
2218
+ "value": "primary",
2219
+ "label": "Primary"
2220
+ },
2221
+ {
2222
+ "value": "accent",
2223
+ "label": "Accent"
2224
+ },
2225
+ {
2226
+ "value": "warn",
2227
+ "label": "Warn"
2228
+ },
2229
+ {
2230
+ "value": "basic",
2231
+ "label": "Basic"
2232
+ }
2233
+ ]
2234
+ },
2235
+ "sections[].headerAlign": {
2236
+ "mode": "enum",
2237
+ "options": [
2238
+ {
2239
+ "value": "start",
2240
+ "label": "Start"
2241
+ },
2242
+ {
2243
+ "value": "center",
2244
+ "label": "Center"
2245
+ }
2246
+ ]
2247
+ },
2248
+ "sections[].appearance": {
2249
+ "mode": "enum",
2250
+ "options": [
2251
+ {
2252
+ "value": "card",
2253
+ "label": "Card"
2254
+ },
2255
+ {
2256
+ "value": "plain",
2257
+ "label": "Plain"
2258
+ },
2259
+ {
2260
+ "value": "step",
2261
+ "label": "Step"
2262
+ }
2263
+ ]
2264
+ },
2265
+ "sections[].sectionHeader.mode": {
2266
+ "mode": "enum",
2267
+ "options": [
2268
+ {
2269
+ "value": "icon",
2270
+ "label": "Icon"
2271
+ },
2272
+ {
2273
+ "value": "avatar-image",
2274
+ "label": "Avatar image"
2275
+ },
2276
+ {
2277
+ "value": "avatar-initials",
2278
+ "label": "Avatar initials"
2279
+ },
2280
+ {
2281
+ "value": "auto",
2282
+ "label": "Auto"
2283
+ }
2284
+ ]
2285
+ },
2286
+ "sections[].sectionHeader.emptyState": {
2287
+ "mode": "enum",
2288
+ "options": [
2289
+ {
2290
+ "value": "placeholder-avatar",
2291
+ "label": "Neutral placeholder"
2292
+ },
2293
+ {
2294
+ "value": "fallback-icon",
2295
+ "label": "Fallback icon"
2296
+ },
2297
+ {
2298
+ "value": "none",
2299
+ "label": "None"
2300
+ }
2301
+ ]
2302
+ },
2303
+ "sections[].sectionHeader.size": {
2304
+ "mode": "enum",
2305
+ "options": [
2306
+ {
2307
+ "value": "sm",
2308
+ "label": "Small"
2309
+ },
2310
+ {
2311
+ "value": "md",
2312
+ "label": "Medium"
2313
+ },
2314
+ {
2315
+ "value": "lg",
2316
+ "label": "Large"
2317
+ }
2318
+ ]
2319
+ },
2320
+ "sections[].stepLabel": {
2321
+ "mode": "suggested",
2322
+ "options": [
2323
+ {
2324
+ "value": "Dados básicos",
2325
+ "label": "Dados básicos"
2326
+ },
2327
+ {
2328
+ "value": "Detalhes",
2329
+ "label": "Detalhes"
2330
+ },
2331
+ {
2332
+ "value": "Confirmação",
2333
+ "label": "Confirmação"
2334
+ }
2335
+ ]
2336
+ },
2337
+ "sections[].titleStyle": {
2338
+ "mode": "enum",
2339
+ "options": [
2340
+ {
2341
+ "value": "titleLarge",
2342
+ "label": "Title large"
2343
+ },
2344
+ {
2345
+ "value": "titleMedium",
2346
+ "label": "Title medium"
2347
+ },
2348
+ {
2349
+ "value": "titleSmall",
2350
+ "label": "Title small"
2351
+ },
2352
+ {
2353
+ "value": "headlineSmall",
2354
+ "label": "Headline small"
2355
+ }
2356
+ ]
2357
+ },
2358
+ "sections[].descriptionStyle": {
2359
+ "mode": "enum",
2360
+ "options": [
2361
+ {
2362
+ "value": "bodyLarge",
2363
+ "label": "Body large"
2364
+ },
2365
+ {
2366
+ "value": "bodyMedium",
2367
+ "label": "Body medium"
2368
+ },
2369
+ {
2370
+ "value": "bodySmall",
2371
+ "label": "Body small"
2372
+ }
2373
+ ]
2374
+ },
2375
+ "sections[].rows[].columns[].align": {
2376
+ "mode": "enum",
2377
+ "options": [
2378
+ {
2379
+ "value": "start",
2380
+ "label": "Start"
2381
+ },
2382
+ {
2383
+ "value": "center",
2384
+ "label": "Center"
2385
+ },
2386
+ {
2387
+ "value": "end",
2388
+ "label": "End"
2389
+ },
2390
+ {
2391
+ "value": "stretch",
2392
+ "label": "Stretch"
2393
+ }
2394
+ ]
2395
+ },
2396
+ "sections[].rows[].columns[].items[].kind": {
2397
+ "mode": "enum",
2398
+ "options": [
2399
+ {
2400
+ "value": "field",
2401
+ "label": "Field"
2402
+ },
2403
+ {
2404
+ "value": "richContent",
2405
+ "label": "Rich content"
2406
+ }
2407
+ ]
2408
+ },
2409
+ "sections[].rows[].columns[].items[].layout": {
2410
+ "mode": "enum",
2411
+ "options": [
2412
+ {
2413
+ "value": "block",
2414
+ "label": "Block"
2415
+ },
2416
+ {
2417
+ "value": "inline",
2418
+ "label": "Inline"
2419
+ }
2420
+ ]
2421
+ },
2422
+ "formRules[].targetType": {
2423
+ "mode": "enum",
2424
+ "options": [
2425
+ {
2426
+ "value": "field",
2427
+ "label": "Field"
2428
+ },
2429
+ {
2430
+ "value": "section",
2431
+ "label": "Section"
2432
+ },
2433
+ {
2434
+ "value": "row",
2435
+ "label": "Row"
2436
+ },
2437
+ {
2438
+ "value": "column",
2439
+ "label": "Column"
2440
+ },
2441
+ {
2442
+ "value": "action",
2443
+ "label": "Action"
2444
+ },
2445
+ {
2446
+ "value": "visualBlock",
2447
+ "label": "Visual block"
2448
+ }
2449
+ ]
2450
+ },
2451
+ "formRules[].context": {
2452
+ "mode": "enum",
2453
+ "options": [
2454
+ {
2455
+ "value": "visibility",
2456
+ "label": "Visibility"
2457
+ },
2458
+ {
2459
+ "value": "readOnly",
2460
+ "label": "Read only"
2461
+ },
2462
+ {
2463
+ "value": "style",
2464
+ "label": "Style"
2465
+ },
2466
+ {
2467
+ "value": "validation",
2468
+ "label": "Validation"
2469
+ },
2470
+ {
2471
+ "value": "notification",
2472
+ "label": "Notification"
2473
+ }
2474
+ ]
2475
+ }
2476
+ },
2477
+ "actionCatalog": [
2478
+ {
2479
+ "id": "field.visibility.hide",
2480
+ "intentExamples": [
2481
+ "hide field",
2482
+ "ocultar campo",
2483
+ "esconder campo",
2484
+ "invisible"
2485
+ ],
2486
+ "patchTemplate": {
2487
+ "fieldMetadata": [
2488
+ {
2489
+ "name": "{{target}}",
2490
+ "hidden": true
2491
+ }
2492
+ ]
2493
+ }
2494
+ },
2495
+ {
2496
+ "id": "field.visibility.show",
2497
+ "intentExamples": [
2498
+ "show field",
2499
+ "mostrar campo",
2500
+ "exibir campo",
2501
+ "visible"
2502
+ ],
2503
+ "patchTemplate": {
2504
+ "fieldMetadata": [
2505
+ {
2506
+ "name": "{{target}}",
2507
+ "hidden": false
2508
+ }
2509
+ ]
2510
+ }
2511
+ },
2512
+ {
2513
+ "id": "field.label.set",
2514
+ "intentExamples": [
2515
+ "label",
2516
+ "rename field",
2517
+ "renomear campo",
2518
+ "titulo"
2519
+ ],
2520
+ "patchTemplate": {
2521
+ "fieldMetadata": [
2522
+ {
2523
+ "name": "{{target}}",
2524
+ "label": "{{value}}"
2525
+ }
2526
+ ]
2527
+ }
2528
+ },
2529
+ {
2530
+ "id": "field.placeholder.set",
2531
+ "intentExamples": [
2532
+ "placeholder",
2533
+ "hint text",
2534
+ "texto de ajuda"
2535
+ ],
2536
+ "patchTemplate": {
2537
+ "fieldMetadata": [
2538
+ {
2539
+ "name": "{{target}}",
2540
+ "placeholder": "{{value}}"
2541
+ }
2542
+ ]
2543
+ }
2544
+ },
2545
+ {
2546
+ "id": "field.required.enable",
2547
+ "intentExamples": [
2548
+ "required",
2549
+ "obrigatorio",
2550
+ "mandatory"
2551
+ ],
2552
+ "patchTemplate": {
2553
+ "fieldMetadata": [
2554
+ {
2555
+ "name": "{{target}}",
2556
+ "required": true
2557
+ }
2558
+ ]
2559
+ }
2560
+ },
2561
+ {
2562
+ "id": "field.required.disable",
2563
+ "intentExamples": [
2564
+ "optional",
2565
+ "nao obrigatorio",
2566
+ "opcional"
2567
+ ],
2568
+ "patchTemplate": {
2569
+ "fieldMetadata": [
2570
+ {
2571
+ "name": "{{target}}",
2572
+ "required": false
2573
+ }
2574
+ ]
2575
+ }
2576
+ },
2577
+ {
2578
+ "id": "field.readonly.enable",
2579
+ "intentExamples": [
2580
+ "readonly",
2581
+ "somente leitura",
2582
+ "read only"
2583
+ ],
2584
+ "patchTemplate": {
2585
+ "fieldMetadata": [
2586
+ {
2587
+ "name": "{{target}}",
2588
+ "readOnly": true
2589
+ }
2590
+ ]
2591
+ }
2592
+ },
2593
+ {
2594
+ "id": "field.readonly.disable",
2595
+ "intentExamples": [
2596
+ "editable",
2597
+ "editavel",
2598
+ "read write"
2599
+ ],
2600
+ "patchTemplate": {
2601
+ "fieldMetadata": [
2602
+ {
2603
+ "name": "{{target}}",
2604
+ "readOnly": false
2605
+ }
2606
+ ]
2607
+ }
2608
+ },
2609
+ {
2610
+ "id": "field.disabled.enable",
2611
+ "intentExamples": [
2612
+ "disable field",
2613
+ "desabilitar campo"
2614
+ ],
2615
+ "patchTemplate": {
2616
+ "fieldMetadata": [
2617
+ {
2618
+ "name": "{{target}}",
2619
+ "disabled": true
2620
+ }
2621
+ ]
2622
+ }
2623
+ },
2624
+ {
2625
+ "id": "field.disabled.disable",
2626
+ "intentExamples": [
2627
+ "enable field",
2628
+ "habilitar campo"
2629
+ ],
2630
+ "patchTemplate": {
2631
+ "fieldMetadata": [
2632
+ {
2633
+ "name": "{{target}}",
2634
+ "disabled": false
2635
+ }
2636
+ ]
2637
+ }
2638
+ },
2639
+ {
2640
+ "id": "field.controlType.set",
2641
+ "intentExamples": [
2642
+ "control type",
2643
+ "tipo de campo",
2644
+ "controlType"
2645
+ ],
2646
+ "patchTemplate": {
2647
+ "fieldMetadata": [
2648
+ {
2649
+ "name": "{{target}}",
2650
+ "controlType": "{{value}}"
2651
+ }
2652
+ ]
2653
+ }
2654
+ },
2655
+ {
2656
+ "id": "field.icon.prefix.set",
2657
+ "intentExamples": [
2658
+ "prefix icon",
2659
+ "icone prefixo",
2660
+ "icon before"
2661
+ ],
2662
+ "patchTemplate": {
2663
+ "fieldMetadata": [
2664
+ {
2665
+ "name": "{{target}}",
2666
+ "prefixIcon": "{{value}}"
2667
+ }
2668
+ ]
2669
+ }
2670
+ },
2671
+ {
2672
+ "id": "field.icon.suffix.set",
2673
+ "intentExamples": [
2674
+ "suffix icon",
2675
+ "icone sufixo",
2676
+ "icon after"
2677
+ ],
2678
+ "patchTemplate": {
2679
+ "fieldMetadata": [
2680
+ {
2681
+ "name": "{{target}}",
2682
+ "suffixIcon": "{{value}}"
2683
+ }
2684
+ ]
2685
+ }
2686
+ },
2687
+ {
2688
+ "id": "section.title.set",
2689
+ "intentExamples": [
2690
+ "section title",
2691
+ "titulo da secao",
2692
+ "section name"
2693
+ ],
2694
+ "patchTemplate": {
2695
+ "sections": [
2696
+ {
2697
+ "id": "{{target}}",
2698
+ "title": "{{value}}"
2699
+ }
2700
+ ]
2701
+ }
2702
+ },
2703
+ {
2704
+ "id": "section.description.set",
2705
+ "intentExamples": [
2706
+ "section description",
2707
+ "descricao da secao"
2708
+ ],
2709
+ "patchTemplate": {
2710
+ "sections": [
2711
+ {
2712
+ "id": "{{target}}",
2713
+ "description": "{{value}}"
2714
+ }
2715
+ ]
2716
+ }
2717
+ },
2718
+ {
2719
+ "id": "section.add",
2720
+ "intentExamples": [
2721
+ "add section",
2722
+ "adicionar secao",
2723
+ "nova secao"
2724
+ ],
2725
+ "patchTemplate": {
2726
+ "sections": [
2727
+ {
2728
+ "id": "{{value}}",
2729
+ "title": "{{value}}",
2730
+ "rows": []
2731
+ }
2732
+ ]
2733
+ },
2734
+ "safetyNotes": "Certifique-se de que o ID da seção é único e relevante."
2735
+ },
2736
+ {
2737
+ "id": "section.remove",
2738
+ "intentExamples": [
2739
+ "remove section",
2740
+ "remover secao",
2741
+ "excluir secao"
2742
+ ],
2743
+ "patchTemplate": {
2744
+ "sections": [
2745
+ {
2746
+ "id": "{{target}}",
2747
+ "_delete": true
2748
+ }
2749
+ ]
2750
+ },
2751
+ "safetyNotes": "Remover uma seção é uma ação destrutiva. Confirme com o usuário."
2752
+ },
2753
+ {
2754
+ "id": "section.order.set",
2755
+ "intentExamples": [
2756
+ "order section",
2757
+ "reordenar secao",
2758
+ "mover secao"
2759
+ ],
2760
+ "patchTemplate": {
2761
+ "sections": [
2762
+ {
2763
+ "id": "{{target}}",
2764
+ "_order": "{{value}}"
2765
+ }
2766
+ ]
2767
+ },
2768
+ "safetyNotes": "A reordenação de seções é uma operação que deve ser revisada."
2769
+ },
2770
+ {
2771
+ "id": "row.add",
2772
+ "intentExamples": [
2773
+ "add row",
2774
+ "adicionar linha",
2775
+ "nova linha na secao"
2776
+ ],
2777
+ "patchTemplate": {
2778
+ "sections": [
2779
+ {
2780
+ "id": "{{target}}",
2781
+ "rows": [
2782
+ {
2783
+ "id": "{{value}}",
2784
+ "columns": []
2785
+ }
2786
+ ]
2787
+ }
2788
+ ]
2789
+ },
2790
+ "safetyNotes": "Certifique-se de que o ID da linha é único e relevante na seção."
2791
+ },
2792
+ {
2793
+ "id": "row.remove",
2794
+ "intentExamples": [
2795
+ "remove row",
2796
+ "remover linha",
2797
+ "excluir linha da secao"
2798
+ ],
2799
+ "patchTemplate": {
2800
+ "sections": [
2801
+ {
2802
+ "id": "{{target}}",
2803
+ "rows": [
2804
+ {
2805
+ "id": "{{value}}",
2806
+ "_delete": true
2807
+ }
2808
+ ]
2809
+ }
2810
+ ]
2811
+ },
2812
+ "safetyNotes": "Remover uma linha é uma ação destrutiva. Confirme com o usuário."
2813
+ },
2814
+ {
2815
+ "id": "column.add",
2816
+ "intentExamples": [
2817
+ "add column",
2818
+ "adicionar coluna",
2819
+ "nova coluna na linha"
2820
+ ],
2821
+ "patchTemplate": {
2822
+ "sections": [
2823
+ {
2824
+ "id": "{{target.sectionId}}",
2825
+ "rows": [
2826
+ {
2827
+ "id": "{{target.rowId}}",
2828
+ "columns": [
2829
+ {
2830
+ "id": "{{value}}",
2831
+ "items": []
2832
+ }
2833
+ ]
2834
+ }
2835
+ ]
2836
+ }
2837
+ ]
2838
+ },
2839
+ "safetyNotes": "Certifique-se de que o ID da coluna é único e relevante na linha."
2840
+ },
2841
+ {
2842
+ "id": "column.remove",
2843
+ "intentExamples": [
2844
+ "remove column",
2845
+ "remover coluna",
2846
+ "excluir coluna da linha"
2847
+ ],
2848
+ "patchTemplate": {
2849
+ "sections": [
2850
+ {
2851
+ "id": "{{target.sectionId}}",
2852
+ "rows": [
2853
+ {
2854
+ "id": "{{target.rowId}}",
2855
+ "columns": [
2856
+ {
2857
+ "id": "{{value}}",
2858
+ "_delete": true
2859
+ }
2860
+ ]
2861
+ }
2862
+ ]
2863
+ }
2864
+ ]
2865
+ },
2866
+ "safetyNotes": "Remover uma coluna é uma ação destrutiva. Confirme com o usuário."
2867
+ },
2868
+ {
2869
+ "id": "column.field.add",
2870
+ "intentExamples": [
2871
+ "add field to column",
2872
+ "adicionar campo a coluna",
2873
+ "colocar campo na coluna"
2874
+ ],
2875
+ "patchTemplate": {
2876
+ "sections": [
2877
+ {
2878
+ "id": "{{target.sectionId}}",
2879
+ "rows": [
2880
+ {
2881
+ "id": "{{target.rowId}}",
2882
+ "columns": [
2883
+ {
2884
+ "id": "{{target.columnId}}",
2885
+ "items": [
2886
+ {
2887
+ "kind": "field",
2888
+ "id": "field-{{value}}",
2889
+ "fieldName": "{{value}}"
2890
+ }
2891
+ ]
2892
+ }
2893
+ ]
2894
+ }
2895
+ ]
2896
+ }
2897
+ ]
2898
+ },
2899
+ "safetyNotes": "Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico."
2900
+ },
2901
+ {
2902
+ "id": "column.field.remove",
2903
+ "intentExamples": [
2904
+ "remove field from column",
2905
+ "remover campo da coluna",
2906
+ "tirar campo da coluna"
2907
+ ],
2908
+ "patchTemplate": {
2909
+ "sections": [
2910
+ {
2911
+ "id": "{{target.sectionId}}",
2912
+ "rows": [
2913
+ {
2914
+ "id": "{{target.rowId}}",
2915
+ "columns": [
2916
+ {
2917
+ "id": "{{target.columnId}}",
2918
+ "items": [
2919
+ {
2920
+ "kind": "field",
2921
+ "fieldName": "{{value}}",
2922
+ "_remove": true
2923
+ }
2924
+ ]
2925
+ }
2926
+ ]
2927
+ }
2928
+ ]
2929
+ }
2930
+ ]
2931
+ },
2932
+ "safetyNotes": "Remover um campo de uma coluna pode alterar o layout do formulário."
2933
+ },
2934
+ {
2935
+ "id": "actions.submit.label.set",
2936
+ "intentExamples": [
2937
+ "submit label",
2938
+ "rotulo salvar",
2939
+ "texto botao enviar"
2940
+ ],
2941
+ "patchTemplate": {
2942
+ "actions": {
2943
+ "submit": {
2944
+ "label": "{{value}}"
2945
+ }
2946
+ }
2947
+ }
2948
+ },
2949
+ {
2950
+ "id": "actions.submit.visible.set",
2951
+ "intentExamples": [
2952
+ "show submit",
2953
+ "esconder salvar",
2954
+ "visibilidade enviar"
2955
+ ],
2956
+ "patchTemplate": {
2957
+ "actions": {
2958
+ "submit": {
2959
+ "visible": "{{value}}"
2960
+ }
2961
+ }
2962
+ }
2963
+ },
2964
+ {
2965
+ "id": "actions.cancel.label.set",
2966
+ "intentExamples": [
2967
+ "cancel label",
2968
+ "rotulo cancelar",
2969
+ "texto botao cancelar"
2970
+ ],
2971
+ "patchTemplate": {
2972
+ "actions": {
2973
+ "cancel": {
2974
+ "label": "{{value}}"
2975
+ }
2976
+ }
2977
+ }
2978
+ },
2979
+ {
2980
+ "id": "actions.cancel.visible.set",
2981
+ "intentExamples": [
2982
+ "show cancel",
2983
+ "esconder cancelar",
2984
+ "visibilidade cancelar"
2985
+ ],
2986
+ "patchTemplate": {
2987
+ "actions": {
2988
+ "cancel": {
2989
+ "visible": "{{value}}"
2990
+ }
2991
+ }
2992
+ }
2993
+ },
2994
+ {
2995
+ "id": "actions.reset.label.set",
2996
+ "intentExamples": [
2997
+ "reset label",
2998
+ "rotulo resetar",
2999
+ "texto botao limpar"
3000
+ ],
3001
+ "patchTemplate": {
3002
+ "actions": {
3003
+ "reset": {
3004
+ "label": "{{value}}"
3005
+ }
3006
+ }
3007
+ }
3008
+ },
3009
+ {
3010
+ "id": "actions.reset.visible.set",
3011
+ "intentExamples": [
3012
+ "show reset",
3013
+ "esconder reset",
3014
+ "visibilidade limpar"
3015
+ ],
3016
+ "patchTemplate": {
3017
+ "actions": {
3018
+ "reset": {
3019
+ "visible": "{{value}}"
3020
+ }
3021
+ }
3022
+ }
3023
+ },
3024
+ {
3025
+ "id": "rule.add.visibility",
3026
+ "intentExamples": [
3027
+ "add visibility rule",
3028
+ "regra de visibilidade",
3029
+ "campo condicional"
3030
+ ],
3031
+ "patchTemplate": {
3032
+ "formRules": [
3033
+ {
3034
+ "id": "{{value.id}}",
3035
+ "name": "{{value.name}}",
3036
+ "targetType": "field",
3037
+ "targets": [
3038
+ "{{target}}"
3039
+ ],
3040
+ "effect": {
3041
+ "condition": "{{value.condition}}",
3042
+ "properties": {
3043
+ "hidden": false
3044
+ },
3045
+ "propertiesWhenFalse": {
3046
+ "hidden": true
3047
+ }
3048
+ }
3049
+ }
3050
+ ]
3051
+ },
3052
+ "safetyNotes": "Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao."
3053
+ },
3054
+ {
3055
+ "id": "rule.remove",
3056
+ "intentExamples": [
3057
+ "remove rule",
3058
+ "excluir regra",
3059
+ "apagar regra"
3060
+ ],
3061
+ "patchTemplate": {
3062
+ "formRules": [
3063
+ {
3064
+ "id": "{{target}}",
3065
+ "_delete": true
3066
+ }
3067
+ ]
3068
+ },
3069
+ "safetyNotes": "Remover regras pode ter efeitos inesperados no comportamento do formulário."
3070
+ },
3071
+ {
3072
+ "id": "rule.add.dependency",
3073
+ "intentExamples": [
3074
+ "adicionar dependencia",
3075
+ "campo depende de",
3076
+ "mostrar se",
3077
+ "obrigatorio se",
3078
+ "desabilitar se",
3079
+ "campo condicional"
3080
+ ],
3081
+ "scope": "GLOBAL",
3082
+ "valueType": "OBJECT",
3083
+ "operation": "create",
3084
+ "params": [
3085
+ {
3086
+ "name": "triggerField",
3087
+ "type": "STRING",
3088
+ "description": "Campo que controla a regra (ex: tipoPessoa)"
3089
+ },
3090
+ {
3091
+ "name": "conditionValue",
3092
+ "type": "STRING",
3093
+ "description": "Valor do trigger para ativar a regra (ex: \"Jurídica\")"
3094
+ },
3095
+ {
3096
+ "name": "targetField",
3097
+ "type": "STRING",
3098
+ "description": "Campo afetado pela regra (ex: cnpj)"
3099
+ },
3100
+ {
3101
+ "name": "effectType",
3102
+ "type": "ENUM",
3103
+ "options": [
3104
+ "visibility",
3105
+ "required",
3106
+ "disabled"
3107
+ ],
3108
+ "description": "Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)"
3109
+ }
3110
+ ],
3111
+ "patchTemplate": {
3112
+ "formRules": [
3113
+ {
3114
+ "id": "rule_{{params.triggerField}}_{{params.targetField}}",
3115
+ "name": "Dependência: {{params.targetField}} depende de {{params.triggerField}}",
3116
+ "targetType": "field",
3117
+ "targets": [
3118
+ "{{params.targetField}}"
3119
+ ],
3120
+ "effect": {
3121
+ "condition": {
3122
+ "==": [
3123
+ {
3124
+ "var": "{{params.triggerField}}"
3125
+ },
3126
+ "{{params.conditionValue}}"
3127
+ ]
3128
+ },
3129
+ "properties": {
3130
+ "hidden": "{{params.effectType === 'visibility' ? false : undefined}}",
3131
+ "required": "{{params.effectType === 'required' ? true : undefined}}",
3132
+ "disabled": "{{params.effectType === 'disabled' ? true : undefined}}"
3133
+ },
3134
+ "propertiesWhenFalse": {
3135
+ "hidden": "{{params.effectType === 'visibility' ? true : undefined}}",
3136
+ "required": "{{params.effectType === 'required' ? false : undefined}}",
3137
+ "disabled": "{{params.effectType === 'disabled' ? false : undefined}}"
3138
+ }
3139
+ }
3140
+ }
3141
+ ]
3142
+ },
3143
+ "safetyNotes": "Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples."
3144
+ },
3145
+ {
3146
+ "id": "rule.add.custom",
3147
+ "intentExamples": [
3148
+ "adicionar regra customizada",
3149
+ "regra complexa",
3150
+ "logica de formulario"
3151
+ ],
3152
+ "scope": "GLOBAL",
3153
+ "valueType": "OBJECT",
3154
+ "operation": "create",
3155
+ "params": [
3156
+ {
3157
+ "name": "id",
3158
+ "type": "STRING",
3159
+ "description": "ID único da regra"
3160
+ },
3161
+ {
3162
+ "name": "condition",
3163
+ "type": "STRING",
3164
+ "description": "Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \"and\": [{ \">\": [{ \"var\": \"idade\" }, 18] }, { \"==\": [{ \"var\": \"possuiHabilitacao\" }, true] }] })"
3165
+ },
3166
+ {
3167
+ "name": "targetField",
3168
+ "type": "STRING",
3169
+ "description": "Campo afetado"
3170
+ },
3171
+ {
3172
+ "name": "propertyName",
3173
+ "type": "STRING",
3174
+ "description": "Propriedade afetada (hidden, required, disabled, readOnly)"
3175
+ },
3176
+ {
3177
+ "name": "valueIfTrue",
3178
+ "type": "BOOLEAN",
3179
+ "description": "Valor se a condição for verdadeira"
3180
+ },
3181
+ {
3182
+ "name": "valueIfFalse",
3183
+ "type": "BOOLEAN",
3184
+ "description": "Valor se a condição for falsa"
3185
+ }
3186
+ ],
3187
+ "patchTemplate": {
3188
+ "formRules": [
3189
+ {
3190
+ "id": "{{params.id}}",
3191
+ "name": "Regra Customizada: {{params.id}}",
3192
+ "targetType": "field",
3193
+ "targets": [
3194
+ "{{params.targetField}}"
3195
+ ],
3196
+ "effect": {
3197
+ "condition": "{{params.condition}}",
3198
+ "properties": {
3199
+ "{{params.propertyName}}": "{{params.valueIfTrue}}"
3200
+ },
3201
+ "propertiesWhenFalse": {
3202
+ "{{params.propertyName}}": "{{params.valueIfFalse}}"
3203
+ }
3204
+ }
3205
+ }
3206
+ ]
3207
+ }
3208
+ }
3209
+ ],
3210
+ "fieldResolvers": {
3211
+ "fieldMetadata[]": [
3212
+ "name",
3213
+ "label"
3214
+ ],
3215
+ "sections[]": [
3216
+ "id",
3217
+ "title"
3218
+ ],
3219
+ "sections[].rows[].columns[].items[]": [
3220
+ "id",
3221
+ "fieldName"
3222
+ ],
3223
+ "sections[].rows[].columns[].fields[]": []
3224
+ },
3225
+ "hints": [
3226
+ "Use fieldMetadata[].name as the canonical field id; avoid array indexes.",
3227
+ "Local fields are real form controls. Create them in fieldMetadata[] with source:\"local\", usually transient:true and submitPolicy:\"omit\", then place them as kind:\"field\" layout items.",
3228
+ "submitPolicy accepts only \"omit\", \"include\", or \"includeWhenDirty\". If legacy prompt text says \"never\", normalize it to \"omit\" before persisting.",
3229
+ "Visual blocks are not fields. Store them only as kind:\"richContent\" layout items and never in fieldMetadata[].",
3230
+ "Use sections[].rows[].columns[].items[] as the canonical mixed layout order. kind:\"field\" items reference fieldMetadata; kind:\"richContent\" items are visual blocks outside submit payload.",
3231
+ "Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.",
3232
+ "For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.",
3233
+ "For field formRules that must calculate a FormControl value, use effect.properties.value with the closed envelope { expression: <JSON Logic> }, such as { expression: { yearsSince: [{ var: \"birthDate\" }] } }. Use the closed envelope { literal: <value> } for structured literal objects; do not add extra keys and do not generate TypeScript functions.",
3234
+ "For conditional side effects, use formCommandRules with effects[].kind:\"global-action\" and a structured globalAction ref. The visual editor authors the primary effect and preserves secondary effects from advanced JSON. Do not put alert/modal/navigation commands inside formRules[].effect.properties.",
3235
+ "LLM-created formRules must include metadata.origin:\"llm\" and metadata.reviewStatus:\"pending\"; never write generated formRulesState.",
3236
+ "Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.",
3237
+ "For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.",
3238
+ "Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.",
3239
+ "When adding sections/rows/columns, provide a unique \"id\" for each new element.",
3240
+ "For nested layout changes (column within a row within a section), explicitly define \"target.sectionId\", \"target.rowId\", \"target.columnId\" in user prompt for clarity.",
3241
+ "DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).",
3242
+ "DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).",
3243
+ "DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.",
3244
+ "DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.",
3245
+ "DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally."
3246
+ ]
3247
+ },
3248
+ "authoringManifest": {
3249
+ "schemaVersion": "1.0.0",
3250
+ "componentId": "praxis-manual-form",
3251
+ "ownerPackage": "@praxisui/manual-form",
3252
+ "configSchemaId": "ManualFormInstance",
3253
+ "manifestVersion": "1.0.0",
3254
+ "runtimeInputs": [
3255
+ {
3256
+ "name": "formId",
3257
+ "type": "string",
3258
+ "description": "Required manual form id used for runtime state and persistence key composition."
3259
+ },
3260
+ {
3261
+ "name": "formGroup",
3262
+ "type": "FormGroup | null",
3263
+ "description": "Host-owned typed FormGroup adopted by the manual form runtime when provided."
3264
+ },
3265
+ {
3266
+ "name": "formTitle",
3267
+ "type": "string | null",
3268
+ "description": "Manual form title override."
3269
+ },
3270
+ {
3271
+ "name": "formDescription",
3272
+ "type": "string | null",
3273
+ "description": "Manual form description override."
3274
+ },
3275
+ {
3276
+ "name": "actions",
3277
+ "type": "FormActionsLayout | null",
3278
+ "description": "Manual toolbar/actions layout."
3279
+ },
3280
+ {
3281
+ "name": "enableAutoSave",
3282
+ "type": "boolean",
3283
+ "description": "Enables draft persistence through ManualFormInstance.saveDraft."
3284
+ },
3285
+ {
3286
+ "name": "autoSaveDebounceMs",
3287
+ "type": "number",
3288
+ "description": "Autosave debounce in milliseconds."
3289
+ },
3290
+ {
3291
+ "name": "enableCustomization",
3292
+ "type": "boolean",
3293
+ "description": "Enables field toolbar and metadata editor bridge."
3294
+ },
3295
+ {
3296
+ "name": "persistenceOptions",
3297
+ "type": "ManualFormPersistenceOptions | null",
3298
+ "description": "Namespace, tenant, profile, locale and storage key controls."
3299
+ },
3300
+ {
3301
+ "name": "usePathNames",
3302
+ "type": "boolean",
3303
+ "description": "Uses FormControlName.path as FieldMetadata.name for nested manual forms."
3304
+ }
3305
+ ],
3306
+ "editableTargets": [
3307
+ {
3308
+ "kind": "manualField",
3309
+ "resolver": "manual-form-field-by-name",
3310
+ "description": "Detected or declared manual field tracked by ManualFormInstance field metadata."
3311
+ },
3312
+ {
3313
+ "kind": "layout",
3314
+ "resolver": "manual-form-layout",
3315
+ "description": "Manual layout ownership: host template layout plus optional FormConfig sections for authored structure."
3316
+ },
3317
+ {
3318
+ "kind": "toolbar",
3319
+ "resolver": "manual-form-customization-toolbar",
3320
+ "description": "Customization toolbar and quick metadata toggles."
3321
+ },
3322
+ {
3323
+ "kind": "autosave",
3324
+ "resolver": "manual-form-autosave-policy",
3325
+ "description": "Autosave enablement, debounce and persistence key controls."
3326
+ },
3327
+ {
3328
+ "kind": "metadataBridge",
3329
+ "resolver": "manual-field-metadata-bridge",
3330
+ "description": "Bridge from manual fields to @praxisui/metadata-editor patches."
3331
+ },
3332
+ {
3333
+ "kind": "submitBehavior",
3334
+ "resolver": "manual-form-submit-behavior",
3335
+ "description": "Submit, reset, validation focus and unsaved-change behavior."
3336
+ }
3337
+ ],
3338
+ "operations": [
3339
+ {
3340
+ "operationId": "manualField.add",
3341
+ "title": "Add manual field metadata",
3342
+ "scope": "field",
3343
+ "targetKind": "manualField",
3344
+ "target": {
3345
+ "kind": "manualField",
3346
+ "resolver": "manual-form-field-by-name",
3347
+ "ambiguityPolicy": "fail",
3348
+ "required": true
3349
+ },
3350
+ "inputSchema": {
3351
+ "type": "object",
3352
+ "required": [
3353
+ "fieldName",
3354
+ "controlType"
3355
+ ],
3356
+ "properties": {
3357
+ "fieldName": {
3358
+ "type": "string"
3359
+ },
3360
+ "controlType": {
3361
+ "type": "string"
3362
+ },
3363
+ "label": {
3364
+ "type": "string"
3365
+ },
3366
+ "required": {
3367
+ "type": "boolean"
3368
+ },
3369
+ "sectionId": {
3370
+ "type": "string"
3371
+ },
3372
+ "source": {
3373
+ "enum": [
3374
+ "manual-template",
3375
+ "detected-component",
3376
+ "metadata-bridge"
3377
+ ]
3378
+ },
3379
+ "delegateFieldMetadataTo": {
3380
+ "enum": [
3381
+ "praxis-metadata-editor"
3382
+ ]
3383
+ }
3384
+ }
3385
+ },
3386
+ "effects": [
3387
+ {
3388
+ "kind": "compile-domain-patch",
3389
+ "handler": "manual-field-add",
3390
+ "handlerContract": {
3391
+ "reads": [
3392
+ "ManualFormInstance.currentConfig",
3393
+ "ManualFormInstance.currentFieldMetadata",
3394
+ "ManualFieldKeyService",
3395
+ "dynamic-fields-control-discovery"
3396
+ ],
3397
+ "writes": [
3398
+ "currentConfig.fieldMetadata",
3399
+ "currentFieldMetadata",
3400
+ "form"
3401
+ ],
3402
+ "identityKeys": [
3403
+ "fieldName"
3404
+ ],
3405
+ "failureModes": [
3406
+ "duplicate-manual-field-id",
3407
+ "control-type-not-discovered",
3408
+ "host-template-field-missing",
3409
+ "field-metadata-delegation-required"
3410
+ ],
3411
+ "description": "Adds metadata for a manual field while preserving host-owned template layout and delegating advanced FieldMetadata edits."
3412
+ }
3413
+ }
3414
+ ],
3415
+ "validators": [
3416
+ "manual-field-id-unique",
3417
+ "control-type-discovered",
3418
+ "host-template-field-exists",
3419
+ "metadata-bridge-does-not-redefine-schema",
3420
+ "manual-form-round-trip"
3421
+ ],
3422
+ "affectedPaths": [
3423
+ "currentConfig.fieldMetadata",
3424
+ "currentFieldMetadata",
3425
+ "form"
3426
+ ],
3427
+ "submissionImpact": "affects-schema-backed-data",
3428
+ "preconditions": [
3429
+ "manual-form-instance-loaded"
3430
+ ],
3431
+ "destructive": false,
3432
+ "requiresConfirmation": false
3433
+ },
3434
+ {
3435
+ "operationId": "manualField.remove",
3436
+ "title": "Remove manual field metadata",
3437
+ "scope": "field",
3438
+ "targetKind": "manualField",
3439
+ "target": {
3440
+ "kind": "manualField",
3441
+ "resolver": "manual-form-field-by-name",
3442
+ "ambiguityPolicy": "fail",
3443
+ "required": true
3444
+ },
3445
+ "inputSchema": {
3446
+ "type": "object",
3447
+ "required": [
3448
+ "fieldName"
3449
+ ],
3450
+ "properties": {
3451
+ "fieldName": {
3452
+ "type": "string"
3453
+ },
3454
+ "removeFromLayout": {
3455
+ "type": "boolean"
3456
+ },
3457
+ "clearPersistedValue": {
3458
+ "type": "boolean"
3459
+ }
3460
+ }
3461
+ },
3462
+ "effects": [
3463
+ {
3464
+ "kind": "compile-domain-patch",
3465
+ "handler": "manual-field-remove",
3466
+ "handlerContract": {
3467
+ "reads": [
3468
+ "ManualFormInstance.currentConfig",
3469
+ "ManualFormInstance.currentFieldMetadata",
3470
+ "ManualFormInstance.form",
3471
+ "FormConfig.sections"
3472
+ ],
3473
+ "writes": [
3474
+ "currentConfig.fieldMetadata",
3475
+ "currentConfig.sections",
3476
+ "currentFieldMetadata",
3477
+ "form"
3478
+ ],
3479
+ "identityKeys": [
3480
+ "fieldName"
3481
+ ],
3482
+ "failureModes": [
3483
+ "manual-field-not-found",
3484
+ "field-still-referenced-by-layout",
3485
+ "persisted-value-removal-not-confirmed"
3486
+ ],
3487
+ "description": "Removes a manual field by stable field name and requires explicit confirmation before metadata, layout or value loss."
3488
+ }
3489
+ }
3490
+ ],
3491
+ "destructive": true,
3492
+ "requiresConfirmation": true,
3493
+ "validators": [
3494
+ "manual-field-exists",
3495
+ "field-removal-confirmed",
3496
+ "layout-field-references-valid",
3497
+ "manual-form-round-trip"
3498
+ ],
3499
+ "affectedPaths": [
3500
+ "currentConfig.fieldMetadata",
3501
+ "currentConfig.sections",
3502
+ "currentFieldMetadata",
3503
+ "form"
3504
+ ],
3505
+ "submissionImpact": "affects-schema-backed-data",
3506
+ "preconditions": [
3507
+ "manual-form-instance-loaded",
3508
+ "explicit-confirmation-provided"
3509
+ ]
3510
+ },
3511
+ {
3512
+ "operationId": "manualField.label.set",
3513
+ "title": "Set manual field label",
3514
+ "scope": "field",
3515
+ "targetKind": "manualField",
3516
+ "target": {
3517
+ "kind": "manualField",
3518
+ "resolver": "manual-form-field-by-name",
3519
+ "ambiguityPolicy": "fail",
3520
+ "required": true
3521
+ },
3522
+ "inputSchema": {
3523
+ "type": "object",
3524
+ "required": [
3525
+ "fieldName",
3526
+ "label"
3527
+ ],
3528
+ "properties": {
3529
+ "fieldName": {
3530
+ "type": "string"
3531
+ },
3532
+ "label": {
3533
+ "type": "string"
3534
+ },
3535
+ "updatePlaceholderWhenEmpty": {
3536
+ "type": "boolean"
3537
+ }
3538
+ }
3539
+ },
3540
+ "effects": [
3541
+ {
3542
+ "kind": "compile-domain-patch",
3543
+ "handler": "manual-field-label-set",
3544
+ "handlerContract": {
3545
+ "reads": [
3546
+ "ManualFormInstance.currentFieldMetadata",
3547
+ "ManualFieldMetadataBridgeService"
3548
+ ],
3549
+ "writes": [
3550
+ "currentConfig.fieldMetadata[].label",
3551
+ "currentConfig.fieldMetadata[].placeholder",
3552
+ "currentFieldMetadata"
3553
+ ],
3554
+ "identityKeys": [
3555
+ "fieldName"
3556
+ ],
3557
+ "failureModes": [
3558
+ "manual-field-not-found",
3559
+ "label-empty",
3560
+ "metadata-patch-rejected"
3561
+ ],
3562
+ "description": "Sets a manual field label through the metadata bridge without redefining backend schema semantics."
3563
+ }
3564
+ }
3565
+ ],
3566
+ "validators": [
3567
+ "manual-field-exists",
3568
+ "field-label-valid",
3569
+ "metadata-bridge-does-not-redefine-schema",
3570
+ "manual-form-round-trip"
3571
+ ],
3572
+ "affectedPaths": [
3573
+ "currentConfig.fieldMetadata[].label",
3574
+ "currentConfig.fieldMetadata[].placeholder",
3575
+ "currentFieldMetadata"
3576
+ ],
3577
+ "submissionImpact": "visual-only",
3578
+ "preconditions": [
3579
+ "manual-form-instance-loaded"
3580
+ ],
3581
+ "destructive": false,
3582
+ "requiresConfirmation": false
3583
+ },
3584
+ {
3585
+ "operationId": "layout.configure",
3586
+ "title": "Configure manual form layout",
3587
+ "scope": "layout",
3588
+ "targetKind": "layout",
3589
+ "target": {
3590
+ "kind": "layout",
3591
+ "resolver": "manual-form-layout",
3592
+ "ambiguityPolicy": "fail",
3593
+ "required": false
3594
+ },
3595
+ "inputSchema": {
3596
+ "type": "object",
3597
+ "minProperties": 1,
3598
+ "properties": {
3599
+ "usePathNames": {
3600
+ "type": "boolean"
3601
+ },
3602
+ "sections": {
3603
+ "type": "array"
3604
+ },
3605
+ "rows": {
3606
+ "type": "array"
3607
+ },
3608
+ "columns": {
3609
+ "type": "array"
3610
+ },
3611
+ "fieldOrder": {
3612
+ "type": "array",
3613
+ "items": {
3614
+ "type": "string"
3615
+ }
3616
+ },
3617
+ "delegateAdvancedFormConfigTo": {
3618
+ "enum": [
3619
+ "praxis-dynamic-form"
3620
+ ]
3621
+ }
3622
+ }
3623
+ },
3624
+ "effects": [
3625
+ {
3626
+ "kind": "compile-domain-patch",
3627
+ "handler": "manual-layout-configure",
3628
+ "handlerContract": {
3629
+ "reads": [
3630
+ "ManualFormInstance.currentConfig",
3631
+ "FormConfig.sections",
3632
+ "host-template-layout",
3633
+ "praxis-dynamic-form-authoring-manifest"
3634
+ ],
3635
+ "writes": [
3636
+ "currentConfig.sections",
3637
+ "usePathNames"
3638
+ ],
3639
+ "identityKeys": [
3640
+ "sectionId",
3641
+ "rowId",
3642
+ "columnId",
3643
+ "fieldName"
3644
+ ],
3645
+ "failureModes": [
3646
+ "layout-field-reference-missing",
3647
+ "advanced-form-config-delegation-required",
3648
+ "host-template-layout-conflict"
3649
+ ],
3650
+ "description": "Configures manual layout metadata and delegates advanced FormConfig layout semantics to the dynamic-form manifest."
3651
+ }
3652
+ }
3653
+ ],
3654
+ "validators": [
3655
+ "layout-field-references-valid",
3656
+ "manual-layout-does-not-replace-host-template",
3657
+ "delegates-form-config",
3658
+ "manual-form-round-trip"
3659
+ ],
3660
+ "affectedPaths": [
3661
+ "currentConfig.sections",
3662
+ "usePathNames"
3663
+ ],
3664
+ "submissionImpact": "config-only",
3665
+ "preconditions": [
3666
+ "manual-form-instance-loaded"
3667
+ ],
3668
+ "destructive": false,
3669
+ "requiresConfirmation": false
3670
+ },
3671
+ {
3672
+ "operationId": "toolbar.configure",
3673
+ "title": "Configure manual form customization toolbar",
3674
+ "scope": "toolbarUi",
3675
+ "targetKind": "toolbar",
3676
+ "target": {
3677
+ "kind": "toolbar",
3678
+ "resolver": "manual-form-customization-toolbar",
3679
+ "ambiguityPolicy": "fail",
3680
+ "required": false
3681
+ },
3682
+ "inputSchema": {
3683
+ "type": "object",
3684
+ "minProperties": 1,
3685
+ "properties": {
3686
+ "enableCustomization": {
3687
+ "type": "boolean"
3688
+ },
3689
+ "editableFlags": {
3690
+ "type": "array",
3691
+ "items": {
3692
+ "enum": [
3693
+ "required",
3694
+ "readOnly",
3695
+ "hidden",
3696
+ "disabled",
3697
+ "openMetadataEditor"
3698
+ ]
3699
+ }
3700
+ }
3701
+ }
3702
+ },
3703
+ "effects": [
3704
+ {
3705
+ "kind": "compile-domain-patch",
3706
+ "handler": "manual-toolbar-configure",
3707
+ "handlerContract": {
3708
+ "reads": [
3709
+ "ManualFormComponent.enableCustomization",
3710
+ "ManualFieldToolbarComponent",
3711
+ "ManualFieldEditorOnDblclickDirective"
3712
+ ],
3713
+ "writes": [
3714
+ "enableCustomization"
3715
+ ],
3716
+ "identityKeys": [
3717
+ "formId"
3718
+ ],
3719
+ "failureModes": [
3720
+ "toolbar-disabled-with-required-bridge",
3721
+ "unsupported-toolbar-flag"
3722
+ ],
3723
+ "description": "Configures the manual customization toolbar and keeps metadata edit entry points behind enableCustomization."
3724
+ }
3725
+ }
3726
+ ],
3727
+ "validators": [
3728
+ "toolbar-flags-supported",
3729
+ "metadata-bridge-gated-by-customization",
3730
+ "manual-form-round-trip"
3731
+ ],
3732
+ "affectedPaths": [
3733
+ "enableCustomization"
3734
+ ],
3735
+ "submissionImpact": "visual-only",
3736
+ "preconditions": [
3737
+ "manual-form-component-loaded"
3738
+ ],
3739
+ "destructive": false,
3740
+ "requiresConfirmation": false
3741
+ },
3742
+ {
3743
+ "operationId": "autosave.enabled.set",
3744
+ "title": "Set manual form autosave policy",
3745
+ "scope": "interaction",
3746
+ "targetKind": "autosave",
3747
+ "target": {
3748
+ "kind": "autosave",
3749
+ "resolver": "manual-form-autosave-policy",
3750
+ "ambiguityPolicy": "fail",
3751
+ "required": false
3752
+ },
3753
+ "inputSchema": {
3754
+ "type": "object",
3755
+ "required": [
3756
+ "enabled"
3757
+ ],
3758
+ "properties": {
3759
+ "enabled": {
3760
+ "type": "boolean"
3761
+ },
3762
+ "debounceMs": {
3763
+ "type": "number"
3764
+ },
3765
+ "storageKey": {
3766
+ "type": "string"
3767
+ },
3768
+ "namespace": {
3769
+ "type": "string"
3770
+ },
3771
+ "tenantId": {
3772
+ "type": "string"
3773
+ },
3774
+ "profileId": {
3775
+ "type": "string"
3776
+ }
3777
+ }
3778
+ },
3779
+ "effects": [
3780
+ {
3781
+ "kind": "compile-domain-patch",
3782
+ "handler": "manual-autosave-enabled-set",
3783
+ "handlerContract": {
3784
+ "reads": [
3785
+ "enableAutoSave",
3786
+ "autoSaveDebounceMs",
3787
+ "ManualFormPersistenceOptions",
3788
+ "ASYNC_CONFIG_STORAGE"
3789
+ ],
3790
+ "writes": [
3791
+ "enableAutoSave",
3792
+ "autoSaveDebounceMs",
3793
+ "persistenceOptions"
3794
+ ],
3795
+ "identityKeys": [
3796
+ "formId",
3797
+ "storageKey",
3798
+ "namespace",
3799
+ "tenantId",
3800
+ "profileId"
3801
+ ],
3802
+ "failureModes": [
3803
+ "autosave-storage-missing",
3804
+ "unsafe-debounce",
3805
+ "ambiguous-storage-key",
3806
+ "ssr-storage-not-safe"
3807
+ ],
3808
+ "description": "Sets autosave explicitly and requires safe debounce plus deterministic persistence key composition."
3809
+ }
3810
+ }
3811
+ ],
3812
+ "validators": [
3813
+ "autosave-explicit",
3814
+ "autosave-debounce-safe",
3815
+ "autosave-storage-available",
3816
+ "persistence-key-deterministic",
3817
+ "manual-form-round-trip"
3818
+ ],
3819
+ "affectedPaths": [
3820
+ "enableAutoSave",
3821
+ "autoSaveDebounceMs",
3822
+ "persistenceOptions"
3823
+ ],
3824
+ "submissionImpact": "config-only",
3825
+ "preconditions": [
3826
+ "manual-form-instance-loaded"
3827
+ ],
3828
+ "destructive": false,
3829
+ "requiresConfirmation": false
3830
+ },
3831
+ {
3832
+ "operationId": "submitBehavior.set",
3833
+ "title": "Set manual form submit behavior",
3834
+ "scope": "interaction",
3835
+ "targetKind": "submitBehavior",
3836
+ "target": {
3837
+ "kind": "submitBehavior",
3838
+ "resolver": "manual-form-submit-behavior",
3839
+ "ambiguityPolicy": "fail",
3840
+ "required": false
3841
+ },
3842
+ "inputSchema": {
3843
+ "type": "object",
3844
+ "minProperties": 1,
3845
+ "properties": {
3846
+ "action": {
3847
+ "enum": [
3848
+ "submit",
3849
+ "saveDraft",
3850
+ "reset",
3851
+ "cancel",
3852
+ "custom"
3853
+ ]
3854
+ },
3855
+ "clearAfterSave": {
3856
+ "type": "boolean"
3857
+ },
3858
+ "focusFirstError": {
3859
+ "type": "boolean"
3860
+ },
3861
+ "scrollToErrors": {
3862
+ "type": "boolean"
3863
+ },
3864
+ "confirmOnUnsavedChanges": {
3865
+ "type": "boolean"
3866
+ },
3867
+ "delegateFormSubmitTo": {
3868
+ "enum": [
3869
+ "praxis-dynamic-form"
3870
+ ]
3871
+ }
3872
+ }
3873
+ },
3874
+ "effects": [
3875
+ {
3876
+ "kind": "compile-domain-patch",
3877
+ "handler": "manual-submit-behavior-set",
3878
+ "handlerContract": {
3879
+ "reads": [
3880
+ "ManualFormComponent.submitted",
3881
+ "ManualFormInstance.form",
3882
+ "FormConfig.behavior",
3883
+ "praxis-dynamic-form-authoring-manifest"
3884
+ ],
3885
+ "writes": [
3886
+ "currentConfig.behavior",
3887
+ "submitted",
3888
+ "saved",
3889
+ "resetEvent"
3890
+ ],
3891
+ "identityKeys": [
3892
+ "formId",
3893
+ "action"
3894
+ ],
3895
+ "failureModes": [
3896
+ "submit-action-unsupported",
3897
+ "advanced-form-submit-delegation-required",
3898
+ "validation-focus-target-missing"
3899
+ ],
3900
+ "description": "Configures manual submit/reset behavior and delegates dynamic-form submit payload semantics to the dynamic-form manifest."
3901
+ }
3902
+ }
3903
+ ],
3904
+ "validators": [
3905
+ "submit-behavior-supported",
3906
+ "delegates-form-config",
3907
+ "manual-form-round-trip"
3908
+ ],
3909
+ "affectedPaths": [
3910
+ "currentConfig.behavior",
3911
+ "submitted",
3912
+ "saved",
3913
+ "resetEvent"
3914
+ ],
3915
+ "submissionImpact": "affects-submission",
3916
+ "preconditions": [
3917
+ "manual-form-instance-loaded"
3918
+ ],
3919
+ "destructive": false,
3920
+ "requiresConfirmation": false
3921
+ },
3922
+ {
3923
+ "operationId": "metadataBridge.configure",
3924
+ "title": "Configure manual metadata bridge",
3925
+ "scope": "fieldMetadataPath",
3926
+ "targetKind": "metadataBridge",
3927
+ "target": {
3928
+ "kind": "metadataBridge",
3929
+ "resolver": "manual-field-metadata-bridge",
3930
+ "ambiguityPolicy": "fail",
3931
+ "required": false
3932
+ },
3933
+ "inputSchema": {
3934
+ "type": "object",
3935
+ "minProperties": 1,
3936
+ "properties": {
3937
+ "enabled": {
3938
+ "type": "boolean"
3939
+ },
3940
+ "fieldName": {
3941
+ "type": "string"
3942
+ },
3943
+ "openMode": {
3944
+ "enum": [
3945
+ "field-toolbar",
3946
+ "double-click",
3947
+ "programmatic"
3948
+ ]
3949
+ },
3950
+ "persistDraftAfterPatch": {
3951
+ "type": "boolean"
3952
+ },
3953
+ "delegateFieldMetadataTo": {
3954
+ "enum": [
3955
+ "praxis-metadata-editor"
3956
+ ]
3957
+ },
3958
+ "delegateControlDiscoveryTo": {
3959
+ "enum": [
3960
+ "praxis-dynamic-fields"
3961
+ ]
3962
+ }
3963
+ }
3964
+ },
3965
+ "effects": [
3966
+ {
3967
+ "kind": "compile-domain-patch",
3968
+ "handler": "manual-metadata-bridge-configure",
3969
+ "handlerContract": {
3970
+ "reads": [
3971
+ "ManualFieldMetadataBridgeService",
3972
+ "SettingsPanelService",
3973
+ "PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST",
3974
+ "dynamic-fields-discovery"
3975
+ ],
3976
+ "writes": [
3977
+ "enableCustomization",
3978
+ "currentFieldMetadata",
3979
+ "currentConfig.fieldMetadata"
3980
+ ],
3981
+ "identityKeys": [
3982
+ "formId",
3983
+ "fieldName",
3984
+ "openMode"
3985
+ ],
3986
+ "failureModes": [
3987
+ "metadata-editor-unavailable",
3988
+ "field-metadata-delegation-required",
3989
+ "control-discovery-delegation-required",
3990
+ "draft-persistence-failed"
3991
+ ],
3992
+ "description": "Configures the bridge that opens metadata-editor for manual fields and persists accepted patches through ManualFormInstance."
3993
+ }
3994
+ }
3995
+ ],
3996
+ "validators": [
3997
+ "metadata-bridge-does-not-redefine-schema",
3998
+ "delegates-field-metadata",
3999
+ "control-type-discovered",
4000
+ "metadata-bridge-gated-by-customization",
4001
+ "manual-form-round-trip"
4002
+ ],
4003
+ "affectedPaths": [
4004
+ "enableCustomization",
4005
+ "currentFieldMetadata",
4006
+ "currentConfig.fieldMetadata"
4007
+ ],
4008
+ "submissionImpact": "affects-schema-backed-data",
4009
+ "preconditions": [
4010
+ "manual-form-instance-loaded"
4011
+ ],
4012
+ "destructive": false,
4013
+ "requiresConfirmation": false
4014
+ }
4015
+ ],
4016
+ "validators": [
4017
+ {
4018
+ "validatorId": "manual-field-id-unique",
4019
+ "level": "error",
4020
+ "code": "MANUAL_FORM_FIELD_ID_UNIQUE",
4021
+ "description": "Manual field names must be unique in the instance metadata map."
4022
+ },
4023
+ {
4024
+ "validatorId": "manual-field-exists",
4025
+ "level": "error",
4026
+ "code": "MANUAL_FORM_FIELD_EXISTS",
4027
+ "description": "Target manual field must exist before patching or removing it."
4028
+ },
4029
+ {
4030
+ "validatorId": "field-removal-confirmed",
4031
+ "level": "error",
4032
+ "code": "MANUAL_FORM_FIELD_REMOVAL_CONFIRMED",
4033
+ "description": "Removing a field or its persisted value requires explicit confirmation."
4034
+ },
4035
+ {
4036
+ "validatorId": "field-label-valid",
4037
+ "level": "error",
4038
+ "code": "MANUAL_FORM_FIELD_LABEL_VALID",
4039
+ "description": "Manual field label must be a non-empty user-facing string."
4040
+ },
4041
+ {
4042
+ "validatorId": "host-template-field-exists",
4043
+ "level": "error",
4044
+ "code": "MANUAL_FORM_HOST_FIELD_EXISTS",
4045
+ "description": "Manual field metadata must correspond to a host template control or declared metadata bridge target."
4046
+ },
4047
+ {
4048
+ "validatorId": "control-type-discovered",
4049
+ "level": "error",
4050
+ "code": "MANUAL_FORM_CONTROL_TYPE_DISCOVERED",
4051
+ "description": "Control type must be discovered through dynamic-fields mappings or delegated discovery."
4052
+ },
4053
+ {
4054
+ "validatorId": "metadata-bridge-does-not-redefine-schema",
4055
+ "level": "error",
4056
+ "code": "MANUAL_FORM_METADATA_BRIDGE_SCHEMA_SAFE",
4057
+ "description": "Metadata bridge patches must not silently redefine backend schema or schema-driven FormConfig semantics."
4058
+ },
4059
+ {
4060
+ "validatorId": "delegates-field-metadata",
4061
+ "level": "error",
4062
+ "code": "MANUAL_FORM_DELEGATES_FIELD_METADATA",
4063
+ "description": "Advanced FieldMetadata edits must be delegated to the metadata-editor manifest."
4064
+ },
4065
+ {
4066
+ "validatorId": "delegates-form-config",
4067
+ "level": "error",
4068
+ "code": "MANUAL_FORM_DELEGATES_FORM_CONFIG",
4069
+ "description": "Advanced FormConfig semantics must be delegated to the dynamic-form manifest."
4070
+ },
4071
+ {
4072
+ "validatorId": "layout-field-references-valid",
4073
+ "level": "error",
4074
+ "code": "MANUAL_FORM_LAYOUT_FIELD_REFERENCES_VALID",
4075
+ "description": "Layout field references must resolve to manual fields."
4076
+ },
4077
+ {
4078
+ "validatorId": "manual-layout-does-not-replace-host-template",
4079
+ "level": "error",
4080
+ "code": "MANUAL_FORM_LAYOUT_HOST_TEMPLATE_SAFE",
4081
+ "description": "Manual layout metadata must not pretend to rewrite host-owned HTML template structure."
4082
+ },
4083
+ {
4084
+ "validatorId": "toolbar-flags-supported",
4085
+ "level": "error",
4086
+ "code": "MANUAL_FORM_TOOLBAR_FLAGS_SUPPORTED",
4087
+ "description": "Toolbar quick edit flags must be supported by the manual field toolbar."
4088
+ },
4089
+ {
4090
+ "validatorId": "metadata-bridge-gated-by-customization",
4091
+ "level": "error",
4092
+ "code": "MANUAL_FORM_METADATA_BRIDGE_GATED",
4093
+ "description": "Metadata bridge entry points must respect enableCustomization."
4094
+ },
4095
+ {
4096
+ "validatorId": "autosave-explicit",
4097
+ "level": "error",
4098
+ "code": "MANUAL_FORM_AUTOSAVE_EXPLICIT",
4099
+ "description": "Autosave enablement and persistence policy must be explicit."
4100
+ },
4101
+ {
4102
+ "validatorId": "autosave-debounce-safe",
4103
+ "level": "error",
4104
+ "code": "MANUAL_FORM_AUTOSAVE_DEBOUNCE_SAFE",
4105
+ "description": "Autosave debounce must be positive and safe for storage backends."
4106
+ },
4107
+ {
4108
+ "validatorId": "autosave-storage-available",
4109
+ "level": "error",
4110
+ "code": "MANUAL_FORM_AUTOSAVE_STORAGE_AVAILABLE",
4111
+ "description": "Autosave requires a valid AsyncConfigStorage implementation."
4112
+ },
4113
+ {
4114
+ "validatorId": "persistence-key-deterministic",
4115
+ "level": "error",
4116
+ "code": "MANUAL_FORM_PERSISTENCE_KEY_DETERMINISTIC",
4117
+ "description": "Persistence key composition must be deterministic across reopen/reload."
4118
+ },
4119
+ {
4120
+ "validatorId": "submit-behavior-supported",
4121
+ "level": "error",
4122
+ "code": "MANUAL_FORM_SUBMIT_BEHAVIOR_SUPPORTED",
4123
+ "description": "Submit behavior must map to supported manual form outputs or delegated dynamic-form semantics."
4124
+ },
4125
+ {
4126
+ "validatorId": "manual-form-round-trip",
4127
+ "level": "error",
4128
+ "code": "MANUAL_FORM_ROUND_TRIP",
4129
+ "description": "Open, edit, apply/save, reopen and runtime consume must preserve manual form config."
4130
+ }
4131
+ ],
4132
+ "roundTripRequirements": [
4133
+ "ManualFormInstance is the package-level runtime document: config, field metadata map, FormGroup and persistence key must remain coherent.",
4134
+ "Manual field ids are stable field names; array indexes are not canonical identity.",
4135
+ "Field removal is destructive and requires confirmation before metadata, layout references or persisted values are removed.",
4136
+ "Autosave must be explicit, have a safe debounce and use deterministic persistence key composition through ManualFormPersistenceOptions.",
4137
+ "The metadata bridge may apply metadata-editor patches but must not silently redefine backend schema or duplicate FieldMetadata semantics.",
4138
+ "Advanced FormConfig authoring belongs to praxis-dynamic-form; this manifest governs manual form orchestration and delegates deeper FormConfig semantics."
4139
+ ],
4140
+ "examples": [
4141
+ {
4142
+ "id": "add-text-field",
4143
+ "request": "Add a manual text field for customer name.",
4144
+ "operationId": "manualField.add",
4145
+ "params": {
4146
+ "fieldName": "customerName",
4147
+ "controlType": "input",
4148
+ "label": "Customer name",
4149
+ "source": "manual-template",
4150
+ "delegateFieldMetadataTo": "praxis-metadata-editor"
4151
+ },
4152
+ "isPositive": true
4153
+ },
4154
+ {
4155
+ "id": "remove-obsolete-field",
4156
+ "request": "Remove the obsolete nickname field from the manual form.",
4157
+ "operationId": "manualField.remove",
4158
+ "params": {
4159
+ "fieldName": "nickname",
4160
+ "removeFromLayout": true,
4161
+ "clearPersistedValue": true
4162
+ },
4163
+ "isPositive": true
4164
+ },
4165
+ {
4166
+ "id": "rename-label",
4167
+ "request": "Change the label of cpf to CPF/CNPJ.",
4168
+ "operationId": "manualField.label.set",
4169
+ "params": {
4170
+ "fieldName": "cpf",
4171
+ "label": "CPF/CNPJ"
4172
+ },
4173
+ "isPositive": true
4174
+ },
4175
+ {
4176
+ "id": "enable-path-names",
4177
+ "request": "Use nested form paths as field names.",
4178
+ "operationId": "layout.configure",
4179
+ "params": {
4180
+ "usePathNames": true
4181
+ },
4182
+ "isPositive": true
4183
+ },
4184
+ {
4185
+ "id": "configure-toolbar",
4186
+ "request": "Enable customization toolbar with required and hidden toggles.",
4187
+ "operationId": "toolbar.configure",
4188
+ "params": {
4189
+ "enableCustomization": true,
4190
+ "editableFlags": [
4191
+ "required",
4192
+ "hidden",
4193
+ "openMetadataEditor"
4194
+ ]
4195
+ },
4196
+ "isPositive": true
4197
+ },
4198
+ {
4199
+ "id": "enable-autosave",
4200
+ "request": "Enable autosave every second for this tenant profile.",
4201
+ "operationId": "autosave.enabled.set",
4202
+ "params": {
4203
+ "enabled": true,
4204
+ "debounceMs": 1000,
4205
+ "namespace": "sales",
4206
+ "tenantId": "acme",
4207
+ "profileId": "admin"
4208
+ },
4209
+ "isPositive": true
4210
+ },
4211
+ {
4212
+ "id": "set-submit-behavior",
4213
+ "request": "Focus the first invalid field and scroll to errors on submit.",
4214
+ "operationId": "submitBehavior.set",
4215
+ "params": {
4216
+ "action": "submit",
4217
+ "focusFirstError": true,
4218
+ "scrollToErrors": true
4219
+ },
4220
+ "isPositive": true
4221
+ },
4222
+ {
4223
+ "id": "configure-metadata-bridge",
4224
+ "request": "Open metadata editor from the toolbar and persist draft after patch.",
4225
+ "operationId": "metadataBridge.configure",
4226
+ "params": {
4227
+ "enabled": true,
4228
+ "openMode": "field-toolbar",
4229
+ "persistDraftAfterPatch": true,
4230
+ "delegateFieldMetadataTo": "praxis-metadata-editor",
4231
+ "delegateControlDiscoveryTo": "praxis-dynamic-fields"
4232
+ },
4233
+ "isPositive": true
4234
+ },
4235
+ {
4236
+ "id": "reject-duplicate-field",
4237
+ "request": "Add another customerName field with a different label.",
4238
+ "operationId": "manualField.add",
4239
+ "params": {
4240
+ "fieldName": "customerName",
4241
+ "controlType": "input",
4242
+ "label": "Duplicate customer"
4243
+ },
4244
+ "isPositive": false
4245
+ },
4246
+ {
4247
+ "id": "reject-unconfirmed-removal",
4248
+ "request": "Remove email and clear its saved value without confirmation.",
4249
+ "operationId": "manualField.remove",
4250
+ "params": {
4251
+ "fieldName": "email",
4252
+ "clearPersistedValue": true
4253
+ },
4254
+ "isPositive": false
4255
+ },
4256
+ {
4257
+ "id": "reject-unsafe-autosave",
4258
+ "request": "Autosave every millisecond with no storage identity.",
4259
+ "operationId": "autosave.enabled.set",
4260
+ "params": {
4261
+ "enabled": true,
4262
+ "debounceMs": 1
4263
+ },
4264
+ "isPositive": false
4265
+ },
4266
+ {
4267
+ "id": "reject-schema-redefinition",
4268
+ "request": "Use manual form metadata bridge to replace the backend schema for cpf.",
4269
+ "operationId": "metadataBridge.configure",
4270
+ "params": {
4271
+ "enabled": true,
4272
+ "fieldName": "cpf",
4273
+ "backendSchemaOverride": {
4274
+ "type": "number"
4275
+ }
4276
+ },
4277
+ "isPositive": false
4278
+ }
4279
+ ]
4280
+ },
4281
+ "chunks": [
4282
+ {
4283
+ "chunkIndex": 0,
4284
+ "chunkKind": "summary",
4285
+ "content": "Component ID: praxis-manual-form\nSelector: praxis-manual-form\nFriendly Name: Praxis Manual Form\nDescription: Form builder with manual field selection and layout controls.\nCategory: form\nLib/Package: @praxisui/manual-form\nTags: widget, form, configurable\n",
4286
+ "sourcePointer": "praxis-ui-angular/projects/praxis-manual-form/src/lib/praxis-manual-form.metadata.ts",
4287
+ "contentHash": "5d054a39050901cc447986a4def52cf28244832487ffe321462bf8ffaeb74ddc",
4288
+ "sourceKind": "component_definition",
4289
+ "sourceId": "praxis-manual-form",
4290
+ "corpusVersion": "1.0.0"
4291
+ },
4292
+ {
4293
+ "chunkIndex": 1,
4294
+ "chunkKind": "capabilities",
4295
+ "content": "Component Capabilities:\n - Path: metadata.version\n Category: metadata\n Kind: string\n Description: Versao da configuracao do formulario.\n - Path: metadata.source\n Category: metadata\n Kind: enum\n Description: Origem da configuracao.\n - Path: metadata.title\n Category: metadata\n Kind: string\n Description: Titulo exibido no cabecalho quando formTitle nao for informado.\n - Path: metadata.description\n Category: metadata\n Kind: string\n Description: Descricao exibida no cabecalho quando formDescription nao for informado.\n - Path: metadata.lastUpdated\n Category: metadata\n Kind: string\n Description: Timestamp da ultima atualizacao.\n - Path: metadata.schemaId\n Category: metadata\n Kind: string\n Description: Identificador do schema usado na composicao.\n - Path: metadata.serverHash\n Category: metadata\n Kind: string\n Description: Hash do schema/servidor para reconciliacao.\n - Path: metadata.schemaContext\n Category: metadata\n Kind: object\n Description: Contexto do schema (path/operation/schemaType).\n - Path: metadata.schemaContext.path\n Category: metadata\n Kind: string\n Description: Path do schema usado para compor o formulario.\n - Path: metadata.schemaContext.operation\n Category: metadata\n Kind: string\n Description: Operacao do schema (ex: GET/POST).\n - Path: metadata.schemaContext.schemaType\n Category: metadata\n Kind: enum\n Description: Tipo do schema (response/request).\n - Path: metadata.schemaContext.internal\n Category: metadata\n Kind: boolean\n Description: Marca schema como interno.\n - Path: metadata.schemaContext.tenant\n Category: metadata\n Kind: string\n Description: Tenant do schema.\n - Path: metadata.schemaContext.locale\n Category: metadata\n Kind: string\n Description: Locale do schema.\n - Path: metadata.customizations\n Category: metadata\n Kind: array\n Description: Log de customizacoes.\n - Path: metadata.customizations[]\n Category: metadata\n Kind: object\n Description: Registro de customizacao.\n - Path: metadata.customizations[].fieldName\n Category: metadata\n Kind: string\n Description: Campo customizado.\n - Path: metadata.customizations[].property\n Category: metadata\n Kind: string\n Description: Propriedade alterada.\n - Path: metadata.customizations[].oldValue\n Category: metadata\n Kind: object\n Description: Valor anterior.\n - Path: metadata.customizations[].newValue\n Category: metadata\n Kind: object\n Description: Novo valor.\n - Path: metadata.customizations[].timestamp\n Category: metadata\n Kind: string\n Description: Timestamp da alteracao (ISO).\n - Path: metadata.customizations[].source\n Category: metadata\n Kind: enum\n Description: Origem da alteracao.\n - Path: fieldMetadata\n Category: fields\n Kind: array\n Description: Metadados dos campos (FieldMetadata).\n - Path: fieldMetadata[]\n Category: fields\n Kind: object\n Description: Item de metadados do campo (FieldMetadata).\n - Path: sections[]\n Category: layout\n Kind: object\n Description: Secao do formulario.\n - Path: sections[].id\n Category: layout\n Kind: string\n Description: ID da secao.\n - Path: sections[].title\n Category: layout\n Kind: string\n Description: Titulo da secao.\n - Path: sections[].description\n Category: layout\n Kind: string\n Description: Descricao da secao.\n - Path: sections[].icon\n Category: layout\n Kind: string\n Description: Icone da secao.\n - Path: sections[].collapsible\n Category: layout\n Kind: boolean\n Description: Secao recolhivel.\n - Path: sections[].collapsed\n Category: layout\n Kind: boolean\n Description: Estado inicial recolhido.\n - Path: sections[].gapBottom\n Category: layout\n Kind: number\n Description: Espaco extra apos a secao (px).\n - Path: sections[].titleGapBottom\n Category: layout\n Kind: number\n Description: Espaco abaixo do titulo (px).\n - Path: sections[].descriptionGapBottom\n Category: layout\n Kind: number\n Description: Espaco abaixo da descricao (px).\n - Path: sections[].titleStyle\n Category: layout\n Kind: enum\n Description: Preset tipografico do titulo.\n - Path: sections[].descriptionStyle\n Category: layout\n Kind: enum\n Description: Preset tipografico da descricao.\n - Path: sections[].titleColor\n Category: layout\n Kind: string\n Description: Cor do titulo.\n - Path: sections[].descriptionColor\n Category: layout\n Kind: string\n Description: Cor da descricao.\n - Path: sections[].headerAlign\n Category: layout\n Kind: enum\n Description: Alinhamento do header.\n - Path: sections[].headerTooltip\n Category: layout\n Kind: string\n Description: Tooltip do header da secao.\n - Path: sections[].rows[]\n Category: layout\n Kind: object\n Description: Linha da secao.\n - Path: sections[].rows[].id\n Category: layout\n Kind: string\n Description: ID da linha.\n - Path: sections[].rows[].title\n Category: layout\n Kind: string\n Description: Titulo da linha.\n - Path: sections[].rows[].gap\n Category: layout\n Kind: number\n Description: Espaco horizontal entre colunas (px).\n - Path: sections[].rows[].rowGap\n Category: layout\n Kind: number\n Description: Espaco vertical apos a linha (px).\n - Path: sections[].rows[].columns[]\n Category: layout\n Kind: object\n Description: Coluna da linha.\n - Path: sections[].rows[].columns[].id\n Category: layout\n Kind: string\n Description: ID da coluna.\n - Path: sections[].rows[].columns[].title\n Category: layout\n Kind: string\n Description: Titulo da coluna.\n - Path: sections[].rows[].columns[].fields\n Category: layout\n Kind: array\n Description: Campos associados a coluna.\n - Path: sections[].rows[].columns[].fields[]\n Category: layout\n Kind: string\n Description: Nome do campo na coluna.\n - Path: sections[].rows[].columns[].span\n Category: layout\n Kind: object\n Description: Span responsivo.\n - Path: sections[].rows[].columns[].span.xs\n Category: layout\n Kind: number\n Description: Span xs (1-12).\n - Path: sections[].rows[].columns[].span.sm\n Category: layout\n Kind: number\n Description: Span sm (1-12).\n - Path: sections[].rows[].columns[].span.md\n Category: layout\n Kind: number\n Description: Span md (1-12).\n - Path: sections[].rows[].columns[].span.lg\n Category: layout\n Kind: number\n Description: Span lg (1-12).\n - Path: sections[].rows[].columns[].span.xl\n Category: layout\n Kind: number\n Description: Span xl (1-12).\n - Path: sections[].rows[].columns[].offset\n Category: layout\n Kind: object\n Description: Offset responsivo.\n - Path: sections[].rows[].columns[].offset.xs\n Category: layout\n Kind: number\n Description: Offset xs (1-12).\n - Path: sections[].rows[].columns[].offset.sm\n Category: layout\n Kind: number\n Description: Offset sm (1-12).\n - Path: sections[].rows[].columns[].offset.md\n Category: layout\n Kind: number\n Description: Offset md (1-12).\n - Path: sections[].rows[].columns[].offset.lg\n Category: layout\n Kind: number\n Description: Offset lg (1-12).\n - Path: sections[].rows[].columns[].offset.xl\n Category: layout\n Kind: number\n Description: Offset xl (1-12).\n - Path: sections[].rows[].columns[].order\n Category: layout\n Kind: object\n Description: Order responsivo.\n - Path: sections[].rows[].columns[].order.xs\n Category: layout\n Kind: number\n Description: Order xs.\n - Path: sections[].rows[].columns[].order.sm\n Category: layout\n Kind: number\n Description: Order sm.\n - Path: sections[].rows[].columns[].order.md\n Category: layout\n Kind: number\n Description: Order md.\n - Path: sections[].rows[].columns[].order.lg\n Category: layout\n Kind: number\n Description: Order lg.\n - Path: sections[].rows[].columns[].order.xl\n Category: layout\n Kind: number\n Description: Order xl.\n - Path: sections[].rows[].columns[].hidden\n Category: layout\n Kind: object\n Description: Hidden responsivo.\n - Path: sections[].rows[].columns[].hidden.xs\n Category: layout\n Kind: boolean\n Description: Ocultar no xs.\n - Path: sections[].rows[].columns[].hidden.sm\n Category: layout\n Kind: boolean\n Description: Ocultar no sm.\n - Path: sections[].rows[].columns[].hidden.md\n Category: layout\n Kind: boolean\n Description: Ocultar no md.\n - Path: sections[].rows[].columns[].hidden.lg\n Category: layout\n Kind: boolean\n Description: Ocultar no lg.\n - Path: sections[].rows[].columns[].hidden.xl\n Category: layout\n Kind: boolean\n Description: Ocultar no xl.\n - Path: sections[].rows[].columns[].align\n Category: layout\n Kind: enum\n Description: Alinhamento da coluna.\n - Path: sections[].rows[].columns[].padding\n Category: layout\n Kind: number\n Description: Padding da coluna (px).\n - Path: sections[].rows[].columns[].className\n Category: layout\n Kind: string\n Description: Classe CSS da coluna.\n - Path: sections[].rows[].columns[].testId\n Category: layout\n Kind: string\n Description: Test id da coluna.\n - Path: actions\n Category: actions\n Kind: object\n Description: Layout de acoes do formulario.\n - Path: actions.position\n Category: actions\n Kind: enum\n Description: Posicao das acoes.\n - Path: actions.orientation\n Category: actions\n Kind: enum\n Description: Orientacao das acoes.\n - Path: actions.spacing\n Category: actions\n Kind: enum\n Description: Espacamento das acoes.\n - Path: actions.sticky\n Category: actions\n Kind: boolean\n Description: Fixar barra de acoes.\n - Path: actions.divider\n Category: actions\n Kind: boolean\n Description: Exibir divisor acima das acoes.\n - Path: actions.placement\n Category: actions\n Kind: enum\n Description: Posicionamento estrutural das acoes.\n - Path: actions.containerClassName\n Category: actions\n Kind: string\n Description: Classe CSS do container de acoes.\n - Path: actions.containerStyles\n Category: actions\n Kind: object\n Description: Estilos inline do container.\n - Path: actions.mobile\n Category: actions\n Kind: object\n Description: Config para mobile.\n - Path: actions.mobile.position\n Category: actions\n Kind: enum\n Description: Posicao das acoes no mobile.\n - Path: actions.mobile.orientation\n Category: actions\n Kind: enum\n Description: Orientacao no mobile.\n - Path: actions.mobile.collapseToMenu\n Category: actions\n Kind: boolean\n Description: Colapsar acoes em menu.\n - Path: actions.showSaveButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar botao salvar.\n - Path: actions.submitButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do submit.\n - Path: actions.showCancelButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar cancelar.\n - Path: actions.cancelButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do cancelar.\n - Path: actions.showResetButton\n Category: actions\n Kind: boolean\n Description: Legacy: mostrar reset.\n - Path: actions.resetButtonLabel\n Category: actions\n Kind: string\n Description: Legacy: texto do reset.\n - Path: actions.submit\n Category: actions\n Kind: object\n Description: Botao submit.\n - Path: actions.cancel\n Category: actions\n Kind: object\n Description: Botao cancelar.\n - Path: actions.reset\n Category: actions\n Kind: object\n Description: Botao reset.\n - Path: actions.custom\n Category: actions\n Kind: array\n Description: Botoes customizados.\n - Path: actions.custom[]\n Category: actions\n Kind: object\n Description: Configuracao de botao customizado.\n - Path: actions.submit.id\n Category: actions\n Kind: string\n Description: ID do botao.\n - Path: actions.submit.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade.\n - Path: actions.submit.label\n Category: actions\n Kind: string\n Description: Label do botao.\n - Path: actions.submit.icon\n Category: actions\n Kind: string\n Description: Icone do botao.\n - Path: actions.submit.className\n Category: actions\n Kind: string\n Description: Classe CSS.\n - Path: actions.submit.style\n Category: actions\n Kind: object\n Description: Estilo inline.\n - Path: actions.submit.color\n Category: actions\n Kind: enum\n Description: Cor do botao.\n - Path: actions.submit.disabled\n Category: actions\n Kind: boolean\n Description: Botao desabilitado.\n - Path: actions.submit.type\n Category: actions\n Kind: enum\n Description: Tipo do botao.\n - Path: actions.submit.action\n Category: actions\n Kind: string\n Description: Evento custom.\n - Path: actions.submit.tooltip\n Category: actions\n Kind: string\n Description: Tooltip.\n - Path: actions.submit.loading\n Category: actions\n Kind: boolean\n Description: Estado loading.\n - Path: actions.submit.size\n Category: actions\n Kind: enum\n Description: Tamanho do botao.\n - Path: actions.submit.variant\n Category: actions\n Kind: enum\n Description: Variante visual.\n - Path: actions.submit.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado.\n - Path: actions.cancel.id\n Category: actions\n Kind: string\n Description: ID do botao cancelar.\n - Path: actions.cancel.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao cancelar.\n - Path: actions.cancel.label\n Category: actions\n Kind: string\n Description: Label do botao cancelar.\n - Path: actions.cancel.icon\n Category: actions\n Kind: string\n Description: Icone do botao cancelar.\n - Path: actions.cancel.className\n Category: actions\n Kind: string\n Description: Classe CSS do botao cancelar.\n - Path: actions.cancel.style\n Category: actions\n Kind: object\n Description: Estilo inline do botao cancelar.\n - Path: actions.cancel.color\n Category: actions\n Kind: enum\n Description: Cor do botao cancelar.\n - Path: actions.cancel.disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao cancelar.\n - Path: actions.cancel.type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao cancelar.\n - Path: actions.cancel.action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao cancelar.\n - Path: actions.cancel.tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao cancelar.\n - Path: actions.cancel.loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao cancelar.\n - Path: actions.cancel.size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao cancelar.\n - Path: actions.cancel.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao cancelar.\n - Path: actions.cancel.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao cancelar.\n - Path: actions.reset.id\n Category: actions\n Kind: string\n Description: ID do botao reset.\n - Path: actions.reset.visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao reset.\n - Path: actions.reset.label\n Category: actions\n Kind: string\n Description: Label do botao reset.\n - Path: actions.reset.icon\n Category: actions\n Kind: string\n Description: Icone do botao reset.\n - Path: actions.reset.className\n Category: actions\n Kind: string\n Description: Classe CSS do botao reset.\n - Path: actions.reset.style\n Category: actions\n Kind: object\n Description: Estilo inline do botao reset.\n - Path: actions.reset.color\n Category: actions\n Kind: enum\n Description: Cor do botao reset.\n - Path: actions.reset.disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao reset.\n - Path: actions.reset.type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao reset.\n - Path: actions.reset.action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao reset.\n - Path: actions.reset.tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao reset.\n - Path: actions.reset.loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao reset.\n - Path: actions.reset.size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao reset.\n - Path: actions.reset.variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao reset.\n - Path: actions.reset.shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao reset.\n - Path: actions.custom[].id\n Category: actions\n Kind: string\n Description: ID do botao customizado.\n - Path: actions.custom[].visible\n Category: actions\n Kind: boolean\n Description: Visibilidade do botao customizado.\n - Path: actions.custom[].label\n Category: actions\n Kind: string\n Description: Label do botao customizado.\n - Path: actions.custom[].icon\n Category: actions\n Kind: string\n Description: Icone do botao customizado.\n - Path: actions.custom[].className\n Category: actions\n Kind: string\n Description: Classe CSS do botao customizado.\n - Path: actions.custom[].style\n Category: actions\n Kind: object\n Description: Estilo inline do botao customizado.\n - Path: actions.custom[].color\n Category: actions\n Kind: enum\n Description: Cor do botao customizado.\n - Path: actions.custom[].disabled\n Category: actions\n Kind: boolean\n Description: Estado desabilitado do botao customizado.\n - Path: actions.custom[].type\n Category: actions\n Kind: enum\n Description: Tipo HTML do botao customizado.\n - Path: actions.custom[].action\n Category: actions\n Kind: string\n Description: Acao customizada disparada pelo botao.\n - Path: actions.custom[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip do botao customizado.\n - Path: actions.custom[].loading\n Category: actions\n Kind: boolean\n Description: Estado de loading do botao customizado.\n - Path: actions.custom[].size\n Category: actions\n Kind: enum\n Description: Tamanho visual do botao customizado.\n - Path: actions.custom[].variant\n Category: actions\n Kind: enum\n Description: Variante visual do botao customizado.\n - Path: actions.custom[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado do botao customizado.\n - Path: behavior\n Category: behavior\n Kind: object\n Description: Comportamento do formulario.\n - Path: behavior.confirmOnUnsavedChanges\n Category: behavior\n Kind: boolean\n Description: Solicita confirmacao ao sair com alteracoes nao salvas.\n - Path: behavior.trackHistory\n Category: behavior\n Kind: boolean\n Description: Mantem historico de alteracoes do formulario.\n - Path: behavior.focusFirstError\n Category: behavior\n Kind: boolean\n Description: Move o foco para o primeiro campo com erro.\n - Path: behavior.scrollToErrors\n Category: behavior\n Kind: boolean\n Description: Rola a tela ate a primeira area com erro de validacao.\n - Path: behavior.clearAfterSave\n Category: behavior\n Kind: boolean\n Description: Limpa o formulario apos salvar com sucesso.\n - Path: behavior.redirectAfterSave\n Category: behavior\n Kind: string\n Description: Destino de navegacao apos salvar com sucesso.\n - Path: behavior.reactiveValidation\n Category: behavior\n Kind: boolean\n Description: Ativa validacao reativa durante a digitacao.\n - Path: behavior.reactiveValidationDebounceMs\n Category: behavior\n Kind: number\n Description: Debounce em milissegundos para a validacao reativa.\n - Path: api\n Category: api\n Kind: object\n Description: Configuracao de API do formulario.\n - Path: api.saveEndpoint\n Category: api\n Kind: string\n Description: Endpoint usado para persistir os dados do formulario.\n - Path: api.loadEndpoint\n Category: api\n Kind: string\n Description: Endpoint usado para carregar os dados iniciais do formulario.\n - Path: api.saveMethod\n Category: api\n Kind: enum\n Description: Metodo HTTP usado na operacao de salvamento.\n - Path: api.timeout\n Category: api\n Kind: number\n Description: Timeout da operacao de API em milissegundos.\n - Path: api.headers\n Category: api\n Kind: object\n Description: Headers HTTP adicionais enviados nas operacoes de API.\n - Path: api.idField\n Category: api\n Kind: string\n Description: Campo que representa o identificador primario no payload remoto.\n - Path: api.beforeSave\n Category: api\n Kind: expression\n Description: Hook/callback do host antes de salvar. Nao e Json Logic nem expressao computada serializavel.\n - Path: api.afterLoad\n Category: api\n Kind: expression\n Description: Hook/callback do host apos carregar. Nao e Json Logic nem expressao computada serializavel.\n - Path: messages\n Category: messages\n Kind: object\n Description: Mensagens e i18n do formulario.\n - Path: messages.updateRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso ao atualizar registro.\n - Path: messages.createRegistrySuccess\n Category: messages\n Kind: string\n Description: Mensagem de sucesso ao criar registro.\n - Path: messages.updateRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro ao atualizar registro.\n - Path: messages.createRegistryError\n Category: messages\n Kind: string\n Description: Mensagem de erro ao criar registro.\n - Path: messages.confirmations\n Category: messages\n Kind: object\n Description: Mensagens de confirmacao.\n - Path: messages.confirmations.submit\n Category: messages\n Kind: string\n Description: Confirmacao de submit.\n - Path: messages.confirmations.cancel\n Category: messages\n Kind: string\n Description: Confirmacao de cancel.\n - Path: messages.confirmations.reset\n Category: messages\n Kind: string\n Description: Confirmacao de reset.\n - Path: messages.confirmations.[actionId]\n Category: messages\n Kind: string\n Description: Confirmacao para acao custom.\n - Path: messages.customActions\n Category: messages\n Kind: object\n Description: Mensagens por acao custom.\n - Path: messages.customActions.[actionId]\n Category: messages\n Kind: object\n Description: Mensagens da acao custom (success/error/confirmation).\n - Path: messages.customActions.[actionId].success\n Category: messages\n Kind: string\n Description: Sucesso para acao custom.\n - Path: messages.customActions.[actionId].error\n Category: messages\n Kind: string\n Description: Erro para acao custom.\n - Path: messages.customActions.[actionId].confirmation\n Category: messages\n Kind: string\n Description: Confirmacao para acao custom.\n - Path: messages.loading\n Category: messages\n Kind: object\n Description: Mensagens de loading.\n - Path: messages.loading.submit\n Category: messages\n Kind: string\n Description: Mensagem de loading no submit.\n - Path: messages.loading.cancel\n Category: messages\n Kind: string\n Description: Mensagem de loading no cancel.\n - Path: messages.loading.reset\n Category: messages\n Kind: string\n Description: Mensagem de loading no reset.\n - Path: messages.loading.[actionId]\n Category: messages\n Kind: string\n Description: Mensagem de loading para acao custom.\n - Path: formRules\n Category: rules\n Kind: array\n Description: Regras de layout/comportamento.\n - Path: formRules[].id\n Category: rules\n Kind: string\n Description: ID da regra.\n - Path: formRules[].name\n Category: rules\n Kind: string\n Description: Nome da regra.\n - Path: formRules[].description\n Category: rules\n Kind: string\n Description: Descricao da regra.\n - Path: formRules[].targetType\n Category: rules\n Kind: enum\n Description: Tipo de alvo.\n - Path: formRules[].targets\n Category: rules\n Kind: array\n Description: IDs dos alvos canonicos.\n - Path: formRules[].targets[]\n Category: rules\n Kind: string\n Description: ID do alvo canonico.\n - Path: formRules[].targetFields\n Category: rules\n Kind: array\n Description: Alias legado para campos alvo.\n - Path: formRules[].targetFields[]\n Category: rules\n Kind: string\n Description: ID do campo alvo (alias legado).\n - Path: formRules[].context\n Category: rules\n Kind: enum\n Description: Contexto legado da regra.\n - Path: formRules[].effect.condition\n Category: rules\n Kind: expression\n Description: Condicao canonica da regra, expressa em Json Logic.\n - Path: formRules[].effect.properties\n Category: rules\n Kind: object\n Description: Propriedades aplicadas quando true.\n - Path: formRules[].effect.propertiesWhenFalse\n Category: rules\n Kind: object\n Description: Propriedades aplicadas quando false.\n - Path: formRulesState\n Category: metadata\n Kind: object\n Description: Estado interno do builder visual de regras, gerado apenas para round-trip do editor.\n - Path: hooks\n Category: hooks\n Kind: object\n Description: Declaracoes de hooks por estagio.\n - Path: hooks.beforeInit\n Category: hooks\n Kind: array\n Description: Hooks beforeInit.\n - Path: hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks beforeInit.\n - Path: hooks.beforeInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook.\n - Path: hooks.beforeInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade do hook.\n - Path: hooks.beforeInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook.\n - Path: hooks.beforeInit[].args\n Category: hooks\n Kind: object\n Description: Args do hook.\n - Path: hooks.afterInit\n Category: hooks\n Kind: array\n Description: Hooks afterInit.\n - Path: hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks afterInit.\n - Path: hooks.afterInit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos a inicializacao.\n - Path: hooks.afterInit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos a inicializacao.\n - Path: hooks.afterInit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos a inicializacao em milissegundos.\n - Path: hooks.afterInit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos a inicializacao.\n - Path: hooks.beforeValidate\n Category: hooks\n Kind: array\n Description: Hooks beforeValidate.\n - Path: hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks beforeValidate.\n - Path: hooks.beforeValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado antes da validacao.\n - Path: hooks.beforeValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook antes da validacao.\n - Path: hooks.beforeValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook antes da validacao em milissegundos.\n - Path: hooks.beforeValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook antes da validacao.\n - Path: hooks.afterValidate\n Category: hooks\n Kind: array\n Description: Hooks afterValidate.\n - Path: hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks afterValidate.\n - Path: hooks.afterValidate[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos a validacao.\n - Path: hooks.afterValidate[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos a validacao.\n - Path: hooks.afterValidate[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos a validacao em milissegundos.\n - Path: hooks.afterValidate[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos a validacao.\n - Path: hooks.beforeSubmit\n Category: hooks\n Kind: array\n Description: Hooks beforeSubmit.\n - Path: hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks beforeSubmit.\n - Path: hooks.beforeSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado antes do submit.\n - Path: hooks.beforeSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook antes do submit.\n - Path: hooks.beforeSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook antes do submit em milissegundos.\n - Path: hooks.beforeSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook antes do submit.\n - Path: hooks.afterSubmit\n Category: hooks\n Kind: array\n Description: Hooks afterSubmit.\n - Path: hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks afterSubmit.\n - Path: hooks.afterSubmit[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado apos o submit.\n - Path: hooks.afterSubmit[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook apos o submit.\n - Path: hooks.afterSubmit[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook apos o submit em milissegundos.\n - Path: hooks.afterSubmit[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook apos o submit.\n - Path: hooks.onError\n Category: hooks\n Kind: array\n Description: Hooks onError.\n - Path: hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks onError.\n - Path: hooks.onError[].id\n Category: hooks\n Kind: string\n Description: ID do hook executado em cenarios de erro.\n - Path: hooks.onError[].priority\n Category: hooks\n Kind: number\n Description: Prioridade de execucao do hook em cenarios de erro.\n - Path: hooks.onError[].timeoutMs\n Category: hooks\n Kind: number\n Description: Timeout do hook de erro em milissegundos.\n - Path: hooks.onError[].args\n Category: hooks\n Kind: object\n Description: Argumentos configurados para o hook de erro.\n - Path: hints.dataModes.create\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo create de dados.\n - Path: hints.dataModes.edit\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo edit de dados.\n - Path: hints.dataModes.view\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo view de dados.\n - Path: hints.uiModes.presentation\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo de apresentacao da UI.\n - Path: hints.uiModes.readonly\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo somente leitura.\n - Path: hints.uiModes.disabled\n Category: hints\n Kind: string\n Description: Texto de apoio para o modo desabilitado.\n - Path: hints.uiModes.visible\n Category: hints\n Kind: string\n Description: Texto de apoio para a visibilidade dos elementos da UI.\nCapability Notes:\n - ManualForm usa FormConfig interno para metadados e layout.\n - fieldMetadata[] deve seguir o catalogo base de FieldMetadata.\n - Arrays de layout e actions devem ser mesclados por id/label, evitando replace total.\n - ManualFormHeader usa metadata.title/metadata.description como fallback para titulo/descricao.\n - Se controlType nao tiver catalogo dedicado, trate como FieldMetadata base.\n",
4296
+ "sourcePointer": "praxis-ui-angular/projects/praxis-manual-form/src/lib/ai/manual-form-ai-capabilities.ts",
4297
+ "contentHash": "3d06c45400ad846c00f63a093f2c3dc1fde66b77bb4b301f5dc521952f3f2f89",
4298
+ "sourceKind": "component_definition",
4299
+ "sourceId": "praxis-manual-form",
4300
+ "corpusVersion": "1.0.0"
4301
+ },
4302
+ {
4303
+ "chunkIndex": 2,
4304
+ "chunkKind": "authoring_manifest",
4305
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-manual-form\",\n \"ownerPackage\": \"@praxisui/manual-form\",\n \"configSchemaId\": \"ManualFormInstance\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"formId\",\n \"type\": \"string\",\n \"description\": \"Required manual form id used for runtime state and persistence key composition.\"\n },\n {\n \"name\": \"formGroup\",\n \"type\": \"FormGroup | null\",\n \"description\": \"Host-owned typed FormGroup adopted by the manual form runtime when provided.\"\n },\n {\n \"name\": \"formTitle\",\n \"type\": \"string | null\",\n \"description\": \"Manual form title override.\"\n },\n {\n \"name\": \"formDescription\",\n \"type\": \"string | null\",\n \"description\": \"Manual form description override.\"\n },\n {\n \"name\": \"actions\",\n \"type\": \"FormActionsLayout | null\",\n \"description\": \"Manual toolbar/actions layout.\"\n },\n {\n \"name\": \"enableAutoSave\",\n \"type\": \"boolean\",\n \"description\": \"Enables draft persistence through ManualFormInstance.saveDraft.\"\n },\n {\n \"name\": \"autoSaveDebounceMs\",\n \"type\": \"number\",\n \"description\": \"Autosave debounce in milliseconds.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Enables field toolbar and metadata editor bridge.\"\n },\n {\n \"name\": \"persistenceOptions\",\n \"type\": \"ManualFormPersistenceOptions | null\",\n \"description\": \"Namespace, tenant, profile, locale and storage key controls.\"\n },\n {\n \"name\": \"usePathNames\",\n \"type\": \"boolean\",\n \"description\": \"Uses FormControlName.path as FieldMetadata.name for nested manual forms.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"manualField\",\n \"resolver\": \"manual-form-field-by-name\",\n \"description\": \"Detected or declared manual field tracked by ManualFormInstance field metadata.\"\n },\n {\n \"kind\": \"layout\",\n \"resolver\": \"manual-form-layout\",\n \"description\": \"Manual layout ownership: host template layout plus optional FormConfig sections for authored structure.\"\n },\n {\n \"kind\": \"toolbar\",\n \"resolver\": \"manual-form-customization-toolbar\",\n \"description\": \"Customization toolbar and quick metadata toggles.\"\n },\n {\n \"kind\": \"autosave\",\n \"resolver\": \"manual-form-autosave-policy\",\n \"description\": \"Autosave enablement, debounce and persistence key controls.\"\n },\n {\n \"kind\": \"metadataBridge\",\n \"resolver\": \"manual-field-metadata-bridge\",\n \"description\": \"Bridge from manual fields to @praxisui/metadata-editor patches.\"\n },\n {\n \"kind\": \"submitBehavior\",\n \"resolver\": \"manual-form-submit-behavior\",\n \"description\": \"Submit, reset, validation focus and unsaved-change behavior.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"manualField.add\",\n \"title\": \"Add manual field metadata\",\n \"scope\": \"field\",\n \"targetKind\": \"manualField\",\n \"target\": {\n \"kind\": \"manualField\",\n \"resolver\": \"manual-form-field-by-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"fieldName\",\n \"controlType\"\n ],\n \"properties\": {\n \"fieldName\": {\n \"type\": \"string\"\n },\n \"controlType\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"manual-template\",\n \"detected-component\",\n \"metadata-bridge\"\n ]\n },\n \"delegateFieldMetadataTo\": {\n \"enum\": [\n \"praxis-metadata-editor\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-field-add\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFormInstance.currentConfig\",\n \"ManualFormInstance.currentFieldMetadata\",\n \"ManualFieldKeyService\",\n \"dynamic-fields-control-discovery\"\n ],\n \"writes\": [\n \"currentConfig.fieldMetadata\",\n \"currentFieldMetadata\",\n \"form\"\n ],\n \"identityKeys\": [\n \"fieldName\"\n ],\n \"failureModes\": [\n \"duplicate-manual-field-id\",\n \"control-type-not-discovered\",\n \"host-template-field-missing\",\n \"field-metadata-delegation-required\"\n ],\n \"description\": \"Adds metadata for a manual field while preserving host-owned template layout and delegating advanced FieldMetadata edits.\"\n }\n }\n ],\n \"validators\": [\n \"manual-field-id-unique\",\n \"control-type-discovered\",\n \"host-template-field-exists\",\n \"metadata-bridge-does-not-redefine-schema\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"currentConfig.fieldMetadata\",\n \"currentFieldMetadata\",\n \"form\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"manual-form-instance-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n },\n {\n \"operationId\": \"manualField.remove\",\n \"title\": \"Remove manual field metadata\",\n \"scope\": \"field\",\n \"targetKind\": \"manualField\",\n \"target\": {\n \"kind\": \"manualField\",\n \"resolver\": \"manual-form-field-by-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"fieldName\"\n ],\n \"properties\": {\n \"fieldName\": {\n \"type\": \"string\"\n },\n \"removeFromLayout\": {\n \"type\": \"boolean\"\n },\n \"clearPersistedValue\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-field-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFormInstance.currentConfig\",\n \"ManualFormInstance.currentFieldMetadata\",\n \"ManualFormInstance.form\",\n \"FormConfig.sections\"\n ],\n \"writes\": [\n \"currentConfig.fieldMetadata\",\n \"currentConfig.sections\",\n \"currentFieldMetadata\",\n \"form\"\n ],\n \"identityKeys\": [\n \"fieldName\"\n ],\n \"failureModes\": [\n \"manual-field-not-found\",\n \"field-still-referenced-by-layout\",\n \"persisted-value-removal-not-confirmed\"\n ],\n \"description\": \"Removes a manual field by stable field name and requires explicit confirmation before metadata, layout or value loss.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"manual-field-exists\",\n \"field-removal-confirmed\",\n \"layout-field-references-valid\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"currentConfig.fieldMetadata\",\n \"currentConfig.sections\",\n \"currentFieldMetadata\",\n \"form\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"manual-form-instance-loaded\",\n \"explicit-confirmation-provided\"\n ]\n },\n {\n \"operationId\": \"manualField.label.set\",\n \"title\": \"Set manual field label\",\n \"scope\": \"field\",\n \"targetKind\": \"manualField\",\n \"target\": {\n \"kind\": \"manualField\",\n \"resolver\": \"manual-form-field-by-name\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"fieldName\",\n \"label\"\n ],\n \"properties\": {\n \"fieldName\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"updatePlaceholderWhenEmpty\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-field-label-set\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFormInstance.currentFieldMetadata\",\n \"ManualFieldMetadataBridgeService\"\n ],\n \"writes\": [\n \"currentConfig.fieldMetadata[].label\",\n \"currentConfig.fieldMetadata[].placeholder\",\n \"currentFieldMetadata\"\n ],\n \"identityKeys\": [\n \"fieldName\"\n ],\n \"failureModes\": [\n \"manual-field-not-found\",\n \"label-empty\",\n \"metadata-patch-rejected\"\n ],\n \"description\": \"Sets a manual field label through the metadata bridge without redefining backend schema semantics.\"\n }\n }\n ],\n \"validators\": [\n \"manual-field-exists\",\n \"field-label-valid\",\n \"metadata-bridge-does-not-redefine-schema\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"currentConfig.fieldMetadata[].label\",\n \"currentConfig.fieldMetadata[].placeholder\",\n \"currentFieldMetadata\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"manual-form-instance-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n },\n {\n \"operationId\": \"layout.configure\",\n \"title\": \"Configure manual form layout\",\n \"scope\": \"layout\",\n \"targetKind\": \"layout\",\n \"target\": {\n \"kind\": \"layout\",\n \"resolver\": \"manual-form-layout\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"usePathNames\": {\n \"type\": \"boolean\"\n },\n \"sections\": {\n \"type\": \"array\"\n },\n \"rows\": {\n \"type\": \"array\"\n },\n \"columns\": {\n \"type\": \"array\"\n },\n \"fieldOrder\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"delegateAdvancedFormConfigTo\": {\n \"enum\": [\n \"praxis-dynamic-form\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-layout-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFormInstance.currentConfig\",\n \"FormConfig.sections\",\n \"host-template-layout\",\n \"praxis-dynamic-form-authoring-manifest\"\n ],\n \"writes\": [\n \"currentConfig.sections\",\n \"usePathNames\"\n ],\n \"identityKeys\": [\n \"sectionId\",\n \"rowId\",\n \"columnId\",\n \"fieldName\"\n ],\n \"failureModes\": [\n \"layout-field-reference-missing\",\n \"advanced-form-config-delegation-required\",\n \"host-template-layout-conflict\"\n ],\n \"description\": \"Configures manual layout metadata and delegates advanced FormConfig layout semantics to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"layout-field-references-valid\",\n \"manual-layout-does-not-replace-host-template\",\n \"delegates-form-config\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"currentConfig.sections\",\n \"usePathNames\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"manual-form-instance-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n },\n {\n \"operationId\": \"toolbar.configure\",\n \"title\": \"Configure manual form customization toolbar\",\n \"scope\": \"toolbarUi\",\n \"targetKind\": \"toolbar\",\n \"target\": {\n \"kind\": \"toolbar\",\n \"resolver\": \"manual-form-customization-toolbar\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"enableCustomization\": {\n \"type\": \"boolean\"\n },\n \"editableFlags\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"required\",\n \"readOnly\",\n \"hidden\",\n \"disabled\",\n \"openMetadataEditor\"\n ]\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-toolbar-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFormComponent.enableCustomization\",\n \"ManualFieldToolbarComponent\",\n \"ManualFieldEditorOnDblclickDirective\"\n ],\n \"writes\": [\n \"enableCustomization\"\n ],\n \"identityKeys\": [\n \"formId\"\n ],\n \"failureModes\": [\n \"toolbar-disabled-with-required-bridge\",\n \"unsupported-toolbar-flag\"\n ],\n \"description\": \"Configures the manual customization toolbar and keeps metadata edit entry points behind enableCustomization.\"\n }\n }\n ],\n \"validators\": [\n \"toolbar-flags-supported\",\n \"metadata-bridge-gated-by-customization\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"enableCustomization\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"manual-form-component-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n },\n {\n \"operationId\": \"autosave.enabled.set\",\n \"title\": \"Set manual form autosave policy\",\n \"scope\": \"interaction\",\n \"targetKind\": \"autosave\",\n \"target\": {\n \"kind\": \"autosave\",\n \"resolver\": \"manual-form-autosave-policy\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"debounceMs\": {\n \"type\": \"number\"\n },\n \"storageKey\": {\n \"type\": \"string\"\n },\n \"namespace\": {\n \"type\": \"string\"\n },\n \"tenantId\": {\n \"type\": \"string\"\n },\n \"profileId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-autosave-enabled-set\",\n \"handlerContract\": {\n \"reads\": [\n \"enableAutoSave\",\n \"autoSaveDebounceMs\",\n \"ManualFormPersistenceOptions\",\n \"ASYNC_CONFIG_STORAGE\"\n ],\n \"writes\": [\n \"enableAutoSave\",\n \"autoSaveDebounceMs\",\n \"persistenceOptions\"\n ],\n \"identityKeys\": [\n \"formId\",\n \"storageKey\",\n \"namespace\",\n \"tenantId\",\n \"profileId\"\n ],\n \"failureModes\": [\n \"autosave-storage-missing\",\n \"unsafe-debounce\",\n \"ambiguous-storage-key\",\n \"ssr-storage-not-safe\"\n ],\n \"description\": \"Sets autosave explicitly and requires safe debounce plus deterministic persistence key composition.\"\n }\n }\n ],\n \"validators\": [\n \"autosave-explicit\",\n \"autosave-debounce-safe\",\n \"autosave-storage-available\",\n \"persistence-key-deterministic\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"enableAutoSave\",\n \"autoSaveDebounceMs\",\n \"persistenceOptions\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"manual-form-instance-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n },\n {\n \"operationId\": \"submitBehavior.set\",\n \"title\": \"Set manual form submit behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"submitBehavior\",\n \"target\": {\n \"kind\": \"submitBehavior\",\n \"resolver\": \"manual-form-submit-behavior\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"submit\",\n \"saveDraft\",\n \"reset\",\n \"cancel\",\n \"custom\"\n ]\n },\n \"clearAfterSave\": {\n \"type\": \"boolean\"\n },\n \"focusFirstError\": {\n \"type\": \"boolean\"\n },\n \"scrollToErrors\": {\n \"type\": \"boolean\"\n },\n \"confirmOnUnsavedChanges\": {\n \"type\": \"boolean\"\n },\n \"delegateFormSubmitTo\": {\n \"enum\": [\n \"praxis-dynamic-form\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-submit-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFormComponent.submitted\",\n \"ManualFormInstance.form\",\n \"FormConfig.behavior\",\n \"praxis-dynamic-form-authoring-manifest\"\n ],\n \"writes\": [\n \"currentConfig.behavior\",\n \"submitted\",\n \"saved\",\n \"resetEvent\"\n ],\n \"identityKeys\": [\n \"formId\",\n \"action\"\n ],\n \"failureModes\": [\n \"submit-action-unsupported\",\n \"advanced-form-submit-delegation-required\",\n \"validation-focus-target-missing\"\n ],\n \"description\": \"Configures manual submit/reset behavior and delegates dynamic-form submit payload semantics to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"submit-behavior-supported\",\n \"delegates-form-config\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"currentConfig.behavior\",\n \"submitted\",\n \"saved\",\n \"resetEvent\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"manual-form-instance-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n },\n {\n \"operationId\": \"metadataBridge.configure\",\n \"title\": \"Configure manual metadata bridge\",\n \"scope\": \"fieldMetadataPath\",\n \"targetKind\": \"metadataBridge\",\n \"target\": {\n \"kind\": \"metadataBridge\",\n \"resolver\": \"manual-field-metadata-bridge\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"fieldName\": {\n \"type\": \"string\"\n },\n \"openMode\": {\n \"enum\": [\n \"field-toolbar\",\n \"double-click\",\n \"programmatic\"\n ]\n },\n \"persistDraftAfterPatch\": {\n \"type\": \"boolean\"\n },\n \"delegateFieldMetadataTo\": {\n \"enum\": [\n \"praxis-metadata-editor\"\n ]\n },\n \"delegateControlDiscoveryTo\": {\n \"enum\": [\n \"praxis-dynamic-fields\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"manual-metadata-bridge-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"ManualFieldMetadataBridgeService\",\n \"SettingsPanelService\",\n \"PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST\",\n \"dynamic-fields-discovery\"\n ],\n \"writes\": [\n \"enableCustomization\",\n \"currentFieldMetadata\",\n \"currentConfig.fieldMetadata\"\n ],\n \"identityKeys\": [\n \"formId\",\n \"fieldName\",\n \"openMode\"\n ],\n \"failureModes\": [\n \"metadata-editor-unavailable\",\n \"field-metadata-delegation-required\",\n \"control-discovery-delegation-required\",\n \"draft-persistence-failed\"\n ],\n \"description\": \"Configures the bridge that opens metadata-editor for manual fields and persists accepted patches through ManualFormInstance.\"\n }\n }\n ],\n \"validators\": [\n \"metadata-bridge-does-not-redefine-schema\",\n \"delegates-field-metadata\",\n \"control-type-discovered\",\n \"metadata-bridge-gated-by-customization\",\n \"manual-form-round-trip\"\n ],\n \"affectedPaths\": [\n \"enableCustomization\",\n \"currentFieldMetadata\",\n \"currentConfig.fieldMetadata\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"manual-form-instance-loaded\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"manual-field-id-unique\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_FIELD_ID_UNIQUE\",\n \"description\": \"Manual field names must be unique in the instance metadata map.\"\n },\n {\n \"validatorId\": \"manual-field-exists\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_FIELD_EXISTS\",\n \"description\": \"Target manual field must exist before patching or removing it.\"\n },\n {\n \"validatorId\": \"field-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_FIELD_REMOVAL_CONFIRMED\",\n \"description\": \"Removing a field or its persisted value requires explicit confirmation.\"\n },\n {\n \"validatorId\": \"field-label-valid\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_FIELD_LABEL_VALID\",\n \"description\": \"Manual field label must be a non-empty user-facing string.\"\n },\n {\n \"validatorId\": \"host-template-field-exists\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_HOST_FIELD_EXISTS\",\n \"description\": \"Manual field metadata must correspond to a host template control or declared metadata bridge target.\"\n },\n {\n \"validatorId\": \"control-type-discovered\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_CONTROL_TYPE_DISCOVERED\",\n \"description\": \"Control type must be discovered through dynamic-fields mappings or delegated discovery.\"\n },\n {\n \"validatorId\": \"metadata-bridge-does-not-redefine-schema\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_METADATA_BRIDGE_SCHEMA_SAFE\",\n \"description\": \"Metadata bridge patches must not silently redefine backend schema or schema-driven FormConfig semantics.\"\n },\n {\n \"validatorId\": \"delegates-field-metadata\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_DELEGATES_FIELD_METADATA\",\n \"description\": \"Advanced FieldMetadata edits must be delegated to the metadata-editor manifest.\"\n },\n {\n \"validatorId\": \"delegates-form-config\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_DELEGATES_FORM_CONFIG\",\n \"description\": \"Advanced FormConfig semantics must be delegated to the dynamic-form manifest.\"\n },\n {\n \"validatorId\": \"layout-field-references-valid\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_LAYOUT_FIELD_REFERENCES_VALID\",\n \"description\": \"Layout field references must resolve to manual fields.\"\n },\n {\n \"validatorId\": \"manual-layout-does-not-replace-host-template\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_LAYOUT_HOST_TEMPLATE_SAFE\",\n \"description\": \"Manual layout metadata must not pretend to rewrite host-owned HTML template structure.\"\n },\n {\n \"validatorId\": \"toolbar-flags-supported\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_TOOLBAR_FLAGS_SUPPORTED\",\n \"description\": \"Toolbar quick edit flags must be supported by the manual field toolbar.\"\n },\n {\n \"validatorId\": \"metadata-bridge-gated-by-customization\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_METADATA_BRIDGE_GATED\",\n \"description\": \"Metadata bridge entry points must respect enableCustomization.\"\n },\n {\n \"validatorId\": \"autosave-explicit\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_AUTOSAVE_EXPLICIT\",\n \"description\": \"Autosave enablement and persistence policy must be explicit.\"\n },\n {\n \"validatorId\": \"autosave-debounce-safe\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_AUTOSAVE_DEBOUNCE_SAFE\",\n \"description\": \"Autosave debounce must be positive and safe for storage backends.\"\n },\n {\n \"validatorId\": \"autosave-storage-available\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_AUTOSAVE_STORAGE_AVAILABLE\",\n \"description\": \"Autosave requires a valid AsyncConfigStorage implementation.\"\n },\n {\n \"validatorId\": \"persistence-key-deterministic\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_PERSISTENCE_KEY_DETERMINISTIC\",\n \"description\": \"Persistence key composition must be deterministic across reopen/reload.\"\n },\n {\n \"validatorId\": \"submit-behavior-supported\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_SUBMIT_BEHAVIOR_SUPPORTED\",\n \"description\": \"Submit behavior must map to supported manual form outputs or delegated dynamic-form semantics.\"\n },\n {\n \"validatorId\": \"manual-form-round-trip\",\n \"level\": \"error\",\n \"code\": \"MANUAL_FORM_ROUND_TRIP\",\n \"description\": \"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"\n }\n ],\n \"roundTripRequirements\": [\n \"ManualFormInstance is the package-level runtime document: config, field metadata map, FormGroup and persistence key must remain coherent.\",\n \"Manual field ids are stable field names; array indexes are not canonical identity.\",\n \"Field removal is destructive and requires confirmation before metadata, layout references or persisted values are removed.\",\n \"Autosave must be explicit, have a safe debounce and use deterministic persistence key composition through ManualFormPersistenceOptions.\",\n \"The metadata bridge may apply metadata-editor patches but must not silently redefine backend schema or duplicate FieldMetadata semantics.\",\n \"Advanced FormConfig authoring belongs to praxis-dynamic-form; this manifest governs manual form orchestration and delegates deeper FormConfig semantics.\"\n ],\n \"examples\": [\n {\n \"id\": \"add-text-field\",\n \"request\": \"Add a manual text field for customer name.\",\n \"operationId\": \"manualField.add\",\n \"params\": {\n \"fieldName\": \"customerName\",\n \"controlType\": \"input\",\n \"label\": \"Customer name\",\n \"source\": \"manual-template\",\n \"delegateFieldMetadataTo\": \"praxis-metadata-editor\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-obsolete-field\",\n \"request\": \"Remove the obsolete nickname field from the manual form.\",\n \"operationId\": \"manualField.remove\",\n \"params\": {\n \"fieldName\": \"nickname\",\n \"removeFromLayout\": true,\n \"clearPersistedValue\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"rename-label\",\n \"request\": \"Change the label of cpf to CPF/CNPJ.\",\n \"operationId\": \"manualField.label.set\",\n \"params\": {\n \"fieldName\": \"cpf\",\n \"label\": \"CPF/CNPJ\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"enable-path-names\",\n \"request\": \"Use nested form paths as field names.\",\n \"operationId\": \"layout.configure\",\n \"params\": {\n \"usePathNames\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-toolbar\",\n \"request\": \"Enable customization toolbar with required and hidden toggles.\",\n \"operationId\": \"toolbar.configure\",\n \"params\": {\n \"enableCustomization\": true,\n \"editableFlags\": [\n \"required\",\n \"hidden\",\n \"openMetadataEditor\"\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"enable-autosave\",\n \"request\": \"Enable autosave every second for this tenant profile.\",\n \"operationId\": \"autosave.enabled.set\",\n \"params\": {\n \"enabled\": true,\n \"debounceMs\": 1000,\n \"namespace\": \"sales\",\n \"tenantId\": \"acme\",\n \"profileId\": \"admin\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-submit-behavior\",\n \"request\": \"Focus the first invalid field and scroll to errors on submit.\",\n \"operationId\": \"submitBehavior.set\",\n \"params\": {\n \"action\": \"submit\",\n \"focusFirstError\": true,\n \"scrollToErrors\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-metadata-bridge\",\n \"request\": \"Open metadata editor from the toolbar and persist draft after patch.\",\n \"operationId\": \"metadataBridge.configure\",\n \"params\": {\n \"enabled\": true,\n \"openMode\": \"field-toolbar\",\n \"persistDraftAfterPatch\": true,\n \"delegateFieldMetadataTo\": \"praxis-metadata-editor\",\n \"delegateControlDiscoveryTo\": \"praxis-dynamic-fields\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-duplicate-field\",\n \"request\": \"Add another customerName field with a different label.\",\n \"operationId\": \"manualField.add\",\n \"params\": {\n \"fieldName\": \"customerName\",\n \"controlType\": \"input\",\n \"label\": \"Duplicate customer\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-unconfirmed-removal\",\n \"request\": \"Remove email and clear its saved value without confirmation.\",\n \"operationId\": \"manualField.remove\",\n \"params\": {\n \"fieldName\": \"email\",\n \"clearPersistedValue\": true\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-unsafe-autosave\",\n \"request\": \"Autosave every millisecond with no storage identity.\",\n \"operationId\": \"autosave.enabled.set\",\n \"params\": {\n \"enabled\": true,\n \"debounceMs\": 1\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-schema-redefinition\",\n \"request\": \"Use manual form metadata bridge to replace the backend schema for cpf.\",\n \"operationId\": \"metadataBridge.configure\",\n \"params\": {\n \"enabled\": true,\n \"fieldName\": \"cpf\",\n \"backendSchemaOverride\": {\n \"type\": \"number\"\n }\n },\n \"isPositive\": false\n }\n ]\n}",
4306
+ "sourcePointer": "praxis-ui-angular/projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4307
+ "contentHash": "2919110c43c46985a1787493cbbdebb69e50a55e10c92db61c8a98bc1e92548d",
4308
+ "sourceKind": "component_definition",
4309
+ "sourceId": "praxis-manual-form",
4310
+ "corpusVersion": "1.0.0"
4311
+ },
4312
+ {
4313
+ "chunkIndex": 3,
4314
+ "chunkKind": "context_pack",
4315
+ "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"fieldMetadata[].controlType\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"input\",\n \"label\": \"Input\"\n },\n {\n \"value\": \"textarea\",\n \"label\": \"Textarea\"\n },\n {\n \"value\": \"email\",\n \"label\": \"Email\"\n },\n {\n \"value\": \"password\",\n \"label\": \"Password\"\n },\n {\n \"value\": \"search\",\n \"label\": \"Search\"\n },\n {\n \"value\": \"url\",\n \"label\": \"URL\"\n },\n {\n \"value\": \"phone\",\n \"label\": \"Phone\"\n },\n {\n \"value\": \"cpfCnpjInput\",\n \"label\": \"CPF/CNPJ\"\n },\n {\n \"value\": \"numericTextBox\",\n \"label\": \"Number\"\n },\n {\n \"value\": \"currency\",\n \"label\": \"Currency\"\n },\n {\n \"value\": \"priceRange\",\n \"label\": \"Price range\"\n },\n {\n \"value\": \"date\",\n \"label\": \"Date picker\"\n },\n {\n \"value\": \"dateRange\",\n \"label\": \"Date range\"\n },\n {\n \"value\": \"dateInput\",\n \"label\": \"Date input\"\n },\n {\n \"value\": \"dateTime\",\n \"label\": \"Datetime\"\n },\n {\n \"value\": \"dateTimeRange\",\n \"label\": \"Datetime range\"\n },\n {\n \"value\": \"dateTimeLocal\",\n \"label\": \"Datetime local\"\n },\n {\n \"value\": \"time\",\n \"label\": \"Time input\"\n },\n {\n \"value\": \"timePicker\",\n \"label\": \"Time picker\"\n },\n {\n \"value\": \"timeRange\",\n \"label\": \"Time range\"\n },\n {\n \"value\": \"week\",\n \"label\": \"Week input\"\n },\n {\n \"value\": \"month\",\n \"label\": \"Month input\"\n },\n {\n \"value\": \"year\",\n \"label\": \"Year input\"\n },\n {\n \"value\": \"select\",\n \"label\": \"Select\"\n },\n {\n \"value\": \"multiSelect\",\n \"label\": \"Multi select\"\n },\n {\n \"value\": \"multiSelectTree\",\n \"label\": \"Multi select tree\"\n },\n {\n \"value\": \"treeSelect\",\n \"label\": \"Tree select\"\n },\n {\n \"value\": \"transferList\",\n \"label\": \"Transfer list\"\n },\n {\n \"value\": \"autoComplete\",\n \"label\": \"Autocomplete\"\n },\n {\n \"value\": \"searchable-select\",\n \"label\": \"Searchable select\"\n },\n {\n \"value\": \"async-select\",\n \"label\": \"Async select\"\n },\n {\n \"value\": \"radio\",\n \"label\": \"Radio group\"\n },\n {\n \"value\": \"checkbox\",\n \"label\": \"Checkbox group\"\n },\n {\n \"value\": \"selectionList\",\n \"label\": \"Selection list\"\n },\n {\n \"value\": \"toggle\",\n \"label\": \"Toggle\"\n },\n {\n \"value\": \"buttonToggle\",\n \"label\": \"Button toggle\"\n },\n {\n \"value\": \"slider\",\n \"label\": \"Slider\"\n },\n {\n \"value\": \"rangeSlider\",\n \"label\": \"Range slider\"\n },\n {\n \"value\": \"rating\",\n \"label\": \"Rating\"\n },\n {\n \"value\": \"chipInput\",\n \"label\": \"Chips\"\n },\n {\n \"value\": \"chipList\",\n \"label\": \"Chip list\"\n },\n {\n \"value\": \"upload\",\n \"label\": \"File upload\"\n },\n {\n \"value\": \"color\",\n \"label\": \"Color input\"\n },\n {\n \"value\": \"colorPicker\",\n \"label\": \"Color picker\"\n },\n {\n \"value\": \"cronBuilder\",\n \"label\": \"Cron builder\"\n }\n ]\n },\n \"fieldMetadata[].source\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"schema\",\n \"label\": \"Schema field\"\n },\n {\n \"value\": \"local\",\n \"label\": \"Local field\"\n }\n ]\n },\n \"fieldMetadata[].submitPolicy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"omit\",\n \"label\": \"Omit from submit payload\"\n },\n {\n \"value\": \"include\",\n \"label\": \"Include in submit payload\"\n },\n {\n \"value\": \"includeWhenDirty\",\n \"label\": \"Include only when dirty\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"fill\",\n \"label\": \"Fill\"\n },\n {\n \"value\": \"outline\",\n \"label\": \"Outline\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.floatLabel\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"always\",\n \"label\": \"Always\"\n }\n ]\n },\n \"fieldMetadata[].materialDesign.density\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"comfortable\",\n \"label\": \"Comfortable\"\n },\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"dense\",\n \"label\": \"Dense\"\n }\n ]\n },\n \"actions.position\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"left\",\n \"label\": \"Left\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"right\",\n \"label\": \"Right\"\n },\n {\n \"value\": \"justified\",\n \"label\": \"Justified\"\n },\n {\n \"value\": \"split\",\n \"label\": \"Split\"\n }\n ]\n },\n \"actions.orientation\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"horizontal\",\n \"label\": \"Horizontal\"\n },\n {\n \"value\": \"vertical\",\n \"label\": \"Vertical\"\n }\n ]\n },\n \"actions.spacing\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"normal\",\n \"label\": \"Normal\"\n },\n {\n \"value\": \"spacious\",\n \"label\": \"Spacious\"\n }\n ]\n },\n \"actions.placement\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"insideLastSection\",\n \"label\": \"Inside last section\"\n },\n {\n \"value\": \"afterSections\",\n \"label\": \"After sections\"\n },\n {\n \"value\": \"top\",\n \"label\": \"Top\"\n }\n ]\n },\n \"actions.submit.type\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"button\",\n \"label\": \"Button\"\n },\n {\n \"value\": \"submit\",\n \"label\": \"Submit\"\n },\n {\n \"value\": \"reset\",\n \"label\": \"Reset\"\n }\n ]\n },\n \"actions.submit.variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"raised\",\n \"label\": \"Raised\"\n },\n {\n \"value\": \"stroked\",\n \"label\": \"Stroked\"\n },\n {\n \"value\": \"flat\",\n \"label\": \"Flat\"\n },\n {\n \"value\": \"fab\",\n \"label\": \"Fab\"\n }\n ]\n },\n \"actions.submit.size\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"small\",\n \"label\": \"Small\"\n },\n {\n \"value\": \"medium\",\n \"label\": \"Medium\"\n },\n {\n \"value\": \"large\",\n \"label\": \"Large\"\n }\n ]\n },\n \"actions.submit.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n },\n {\n \"value\": \"basic\",\n \"label\": \"Basic\"\n }\n ]\n },\n \"sections[].headerAlign\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n }\n ]\n },\n \"sections[].appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"card\",\n \"label\": \"Card\"\n },\n {\n \"value\": \"plain\",\n \"label\": \"Plain\"\n },\n {\n \"value\": \"step\",\n \"label\": \"Step\"\n }\n ]\n },\n \"sections[].sectionHeader.mode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"icon\",\n \"label\": \"Icon\"\n },\n {\n \"value\": \"avatar-image\",\n \"label\": \"Avatar image\"\n },\n {\n \"value\": \"avatar-initials\",\n \"label\": \"Avatar initials\"\n },\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n }\n ]\n },\n \"sections[].sectionHeader.emptyState\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"placeholder-avatar\",\n \"label\": \"Neutral placeholder\"\n },\n {\n \"value\": \"fallback-icon\",\n \"label\": \"Fallback icon\"\n },\n {\n \"value\": \"none\",\n \"label\": \"None\"\n }\n ]\n },\n \"sections[].sectionHeader.size\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"sm\",\n \"label\": \"Small\"\n },\n {\n \"value\": \"md\",\n \"label\": \"Medium\"\n },\n {\n \"value\": \"lg\",\n \"label\": \"Large\"\n }\n ]\n },\n \"sections[].stepLabel\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"Dados básicos\",\n \"label\": \"Dados básicos\"\n },\n {\n \"value\": \"Detalhes\",\n \"label\": \"Detalhes\"\n },\n {\n \"value\": \"Confirmação\",\n \"label\": \"Confirmação\"\n }\n ]\n },\n \"sections[].titleStyle\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"titleLarge\",\n \"label\": \"Title large\"\n },\n {\n \"value\": \"titleMedium\",\n \"label\": \"Title medium\"\n },\n {\n \"value\": \"titleSmall\",\n \"label\": \"Title small\"\n },\n {\n \"value\": \"headlineSmall\",\n \"label\": \"Headline small\"\n }\n ]\n },\n \"sections[].descriptionStyle\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"bodyLarge\",\n \"label\": \"Body large\"\n },\n {\n \"value\": \"bodyMedium\",\n \"label\": \"Body medium\"\n },\n {\n \"value\": \"bodySmall\",\n \"label\": \"Body small\"\n }\n ]\n },\n \"sections[].rows[].columns[].align\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n },\n {\n \"value\": \"stretch\",\n \"label\": \"Stretch\"\n }\n ]\n },\n \"sections[].rows[].columns[].items[].kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n },\n {\n \"value\": \"richContent\",\n \"label\": \"Rich content\"\n }\n ]\n },\n \"sections[].rows[].columns[].items[].layout\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"block\",\n \"label\": \"Block\"\n },\n {\n \"value\": \"inline\",\n \"label\": \"Inline\"\n }\n ]\n },\n \"formRules[].targetType\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n },\n {\n \"value\": \"section\",\n \"label\": \"Section\"\n },\n {\n \"value\": \"row\",\n \"label\": \"Row\"\n },\n {\n \"value\": \"column\",\n \"label\": \"Column\"\n },\n {\n \"value\": \"action\",\n \"label\": \"Action\"\n },\n {\n \"value\": \"visualBlock\",\n \"label\": \"Visual block\"\n }\n ]\n },\n \"formRules[].context\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"visibility\",\n \"label\": \"Visibility\"\n },\n {\n \"value\": \"readOnly\",\n \"label\": \"Read only\"\n },\n {\n \"value\": \"style\",\n \"label\": \"Style\"\n },\n {\n \"value\": \"validation\",\n \"label\": \"Validation\"\n },\n {\n \"value\": \"notification\",\n \"label\": \"Notification\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"field.visibility.hide\",\n \"intentExamples\": [\n \"hide field\",\n \"ocultar campo\",\n \"esconder campo\",\n \"invisible\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"hidden\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.visibility.show\",\n \"intentExamples\": [\n \"show field\",\n \"mostrar campo\",\n \"exibir campo\",\n \"visible\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"hidden\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.label.set\",\n \"intentExamples\": [\n \"label\",\n \"rename field\",\n \"renomear campo\",\n \"titulo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.placeholder.set\",\n \"intentExamples\": [\n \"placeholder\",\n \"hint text\",\n \"texto de ajuda\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"placeholder\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.required.enable\",\n \"intentExamples\": [\n \"required\",\n \"obrigatorio\",\n \"mandatory\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"required\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.required.disable\",\n \"intentExamples\": [\n \"optional\",\n \"nao obrigatorio\",\n \"opcional\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"required\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.readonly.enable\",\n \"intentExamples\": [\n \"readonly\",\n \"somente leitura\",\n \"read only\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"readOnly\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.readonly.disable\",\n \"intentExamples\": [\n \"editable\",\n \"editavel\",\n \"read write\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"readOnly\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.disabled.enable\",\n \"intentExamples\": [\n \"disable field\",\n \"desabilitar campo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"disabled\": true\n }\n ]\n }\n },\n {\n \"id\": \"field.disabled.disable\",\n \"intentExamples\": [\n \"enable field\",\n \"habilitar campo\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"disabled\": false\n }\n ]\n }\n },\n {\n \"id\": \"field.controlType.set\",\n \"intentExamples\": [\n \"control type\",\n \"tipo de campo\",\n \"controlType\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"controlType\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.icon.prefix.set\",\n \"intentExamples\": [\n \"prefix icon\",\n \"icone prefixo\",\n \"icon before\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"prefixIcon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"field.icon.suffix.set\",\n \"intentExamples\": [\n \"suffix icon\",\n \"icone sufixo\",\n \"icon after\"\n ],\n \"patchTemplate\": {\n \"fieldMetadata\": [\n {\n \"name\": \"{{target}}\",\n \"suffixIcon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.title.set\",\n \"intentExamples\": [\n \"section title\",\n \"titulo da secao\",\n \"section name\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"title\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.description.set\",\n \"intentExamples\": [\n \"section description\",\n \"descricao da secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"description\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"section.add\",\n \"intentExamples\": [\n \"add section\",\n \"adicionar secao\",\n \"nova secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{value}}\",\n \"title\": \"{{value}}\",\n \"rows\": []\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da seção é único e relevante.\"\n },\n {\n \"id\": \"section.remove\",\n \"intentExamples\": [\n \"remove section\",\n \"remover secao\",\n \"excluir secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"_delete\": true\n }\n ]\n },\n \"safetyNotes\": \"Remover uma seção é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"section.order.set\",\n \"intentExamples\": [\n \"order section\",\n \"reordenar secao\",\n \"mover secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"_order\": \"{{value}}\"\n }\n ]\n },\n \"safetyNotes\": \"A reordenação de seções é uma operação que deve ser revisada.\"\n },\n {\n \"id\": \"row.add\",\n \"intentExamples\": [\n \"add row\",\n \"adicionar linha\",\n \"nova linha na secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"rows\": [\n {\n \"id\": \"{{value}}\",\n \"columns\": []\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da linha é único e relevante na seção.\"\n },\n {\n \"id\": \"row.remove\",\n \"intentExamples\": [\n \"remove row\",\n \"remover linha\",\n \"excluir linha da secao\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target}}\",\n \"rows\": [\n {\n \"id\": \"{{value}}\",\n \"_delete\": true\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover uma linha é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"column.add\",\n \"intentExamples\": [\n \"add column\",\n \"adicionar coluna\",\n \"nova coluna na linha\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{value}}\",\n \"items\": []\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Certifique-se de que o ID da coluna é único e relevante na linha.\"\n },\n {\n \"id\": \"column.remove\",\n \"intentExamples\": [\n \"remove column\",\n \"remover coluna\",\n \"excluir coluna da linha\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{value}}\",\n \"_delete\": true\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover uma coluna é uma ação destrutiva. Confirme com o usuário.\"\n },\n {\n \"id\": \"column.field.add\",\n \"intentExamples\": [\n \"add field to column\",\n \"adicionar campo a coluna\",\n \"colocar campo na coluna\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{target.columnId}}\",\n \"items\": [\n {\n \"kind\": \"field\",\n \"id\": \"field-{{value}}\",\n \"fieldName\": \"{{value}}\"\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico.\"\n },\n {\n \"id\": \"column.field.remove\",\n \"intentExamples\": [\n \"remove field from column\",\n \"remover campo da coluna\",\n \"tirar campo da coluna\"\n ],\n \"patchTemplate\": {\n \"sections\": [\n {\n \"id\": \"{{target.sectionId}}\",\n \"rows\": [\n {\n \"id\": \"{{target.rowId}}\",\n \"columns\": [\n {\n \"id\": \"{{target.columnId}}\",\n \"items\": [\n {\n \"kind\": \"field\",\n \"fieldName\": \"{{value}}\",\n \"_remove\": true\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n \"safetyNotes\": \"Remover um campo de uma coluna pode alterar o layout do formulário.\"\n },\n {\n \"id\": \"actions.submit.label.set\",\n \"intentExamples\": [\n \"submit label\",\n \"rotulo salvar\",\n \"texto botao enviar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"submit\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.submit.visible.set\",\n \"intentExamples\": [\n \"show submit\",\n \"esconder salvar\",\n \"visibilidade enviar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"submit\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.cancel.label.set\",\n \"intentExamples\": [\n \"cancel label\",\n \"rotulo cancelar\",\n \"texto botao cancelar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"cancel\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.cancel.visible.set\",\n \"intentExamples\": [\n \"show cancel\",\n \"esconder cancelar\",\n \"visibilidade cancelar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"cancel\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.reset.label.set\",\n \"intentExamples\": [\n \"reset label\",\n \"rotulo resetar\",\n \"texto botao limpar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"reset\": {\n \"label\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"actions.reset.visible.set\",\n \"intentExamples\": [\n \"show reset\",\n \"esconder reset\",\n \"visibilidade limpar\"\n ],\n \"patchTemplate\": {\n \"actions\": {\n \"reset\": {\n \"visible\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"rule.add.visibility\",\n \"intentExamples\": [\n \"add visibility rule\",\n \"regra de visibilidade\",\n \"campo condicional\"\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{value.id}}\",\n \"name\": \"{{value.name}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{target}}\"\n ],\n \"effect\": {\n \"condition\": \"{{value.condition}}\",\n \"properties\": {\n \"hidden\": false\n },\n \"propertiesWhenFalse\": {\n \"hidden\": true\n }\n }\n }\n ]\n },\n \"safetyNotes\": \"Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao.\"\n },\n {\n \"id\": \"rule.remove\",\n \"intentExamples\": [\n \"remove rule\",\n \"excluir regra\",\n \"apagar regra\"\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{target}}\",\n \"_delete\": true\n }\n ]\n },\n \"safetyNotes\": \"Remover regras pode ter efeitos inesperados no comportamento do formulário.\"\n },\n {\n \"id\": \"rule.add.dependency\",\n \"intentExamples\": [\n \"adicionar dependencia\",\n \"campo depende de\",\n \"mostrar se\",\n \"obrigatorio se\",\n \"desabilitar se\",\n \"campo condicional\"\n ],\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"operation\": \"create\",\n \"params\": [\n {\n \"name\": \"triggerField\",\n \"type\": \"STRING\",\n \"description\": \"Campo que controla a regra (ex: tipoPessoa)\"\n },\n {\n \"name\": \"conditionValue\",\n \"type\": \"STRING\",\n \"description\": \"Valor do trigger para ativar a regra (ex: \\\"Jurídica\\\")\"\n },\n {\n \"name\": \"targetField\",\n \"type\": \"STRING\",\n \"description\": \"Campo afetado pela regra (ex: cnpj)\"\n },\n {\n \"name\": \"effectType\",\n \"type\": \"ENUM\",\n \"options\": [\n \"visibility\",\n \"required\",\n \"disabled\"\n ],\n \"description\": \"Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)\"\n }\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"rule_{{params.triggerField}}_{{params.targetField}}\",\n \"name\": \"Dependência: {{params.targetField}} depende de {{params.triggerField}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{params.targetField}}\"\n ],\n \"effect\": {\n \"condition\": {\n \"==\": [\n {\n \"var\": \"{{params.triggerField}}\"\n },\n \"{{params.conditionValue}}\"\n ]\n },\n \"properties\": {\n \"hidden\": \"{{params.effectType === 'visibility' ? false : undefined}}\",\n \"required\": \"{{params.effectType === 'required' ? true : undefined}}\",\n \"disabled\": \"{{params.effectType === 'disabled' ? true : undefined}}\"\n },\n \"propertiesWhenFalse\": {\n \"hidden\": \"{{params.effectType === 'visibility' ? true : undefined}}\",\n \"required\": \"{{params.effectType === 'required' ? false : undefined}}\",\n \"disabled\": \"{{params.effectType === 'disabled' ? false : undefined}}\"\n }\n }\n }\n ]\n },\n \"safetyNotes\": \"Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples.\"\n },\n {\n \"id\": \"rule.add.custom\",\n \"intentExamples\": [\n \"adicionar regra customizada\",\n \"regra complexa\",\n \"logica de formulario\"\n ],\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"operation\": \"create\",\n \"params\": [\n {\n \"name\": \"id\",\n \"type\": \"STRING\",\n \"description\": \"ID único da regra\"\n },\n {\n \"name\": \"condition\",\n \"type\": \"STRING\",\n \"description\": \"Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \\\"and\\\": [{ \\\">\\\": [{ \\\"var\\\": \\\"idade\\\" }, 18] }, { \\\"==\\\": [{ \\\"var\\\": \\\"possuiHabilitacao\\\" }, true] }] })\"\n },\n {\n \"name\": \"targetField\",\n \"type\": \"STRING\",\n \"description\": \"Campo afetado\"\n },\n {\n \"name\": \"propertyName\",\n \"type\": \"STRING\",\n \"description\": \"Propriedade afetada (hidden, required, disabled, readOnly)\"\n },\n {\n \"name\": \"valueIfTrue\",\n \"type\": \"BOOLEAN\",\n \"description\": \"Valor se a condição for verdadeira\"\n },\n {\n \"name\": \"valueIfFalse\",\n \"type\": \"BOOLEAN\",\n \"description\": \"Valor se a condição for falsa\"\n }\n ],\n \"patchTemplate\": {\n \"formRules\": [\n {\n \"id\": \"{{params.id}}\",\n \"name\": \"Regra Customizada: {{params.id}}\",\n \"targetType\": \"field\",\n \"targets\": [\n \"{{params.targetField}}\"\n ],\n \"effect\": {\n \"condition\": \"{{params.condition}}\",\n \"properties\": {\n \"{{params.propertyName}}\": \"{{params.valueIfTrue}}\"\n },\n \"propertiesWhenFalse\": {\n \"{{params.propertyName}}\": \"{{params.valueIfFalse}}\"\n }\n }\n }\n ]\n }\n }\n ],\n \"fieldResolvers\": {\n \"fieldMetadata[]\": [\n \"name\",\n \"label\"\n ],\n \"sections[]\": [\n \"id\",\n \"title\"\n ],\n \"sections[].rows[].columns[].items[]\": [\n \"id\",\n \"fieldName\"\n ],\n \"sections[].rows[].columns[].fields[]\": []\n },\n \"hints\": [\n \"Use fieldMetadata[].name as the canonical field id; avoid array indexes.\",\n \"Local fields are real form controls. Create them in fieldMetadata[] with source:\\\"local\\\", usually transient:true and submitPolicy:\\\"omit\\\", then place them as kind:\\\"field\\\" layout items.\",\n \"submitPolicy accepts only \\\"omit\\\", \\\"include\\\", or \\\"includeWhenDirty\\\". If legacy prompt text says \\\"never\\\", normalize it to \\\"omit\\\" before persisting.\",\n \"Visual blocks are not fields. Store them only as kind:\\\"richContent\\\" layout items and never in fieldMetadata[].\",\n \"Use sections[].rows[].columns[].items[] as the canonical mixed layout order. kind:\\\"field\\\" items reference fieldMetadata; kind:\\\"richContent\\\" items are visual blocks outside submit payload.\",\n \"Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.\",\n \"For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.\",\n \"For field formRules that must calculate a FormControl value, use effect.properties.value with the closed envelope { expression: <JSON Logic> }, such as { expression: { yearsSince: [{ var: \\\"birthDate\\\" }] } }. Use the closed envelope { literal: <value> } for structured literal objects; do not add extra keys and do not generate TypeScript functions.\",\n \"For conditional side effects, use formCommandRules with effects[].kind:\\\"global-action\\\" and a structured globalAction ref. The visual editor authors the primary effect and preserves secondary effects from advanced JSON. Do not put alert/modal/navigation commands inside formRules[].effect.properties.\",\n \"LLM-created formRules must include metadata.origin:\\\"llm\\\" and metadata.reviewStatus:\\\"pending\\\"; never write generated formRulesState.\",\n \"Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.\",\n \"For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.\",\n \"Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.\",\n \"When adding sections/rows/columns, provide a unique \\\"id\\\" for each new element.\",\n \"For nested layout changes (column within a row within a section), explicitly define \\\"target.sectionId\\\", \\\"target.rowId\\\", \\\"target.columnId\\\" in user prompt for clarity.\",\n \"DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).\",\n \"DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).\",\n \"DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.\",\n \"DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.\",\n \"DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally.\"\n ]\n }\n}",
4316
+ "sourcePointer": "praxis-ui-angular/projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
4317
+ "contentHash": "fce0638895fb6284d9f1f6c896a2eeb5945f4877b418f942a1872f60b1541c15",
4318
+ "sourceKind": "component_definition",
4319
+ "sourceId": "praxis-manual-form",
4320
+ "corpusVersion": "1.0.0"
4321
+ },
4322
+ {
4323
+ "chunkIndex": 4,
4324
+ "chunkKind": "recipe",
4325
+ "content": "{\n \"_comment\": \"Receita para Formulário Manual (Low-code/No-code).\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-manual-form\",\n \"variantId\": \"base\",\n \"useWhen\": \"Base manual form configuration.\",\n \"examplePrompts\": [\n \"create a manual form with fields\",\n \"configure manual form layout\"\n ]\n },\n \"config\": {\n \"schema\": {\n \"fields\": [\n { \"name\": \"title\", \"type\": \"text\", \"label\": \"Título\" },\n { \"name\": \"content\", \"type\": \"textarea\", \"label\": \"Conteúdo\" }\n ]\n },\n \"layout\": {\n \"type\": \"grid\",\n \"columns\": 2\n },\n \"initialData\": {\n \"title\": \"Rascunho\"\n },\n \"validationSchema\": {\n \"title\": { \"required\": true, \"minLength\": 5 }\n },\n \"actions\": [\n { \"id\": \"save\", \"label\": \"Salvar\", \"handler\": \"onSubmit\" },\n { \"id\": \"cancel\", \"label\": \"Cancelar\", \"handler\": \"onCancel\" }\n ],\n \"hooks\": {\n \"_comment\": \"Hooks executaveis sao representados como strings; substitua por funcoes reais no runtime.\",\n \"onSubmit\": \"console.log('Form submitted', data)\",\n \"onCancel\": \"history.back()\"\n }\n }\n}\n",
4326
+ "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-manual-form.json",
4327
+ "contentHash": "b3ff7aeaf70885976128fd5c9160e80836f651a42bcd24279801ea830c30e8ac",
4328
+ "sourceKind": "component_definition",
4329
+ "sourceId": "praxis-manual-form",
4330
+ "corpusVersion": "1.0.0"
4331
+ }
4332
+ ]
4333
+ }
4334
+ },
4335
+ "note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
4336
+ }