@praxisui/manual-form 9.0.0-beta.85 → 9.0.0-beta.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-21T15:34:49.320Z",
3
+ "generatedAt": "2026-07-23T02:50:28.389Z",
4
4
  "packageName": "@praxisui/manual-form",
5
- "packageVersion": "9.0.0-beta.85",
5
+ "packageVersion": "9.0.0-beta.88",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -3402,6 +3402,42 @@
3402
3402
  "identityKeys": [
3403
3403
  "fieldName"
3404
3404
  ],
3405
+ "inputSchema": {
3406
+ "type": "object",
3407
+ "required": [
3408
+ "fieldName",
3409
+ "controlType"
3410
+ ],
3411
+ "properties": {
3412
+ "fieldName": {
3413
+ "type": "string"
3414
+ },
3415
+ "controlType": {
3416
+ "type": "string"
3417
+ },
3418
+ "label": {
3419
+ "type": "string"
3420
+ },
3421
+ "required": {
3422
+ "type": "boolean"
3423
+ },
3424
+ "sectionId": {
3425
+ "type": "string"
3426
+ },
3427
+ "source": {
3428
+ "enum": [
3429
+ "manual-template",
3430
+ "detected-component",
3431
+ "metadata-bridge"
3432
+ ]
3433
+ },
3434
+ "delegateFieldMetadataTo": {
3435
+ "enum": [
3436
+ "praxis-metadata-editor"
3437
+ ]
3438
+ }
3439
+ }
3440
+ },
3405
3441
  "failureModes": [
3406
3442
  "duplicate-manual-field-id",
3407
3443
  "control-type-not-discovered",
@@ -3479,6 +3515,23 @@
3479
3515
  "identityKeys": [
3480
3516
  "fieldName"
3481
3517
  ],
3518
+ "inputSchema": {
3519
+ "type": "object",
3520
+ "required": [
3521
+ "fieldName"
3522
+ ],
3523
+ "properties": {
3524
+ "fieldName": {
3525
+ "type": "string"
3526
+ },
3527
+ "removeFromLayout": {
3528
+ "type": "boolean"
3529
+ },
3530
+ "clearPersistedValue": {
3531
+ "type": "boolean"
3532
+ }
3533
+ }
3534
+ },
3482
3535
  "failureModes": [
3483
3536
  "manual-field-not-found",
3484
3537
  "field-still-referenced-by-layout",
@@ -3554,6 +3607,24 @@
3554
3607
  "identityKeys": [
3555
3608
  "fieldName"
3556
3609
  ],
3610
+ "inputSchema": {
3611
+ "type": "object",
3612
+ "required": [
3613
+ "fieldName",
3614
+ "label"
3615
+ ],
3616
+ "properties": {
3617
+ "fieldName": {
3618
+ "type": "string"
3619
+ },
3620
+ "label": {
3621
+ "type": "string"
3622
+ },
3623
+ "updatePlaceholderWhenEmpty": {
3624
+ "type": "boolean"
3625
+ }
3626
+ }
3627
+ },
3557
3628
  "failureModes": [
3558
3629
  "manual-field-not-found",
3559
3630
  "label-empty",
@@ -3642,6 +3713,35 @@
3642
3713
  "columnId",
3643
3714
  "fieldName"
3644
3715
  ],
3716
+ "inputSchema": {
3717
+ "type": "object",
3718
+ "minProperties": 1,
3719
+ "properties": {
3720
+ "usePathNames": {
3721
+ "type": "boolean"
3722
+ },
3723
+ "sections": {
3724
+ "type": "array"
3725
+ },
3726
+ "rows": {
3727
+ "type": "array"
3728
+ },
3729
+ "columns": {
3730
+ "type": "array"
3731
+ },
3732
+ "fieldOrder": {
3733
+ "type": "array",
3734
+ "items": {
3735
+ "type": "string"
3736
+ }
3737
+ },
3738
+ "delegateAdvancedFormConfigTo": {
3739
+ "enum": [
3740
+ "praxis-dynamic-form"
3741
+ ]
3742
+ }
3743
+ }
3744
+ },
3645
3745
  "failureModes": [
3646
3746
  "layout-field-reference-missing",
3647
3747
  "advanced-form-config-delegation-required",
@@ -3716,6 +3816,27 @@
3716
3816
  "identityKeys": [
3717
3817
  "formId"
3718
3818
  ],
3819
+ "inputSchema": {
3820
+ "type": "object",
3821
+ "minProperties": 1,
3822
+ "properties": {
3823
+ "enableCustomization": {
3824
+ "type": "boolean"
3825
+ },
3826
+ "editableFlags": {
3827
+ "type": "array",
3828
+ "items": {
3829
+ "enum": [
3830
+ "required",
3831
+ "readOnly",
3832
+ "hidden",
3833
+ "disabled",
3834
+ "openMetadataEditor"
3835
+ ]
3836
+ }
3837
+ }
3838
+ }
3839
+ },
3719
3840
  "failureModes": [
3720
3841
  "toolbar-disabled-with-required-bridge",
3721
3842
  "unsupported-toolbar-flag"
@@ -3799,6 +3920,32 @@
3799
3920
  "tenantId",
3800
3921
  "profileId"
3801
3922
  ],
3923
+ "inputSchema": {
3924
+ "type": "object",
3925
+ "required": [
3926
+ "enabled"
3927
+ ],
3928
+ "properties": {
3929
+ "enabled": {
3930
+ "type": "boolean"
3931
+ },
3932
+ "debounceMs": {
3933
+ "type": "number"
3934
+ },
3935
+ "storageKey": {
3936
+ "type": "string"
3937
+ },
3938
+ "namespace": {
3939
+ "type": "string"
3940
+ },
3941
+ "tenantId": {
3942
+ "type": "string"
3943
+ },
3944
+ "profileId": {
3945
+ "type": "string"
3946
+ }
3947
+ }
3948
+ },
3802
3949
  "failureModes": [
3803
3950
  "autosave-storage-missing",
3804
3951
  "unsafe-debounce",
@@ -3892,6 +4039,38 @@
3892
4039
  "formId",
3893
4040
  "action"
3894
4041
  ],
4042
+ "inputSchema": {
4043
+ "type": "object",
4044
+ "minProperties": 1,
4045
+ "properties": {
4046
+ "action": {
4047
+ "enum": [
4048
+ "submit",
4049
+ "saveDraft",
4050
+ "reset",
4051
+ "cancel",
4052
+ "custom"
4053
+ ]
4054
+ },
4055
+ "clearAfterSave": {
4056
+ "type": "boolean"
4057
+ },
4058
+ "focusFirstError": {
4059
+ "type": "boolean"
4060
+ },
4061
+ "scrollToErrors": {
4062
+ "type": "boolean"
4063
+ },
4064
+ "confirmOnUnsavedChanges": {
4065
+ "type": "boolean"
4066
+ },
4067
+ "delegateFormSubmitTo": {
4068
+ "enum": [
4069
+ "praxis-dynamic-form"
4070
+ ]
4071
+ }
4072
+ }
4073
+ },
3895
4074
  "failureModes": [
3896
4075
  "submit-action-unsupported",
3897
4076
  "advanced-form-submit-delegation-required",
@@ -3983,6 +4162,38 @@
3983
4162
  "fieldName",
3984
4163
  "openMode"
3985
4164
  ],
4165
+ "inputSchema": {
4166
+ "type": "object",
4167
+ "minProperties": 1,
4168
+ "properties": {
4169
+ "enabled": {
4170
+ "type": "boolean"
4171
+ },
4172
+ "fieldName": {
4173
+ "type": "string"
4174
+ },
4175
+ "openMode": {
4176
+ "enum": [
4177
+ "field-toolbar",
4178
+ "double-click",
4179
+ "programmatic"
4180
+ ]
4181
+ },
4182
+ "persistDraftAfterPatch": {
4183
+ "type": "boolean"
4184
+ },
4185
+ "delegateFieldMetadataTo": {
4186
+ "enum": [
4187
+ "praxis-metadata-editor"
4188
+ ]
4189
+ },
4190
+ "delegateControlDiscoveryTo": {
4191
+ "enum": [
4192
+ "praxis-dynamic-fields"
4193
+ ]
4194
+ }
4195
+ }
4196
+ },
3986
4197
  "failureModes": [
3987
4198
  "metadata-editor-unavailable",
3988
4199
  "field-metadata-delegation-required",
@@ -4342,6 +4553,86 @@
4342
4553
  {
4343
4554
  "chunkIndex": 6,
4344
4555
  "chunkKind": "authoring_manifest",
4556
+ "content": "{\"operationId\":\"manualField.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add manual field metadata Effects: compile-domain-patch. Add a manual text field for customer name. Add another customerName field with a different label.\",\"scope\":\"field\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"required\":true},\"inputContract\":{\"required\":[\"fieldName\",\"controlType\"],\"properties\":[\"fieldName\",\"controlType\",\"label\",\"required\",\"sectionId\",\"source\",\"delegateFieldMetadataTo\"],\"semanticTerms\":[\"fieldName\",\"controlType\",\"label\",\"required\",\"sectionId\",\"source\",\"delegateFieldMetadataTo\",\"manual-template\",\"detected-component\",\"metadata-bridge\",\"praxis-metadata-editor\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"currentConfig.fieldMetadata\",\"currentFieldMetadata\",\"form\"],\"validators\":[{\"validatorId\":\"manual-field-id-unique\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_ID_UNIQUE\",\"description\":\"Manual field names must be unique in the instance metadata map.\"},{\"validatorId\":\"control-type-discovered\",\"level\":\"error\",\"code\":\"MANUAL_FORM_CONTROL_TYPE_DISCOVERED\",\"description\":\"Control type must be discovered through dynamic-fields mappings or delegated discovery.\"},{\"validatorId\":\"host-template-field-exists\",\"level\":\"error\",\"code\":\"MANUAL_FORM_HOST_FIELD_EXISTS\",\"description\":\"Manual field metadata must correspond to a host template control or declared metadata bridge target.\"},{\"validatorId\":\"metadata-bridge-does-not-redefine-schema\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_SCHEMA_SAFE\",\"description\":\"Metadata bridge patches must not silently redefine backend schema or schema-driven FormConfig semantics.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-text-field\",\"request\":\"Add a manual text field for customer name.\",\"operationId\":\"manualField.add\",\"params\":{\"fieldName\":\"customerName\",\"controlType\":\"input\",\"label\":\"Customer name\",\"source\":\"manual-template\",\"delegateFieldMetadataTo\":\"praxis-metadata-editor\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-duplicate-field\",\"request\":\"Add another customerName field with a different label.\",\"operationId\":\"manualField.add\",\"params\":{\"fieldName\":\"customerName\",\"controlType\":\"input\",\"label\":\"Duplicate customer\"},\"isPositive\":false}]}",
4557
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4558
+ "contentHash": "4eb6255754636c4069553ff544b43719fe82f576b63fee8da197f58c121b7c96",
4559
+ "sourceKind": "component_definition",
4560
+ "sourceId": "praxis-manual-form",
4561
+ "corpusVersion": "1.0.0"
4562
+ },
4563
+ {
4564
+ "chunkIndex": 7,
4565
+ "chunkKind": "authoring_manifest",
4566
+ "content": "{\"operationId\":\"manualField.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove manual field metadata Effects: compile-domain-patch. Remove the obsolete nickname field from the manual form. Remove email and clear its saved value without confirmation.\",\"scope\":\"field\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"required\":true},\"inputContract\":{\"required\":[\"fieldName\"],\"properties\":[\"fieldName\",\"removeFromLayout\",\"clearPersistedValue\"],\"semanticTerms\":[\"fieldName\",\"removeFromLayout\",\"clearPersistedValue\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"currentConfig.fieldMetadata\",\"currentConfig.sections\",\"currentFieldMetadata\",\"form\"],\"validators\":[{\"validatorId\":\"manual-field-exists\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_EXISTS\",\"description\":\"Target manual field must exist before patching or removing it.\"},{\"validatorId\":\"field-removal-confirmed\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_REMOVAL_CONFIRMED\",\"description\":\"Removing a field or its persisted value requires explicit confirmation.\"},{\"validatorId\":\"layout-field-references-valid\",\"level\":\"error\",\"code\":\"MANUAL_FORM_LAYOUT_FIELD_REFERENCES_VALID\",\"description\":\"Layout field references must resolve to manual fields.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\",\"explicit-confirmation-provided\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-obsolete-field\",\"request\":\"Remove the obsolete nickname field from the manual form.\",\"operationId\":\"manualField.remove\",\"params\":{\"fieldName\":\"nickname\",\"removeFromLayout\":true,\"clearPersistedValue\":true},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unconfirmed-removal\",\"request\":\"Remove email and clear its saved value without confirmation.\",\"operationId\":\"manualField.remove\",\"params\":{\"fieldName\":\"email\",\"clearPersistedValue\":true},\"isPositive\":false}]}",
4567
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4568
+ "contentHash": "ab01e30577d930ded56a131aec541dcece24a55a584c17acd995027a5f70888a",
4569
+ "sourceKind": "component_definition",
4570
+ "sourceId": "praxis-manual-form",
4571
+ "corpusVersion": "1.0.0"
4572
+ },
4573
+ {
4574
+ "chunkIndex": 8,
4575
+ "chunkKind": "authoring_manifest",
4576
+ "content": "{\"operationId\":\"manualField.label.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set manual field label Effects: compile-domain-patch. Change the label of cpf to CPF/CNPJ.\",\"scope\":\"field\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"required\":true},\"inputContract\":{\"required\":[\"fieldName\",\"label\"],\"properties\":[\"fieldName\",\"label\",\"updatePlaceholderWhenEmpty\"],\"semanticTerms\":[\"fieldName\",\"label\",\"updatePlaceholderWhenEmpty\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"currentConfig.fieldMetadata[].label\",\"currentConfig.fieldMetadata[].placeholder\",\"currentFieldMetadata\"],\"validators\":[{\"validatorId\":\"manual-field-exists\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_EXISTS\",\"description\":\"Target manual field must exist before patching or removing it.\"},{\"validatorId\":\"field-label-valid\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_LABEL_VALID\",\"description\":\"Manual field label must be a non-empty user-facing string.\"},{\"validatorId\":\"metadata-bridge-does-not-redefine-schema\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_SCHEMA_SAFE\",\"description\":\"Metadata bridge patches must not silently redefine backend schema or schema-driven FormConfig semantics.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"rename-label\",\"request\":\"Change the label of cpf to CPF/CNPJ.\",\"operationId\":\"manualField.label.set\",\"params\":{\"fieldName\":\"cpf\",\"label\":\"CPF/CNPJ\"},\"isPositive\":true}],\"negativeExamples\":[]}",
4577
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4578
+ "contentHash": "40ab840d2c94e136721c346c475ed0c7c23fba7a9f3ff98fa59359778879e24c",
4579
+ "sourceKind": "component_definition",
4580
+ "sourceId": "praxis-manual-form",
4581
+ "corpusVersion": "1.0.0"
4582
+ },
4583
+ {
4584
+ "chunkIndex": 9,
4585
+ "chunkKind": "authoring_manifest",
4586
+ "content": "{\"operationId\":\"layout.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure manual form layout Effects: compile-domain-patch. Use nested form paths as field names.\",\"scope\":\"layout\",\"target\":{\"kind\":\"layout\",\"resolver\":\"manual-form-layout\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"usePathNames\",\"sections\",\"rows\",\"columns\",\"fieldOrder\",\"delegateAdvancedFormConfigTo\"],\"semanticTerms\":[\"usePathNames\",\"sections\",\"rows\",\"columns\",\"fieldOrder\",\"delegateAdvancedFormConfigTo\",\"praxis-dynamic-form\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"currentConfig.sections\",\"usePathNames\"],\"validators\":[{\"validatorId\":\"layout-field-references-valid\",\"level\":\"error\",\"code\":\"MANUAL_FORM_LAYOUT_FIELD_REFERENCES_VALID\",\"description\":\"Layout field references must resolve to manual fields.\"},{\"validatorId\":\"manual-layout-does-not-replace-host-template\",\"level\":\"error\",\"code\":\"MANUAL_FORM_LAYOUT_HOST_TEMPLATE_SAFE\",\"description\":\"Manual layout metadata must not pretend to rewrite host-owned HTML template structure.\"},{\"validatorId\":\"delegates-form-config\",\"level\":\"error\",\"code\":\"MANUAL_FORM_DELEGATES_FORM_CONFIG\",\"description\":\"Advanced FormConfig semantics must be delegated to the dynamic-form manifest.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"enable-path-names\",\"request\":\"Use nested form paths as field names.\",\"operationId\":\"layout.configure\",\"params\":{\"usePathNames\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
4587
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4588
+ "contentHash": "24174e63182f5bcf2bbf5a3f0db970a56060ec9ba3a571095d76f61a50606f18",
4589
+ "sourceKind": "component_definition",
4590
+ "sourceId": "praxis-manual-form",
4591
+ "corpusVersion": "1.0.0"
4592
+ },
4593
+ {
4594
+ "chunkIndex": 10,
4595
+ "chunkKind": "authoring_manifest",
4596
+ "content": "{\"operationId\":\"toolbar.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure manual form customization toolbar Effects: compile-domain-patch. Enable customization toolbar with required and hidden toggles.\",\"scope\":\"toolbarUi\",\"target\":{\"kind\":\"toolbar\",\"resolver\":\"manual-form-customization-toolbar\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"enableCustomization\",\"editableFlags\"],\"semanticTerms\":[\"enableCustomization\",\"editableFlags\",\"required\",\"readOnly\",\"hidden\",\"disabled\",\"openMetadataEditor\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"enableCustomization\"],\"validators\":[{\"validatorId\":\"toolbar-flags-supported\",\"level\":\"error\",\"code\":\"MANUAL_FORM_TOOLBAR_FLAGS_SUPPORTED\",\"description\":\"Toolbar quick edit flags must be supported by the manual field toolbar.\"},{\"validatorId\":\"metadata-bridge-gated-by-customization\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_GATED\",\"description\":\"Metadata bridge entry points must respect enableCustomization.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-component-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-toolbar\",\"request\":\"Enable customization toolbar with required and hidden toggles.\",\"operationId\":\"toolbar.configure\",\"params\":{\"enableCustomization\":true,\"editableFlags\":[\"required\",\"hidden\",\"openMetadataEditor\"]},\"isPositive\":true}],\"negativeExamples\":[]}",
4597
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4598
+ "contentHash": "413a0134b45ef84b46acb60bdaba2453e9bca24cf91bc1f00125c245e6024ebb",
4599
+ "sourceKind": "component_definition",
4600
+ "sourceId": "praxis-manual-form",
4601
+ "corpusVersion": "1.0.0"
4602
+ },
4603
+ {
4604
+ "chunkIndex": 11,
4605
+ "chunkKind": "authoring_manifest",
4606
+ "content": "{\"operationId\":\"autosave.enabled.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set manual form autosave policy Effects: compile-domain-patch. Enable autosave every second for this tenant profile. Autosave every millisecond with no storage identity.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"autosave\",\"resolver\":\"manual-form-autosave-policy\",\"required\":false},\"inputContract\":{\"required\":[\"enabled\"],\"properties\":[\"enabled\",\"debounceMs\",\"storageKey\",\"namespace\",\"tenantId\",\"profileId\"],\"semanticTerms\":[\"enabled\",\"debounceMs\",\"storageKey\",\"namespace\",\"tenantId\",\"profileId\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"persistenceOptions\"],\"validators\":[{\"validatorId\":\"autosave-explicit\",\"level\":\"error\",\"code\":\"MANUAL_FORM_AUTOSAVE_EXPLICIT\",\"description\":\"Autosave enablement and persistence policy must be explicit.\"},{\"validatorId\":\"autosave-debounce-safe\",\"level\":\"error\",\"code\":\"MANUAL_FORM_AUTOSAVE_DEBOUNCE_SAFE\",\"description\":\"Autosave debounce must be positive and safe for storage backends.\"},{\"validatorId\":\"autosave-storage-available\",\"level\":\"error\",\"code\":\"MANUAL_FORM_AUTOSAVE_STORAGE_AVAILABLE\",\"description\":\"Autosave requires a valid AsyncConfigStorage implementation.\"},{\"validatorId\":\"persistence-key-deterministic\",\"level\":\"error\",\"code\":\"MANUAL_FORM_PERSISTENCE_KEY_DETERMINISTIC\",\"description\":\"Persistence key composition must be deterministic across reopen/reload.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"enable-autosave\",\"request\":\"Enable autosave every second for this tenant profile.\",\"operationId\":\"autosave.enabled.set\",\"params\":{\"enabled\":true,\"debounceMs\":1000,\"namespace\":\"sales\",\"tenantId\":\"acme\",\"profileId\":\"admin\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unsafe-autosave\",\"request\":\"Autosave every millisecond with no storage identity.\",\"operationId\":\"autosave.enabled.set\",\"params\":{\"enabled\":true,\"debounceMs\":1},\"isPositive\":false}]}",
4607
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4608
+ "contentHash": "b8468e1981fac43da569b47aa6bfc2ebffcb970d28bb3a16ef91f3965e6316ee",
4609
+ "sourceKind": "component_definition",
4610
+ "sourceId": "praxis-manual-form",
4611
+ "corpusVersion": "1.0.0"
4612
+ },
4613
+ {
4614
+ "chunkIndex": 12,
4615
+ "chunkKind": "authoring_manifest",
4616
+ "content": "{\"operationId\":\"submitBehavior.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set manual form submit behavior Effects: compile-domain-patch. Focus the first invalid field and scroll to errors on submit.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"submitBehavior\",\"resolver\":\"manual-form-submit-behavior\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"action\",\"clearAfterSave\",\"focusFirstError\",\"scrollToErrors\",\"confirmOnUnsavedChanges\",\"delegateFormSubmitTo\"],\"semanticTerms\":[\"action\",\"clearAfterSave\",\"focusFirstError\",\"scrollToErrors\",\"confirmOnUnsavedChanges\",\"delegateFormSubmitTo\",\"submit\",\"saveDraft\",\"reset\",\"cancel\",\"custom\",\"praxis-dynamic-form\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"currentConfig.behavior\",\"submitted\",\"saved\",\"resetEvent\"],\"validators\":[{\"validatorId\":\"submit-behavior-supported\",\"level\":\"error\",\"code\":\"MANUAL_FORM_SUBMIT_BEHAVIOR_SUPPORTED\",\"description\":\"Submit behavior must map to supported manual form outputs or delegated dynamic-form semantics.\"},{\"validatorId\":\"delegates-form-config\",\"level\":\"error\",\"code\":\"MANUAL_FORM_DELEGATES_FORM_CONFIG\",\"description\":\"Advanced FormConfig semantics must be delegated to the dynamic-form manifest.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-submit-behavior\",\"request\":\"Focus the first invalid field and scroll to errors on submit.\",\"operationId\":\"submitBehavior.set\",\"params\":{\"action\":\"submit\",\"focusFirstError\":true,\"scrollToErrors\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
4617
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4618
+ "contentHash": "f516755f4671d68a72d351a48a3dc27311b9f57d6ade0fe9971dc5453fa49a0f",
4619
+ "sourceKind": "component_definition",
4620
+ "sourceId": "praxis-manual-form",
4621
+ "corpusVersion": "1.0.0"
4622
+ },
4623
+ {
4624
+ "chunkIndex": 13,
4625
+ "chunkKind": "authoring_manifest",
4626
+ "content": "{\"operationId\":\"metadataBridge.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure manual metadata bridge Effects: compile-domain-patch. Open metadata editor from the toolbar and persist draft after patch. Use manual form metadata bridge to replace the backend schema for cpf.\",\"scope\":\"fieldMetadataPath\",\"target\":{\"kind\":\"metadataBridge\",\"resolver\":\"manual-field-metadata-bridge\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"enabled\",\"fieldName\",\"openMode\",\"persistDraftAfterPatch\",\"delegateFieldMetadataTo\",\"delegateControlDiscoveryTo\"],\"semanticTerms\":[\"enabled\",\"fieldName\",\"openMode\",\"persistDraftAfterPatch\",\"delegateFieldMetadataTo\",\"delegateControlDiscoveryTo\",\"field-toolbar\",\"double-click\",\"programmatic\",\"praxis-metadata-editor\",\"praxis-dynamic-fields\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"enableCustomization\",\"currentFieldMetadata\",\"currentConfig.fieldMetadata\"],\"validators\":[{\"validatorId\":\"metadata-bridge-does-not-redefine-schema\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_SCHEMA_SAFE\",\"description\":\"Metadata bridge patches must not silently redefine backend schema or schema-driven FormConfig semantics.\"},{\"validatorId\":\"delegates-field-metadata\",\"level\":\"error\",\"code\":\"MANUAL_FORM_DELEGATES_FIELD_METADATA\",\"description\":\"Advanced FieldMetadata edits must be delegated to the metadata-editor manifest.\"},{\"validatorId\":\"control-type-discovered\",\"level\":\"error\",\"code\":\"MANUAL_FORM_CONTROL_TYPE_DISCOVERED\",\"description\":\"Control type must be discovered through dynamic-fields mappings or delegated discovery.\"},{\"validatorId\":\"metadata-bridge-gated-by-customization\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_GATED\",\"description\":\"Metadata bridge entry points must respect enableCustomization.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}],\"preconditions\":[\"manual-form-instance-loaded\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-metadata-bridge\",\"request\":\"Open metadata editor from the toolbar and persist draft after patch.\",\"operationId\":\"metadataBridge.configure\",\"params\":{\"enabled\":true,\"openMode\":\"field-toolbar\",\"persistDraftAfterPatch\":true,\"delegateFieldMetadataTo\":\"praxis-metadata-editor\",\"delegateControlDiscoveryTo\":\"praxis-dynamic-fields\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-schema-redefinition\",\"request\":\"Use manual form metadata bridge to replace the backend schema for cpf.\",\"operationId\":\"metadataBridge.configure\",\"params\":{\"enabled\":true,\"fieldName\":\"cpf\",\"backendSchemaOverride\":{\"type\":\"number\"}},\"isPositive\":false}]}",
4627
+ "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4628
+ "contentHash": "a39e54367bd8f4a294d8abfb8e12c97f8f58c8a8164ce922e0bbce5ddf70ec78",
4629
+ "sourceKind": "component_definition",
4630
+ "sourceId": "praxis-manual-form",
4631
+ "corpusVersion": "1.0.0"
4632
+ },
4633
+ {
4634
+ "chunkIndex": 14,
4635
+ "chunkKind": "authoring_manifest",
4345
4636
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"identity\"}",
4346
4637
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4347
4638
  "contentHash": "056e0a638a87c288dfb507ff43b2305d203406cd7a972f10c4dd16a0218cbb04",
@@ -4350,7 +4641,7 @@
4350
4641
  "corpusVersion": "1.0.0"
4351
4642
  },
4352
4643
  {
4353
- "chunkIndex": 7,
4644
+ "chunkIndex": 15,
4354
4645
  "chunkKind": "authoring_manifest",
4355
4646
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"formId\",\"type\":\"string\",\"description\":\"Required manual form id used for runtime state and persistence key composition.\"},{\"name\":\"formGroup\",\"type\":\"FormGroup | null\",\"description\":\"Host-owned typed FormGroup adopted by the manual form runtime when provided.\"},{\"name\":\"formTitle\",\"type\":\"string | null\",\"description\":\"Manual form title override.\"},{\"name\":\"formDescription\",\"type\":\"string | null\",\"description\":\"Manual form description override.\"},{\"name\":\"actions\",\"type\":\"FormActionsLayout | null\",\"description\":\"Manual toolbar/actions layout.\"},{\"name\":\"enableAutoSave\",\"type\":\"boolean\",\"description\":\"Enables draft persistence through ManualFormInstance.saveDraft.\"},{\"name\":\"autoSaveDebounceMs\",\"type\":\"number\",\"description\":\"Autosave debounce in milliseconds.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables field toolbar and metadata editor bridge.\"},{\"name\":\"persistenceOptions\",\"type\":\"ManualFormPersistenceOptions | null\",\"description\":\"Namespace, tenant, profile, locale and storage key controls.\"},{\"name\":\"usePathNames\",\"type\":\"boolean\",\"description\":\"Uses FormControlName.path as FieldMetadata.name for nested manual forms.\"}]}",
4356
4647
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
@@ -4360,7 +4651,7 @@
4360
4651
  "corpusVersion": "1.0.0"
4361
4652
  },
4362
4653
  {
4363
- "chunkIndex": 8,
4654
+ "chunkIndex": 16,
4364
4655
  "chunkKind": "authoring_manifest",
4365
4656
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"description\":\"Detected or declared manual field tracked by ManualFormInstance field metadata.\"},{\"kind\":\"layout\",\"resolver\":\"manual-form-layout\",\"description\":\"Manual layout ownership: host template layout plus optional FormConfig sections for authored structure.\"},{\"kind\":\"toolbar\",\"resolver\":\"manual-form-customization-toolbar\",\"description\":\"Customization toolbar and quick metadata toggles.\"},{\"kind\":\"autosave\",\"resolver\":\"manual-form-autosave-policy\",\"description\":\"Autosave enablement, debounce and persistence key controls.\"},{\"kind\":\"metadataBridge\",\"resolver\":\"manual-field-metadata-bridge\",\"description\":\"Bridge from manual fields to @praxisui/metadata-editor patches.\"},{\"kind\":\"submitBehavior\",\"resolver\":\"manual-form-submit-behavior\",\"description\":\"Submit, reset, validation focus and unsaved-change behavior.\"}]}",
4366
4657
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
@@ -4370,27 +4661,27 @@
4370
4661
  "corpusVersion": "1.0.0"
4371
4662
  },
4372
4663
  {
4373
- "chunkIndex": 9,
4664
+ "chunkIndex": 17,
4374
4665
  "chunkKind": "authoring_manifest",
4375
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"manualField.add\",\"title\":\"Add manual field metadata\",\"scope\":\"field\",\"targetKind\":\"manualField\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\",\"controlType\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"controlType\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"required\":{\"type\":\"boolean\"},\"sectionId\":{\"type\":\"string\"},\"source\":{\"enum\":[\"manual-template\",\"detected-component\",\"metadata-bridge\"]},\"delegateFieldMetadataTo\":{\"enum\":[\"praxis-metadata-editor\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-field-add\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentConfig\",\"ManualFormInstance.currentFieldMetadata\",\"ManualFieldKeyService\",\"dynamic-fields-control-discovery\"],\"writes\":[\"currentConfig.fieldMetadata\",\"currentFieldMetadata\",\"form\"],\"identityKeys\":[\"fieldName\"],\"failureModes\":[\"duplicate-manual-field-id\",\"control-type-not-discovered\",\"host-template-field-missing\",\"field-metadata-delegation-required\"],\"description\":\"Adds metadata for a manual field while preserving host-owned template layout and delegating advanced FieldMetadata edits.\"}}],\"validators\":[\"manual-field-id-unique\",\"control-type-discovered\",\"host-template-field-exists\",\"metadata-bridge-does-not-redefine-schema\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.fieldMetadata\",\"currentFieldMetadata\",\"form\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"manualField.remove\",\"title\":\"Remove manual field metadata\",\"scope\":\"field\",\"targetKind\":\"manualField\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"removeFromLayout\":{\"type\":\"boolean\"},\"clearPersistedValue\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-field-remove\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentConfig\",\"ManualFormInstance.currentFieldMetadata\",\"ManualFormInstance.form\",\"FormConfig.sections\"],\"writes\":[\"currentConfig.fieldMetadata\",\"currentConfig.sections\",\"currentFieldMetadata\",\"form\"],\"identityKeys\":[\"fieldName\"],\"failureModes\":[\"manual-field-not-found\",\"field-still-referenced-by-layout\",\"persisted-value-removal-not-confirmed\"],\"description\":\"Removes a manual field by stable field name and requires explicit confirmation before metadata, layout or value loss.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"manual-field-exists\",\"field-removal-confirmed\",\"layout-field-references-valid\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.fieldMetadata\",\"currentConfig.sections\",\"currentFieldMetadata\",\"form\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"manual-form-instance-loaded\",\"explicit-confirmation-provided\"]},{\"operationId\":\"manualField.label.set\",\"title\":\"Set manual field label\",\"scope\":\"field\",\"targetKind\":\"manualField\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\",\"label\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"updatePlaceholderWhenEmpty\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-field-label-set\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentFieldMetadata\",\"ManualFieldMetadataBridgeService\"],\"writes\":[\"currentConfig.fieldMetadata[].label\",\"currentConfig.fieldMetadata[].placeholder\",\"currentFieldMetadata\"],\"identityKeys\":[\"fieldName\"],\"failureModes\":[\"manual-field-not-found\",\"label-empty\",\"metadata-patch-rejected\"],\"description\":\"Sets a manual field label through the metadata bridge without redefining backend schema semantics.\"}}],\"validators\":[\"manual-field-exists\",\"field-label-valid\",\"metadata-bridge-does-not-redefine-schema\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.fieldMetadata[].label\",\"currentConfig.fieldMetadata[].placeholder\",\"currentFieldMetadata\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"layout.configure\",\"title\":\"Configure manual form layout\",\"scope\":\"layout\",\"targetKind\":\"layout\",\"target\":{\"kind\":\"layout\",\"resolver\":\"manual-form-layout\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"usePathNames\":{\"type\":\"boolean\"},\"sections\":{\"type\":\"array\"},\"rows\":{\"type\":\"array\"},\"columns\":{\"type\":\"array\"},\"fieldOrder\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"delegateAdvancedFormConfigTo\":{\"enum\":[\"praxis-dynamic-form\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-layout-configure\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentConfig\",\"FormConfig.sections\",\"host-template-layout\",\"praxis-dynamic-form-authoring-manifest\"],\"writes\":[\"currentConfig.sections\",\"usePathNames\"],\"identityKeys\":[\"sectionId\",\"rowId\",\"columnId\",\"fieldName\"],\"failureModes\":[\"layout-field-reference-missing\",\"advanced-form-config-delegation-required\",\"host-template-layout-conflict\"],\"description\":\"Configures manual layout metadata and delegates advanced FormConfig layout semantics to the dynamic-form manifest.\"}}],\"validators\":[\"layout-field-references-valid\",\"manual-layout-does-not-replace-host-template\",\"delegates-form-config\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.sections\",\"usePathNames\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"toolbar.configure\",\"title\":\"Configure manual form customization toolbar\",\"scope\":\"toolbarUi\",\"targetKind\":\"toolbar\",\"target\":{\"kind\":\"toolbar\",\"resolver\":\"manual-form-customization-toolbar\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"enableCustomization\":{\"type\":\"boolean\"},\"editableFlags\":{\"type\":\"array\",\"items\":{\"enum\":[\"required\",\"readOnly\",\"hidden\",\"disabled\",\"openMetadataEditor\"]}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-toolbar-configure\",\"handlerContract\":{\"reads\":[\"ManualFormComponent.enableCustomization\",\"ManualFieldToolbarComponent\",\"ManualFieldEditorOnDblclickDirective\"],\"writes\":[\"enableCustomization\"],\"identityKeys\":[\"formId\"],\"failureModes\":[\"toolbar-disabled-with-required-bridge\",\"unsupported-toolbar-flag\"],\"description\":\"Configures the manual customization toolbar and keeps metadata edit entry points behind enableCustomization.\"}}],\"validators\":[\"toolbar-flags-supported\",\"metadata-bridge-gated-by-customization\",\"manual-form-round-trip\"],\"affectedPaths\":[\"enableCustomization\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"manual-form-component-loaded\"],\"destructive\":false,\"requiresConfirmation\":false}]}",
4666
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"manualField.add\",\"title\":\"Add manual field metadata\",\"scope\":\"field\",\"targetKind\":\"manualField\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\",\"controlType\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"controlType\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"required\":{\"type\":\"boolean\"},\"sectionId\":{\"type\":\"string\"},\"source\":{\"enum\":[\"manual-template\",\"detected-component\",\"metadata-bridge\"]},\"delegateFieldMetadataTo\":{\"enum\":[\"praxis-metadata-editor\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-field-add\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentConfig\",\"ManualFormInstance.currentFieldMetadata\",\"ManualFieldKeyService\",\"dynamic-fields-control-discovery\"],\"writes\":[\"currentConfig.fieldMetadata\",\"currentFieldMetadata\",\"form\"],\"identityKeys\":[\"fieldName\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\",\"controlType\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"controlType\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"required\":{\"type\":\"boolean\"},\"sectionId\":{\"type\":\"string\"},\"source\":{\"enum\":[\"manual-template\",\"detected-component\",\"metadata-bridge\"]},\"delegateFieldMetadataTo\":{\"enum\":[\"praxis-metadata-editor\"]}}},\"failureModes\":[\"duplicate-manual-field-id\",\"control-type-not-discovered\",\"host-template-field-missing\",\"field-metadata-delegation-required\"],\"description\":\"Adds metadata for a manual field while preserving host-owned template layout and delegating advanced FieldMetadata edits.\"}}],\"validators\":[\"manual-field-id-unique\",\"control-type-discovered\",\"host-template-field-exists\",\"metadata-bridge-does-not-redefine-schema\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.fieldMetadata\",\"currentFieldMetadata\",\"form\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"manualField.remove\",\"title\":\"Remove manual field metadata\",\"scope\":\"field\",\"targetKind\":\"manualField\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"removeFromLayout\":{\"type\":\"boolean\"},\"clearPersistedValue\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-field-remove\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentConfig\",\"ManualFormInstance.currentFieldMetadata\",\"ManualFormInstance.form\",\"FormConfig.sections\"],\"writes\":[\"currentConfig.fieldMetadata\",\"currentConfig.sections\",\"currentFieldMetadata\",\"form\"],\"identityKeys\":[\"fieldName\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"removeFromLayout\":{\"type\":\"boolean\"},\"clearPersistedValue\":{\"type\":\"boolean\"}}},\"failureModes\":[\"manual-field-not-found\",\"field-still-referenced-by-layout\",\"persisted-value-removal-not-confirmed\"],\"description\":\"Removes a manual field by stable field name and requires explicit confirmation before metadata, layout or value loss.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"manual-field-exists\",\"field-removal-confirmed\",\"layout-field-references-valid\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.fieldMetadata\",\"currentConfig.sections\",\"currentFieldMetadata\",\"form\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"manual-form-instance-loaded\",\"explicit-confirmation-provided\"]},{\"operationId\":\"manualField.label.set\",\"title\":\"Set manual field label\",\"scope\":\"field\",\"targetKind\":\"manualField\",\"target\":{\"kind\":\"manualField\",\"resolver\":\"manual-form-field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\",\"label\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"updatePlaceholderWhenEmpty\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-field-label-set\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentFieldMetadata\",\"ManualFieldMetadataBridgeService\"],\"writes\":[\"currentConfig.fieldMetadata[].label\",\"currentConfig.fieldMetadata[].placeholder\",\"currentFieldMetadata\"],\"identityKeys\":[\"fieldName\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"fieldName\",\"label\"],\"properties\":{\"fieldName\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"updatePlaceholderWhenEmpty\":{\"type\":\"boolean\"}}},\"failureModes\":[\"manual-field-not-found\",\"label-empty\",\"metadata-patch-rejected\"],\"description\":\"Sets a manual field label through the metadata bridge without redefining backend schema semantics.\"}}],\"validators\":[\"manual-field-exists\",\"field-label-valid\",\"metadata-bridge-does-not-redefine-schema\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.fieldMetadata[].label\",\"currentConfig.fieldMetadata[].placeholder\",\"currentFieldMetadata\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"layout.configure\",\"title\":\"Configure manual form layout\",\"scope\":\"layout\",\"targetKind\":\"layout\",\"target\":{\"kind\":\"layout\",\"resolver\":\"manual-form-layout\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"usePathNames\":{\"type\":\"boolean\"},\"sections\":{\"type\":\"array\"},\"rows\":{\"type\":\"array\"},\"columns\":{\"type\":\"array\"},\"fieldOrder\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"delegateAdvancedFormConfigTo\":{\"enum\":[\"praxis-dynamic-form\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-layout-configure\",\"handlerContract\":{\"reads\":[\"ManualFormInstance.currentConfig\",\"FormConfig.sections\",\"host-template-layout\",\"praxis-dynamic-form-authoring-manifest\"],\"writes\":[\"currentConfig.sections\",\"usePathNames\"],\"identityKeys\":[\"sectionId\",\"rowId\",\"columnId\",\"fieldName\"],\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"usePathNames\":{\"type\":\"boolean\"},\"sections\":{\"type\":\"array\"},\"rows\":{\"type\":\"array\"},\"columns\":{\"type\":\"array\"},\"fieldOrder\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"delegateAdvancedFormConfigTo\":{\"enum\":[\"praxis-dynamic-form\"]}}},\"failureModes\":[\"layout-field-reference-missing\",\"advanced-form-config-delegation-required\",\"host-template-layout-conflict\"],\"description\":\"Configures manual layout metadata and delegates advanced FormConfig layout semantics to the dynamic-form manifest.\"}}],\"validators\":[\"layout-field-references-valid\",\"manual-layout-does-not-replace-host-template\",\"delegates-form-config\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.sections\",\"usePathNames\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false}]}",
4376
4667
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4377
- "contentHash": "09548ccc91117a8e5d7940803eacc93d1d920b4bb10ad8956eea6e42d636bc14",
4668
+ "contentHash": "8f6f72537b599421ded0743c8c34cde702b1ba05aeabac67faf4cb3d78353c81",
4378
4669
  "sourceKind": "component_definition",
4379
4670
  "sourceId": "praxis-manual-form",
4380
4671
  "corpusVersion": "1.0.0"
4381
4672
  },
4382
4673
  {
4383
- "chunkIndex": 10,
4674
+ "chunkIndex": 18,
4384
4675
  "chunkKind": "authoring_manifest",
4385
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"autosave.enabled.set\",\"title\":\"Set manual form autosave policy\",\"scope\":\"interaction\",\"targetKind\":\"autosave\",\"target\":{\"kind\":\"autosave\",\"resolver\":\"manual-form-autosave-policy\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"debounceMs\":{\"type\":\"number\"},\"storageKey\":{\"type\":\"string\"},\"namespace\":{\"type\":\"string\"},\"tenantId\":{\"type\":\"string\"},\"profileId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-autosave-enabled-set\",\"handlerContract\":{\"reads\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"ManualFormPersistenceOptions\",\"ASYNC_CONFIG_STORAGE\"],\"writes\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"persistenceOptions\"],\"identityKeys\":[\"formId\",\"storageKey\",\"namespace\",\"tenantId\",\"profileId\"],\"failureModes\":[\"autosave-storage-missing\",\"unsafe-debounce\",\"ambiguous-storage-key\",\"ssr-storage-not-safe\"],\"description\":\"Sets autosave explicitly and requires safe debounce plus deterministic persistence key composition.\"}}],\"validators\":[\"autosave-explicit\",\"autosave-debounce-safe\",\"autosave-storage-available\",\"persistence-key-deterministic\",\"manual-form-round-trip\"],\"affectedPaths\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"persistenceOptions\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"submitBehavior.set\",\"title\":\"Set manual form submit behavior\",\"scope\":\"interaction\",\"targetKind\":\"submitBehavior\",\"target\":{\"kind\":\"submitBehavior\",\"resolver\":\"manual-form-submit-behavior\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"action\":{\"enum\":[\"submit\",\"saveDraft\",\"reset\",\"cancel\",\"custom\"]},\"clearAfterSave\":{\"type\":\"boolean\"},\"focusFirstError\":{\"type\":\"boolean\"},\"scrollToErrors\":{\"type\":\"boolean\"},\"confirmOnUnsavedChanges\":{\"type\":\"boolean\"},\"delegateFormSubmitTo\":{\"enum\":[\"praxis-dynamic-form\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-submit-behavior-set\",\"handlerContract\":{\"reads\":[\"ManualFormComponent.submitted\",\"ManualFormInstance.form\",\"FormConfig.behavior\",\"praxis-dynamic-form-authoring-manifest\"],\"writes\":[\"currentConfig.behavior\",\"submitted\",\"saved\",\"resetEvent\"],\"identityKeys\":[\"formId\",\"action\"],\"failureModes\":[\"submit-action-unsupported\",\"advanced-form-submit-delegation-required\",\"validation-focus-target-missing\"],\"description\":\"Configures manual submit/reset behavior and delegates dynamic-form submit payload semantics to the dynamic-form manifest.\"}}],\"validators\":[\"submit-behavior-supported\",\"delegates-form-config\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.behavior\",\"submitted\",\"saved\",\"resetEvent\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"metadataBridge.configure\",\"title\":\"Configure manual metadata bridge\",\"scope\":\"fieldMetadataPath\",\"targetKind\":\"metadataBridge\",\"target\":{\"kind\":\"metadataBridge\",\"resolver\":\"manual-field-metadata-bridge\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"fieldName\":{\"type\":\"string\"},\"openMode\":{\"enum\":[\"field-toolbar\",\"double-click\",\"programmatic\"]},\"persistDraftAfterPatch\":{\"type\":\"boolean\"},\"delegateFieldMetadataTo\":{\"enum\":[\"praxis-metadata-editor\"]},\"delegateControlDiscoveryTo\":{\"enum\":[\"praxis-dynamic-fields\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-metadata-bridge-configure\",\"handlerContract\":{\"reads\":[\"ManualFieldMetadataBridgeService\",\"SettingsPanelService\",\"PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST\",\"dynamic-fields-discovery\"],\"writes\":[\"enableCustomization\",\"currentFieldMetadata\",\"currentConfig.fieldMetadata\"],\"identityKeys\":[\"formId\",\"fieldName\",\"openMode\"],\"failureModes\":[\"metadata-editor-unavailable\",\"field-metadata-delegation-required\",\"control-discovery-delegation-required\",\"draft-persistence-failed\"],\"description\":\"Configures the bridge that opens metadata-editor for manual fields and persists accepted patches through ManualFormInstance.\"}}],\"validators\":[\"metadata-bridge-does-not-redefine-schema\",\"delegates-field-metadata\",\"control-type-discovered\",\"metadata-bridge-gated-by-customization\",\"manual-form-round-trip\"],\"affectedPaths\":[\"enableCustomization\",\"currentFieldMetadata\",\"currentConfig.fieldMetadata\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false}]}",
4676
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"toolbar.configure\",\"title\":\"Configure manual form customization toolbar\",\"scope\":\"toolbarUi\",\"targetKind\":\"toolbar\",\"target\":{\"kind\":\"toolbar\",\"resolver\":\"manual-form-customization-toolbar\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"enableCustomization\":{\"type\":\"boolean\"},\"editableFlags\":{\"type\":\"array\",\"items\":{\"enum\":[\"required\",\"readOnly\",\"hidden\",\"disabled\",\"openMetadataEditor\"]}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-toolbar-configure\",\"handlerContract\":{\"reads\":[\"ManualFormComponent.enableCustomization\",\"ManualFieldToolbarComponent\",\"ManualFieldEditorOnDblclickDirective\"],\"writes\":[\"enableCustomization\"],\"identityKeys\":[\"formId\"],\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"enableCustomization\":{\"type\":\"boolean\"},\"editableFlags\":{\"type\":\"array\",\"items\":{\"enum\":[\"required\",\"readOnly\",\"hidden\",\"disabled\",\"openMetadataEditor\"]}}}},\"failureModes\":[\"toolbar-disabled-with-required-bridge\",\"unsupported-toolbar-flag\"],\"description\":\"Configures the manual customization toolbar and keeps metadata edit entry points behind enableCustomization.\"}}],\"validators\":[\"toolbar-flags-supported\",\"metadata-bridge-gated-by-customization\",\"manual-form-round-trip\"],\"affectedPaths\":[\"enableCustomization\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"manual-form-component-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"autosave.enabled.set\",\"title\":\"Set manual form autosave policy\",\"scope\":\"interaction\",\"targetKind\":\"autosave\",\"target\":{\"kind\":\"autosave\",\"resolver\":\"manual-form-autosave-policy\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"debounceMs\":{\"type\":\"number\"},\"storageKey\":{\"type\":\"string\"},\"namespace\":{\"type\":\"string\"},\"tenantId\":{\"type\":\"string\"},\"profileId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-autosave-enabled-set\",\"handlerContract\":{\"reads\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"ManualFormPersistenceOptions\",\"ASYNC_CONFIG_STORAGE\"],\"writes\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"persistenceOptions\"],\"identityKeys\":[\"formId\",\"storageKey\",\"namespace\",\"tenantId\",\"profileId\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"debounceMs\":{\"type\":\"number\"},\"storageKey\":{\"type\":\"string\"},\"namespace\":{\"type\":\"string\"},\"tenantId\":{\"type\":\"string\"},\"profileId\":{\"type\":\"string\"}}},\"failureModes\":[\"autosave-storage-missing\",\"unsafe-debounce\",\"ambiguous-storage-key\",\"ssr-storage-not-safe\"],\"description\":\"Sets autosave explicitly and requires safe debounce plus deterministic persistence key composition.\"}}],\"validators\":[\"autosave-explicit\",\"autosave-debounce-safe\",\"autosave-storage-available\",\"persistence-key-deterministic\",\"manual-form-round-trip\"],\"affectedPaths\":[\"enableAutoSave\",\"autoSaveDebounceMs\",\"persistenceOptions\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"submitBehavior.set\",\"title\":\"Set manual form submit behavior\",\"scope\":\"interaction\",\"targetKind\":\"submitBehavior\",\"target\":{\"kind\":\"submitBehavior\",\"resolver\":\"manual-form-submit-behavior\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"action\":{\"enum\":[\"submit\",\"saveDraft\",\"reset\",\"cancel\",\"custom\"]},\"clearAfterSave\":{\"type\":\"boolean\"},\"focusFirstError\":{\"type\":\"boolean\"},\"scrollToErrors\":{\"type\":\"boolean\"},\"confirmOnUnsavedChanges\":{\"type\":\"boolean\"},\"delegateFormSubmitTo\":{\"enum\":[\"praxis-dynamic-form\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-submit-behavior-set\",\"handlerContract\":{\"reads\":[\"ManualFormComponent.submitted\",\"ManualFormInstance.form\",\"FormConfig.behavior\",\"praxis-dynamic-form-authoring-manifest\"],\"writes\":[\"currentConfig.behavior\",\"submitted\",\"saved\",\"resetEvent\"],\"identityKeys\":[\"formId\",\"action\"],\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"action\":{\"enum\":[\"submit\",\"saveDraft\",\"reset\",\"cancel\",\"custom\"]},\"clearAfterSave\":{\"type\":\"boolean\"},\"focusFirstError\":{\"type\":\"boolean\"},\"scrollToErrors\":{\"type\":\"boolean\"},\"confirmOnUnsavedChanges\":{\"type\":\"boolean\"},\"delegateFormSubmitTo\":{\"enum\":[\"praxis-dynamic-form\"]}}},\"failureModes\":[\"submit-action-unsupported\",\"advanced-form-submit-delegation-required\",\"validation-focus-target-missing\"],\"description\":\"Configures manual submit/reset behavior and delegates dynamic-form submit payload semantics to the dynamic-form manifest.\"}}],\"validators\":[\"submit-behavior-supported\",\"delegates-form-config\",\"manual-form-round-trip\"],\"affectedPaths\":[\"currentConfig.behavior\",\"submitted\",\"saved\",\"resetEvent\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false},{\"operationId\":\"metadataBridge.configure\",\"title\":\"Configure manual metadata bridge\",\"scope\":\"fieldMetadataPath\",\"targetKind\":\"metadataBridge\",\"target\":{\"kind\":\"metadataBridge\",\"resolver\":\"manual-field-metadata-bridge\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"fieldName\":{\"type\":\"string\"},\"openMode\":{\"enum\":[\"field-toolbar\",\"double-click\",\"programmatic\"]},\"persistDraftAfterPatch\":{\"type\":\"boolean\"},\"delegateFieldMetadataTo\":{\"enum\":[\"praxis-metadata-editor\"]},\"delegateControlDiscoveryTo\":{\"enum\":[\"praxis-dynamic-fields\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"manual-metadata-bridge-configure\",\"handlerContract\":{\"reads\":[\"ManualFieldMetadataBridgeService\",\"SettingsPanelService\",\"PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST\",\"dynamic-fields-discovery\"],\"writes\":[\"enableCustomization\",\"currentFieldMetadata\",\"currentConfig.fieldMetadata\"],\"identityKeys\":[\"formId\",\"fieldName\",\"openMode\"],\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"fieldName\":{\"type\":\"string\"},\"openMode\":{\"enum\":[\"field-toolbar\",\"double-click\",\"programmatic\"]},\"persistDraftAfterPatch\":{\"type\":\"boolean\"},\"delegateFieldMetadataTo\":{\"enum\":[\"praxis-metadata-editor\"]},\"delegateControlDiscoveryTo\":{\"enum\":[\"praxis-dynamic-fields\"]}}},\"failureModes\":[\"metadata-editor-unavailable\",\"field-metadata-delegation-required\",\"control-discovery-delegation-required\",\"draft-persistence-failed\"],\"description\":\"Configures the bridge that opens metadata-editor for manual fields and persists accepted patches through ManualFormInstance.\"}}],\"validators\":[\"metadata-bridge-does-not-redefine-schema\",\"delegates-field-metadata\",\"control-type-discovered\",\"metadata-bridge-gated-by-customization\",\"manual-form-round-trip\"],\"affectedPaths\":[\"enableCustomization\",\"currentFieldMetadata\",\"currentConfig.fieldMetadata\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"manual-form-instance-loaded\"],\"destructive\":false,\"requiresConfirmation\":false}]}",
4386
4677
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
4387
- "contentHash": "67b092de2cd1d53b632467f271d4b0eac516c8a5496c8c1cc9882c452fdfda05",
4678
+ "contentHash": "4f0ace5ad3317b0021b77cfddc80d8e4d12d6aab8bb19aa7ac68fae70381b6bf",
4388
4679
  "sourceKind": "component_definition",
4389
4680
  "sourceId": "praxis-manual-form",
4390
4681
  "corpusVersion": "1.0.0"
4391
4682
  },
4392
4683
  {
4393
- "chunkIndex": 11,
4684
+ "chunkIndex": 19,
4394
4685
  "chunkKind": "authoring_manifest",
4395
4686
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"manual-field-id-unique\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_ID_UNIQUE\",\"description\":\"Manual field names must be unique in the instance metadata map.\"},{\"validatorId\":\"manual-field-exists\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_EXISTS\",\"description\":\"Target manual field must exist before patching or removing it.\"},{\"validatorId\":\"field-removal-confirmed\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_REMOVAL_CONFIRMED\",\"description\":\"Removing a field or its persisted value requires explicit confirmation.\"},{\"validatorId\":\"field-label-valid\",\"level\":\"error\",\"code\":\"MANUAL_FORM_FIELD_LABEL_VALID\",\"description\":\"Manual field label must be a non-empty user-facing string.\"},{\"validatorId\":\"host-template-field-exists\",\"level\":\"error\",\"code\":\"MANUAL_FORM_HOST_FIELD_EXISTS\",\"description\":\"Manual field metadata must correspond to a host template control or declared metadata bridge target.\"},{\"validatorId\":\"control-type-discovered\",\"level\":\"error\",\"code\":\"MANUAL_FORM_CONTROL_TYPE_DISCOVERED\",\"description\":\"Control type must be discovered through dynamic-fields mappings or delegated discovery.\"},{\"validatorId\":\"metadata-bridge-does-not-redefine-schema\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_SCHEMA_SAFE\",\"description\":\"Metadata bridge patches must not silently redefine backend schema or schema-driven FormConfig semantics.\"},{\"validatorId\":\"delegates-field-metadata\",\"level\":\"error\",\"code\":\"MANUAL_FORM_DELEGATES_FIELD_METADATA\",\"description\":\"Advanced FieldMetadata edits must be delegated to the metadata-editor manifest.\"},{\"validatorId\":\"delegates-form-config\",\"level\":\"error\",\"code\":\"MANUAL_FORM_DELEGATES_FORM_CONFIG\",\"description\":\"Advanced FormConfig semantics must be delegated to the dynamic-form manifest.\"},{\"validatorId\":\"layout-field-references-valid\",\"level\":\"error\",\"code\":\"MANUAL_FORM_LAYOUT_FIELD_REFERENCES_VALID\",\"description\":\"Layout field references must resolve to manual fields.\"},{\"validatorId\":\"manual-layout-does-not-replace-host-template\",\"level\":\"error\",\"code\":\"MANUAL_FORM_LAYOUT_HOST_TEMPLATE_SAFE\",\"description\":\"Manual layout metadata must not pretend to rewrite host-owned HTML template structure.\"},{\"validatorId\":\"toolbar-flags-supported\",\"level\":\"error\",\"code\":\"MANUAL_FORM_TOOLBAR_FLAGS_SUPPORTED\",\"description\":\"Toolbar quick edit flags must be supported by the manual field toolbar.\"},{\"validatorId\":\"metadata-bridge-gated-by-customization\",\"level\":\"error\",\"code\":\"MANUAL_FORM_METADATA_BRIDGE_GATED\",\"description\":\"Metadata bridge entry points must respect enableCustomization.\"},{\"validatorId\":\"autosave-explicit\",\"level\":\"error\",\"code\":\"MANUAL_FORM_AUTOSAVE_EXPLICIT\",\"description\":\"Autosave enablement and persistence policy must be explicit.\"},{\"validatorId\":\"autosave-debounce-safe\",\"level\":\"error\",\"code\":\"MANUAL_FORM_AUTOSAVE_DEBOUNCE_SAFE\",\"description\":\"Autosave debounce must be positive and safe for storage backends.\"},{\"validatorId\":\"autosave-storage-available\",\"level\":\"error\",\"code\":\"MANUAL_FORM_AUTOSAVE_STORAGE_AVAILABLE\",\"description\":\"Autosave requires a valid AsyncConfigStorage implementation.\"},{\"validatorId\":\"persistence-key-deterministic\",\"level\":\"error\",\"code\":\"MANUAL_FORM_PERSISTENCE_KEY_DETERMINISTIC\",\"description\":\"Persistence key composition must be deterministic across reopen/reload.\"},{\"validatorId\":\"submit-behavior-supported\",\"level\":\"error\",\"code\":\"MANUAL_FORM_SUBMIT_BEHAVIOR_SUPPORTED\",\"description\":\"Submit behavior must map to supported manual form outputs or delegated dynamic-form semantics.\"},{\"validatorId\":\"manual-form-round-trip\",\"level\":\"error\",\"code\":\"MANUAL_FORM_ROUND_TRIP\",\"description\":\"Open, edit, apply/save, reopen and runtime consume must preserve manual form config.\"}]}",
4396
4687
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
@@ -4400,7 +4691,7 @@
4400
4691
  "corpusVersion": "1.0.0"
4401
4692
  },
4402
4693
  {
4403
- "chunkIndex": 12,
4694
+ "chunkIndex": 20,
4404
4695
  "chunkKind": "authoring_manifest",
4405
4696
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"ManualFormInstance is the package-level runtime document: config, field metadata map, FormGroup and persistence key must remain coherent.\",\"Manual field ids are stable field names; array indexes are not canonical identity.\",\"Field removal is destructive and requires confirmation before metadata, layout references or persisted values are removed.\",\"Autosave must be explicit, have a safe debounce and use deterministic persistence key composition through ManualFormPersistenceOptions.\",\"The metadata bridge may apply metadata-editor patches but must not silently redefine backend schema or duplicate FieldMetadata semantics.\",\"Advanced FormConfig authoring belongs to praxis-dynamic-form; this manifest governs manual form orchestration and delegates deeper FormConfig semantics.\"]}",
4406
4697
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
@@ -4410,7 +4701,7 @@
4410
4701
  "corpusVersion": "1.0.0"
4411
4702
  },
4412
4703
  {
4413
- "chunkIndex": 13,
4704
+ "chunkIndex": 21,
4414
4705
  "chunkKind": "authoring_manifest",
4415
4706
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-manual-form\",\"ownerPackage\":\"@praxisui/manual-form\",\"configSchemaId\":\"ManualFormInstance\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"add-text-field\",\"request\":\"Add a manual text field for customer name.\",\"operationId\":\"manualField.add\",\"params\":{\"fieldName\":\"customerName\",\"controlType\":\"input\",\"label\":\"Customer name\",\"source\":\"manual-template\",\"delegateFieldMetadataTo\":\"praxis-metadata-editor\"},\"isPositive\":true},{\"id\":\"remove-obsolete-field\",\"request\":\"Remove the obsolete nickname field from the manual form.\",\"operationId\":\"manualField.remove\",\"params\":{\"fieldName\":\"nickname\",\"removeFromLayout\":true,\"clearPersistedValue\":true},\"isPositive\":true},{\"id\":\"rename-label\",\"request\":\"Change the label of cpf to CPF/CNPJ.\",\"operationId\":\"manualField.label.set\",\"params\":{\"fieldName\":\"cpf\",\"label\":\"CPF/CNPJ\"},\"isPositive\":true},{\"id\":\"enable-path-names\",\"request\":\"Use nested form paths as field names.\",\"operationId\":\"layout.configure\",\"params\":{\"usePathNames\":true},\"isPositive\":true},{\"id\":\"configure-toolbar\",\"request\":\"Enable customization toolbar with required and hidden toggles.\",\"operationId\":\"toolbar.configure\",\"params\":{\"enableCustomization\":true,\"editableFlags\":[\"required\",\"hidden\",\"openMetadataEditor\"]},\"isPositive\":true},{\"id\":\"enable-autosave\",\"request\":\"Enable autosave every second for this tenant profile.\",\"operationId\":\"autosave.enabled.set\",\"params\":{\"enabled\":true,\"debounceMs\":1000,\"namespace\":\"sales\",\"tenantId\":\"acme\",\"profileId\":\"admin\"},\"isPositive\":true},{\"id\":\"set-submit-behavior\",\"request\":\"Focus the first invalid field and scroll to errors on submit.\",\"operationId\":\"submitBehavior.set\",\"params\":{\"action\":\"submit\",\"focusFirstError\":true,\"scrollToErrors\":true},\"isPositive\":true},{\"id\":\"configure-metadata-bridge\",\"request\":\"Open metadata editor from the toolbar and persist draft after patch.\",\"operationId\":\"metadataBridge.configure\",\"params\":{\"enabled\":true,\"openMode\":\"field-toolbar\",\"persistDraftAfterPatch\":true,\"delegateFieldMetadataTo\":\"praxis-metadata-editor\",\"delegateControlDiscoveryTo\":\"praxis-dynamic-fields\"},\"isPositive\":true},{\"id\":\"reject-duplicate-field\",\"request\":\"Add another customerName field with a different label.\",\"operationId\":\"manualField.add\",\"params\":{\"fieldName\":\"customerName\",\"controlType\":\"input\",\"label\":\"Duplicate customer\"},\"isPositive\":false},{\"id\":\"reject-unconfirmed-removal\",\"request\":\"Remove email and clear its saved value without confirmation.\",\"operationId\":\"manualField.remove\",\"params\":{\"fieldName\":\"email\",\"clearPersistedValue\":true},\"isPositive\":false},{\"id\":\"reject-unsafe-autosave\",\"request\":\"Autosave every millisecond with no storage identity.\",\"operationId\":\"autosave.enabled.set\",\"params\":{\"enabled\":true,\"debounceMs\":1},\"isPositive\":false},{\"id\":\"reject-schema-redefinition\",\"request\":\"Use manual form metadata bridge to replace the backend schema for cpf.\",\"operationId\":\"metadataBridge.configure\",\"params\":{\"enabled\":true,\"fieldName\":\"cpf\",\"backendSchemaOverride\":{\"type\":\"number\"}},\"isPositive\":false}]}",
4416
4707
  "sourcePointer": "projects/praxis-manual-form/src/lib/ai/praxis-manual-form-authoring-manifest.ts",
@@ -4420,7 +4711,7 @@
4420
4711
  "corpusVersion": "1.0.0"
4421
4712
  },
4422
4713
  {
4423
- "chunkIndex": 14,
4714
+ "chunkIndex": 22,
4424
4715
  "chunkKind": "context_pack",
4425
4716
  "content": "{\"componentId\":\"praxis-manual-form\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"version\":\"v1\",\"optionsByPath\":{\"fieldMetadata[].controlType\":{\"mode\":\"enum\",\"options\":[{\"value\":\"input\",\"label\":\"Input\"},{\"value\":\"textarea\",\"label\":\"Textarea\"},{\"value\":\"email\",\"label\":\"Email\"},{\"value\":\"password\",\"label\":\"Password\"},{\"value\":\"search\",\"label\":\"Search\"},{\"value\":\"url\",\"label\":\"URL\"},{\"value\":\"phone\",\"label\":\"Phone\"},{\"value\":\"cpfCnpjInput\",\"label\":\"CPF/CNPJ\"},{\"value\":\"numericTextBox\",\"label\":\"Number\"},{\"value\":\"currency\",\"label\":\"Currency\"},{\"value\":\"priceRange\",\"label\":\"Price range\"},{\"value\":\"date\",\"label\":\"Date picker\"},{\"value\":\"dateRange\",\"label\":\"Date range\"},{\"value\":\"dateInput\",\"label\":\"Date input\"},{\"value\":\"dateTime\",\"label\":\"Datetime\"},{\"value\":\"dateTimeRange\",\"label\":\"Datetime range\"},{\"value\":\"dateTimeLocal\",\"label\":\"Datetime local\"},{\"value\":\"time\",\"label\":\"Time input\"},{\"value\":\"timePicker\",\"label\":\"Time picker\"},{\"value\":\"timeRange\",\"label\":\"Time range\"},{\"value\":\"week\",\"label\":\"Week input\"},{\"value\":\"month\",\"label\":\"Month input\"},{\"value\":\"year\",\"label\":\"Year input\"},{\"value\":\"select\",\"label\":\"Select\"},{\"value\":\"multiSelect\",\"label\":\"Multi select\"},{\"value\":\"multiSelectTree\",\"label\":\"Multi select tree\"},{\"value\":\"treeSelect\",\"label\":\"Tree select\"},{\"value\":\"transferList\",\"label\":\"Transfer list\"},{\"value\":\"autoComplete\",\"label\":\"Autocomplete\"},{\"value\":\"searchable-select\",\"label\":\"Searchable select\"},{\"value\":\"async-select\",\"label\":\"Async select\"},{\"value\":\"radio\",\"label\":\"Radio group\"},{\"value\":\"checkbox\",\"label\":\"Checkbox group\"},{\"value\":\"selectionList\",\"label\":\"Selection list\"},{\"value\":\"toggle\",\"label\":\"Toggle\"},{\"value\":\"buttonToggle\",\"label\":\"Button toggle\"},{\"value\":\"slider\",\"label\":\"Slider\"},{\"value\":\"rangeSlider\",\"label\":\"Range slider\"},{\"value\":\"rating\",\"label\":\"Rating\"},{\"value\":\"chipInput\",\"label\":\"Chips\"},{\"value\":\"chipList\",\"label\":\"Chip list\"},{\"value\":\"upload\",\"label\":\"File upload\"},{\"value\":\"color\",\"label\":\"Color input\"},{\"value\":\"colorPicker\",\"label\":\"Color picker\"},{\"value\":\"cronBuilder\",\"label\":\"Cron builder\"}]},\"fieldMetadata[].source\":{\"mode\":\"enum\",\"options\":[{\"value\":\"schema\",\"label\":\"Schema field\"},{\"value\":\"local\",\"label\":\"Local field\"}]},\"fieldMetadata[].submitPolicy\":{\"mode\":\"enum\",\"options\":[{\"value\":\"omit\",\"label\":\"Omit from submit payload\"},{\"value\":\"include\",\"label\":\"Include in submit payload\"},{\"value\":\"includeWhenDirty\",\"label\":\"Include only when dirty\"}]},\"fieldMetadata[].materialDesign.appearance\":{\"mode\":\"enum\",\"options\":[{\"value\":\"fill\",\"label\":\"Fill\"},{\"value\":\"outline\",\"label\":\"Outline\"}]},\"fieldMetadata[].materialDesign.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]},\"fieldMetadata[].materialDesign.floatLabel\":{\"mode\":\"enum\",\"options\":[{\"value\":\"auto\",\"label\":\"Auto\"},{\"value\":\"always\",\"label\":\"Always\"}]},\"fieldMetadata[].materialDesign.density\":{\"mode\":\"enum\",\"options\":[{\"value\":\"comfortable\",\"label\":\"Comfortable\"},{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"dense\",\"label\":\"Dense\"}]},\"actions.position\":{\"mode\":\"enum\",\"options\":[{\"value\":\"left\",\"label\":\"Left\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"right\",\"label\":\"Right\"},{\"value\":\"justified\",\"label\":\"Justified\"},{\"value\":\"split\",\"label\":\"Split\"}]},\"actions.orientation\":{\"mode\":\"enum\",\"options\":[{\"value\":\"horizontal\",\"label\":\"Horizontal\"},{\"value\":\"vertical\",\"label\":\"Vertical\"}]},\"actions.spacing\":{\"mode\":\"enum\",\"options\":[{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"normal\",\"label\":\"Normal\"},{\"value\":\"spacious\",\"label\":\"Spacious\"}]},\"actions.placement\":{\"mode\":\"enum\",\"options\":[{\"value\":\"insideLastSection\",\"label\":\"Inside last section\"},{\"value\":\"afterSections\",\"label\":\"After sections\"},{\"value\":\"top\",\"label\":\"Top\"}]},\"actions.submit.type\":{\"mode\":\"enum\",\"options\":[{\"value\":\"button\",\"label\":\"Button\"},{\"value\":\"submit\",\"label\":\"Submit\"},{\"value\":\"reset\",\"label\":\"Reset\"}]},\"actions.submit.variant\":{\"mode\":\"enum\",\"options\":[{\"value\":\"raised\",\"label\":\"Raised\"},{\"value\":\"stroked\",\"label\":\"Stroked\"},{\"value\":\"flat\",\"label\":\"Flat\"},{\"value\":\"fab\",\"label\":\"Fab\"}]},\"actions.submit.size\":{\"mode\":\"enum\",\"options\":[{\"value\":\"small\",\"label\":\"Small\"},{\"value\":\"medium\",\"label\":\"Medium\"},{\"value\":\"large\",\"label\":\"Large\"}]},\"actions.submit.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"},{\"value\":\"basic\",\"label\":\"Basic\"}]},\"sections[].headerAlign\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"}]},\"sections[].appearance\":{\"mode\":\"enum\",\"options\":[{\"value\":\"card\",\"label\":\"Card\"},{\"value\":\"plain\",\"label\":\"Plain\"},{\"value\":\"step\",\"label\":\"Step\"}]},\"sections[].sectionHeader.mode\":{\"mode\":\"enum\",\"options\":[{\"value\":\"icon\",\"label\":\"Icon\"},{\"value\":\"avatar-image\",\"label\":\"Avatar image\"},{\"value\":\"avatar-initials\",\"label\":\"Avatar initials\"},{\"value\":\"auto\",\"label\":\"Auto\"}]},\"sections[].sectionHeader.emptyState\":{\"mode\":\"enum\",\"options\":[{\"value\":\"placeholder-avatar\",\"label\":\"Neutral placeholder\"},{\"value\":\"fallback-icon\",\"label\":\"Fallback icon\"},{\"value\":\"none\",\"label\":\"None\"}]},\"sections[].sectionHeader.size\":{\"mode\":\"enum\",\"options\":[{\"value\":\"sm\",\"label\":\"Small\"},{\"value\":\"md\",\"label\":\"Medium\"},{\"value\":\"lg\",\"label\":\"Large\"}]},\"sections[].stepLabel\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"Dados básicos\",\"label\":\"Dados básicos\"},{\"value\":\"Detalhes\",\"label\":\"Detalhes\"},{\"value\":\"Confirmação\",\"label\":\"Confirmação\"}]},\"sections[].titleStyle\":{\"mode\":\"enum\",\"options\":[{\"value\":\"titleLarge\",\"label\":\"Title large\"},{\"value\":\"titleMedium\",\"label\":\"Title medium\"},{\"value\":\"titleSmall\",\"label\":\"Title small\"},{\"value\":\"headlineSmall\",\"label\":\"Headline small\"}]},\"sections[].descriptionStyle\":{\"mode\":\"enum\",\"options\":[{\"value\":\"bodyLarge\",\"label\":\"Body large\"},{\"value\":\"bodyMedium\",\"label\":\"Body medium\"},{\"value\":\"bodySmall\",\"label\":\"Body small\"}]},\"sections[].rows[].columns[].align\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"end\",\"label\":\"End\"},{\"value\":\"stretch\",\"label\":\"Stretch\"}]},\"sections[].rows[].columns[].items[].kind\":{\"mode\":\"enum\",\"options\":[{\"value\":\"field\",\"label\":\"Field\"},{\"value\":\"richContent\",\"label\":\"Rich content\"}]},\"sections[].rows[].columns[].items[].layout\":{\"mode\":\"enum\",\"options\":[{\"value\":\"block\",\"label\":\"Block\"},{\"value\":\"inline\",\"label\":\"Inline\"}]},\"formRules[].targetType\":{\"mode\":\"enum\",\"options\":[{\"value\":\"field\",\"label\":\"Field\"},{\"value\":\"section\",\"label\":\"Section\"},{\"value\":\"row\",\"label\":\"Row\"},{\"value\":\"column\",\"label\":\"Column\"},{\"value\":\"action\",\"label\":\"Action\"},{\"value\":\"visualBlock\",\"label\":\"Visual block\"}]},\"formRules[].context\":{\"mode\":\"enum\",\"options\":[{\"value\":\"visibility\",\"label\":\"Visibility\"},{\"value\":\"readOnly\",\"label\":\"Read only\"},{\"value\":\"style\",\"label\":\"Style\"},{\"value\":\"validation\",\"label\":\"Validation\"},{\"value\":\"notification\",\"label\":\"Notification\"}]}}}}",
4426
4717
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -4430,7 +4721,7 @@
4430
4721
  "corpusVersion": "1.0.0"
4431
4722
  },
4432
4723
  {
4433
- "chunkIndex": 15,
4724
+ "chunkIndex": 23,
4434
4725
  "chunkKind": "context_pack",
4435
4726
  "content": "{\"componentId\":\"praxis-manual-form\",\"chunkSection\":\"componentContext.actionCatalog\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"field.visibility.hide\",\"intentExamples\":[\"hide field\",\"ocultar campo\",\"esconder campo\",\"invisible\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"hidden\":true}]}},{\"id\":\"field.visibility.show\",\"intentExamples\":[\"show field\",\"mostrar campo\",\"exibir campo\",\"visible\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"hidden\":false}]}},{\"id\":\"field.label.set\",\"intentExamples\":[\"label\",\"rename field\",\"renomear campo\",\"titulo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"label\":\"{{value}}\"}]}},{\"id\":\"field.placeholder.set\",\"intentExamples\":[\"placeholder\",\"hint text\",\"texto de ajuda\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"placeholder\":\"{{value}}\"}]}},{\"id\":\"field.required.enable\",\"intentExamples\":[\"required\",\"obrigatorio\",\"mandatory\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"required\":true}]}},{\"id\":\"field.required.disable\",\"intentExamples\":[\"optional\",\"nao obrigatorio\",\"opcional\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"required\":false}]}},{\"id\":\"field.readonly.enable\",\"intentExamples\":[\"readonly\",\"somente leitura\",\"read only\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"readOnly\":true}]}},{\"id\":\"field.readonly.disable\",\"intentExamples\":[\"editable\",\"editavel\",\"read write\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"readOnly\":false}]}},{\"id\":\"field.disabled.enable\",\"intentExamples\":[\"disable field\",\"desabilitar campo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"disabled\":true}]}},{\"id\":\"field.disabled.disable\",\"intentExamples\":[\"enable field\",\"habilitar campo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"disabled\":false}]}},{\"id\":\"field.controlType.set\",\"intentExamples\":[\"control type\",\"tipo de campo\",\"controlType\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"controlType\":\"{{value}}\"}]}},{\"id\":\"field.icon.prefix.set\",\"intentExamples\":[\"prefix icon\",\"icone prefixo\",\"icon before\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"prefixIcon\":\"{{value}}\"}]}},{\"id\":\"field.icon.suffix.set\",\"intentExamples\":[\"suffix icon\",\"icone sufixo\",\"icon after\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"suffixIcon\":\"{{value}}\"}]}},{\"id\":\"section.title.set\",\"intentExamples\":[\"section title\",\"titulo da secao\",\"section name\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"title\":\"{{value}}\"}]}},{\"id\":\"section.description.set\",\"intentExamples\":[\"section description\",\"descricao da secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"description\":\"{{value}}\"}]}},{\"id\":\"section.add\",\"intentExamples\":[\"add section\",\"adicionar secao\",\"nova secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{value}}\",\"title\":\"{{value}}\",\"rows\":[]}]},\"safetyNotes\":\"Certifique-se de que o ID da seção é único e relevante.\"},{\"id\":\"section.remove\",\"intentExamples\":[\"remove section\",\"remover secao\",\"excluir secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"_delete\":true}]},\"safetyNotes\":\"Remover uma seção é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"section.order.set\",\"intentExamples\":[\"order section\",\"reordenar secao\",\"mover secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"_order\":\"{{value}}\"}]},\"safetyNotes\":\"A reordenação de seções é uma operação que deve ser revisada.\"},{\"id\":\"row.add\",\"intentExamples\":[\"add row\",\"adicionar linha\",\"nova linha na secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"rows\":[{\"id\":\"{{value}}\",\"columns\":[]}]}]},\"safetyNotes\":\"Certifique-se de que o ID da linha é único e relevante na seção.\"},{\"id\":\"row.remove\",\"intentExamples\":[\"remove row\",\"remover linha\",\"excluir linha da secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"rows\":[{\"id\":\"{{value}}\",\"_delete\":true}]}]},\"safetyNotes\":\"Remover uma linha é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"column.add\",\"intentExamples\":[\"add column\",\"adicionar coluna\",\"nova coluna na linha\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{value}}\",\"items\":[]}]}]}]},\"safetyNotes\":\"Certifique-se de que o ID da coluna é único e relevante na linha.\"},{\"id\":\"column.remove\",\"intentExamples\":[\"remove column\",\"remover coluna\",\"excluir coluna da linha\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{value}}\",\"_delete\":true}]}]}]},\"safetyNotes\":\"Remover uma coluna é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"column.field.add\",\"intentExamples\":[\"add field to column\",\"adicionar campo a coluna\",\"colocar campo na coluna\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{target.columnId}}\",\"items\":[{\"kind\":\"field\",\"id\":\"field-{{value}}\",\"fieldName\":\"{{value}}\"}]}]}]}]},\"safetyNotes\":\"Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico.\"},{\"id\":\"column.field.remove\",\"intentExamples\":[\"remove field from column\",\"remover campo da coluna\",\"tirar campo da coluna\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{target.columnId}}\",\"items\":[{\"kind\":\"field\",\"fieldName\":\"{{value}}\",\"_remove\":true}]}]}]}]},\"safetyNotes\":\"Remover um campo de uma coluna pode alterar o layout do formulário.\"},{\"id\":\"actions.submit.label.set\",\"intentExamples\":[\"submit label\",\"rotulo salvar\",\"texto botao enviar\"],\"patchTemplate\":{\"actions\":{\"submit\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.submit.visible.set\",\"intentExamples\":[\"show submit\",\"esconder salvar\",\"visibilidade enviar\"],\"patchTemplate\":{\"actions\":{\"submit\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"actions.cancel.label.set\",\"intentExamples\":[\"cancel label\",\"rotulo cancelar\",\"texto botao cancelar\"],\"patchTemplate\":{\"actions\":{\"cancel\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.cancel.visible.set\",\"intentExamples\":[\"show cancel\",\"esconder cancelar\",\"visibilidade cancelar\"],\"patchTemplate\":{\"actions\":{\"cancel\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"actions.reset.label.set\",\"intentExamples\":[\"reset label\",\"rotulo resetar\",\"texto botao limpar\"],\"patchTemplate\":{\"actions\":{\"reset\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.reset.visible.set\",\"intentExamples\":[\"show reset\",\"esconder reset\",\"visibilidade limpar\"],\"patchTemplate\":{\"actions\":{\"reset\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"rule.add.visibility\",\"intentExamples\":[\"add visibility rule\",\"regra de visibilidade\",\"campo condicional\"],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{value.id}}\",\"name\":\"{{value.name}}\",\"targetType\":\"field\",\"targets\":[\"{{target}}\"],\"effect\":{\"condition\":\"{{value.condition}}\",\"properties\":{\"hidden\":false},\"propertiesWhenFalse\":{\"hidden\":true}}}]},\"safetyNotes\":\"Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao.\"},{\"id\":\"rule.remove\",\"intentExamples\":[\"remove rule\",\"excluir regra\",\"apagar regra\"],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{target}}\",\"_delete\":true}]},\"safetyNotes\":\"Remover regras pode ter efeitos inesperados no comportamento do formulário.\"}]}}",
4436
4727
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -4440,7 +4731,7 @@
4440
4731
  "corpusVersion": "1.0.0"
4441
4732
  },
4442
4733
  {
4443
- "chunkIndex": 16,
4734
+ "chunkIndex": 24,
4444
4735
  "chunkKind": "context_pack",
4445
4736
  "content": "{\"componentId\":\"praxis-manual-form\",\"chunkSection\":\"componentContext.actionCatalog\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"rule.add.dependency\",\"intentExamples\":[\"adicionar dependencia\",\"campo depende de\",\"mostrar se\",\"obrigatorio se\",\"desabilitar se\",\"campo condicional\"],\"scope\":\"GLOBAL\",\"valueType\":\"OBJECT\",\"operation\":\"create\",\"params\":[{\"name\":\"triggerField\",\"type\":\"STRING\",\"description\":\"Campo que controla a regra (ex: tipoPessoa)\"},{\"name\":\"conditionValue\",\"type\":\"STRING\",\"description\":\"Valor do trigger para ativar a regra (ex: \\\"Jurídica\\\")\"},{\"name\":\"targetField\",\"type\":\"STRING\",\"description\":\"Campo afetado pela regra (ex: cnpj)\"},{\"name\":\"effectType\",\"type\":\"ENUM\",\"options\":[\"visibility\",\"required\",\"disabled\"],\"description\":\"Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)\"}],\"patchTemplate\":{\"formRules\":[{\"id\":\"rule_{{params.triggerField}}_{{params.targetField}}\",\"name\":\"Dependência: {{params.targetField}} depende de {{params.triggerField}}\",\"targetType\":\"field\",\"targets\":[\"{{params.targetField}}\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"{{params.triggerField}}\"},\"{{params.conditionValue}}\"]},\"properties\":{\"hidden\":\"{{params.effectType === 'visibility' ? false : undefined}}\",\"required\":\"{{params.effectType === 'required' ? true : undefined}}\",\"disabled\":\"{{params.effectType === 'disabled' ? true : undefined}}\"},\"propertiesWhenFalse\":{\"hidden\":\"{{params.effectType === 'visibility' ? true : undefined}}\",\"required\":\"{{params.effectType === 'required' ? false : undefined}}\",\"disabled\":\"{{params.effectType === 'disabled' ? false : undefined}}\"}}}]},\"safetyNotes\":\"Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples.\"},{\"id\":\"rule.add.custom\",\"intentExamples\":[\"adicionar regra customizada\",\"regra complexa\",\"logica de formulario\"],\"scope\":\"GLOBAL\",\"valueType\":\"OBJECT\",\"operation\":\"create\",\"params\":[{\"name\":\"id\",\"type\":\"STRING\",\"description\":\"ID único da regra\"},{\"name\":\"condition\",\"type\":\"STRING\",\"description\":\"Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \\\"and\\\": [{ \\\">\\\": [{ \\\"var\\\": \\\"idade\\\" }, 18] }, { \\\"==\\\": [{ \\\"var\\\": \\\"possuiHabilitacao\\\" }, true] }] })\"},{\"name\":\"targetField\",\"type\":\"STRING\",\"description\":\"Campo afetado\"},{\"name\":\"propertyName\",\"type\":\"STRING\",\"description\":\"Propriedade afetada (hidden, required, disabled, readOnly)\"},{\"name\":\"valueIfTrue\",\"type\":\"BOOLEAN\",\"description\":\"Valor se a condição for verdadeira\"},{\"name\":\"valueIfFalse\",\"type\":\"BOOLEAN\",\"description\":\"Valor se a condição for falsa\"}],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{params.id}}\",\"name\":\"Regra Customizada: {{params.id}}\",\"targetType\":\"field\",\"targets\":[\"{{params.targetField}}\"],\"effect\":{\"condition\":\"{{params.condition}}\",\"properties\":{\"{{params.propertyName}}\":\"{{params.valueIfTrue}}\"},\"propertiesWhenFalse\":{\"{{params.propertyName}}\":\"{{params.valueIfFalse}}\"}}}]}}]}}",
4446
4737
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -4450,7 +4741,7 @@
4450
4741
  "corpusVersion": "1.0.0"
4451
4742
  },
4452
4743
  {
4453
- "chunkIndex": 17,
4744
+ "chunkIndex": 25,
4454
4745
  "chunkKind": "context_pack",
4455
4746
  "content": "{\"componentId\":\"praxis-manual-form\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"fieldResolvers\":{\"fieldMetadata[]\":[\"name\",\"label\"],\"sections[]\":[\"id\",\"title\"],\"sections[].rows[].columns[].items[]\":[\"id\",\"fieldName\"],\"sections[].rows[].columns[].fields[]\":[]},\"hints\":[\"Use fieldMetadata[].name as the canonical field id; avoid array indexes.\",\"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.\",\"submitPolicy accepts only \\\"omit\\\", \\\"include\\\", or \\\"includeWhenDirty\\\". If legacy prompt text says \\\"never\\\", normalize it to \\\"omit\\\" before persisting.\",\"Visual blocks are not fields. Store them only as kind:\\\"richContent\\\" layout items and never in fieldMetadata[].\",\"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.\",\"Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.\",\"For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.\",\"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.\",\"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.\",\"LLM-created formRules must include metadata.origin:\\\"llm\\\" and metadata.reviewStatus:\\\"pending\\\"; never write generated formRulesState.\",\"Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.\",\"For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.\",\"Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.\",\"When adding sections/rows/columns, provide a unique \\\"id\\\" for each new element.\",\"For nested layout changes (column within a row within a section), explicitly define \\\"target.sectionId\\\", \\\"target.rowId\\\", \\\"target.columnId\\\" in user prompt for clarity.\",\"DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).\",\"DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).\",\"DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.\",\"DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.\",\"DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally.\"]}}",
4456
4747
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -4460,7 +4751,7 @@
4460
4751
  "corpusVersion": "1.0.0"
4461
4752
  },
4462
4753
  {
4463
- "chunkIndex": 18,
4754
+ "chunkIndex": 26,
4464
4755
  "chunkKind": "recipe",
4465
4756
  "content": "{\"_comment\":\"Receita para Formulário Manual (Low-code/No-code).\",\"templateMeta\":{\"registryKey\":\"praxis-manual-form\",\"variantId\":\"base\",\"useWhen\":\"Base manual form configuration.\",\"examplePrompts\":[\"create a manual form with fields\",\"configure manual form layout\"]},\"config\":{\"schema\":{\"fields\":[{\"name\":\"title\",\"type\":\"text\",\"label\":\"Título\"},{\"name\":\"content\",\"type\":\"textarea\",\"label\":\"Conteúdo\"}]},\"layout\":{\"type\":\"grid\",\"columns\":2},\"initialData\":{\"title\":\"Rascunho\"},\"validationSchema\":{\"title\":{\"required\":true,\"minLength\":5}},\"actions\":[{\"id\":\"save\",\"label\":\"Salvar\",\"handler\":\"onSubmit\"},{\"id\":\"cancel\",\"label\":\"Cancelar\",\"handler\":\"onCancel\"}],\"hooks\":{\"_comment\":\"Hooks executaveis sao representados como strings; substitua por funcoes reais no runtime.\",\"onSubmit\":\"console.log('Form submitted', data)\",\"onCancel\":\"history.back()\"}}}",
4466
4757
  "sourcePointer": "examples/ai-recipes/praxis-manual-form.json",
@@ -1,4 +1,4 @@
1
- import { ensureIds, DynamicFormService, ASYNC_CONFIG_STORAGE, RULE_PROPERTY_SCHEMA, deepMerge, resolveControlTypeAlias, FieldControlType, normalizeControlTypeKey, FormHooksRegistry, ComponentKeyService, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, FieldSelectorRegistry, providePraxisI18n, PraxisI18nService, API_URL, ComponentMetadataRegistry } from '@praxisui/core';
1
+ import { ensureIds, DynamicFormService, ASYNC_CONFIG_STORAGE, RULE_PROPERTY_SCHEMA, deepMerge, resolveControlTypeAlias, FieldControlType, normalizeControlTypeKey, PraxisIconButtonComponent, FormHooksRegistry, ComponentKeyService, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, FieldSelectorRegistry, providePraxisI18n, PraxisI18nService, API_URL, ComponentMetadataRegistry } from '@praxisui/core';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Optional, Inject, Injectable, input, output, ChangeDetectionStrategy, Component, Input, InjectionToken, isDevMode, EventEmitter, HostListener, ViewChild, Output, ChangeDetectorRef, DestroyRef, PLATFORM_ID, effect, ContentChildren, signal, computed, Directive, ENVIRONMENT_INITIALIZER } from '@angular/core';
4
4
  import { BehaviorSubject, firstValueFrom, debounceTime, fromEvent, of } from 'rxjs';
@@ -1834,76 +1834,69 @@ class ManualFieldToolbarComponent {
1834
1834
  <button
1835
1835
  #firstAction
1836
1836
  type="button"
1837
+ [praxisIconButton]="'mso:star'"
1838
+ size="dense"
1839
+ [pressed]="isRequired"
1837
1840
  class="toolbar-btn"
1838
- [attr.aria-pressed]="isRequired ? 'true' : 'false'"
1839
1841
  aria-label="Alternar obrigatorio"
1840
1842
  title="Alternar obrigatorio"
1841
1843
  (click)="toggleRequired.emit()"
1842
- >
1843
- <span class="material-symbols-outlined toolbar-icon" [class.toolbar-icon--filled]="isRequired">
1844
- star
1845
- </span>
1846
- </button>
1844
+ ></button>
1847
1845
  <button
1848
1846
  type="button"
1847
+ [praxisIconButton]="isReadOnly ? 'mso:lock' : 'mso:lock_open'"
1848
+ size="dense"
1849
+ [pressed]="isReadOnly"
1849
1850
  class="toolbar-btn"
1850
- [attr.aria-pressed]="isReadOnly ? 'true' : 'false'"
1851
1851
  aria-label="Alternar somente leitura"
1852
1852
  title="Alternar somente leitura"
1853
1853
  (click)="toggleReadonly.emit()"
1854
- >
1855
- <span class="material-symbols-outlined">
1856
- {{ isReadOnly ? 'lock' : 'lock_open' }}
1857
- </span>
1858
- </button>
1854
+ ></button>
1859
1855
  <button
1860
1856
  type="button"
1857
+ [praxisIconButton]="metadata?.hidden ? 'mso:visibility_off' : 'mso:visibility'"
1858
+ size="dense"
1859
+ [pressed]="metadata?.hidden === true"
1861
1860
  class="toolbar-btn"
1862
- [attr.aria-pressed]="metadata?.hidden ? 'true' : 'false'"
1863
1861
  aria-label="Alternar visibilidade"
1864
1862
  title="Alternar visibilidade"
1865
1863
  (click)="toggleHidden.emit()"
1866
- >
1867
- <span class="material-symbols-outlined">
1868
- {{ metadata?.hidden ? 'visibility_off' : 'visibility' }}
1869
- </span>
1870
- </button>
1864
+ ></button>
1871
1865
  <button
1872
1866
  type="button"
1867
+ [praxisIconButton]="metadata?.disabled ? 'mso:toggle_on' : 'mso:toggle_off'"
1868
+ size="dense"
1869
+ [pressed]="metadata?.disabled === true"
1873
1870
  class="toolbar-btn"
1874
- [attr.aria-pressed]="metadata?.disabled ? 'true' : 'false'"
1875
1871
  aria-label="Alternar desabilitado"
1876
1872
  title="Alternar desabilitado"
1877
1873
  (click)="toggleDisabled.emit()"
1878
- >
1879
- <span class="material-symbols-outlined">
1880
- {{ metadata?.disabled ? 'toggle_on' : 'toggle_off' }}
1881
- </span>
1882
- </button>
1874
+ ></button>
1883
1875
  <button
1884
1876
  type="button"
1877
+ [praxisIconButton]="'mso:tune'"
1878
+ size="dense"
1879
+ appearance="filled"
1885
1880
  class="toolbar-btn toolbar-btn--accent"
1886
1881
  aria-label="Configurar campo"
1887
1882
  title="Configurar campo"
1888
1883
  (click)="openEditor.emit()"
1889
- >
1890
- <span class="material-symbols-outlined">tune</span>
1891
- </button>
1884
+ ></button>
1892
1885
  <button
1893
1886
  type="button"
1887
+ [praxisIconButton]="'mso:close'"
1888
+ size="dense"
1894
1889
  class="toolbar-btn toolbar-btn--ghost"
1895
1890
  aria-label="Fechar"
1896
1891
  title="Fechar"
1897
1892
  (click)="requestClose.emit()"
1898
- >
1899
- <span class="material-symbols-outlined">close</span>
1900
- </button>
1893
+ ></button>
1901
1894
  </div>
1902
- `, isInline: true, styles: [":host{display:block;pointer-events:auto;font-family:inherit}.pdx-manual-field-toolbar{display:inline-flex;align-items:center;gap:6px;padding:6px;border-radius:12px;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);box-shadow:var(--md-sys-elevation-level3);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.toolbar-btn{appearance:none;border:0;background:transparent;color:var(--md-sys-color-on-surface);display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:10px;cursor:pointer;transition:background-color .12s ease,transform .12s ease}.toolbar-btn:hover{background:var(--md-sys-color-primary-container)}.toolbar-btn:active{transform:scale(.97)}.toolbar-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toolbar-btn--accent{background:var(--md-sys-color-primary-container)}.toolbar-btn--ghost{opacity:.7}.material-symbols-outlined{font-size:18px;line-height:18px}.toolbar-icon{font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 20}.toolbar-icon--filled{font-variation-settings:\"FILL\" 1,\"wght\" 600,\"GRAD\" 0,\"opsz\" 20}\n"] });
1895
+ `, isInline: true, styles: [":host{display:block;pointer-events:auto;font-family:inherit}.pdx-manual-field-toolbar{display:inline-flex;align-items:center;gap:6px;padding:6px;border-radius:12px;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);box-shadow:var(--md-sys-elevation-level3);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.toolbar-btn{color:var(--md-sys-color-on-surface)}.toolbar-btn--accent{--praxis-icon-button-filled-background: var(--md-sys-color-primary-container);--praxis-icon-button-filled-foreground: var(--md-sys-color-on-primary-container)}.toolbar-btn--ghost{opacity:.7}\n"], dependencies: [{ kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }] });
1903
1896
  }
1904
1897
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ManualFieldToolbarComponent, decorators: [{
1905
1898
  type: Component,
1906
- args: [{ selector: 'praxis-manual-field-toolbar', standalone: true, imports: [], template: `
1899
+ args: [{ selector: 'praxis-manual-field-toolbar', standalone: true, imports: [PraxisIconButtonComponent], template: `
1907
1900
  <div
1908
1901
  class="pdx-manual-field-toolbar"
1909
1902
  role="toolbar"
@@ -1912,72 +1905,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1912
1905
  <button
1913
1906
  #firstAction
1914
1907
  type="button"
1908
+ [praxisIconButton]="'mso:star'"
1909
+ size="dense"
1910
+ [pressed]="isRequired"
1915
1911
  class="toolbar-btn"
1916
- [attr.aria-pressed]="isRequired ? 'true' : 'false'"
1917
1912
  aria-label="Alternar obrigatorio"
1918
1913
  title="Alternar obrigatorio"
1919
1914
  (click)="toggleRequired.emit()"
1920
- >
1921
- <span class="material-symbols-outlined toolbar-icon" [class.toolbar-icon--filled]="isRequired">
1922
- star
1923
- </span>
1924
- </button>
1915
+ ></button>
1925
1916
  <button
1926
1917
  type="button"
1918
+ [praxisIconButton]="isReadOnly ? 'mso:lock' : 'mso:lock_open'"
1919
+ size="dense"
1920
+ [pressed]="isReadOnly"
1927
1921
  class="toolbar-btn"
1928
- [attr.aria-pressed]="isReadOnly ? 'true' : 'false'"
1929
1922
  aria-label="Alternar somente leitura"
1930
1923
  title="Alternar somente leitura"
1931
1924
  (click)="toggleReadonly.emit()"
1932
- >
1933
- <span class="material-symbols-outlined">
1934
- {{ isReadOnly ? 'lock' : 'lock_open' }}
1935
- </span>
1936
- </button>
1925
+ ></button>
1937
1926
  <button
1938
1927
  type="button"
1928
+ [praxisIconButton]="metadata?.hidden ? 'mso:visibility_off' : 'mso:visibility'"
1929
+ size="dense"
1930
+ [pressed]="metadata?.hidden === true"
1939
1931
  class="toolbar-btn"
1940
- [attr.aria-pressed]="metadata?.hidden ? 'true' : 'false'"
1941
1932
  aria-label="Alternar visibilidade"
1942
1933
  title="Alternar visibilidade"
1943
1934
  (click)="toggleHidden.emit()"
1944
- >
1945
- <span class="material-symbols-outlined">
1946
- {{ metadata?.hidden ? 'visibility_off' : 'visibility' }}
1947
- </span>
1948
- </button>
1935
+ ></button>
1949
1936
  <button
1950
1937
  type="button"
1938
+ [praxisIconButton]="metadata?.disabled ? 'mso:toggle_on' : 'mso:toggle_off'"
1939
+ size="dense"
1940
+ [pressed]="metadata?.disabled === true"
1951
1941
  class="toolbar-btn"
1952
- [attr.aria-pressed]="metadata?.disabled ? 'true' : 'false'"
1953
1942
  aria-label="Alternar desabilitado"
1954
1943
  title="Alternar desabilitado"
1955
1944
  (click)="toggleDisabled.emit()"
1956
- >
1957
- <span class="material-symbols-outlined">
1958
- {{ metadata?.disabled ? 'toggle_on' : 'toggle_off' }}
1959
- </span>
1960
- </button>
1945
+ ></button>
1961
1946
  <button
1962
1947
  type="button"
1948
+ [praxisIconButton]="'mso:tune'"
1949
+ size="dense"
1950
+ appearance="filled"
1963
1951
  class="toolbar-btn toolbar-btn--accent"
1964
1952
  aria-label="Configurar campo"
1965
1953
  title="Configurar campo"
1966
1954
  (click)="openEditor.emit()"
1967
- >
1968
- <span class="material-symbols-outlined">tune</span>
1969
- </button>
1955
+ ></button>
1970
1956
  <button
1971
1957
  type="button"
1958
+ [praxisIconButton]="'mso:close'"
1959
+ size="dense"
1972
1960
  class="toolbar-btn toolbar-btn--ghost"
1973
1961
  aria-label="Fechar"
1974
1962
  title="Fechar"
1975
1963
  (click)="requestClose.emit()"
1976
- >
1977
- <span class="material-symbols-outlined">close</span>
1978
- </button>
1964
+ ></button>
1979
1965
  </div>
1980
- `, styles: [":host{display:block;pointer-events:auto;font-family:inherit}.pdx-manual-field-toolbar{display:inline-flex;align-items:center;gap:6px;padding:6px;border-radius:12px;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);box-shadow:var(--md-sys-elevation-level3);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.toolbar-btn{appearance:none;border:0;background:transparent;color:var(--md-sys-color-on-surface);display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:10px;cursor:pointer;transition:background-color .12s ease,transform .12s ease}.toolbar-btn:hover{background:var(--md-sys-color-primary-container)}.toolbar-btn:active{transform:scale(.97)}.toolbar-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toolbar-btn--accent{background:var(--md-sys-color-primary-container)}.toolbar-btn--ghost{opacity:.7}.material-symbols-outlined{font-size:18px;line-height:18px}.toolbar-icon{font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 20}.toolbar-icon--filled{font-variation-settings:\"FILL\" 1,\"wght\" 600,\"GRAD\" 0,\"opsz\" 20}\n"] }]
1966
+ `, styles: [":host{display:block;pointer-events:auto;font-family:inherit}.pdx-manual-field-toolbar{display:inline-flex;align-items:center;gap:6px;padding:6px;border-radius:12px;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);box-shadow:var(--md-sys-elevation-level3);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.toolbar-btn{color:var(--md-sys-color-on-surface)}.toolbar-btn--accent{--praxis-icon-button-filled-background: var(--md-sys-color-primary-container);--praxis-icon-button-filled-foreground: var(--md-sys-color-on-primary-container)}.toolbar-btn--ghost{opacity:.7}\n"] }]
1981
1967
  }], propDecorators: { metadata: [{
1982
1968
  type: Input
1983
1969
  }], toggleRequired: [{
@@ -3373,6 +3359,7 @@ const MANUAL_FORM_EN_US = {
3373
3359
  'praxis.manualForm.editor.actions.customTitle': 'Custom actions',
3374
3360
  'praxis.manualForm.editor.actions.customHelp': 'Create extra buttons with their own event.',
3375
3361
  'praxis.manualForm.editor.actions.addCustom': 'Add action',
3362
+ 'praxis.manualForm.editor.actions.removeCustom': 'Remove action',
3376
3363
  'praxis.manualForm.editor.actions.emptyCustom': 'No custom actions registered.',
3377
3364
  'praxis.manualForm.editor.actions.field.visible': 'Visible',
3378
3365
  'praxis.manualForm.editor.actions.field.label': 'Label',
@@ -3512,6 +3499,7 @@ const MANUAL_FORM_PT_BR = {
3512
3499
  'praxis.manualForm.editor.actions.customTitle': 'Ações customizadas',
3513
3500
  'praxis.manualForm.editor.actions.customHelp': 'Crie botões extras com eventos próprios.',
3514
3501
  'praxis.manualForm.editor.actions.addCustom': 'Adicionar ação',
3502
+ 'praxis.manualForm.editor.actions.removeCustom': 'Remover ação',
3515
3503
  'praxis.manualForm.editor.actions.emptyCustom': 'Nenhuma ação customizada cadastrada.',
3516
3504
  'praxis.manualForm.editor.actions.field.visible': 'Visível',
3517
3505
  'praxis.manualForm.editor.actions.field.label': 'Rótulo (Label)',
@@ -4260,9 +4248,13 @@ class ManualFormConfigEditorComponent {
4260
4248
  <div class="mf-custom-card">
4261
4249
  <div class="mf-custom-card__header">
4262
4250
  <div class="mf-custom-card__title">{{ action.label || action.id }}</div>
4263
- <button mat-icon-button type="button" (click)="removeCustomAction(action)">
4264
- <mat-icon>delete</mat-icon>
4265
- </button>
4251
+ <button
4252
+ praxisIconButton="delete"
4253
+ size="dense"
4254
+ type="button"
4255
+ (click)="removeCustomAction(action)"
4256
+ [attr.aria-label]="tx('editor.actions.removeCustom', 'Remove action') + ': ' + (action.label || action.id)"
4257
+ ></button>
4266
4258
  </div>
4267
4259
  <div class="mf-custom-card__grid">
4268
4260
  <mat-form-field appearance="outline">
@@ -4708,15 +4700,14 @@ class ManualFormConfigEditorComponent {
4708
4700
  [placeholder]="hookPlaceholder()"
4709
4701
  ></textarea>
4710
4702
  <button
4711
- mat-icon-button
4703
+ praxisIconButton="help_outline"
4704
+ size="dense"
4712
4705
  matSuffix
4713
- class="help-icon-button"
4714
4706
  type="button"
4715
4707
  [matTooltip]="hookTooltip(stage)"
4708
+ [attr.aria-label]="hookTooltip(stage)"
4716
4709
  matTooltipPosition="above"
4717
- >
4718
- <mat-icon>help_outline</mat-icon>
4719
- </button>
4710
+ ></button>
4720
4711
  @if (hooksErrors[stage]) {
4721
4712
  <mat-error>{{ hooksErrors[stage] }}</mat-error>
4722
4713
  }
@@ -4752,15 +4743,14 @@ class ManualFormConfigEditorComponent {
4752
4743
  [placeholder]="formRulesPlaceholder()"
4753
4744
  ></textarea>
4754
4745
  <button
4755
- mat-icon-button
4746
+ praxisIconButton="help_outline"
4747
+ size="dense"
4756
4748
  matSuffix
4757
- class="help-icon-button"
4758
4749
  type="button"
4759
4750
  [matTooltip]="tx('editor.rules.tooltip', 'JSON array with rules (id, targetType, targets, effect).')"
4751
+ [attr.aria-label]="tx('editor.rules.tooltip', 'JSON array with rules (id, targetType, targets, effect).')"
4760
4752
  matTooltipPosition="above"
4761
- >
4762
- <mat-icon>help_outline</mat-icon>
4763
- </button>
4753
+ ></button>
4764
4754
  @if (formRulesError) {
4765
4755
  <mat-error>{{ formRulesError }}</mat-error>
4766
4756
  }
@@ -4778,15 +4768,14 @@ class ManualFormConfigEditorComponent {
4778
4768
  ></textarea>
4779
4769
  <mat-hint>{{ tx('editor.rules.formRulesStateReadonlyHint', 'Generated by the visual editor for round-trip; edit formRules instead.') }}</mat-hint>
4780
4770
  <button
4781
- mat-icon-button
4771
+ praxisIconButton="help_outline"
4772
+ size="dense"
4782
4773
  matSuffix
4783
- class="help-icon-button"
4784
4774
  type="button"
4785
4775
  [matTooltip]="tx('editor.rules.stateTooltip', 'Raw state from the visual editor (optional).')"
4776
+ [attr.aria-label]="tx('editor.rules.stateTooltip', 'Raw state from the visual editor (optional).')"
4786
4777
  matTooltipPosition="above"
4787
- >
4788
- <mat-icon>help_outline</mat-icon>
4789
- </button>
4778
+ ></button>
4790
4779
  @if (formRulesStateError) {
4791
4780
  <mat-error>{{ formRulesStateError }}</mat-error>
4792
4781
  }
@@ -4819,7 +4808,7 @@ class ManualFormConfigEditorComponent {
4819
4808
  </mat-tab>
4820
4809
  </mat-tab-group>
4821
4810
  </div>
4822
- `, isInline: true, styles: [".mf-editor{display:grid;gap:16px;padding:16px;color:var(--md-sys-color-on-surface)}.mf-editor__toolbar{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:12px;background:var(--md-sys-color-surface-container)}.mf-editor__title{display:flex;flex-direction:column;gap:2px;font-weight:600}.mf-editor__subtitle{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.mf-editor__toolbar .spacer{flex:1}.mf-tabs{min-height:420px}.mf-tab{display:grid;gap:16px;padding:14px 6px 0}.mf-editor__list{display:grid;gap:8px;overflow-x:auto}.mf-editor__row{display:grid;grid-template-columns:2.2fr 2fr 1fr repeat(4,minmax(90px,.8fr));align-items:center;gap:8px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);min-width:720px}.mf-editor__row--head{font-weight:600;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface-container)}.mf-editor__filter{display:inline-flex;align-items:center;gap:8px;font-weight:500}.mf-editor__filter input{accent-color:var(--md-sys-color-primary)}.col code{display:inline-block;font-family:inherit;font-size:.85rem;padding:2px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.mf-btn{min-height:36px;padding:0 12px;border-radius:8px;border:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.mf-btn:hover{background:var(--md-sys-color-surface-container)}.mf-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toggle{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant)}.mf-section{display:grid;gap:12px;padding:16px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface)}.mf-section--full{padding:10px}.mf-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.mf-section__header h3{margin:0;font-size:1.05rem;font-weight:600}.mf-help{margin:6px 0 0;font-size:.9rem;color:var(--md-sys-color-on-surface-variant)}.mf-note{padding:10px 12px;border-radius:10px;border:1px dashed var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface-variant);font-size:.9rem}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}.mf-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-action-card,.mf-custom-card,.mf-custom-message-card{display:grid;gap:10px;padding:14px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high)}.mf-action-card__title,.mf-custom-card__title{font-weight:600;color:var(--md-sys-color-on-surface)}.mf-actions-layout{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-toggle-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;align-items:start}.mf-hooks-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.mf-hook-field textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem}.mf-actions-row{display:inline-flex;gap:8px;align-items:center}.mf-actions-row--end{justify-content:flex-end;width:100%}.mf-custom-actions,.mf-custom-messages{display:grid;gap:12px}.mf-custom-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.mf-custom-card__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-messages-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-empty{margin:0;color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: CascadeManagerTabComponent, selector: "praxis-cascade-manager-tab", inputs: ["fields", "connections"], outputs: ["apply", "cancel"] }] });
4811
+ `, isInline: true, styles: [".mf-editor{display:grid;gap:16px;padding:16px;color:var(--md-sys-color-on-surface)}.mf-editor__toolbar{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:12px;background:var(--md-sys-color-surface-container)}.mf-editor__title{display:flex;flex-direction:column;gap:2px;font-weight:600}.mf-editor__subtitle{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.mf-editor__toolbar .spacer{flex:1}.mf-tabs{min-height:420px}.mf-tab{display:grid;gap:16px;padding:14px 6px 0}.mf-editor__list{display:grid;gap:8px;overflow-x:auto}.mf-editor__row{display:grid;grid-template-columns:2.2fr 2fr 1fr repeat(4,minmax(90px,.8fr));align-items:center;gap:8px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);min-width:720px}.mf-editor__row--head{font-weight:600;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface-container)}.mf-editor__filter{display:inline-flex;align-items:center;gap:8px;font-weight:500}.mf-editor__filter input{accent-color:var(--md-sys-color-primary)}.col code{display:inline-block;font-family:inherit;font-size:.85rem;padding:2px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.mf-btn{min-height:36px;padding:0 12px;border-radius:8px;border:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.mf-btn:hover{background:var(--md-sys-color-surface-container)}.mf-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toggle{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant)}.mf-section{display:grid;gap:12px;padding:16px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface)}.mf-section--full{padding:10px}.mf-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.mf-section__header h3{margin:0;font-size:1.05rem;font-weight:600}.mf-help{margin:6px 0 0;font-size:.9rem;color:var(--md-sys-color-on-surface-variant)}.mf-note{padding:10px 12px;border-radius:10px;border:1px dashed var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface-variant);font-size:.9rem}.mf-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-action-card,.mf-custom-card,.mf-custom-message-card{display:grid;gap:10px;padding:14px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high)}.mf-action-card__title,.mf-custom-card__title{font-weight:600;color:var(--md-sys-color-on-surface)}.mf-actions-layout{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-toggle-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;align-items:start}.mf-hooks-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.mf-hook-field textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem}.mf-actions-row{display:inline-flex;gap:8px;align-items:center}.mf-actions-row--end{justify-content:flex-end;width:100%}.mf-custom-actions,.mf-custom-messages{display:grid;gap:12px}.mf-custom-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.mf-custom-card__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-messages-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-empty{margin:0;color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "component", type: CascadeManagerTabComponent, selector: "praxis-cascade-manager-tab", inputs: ["fields", "connections"], outputs: ["apply", "cancel"] }] });
4823
4812
  }
4824
4813
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ManualFormConfigEditorComponent, decorators: [{
4825
4814
  type: Component,
@@ -4833,6 +4822,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4833
4822
  MatButtonModule,
4834
4823
  MatIconModule,
4835
4824
  MatTooltipModule,
4825
+ PraxisIconButtonComponent,
4836
4826
  CascadeManagerTabComponent
4837
4827
  ], providers: [providePraxisManualFormI18n()], template: `
4838
4828
  <div class="mf-editor">
@@ -5057,9 +5047,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5057
5047
  <div class="mf-custom-card">
5058
5048
  <div class="mf-custom-card__header">
5059
5049
  <div class="mf-custom-card__title">{{ action.label || action.id }}</div>
5060
- <button mat-icon-button type="button" (click)="removeCustomAction(action)">
5061
- <mat-icon>delete</mat-icon>
5062
- </button>
5050
+ <button
5051
+ praxisIconButton="delete"
5052
+ size="dense"
5053
+ type="button"
5054
+ (click)="removeCustomAction(action)"
5055
+ [attr.aria-label]="tx('editor.actions.removeCustom', 'Remove action') + ': ' + (action.label || action.id)"
5056
+ ></button>
5063
5057
  </div>
5064
5058
  <div class="mf-custom-card__grid">
5065
5059
  <mat-form-field appearance="outline">
@@ -5505,15 +5499,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5505
5499
  [placeholder]="hookPlaceholder()"
5506
5500
  ></textarea>
5507
5501
  <button
5508
- mat-icon-button
5502
+ praxisIconButton="help_outline"
5503
+ size="dense"
5509
5504
  matSuffix
5510
- class="help-icon-button"
5511
5505
  type="button"
5512
5506
  [matTooltip]="hookTooltip(stage)"
5507
+ [attr.aria-label]="hookTooltip(stage)"
5513
5508
  matTooltipPosition="above"
5514
- >
5515
- <mat-icon>help_outline</mat-icon>
5516
- </button>
5509
+ ></button>
5517
5510
  @if (hooksErrors[stage]) {
5518
5511
  <mat-error>{{ hooksErrors[stage] }}</mat-error>
5519
5512
  }
@@ -5549,15 +5542,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5549
5542
  [placeholder]="formRulesPlaceholder()"
5550
5543
  ></textarea>
5551
5544
  <button
5552
- mat-icon-button
5545
+ praxisIconButton="help_outline"
5546
+ size="dense"
5553
5547
  matSuffix
5554
- class="help-icon-button"
5555
5548
  type="button"
5556
5549
  [matTooltip]="tx('editor.rules.tooltip', 'JSON array with rules (id, targetType, targets, effect).')"
5550
+ [attr.aria-label]="tx('editor.rules.tooltip', 'JSON array with rules (id, targetType, targets, effect).')"
5557
5551
  matTooltipPosition="above"
5558
- >
5559
- <mat-icon>help_outline</mat-icon>
5560
- </button>
5552
+ ></button>
5561
5553
  @if (formRulesError) {
5562
5554
  <mat-error>{{ formRulesError }}</mat-error>
5563
5555
  }
@@ -5575,15 +5567,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5575
5567
  ></textarea>
5576
5568
  <mat-hint>{{ tx('editor.rules.formRulesStateReadonlyHint', 'Generated by the visual editor for round-trip; edit formRules instead.') }}</mat-hint>
5577
5569
  <button
5578
- mat-icon-button
5570
+ praxisIconButton="help_outline"
5571
+ size="dense"
5579
5572
  matSuffix
5580
- class="help-icon-button"
5581
5573
  type="button"
5582
5574
  [matTooltip]="tx('editor.rules.stateTooltip', 'Raw state from the visual editor (optional).')"
5575
+ [attr.aria-label]="tx('editor.rules.stateTooltip', 'Raw state from the visual editor (optional).')"
5583
5576
  matTooltipPosition="above"
5584
- >
5585
- <mat-icon>help_outline</mat-icon>
5586
- </button>
5577
+ ></button>
5587
5578
  @if (formRulesStateError) {
5588
5579
  <mat-error>{{ formRulesStateError }}</mat-error>
5589
5580
  }
@@ -5616,7 +5607,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5616
5607
  </mat-tab>
5617
5608
  </mat-tab-group>
5618
5609
  </div>
5619
- `, styles: [".mf-editor{display:grid;gap:16px;padding:16px;color:var(--md-sys-color-on-surface)}.mf-editor__toolbar{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:12px;background:var(--md-sys-color-surface-container)}.mf-editor__title{display:flex;flex-direction:column;gap:2px;font-weight:600}.mf-editor__subtitle{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.mf-editor__toolbar .spacer{flex:1}.mf-tabs{min-height:420px}.mf-tab{display:grid;gap:16px;padding:14px 6px 0}.mf-editor__list{display:grid;gap:8px;overflow-x:auto}.mf-editor__row{display:grid;grid-template-columns:2.2fr 2fr 1fr repeat(4,minmax(90px,.8fr));align-items:center;gap:8px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);min-width:720px}.mf-editor__row--head{font-weight:600;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface-container)}.mf-editor__filter{display:inline-flex;align-items:center;gap:8px;font-weight:500}.mf-editor__filter input{accent-color:var(--md-sys-color-primary)}.col code{display:inline-block;font-family:inherit;font-size:.85rem;padding:2px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.mf-btn{min-height:36px;padding:0 12px;border-radius:8px;border:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.mf-btn:hover{background:var(--md-sys-color-surface-container)}.mf-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toggle{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant)}.mf-section{display:grid;gap:12px;padding:16px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface)}.mf-section--full{padding:10px}.mf-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.mf-section__header h3{margin:0;font-size:1.05rem;font-weight:600}.mf-help{margin:6px 0 0;font-size:.9rem;color:var(--md-sys-color-on-surface-variant)}.mf-note{padding:10px 12px;border-radius:10px;border:1px dashed var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface-variant);font-size:.9rem}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}.mf-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-action-card,.mf-custom-card,.mf-custom-message-card{display:grid;gap:10px;padding:14px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high)}.mf-action-card__title,.mf-custom-card__title{font-weight:600;color:var(--md-sys-color-on-surface)}.mf-actions-layout{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-toggle-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;align-items:start}.mf-hooks-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.mf-hook-field textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem}.mf-actions-row{display:inline-flex;gap:8px;align-items:center}.mf-actions-row--end{justify-content:flex-end;width:100%}.mf-custom-actions,.mf-custom-messages{display:grid;gap:12px}.mf-custom-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.mf-custom-card__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-messages-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-empty{margin:0;color:var(--md-sys-color-on-surface-variant)}\n"] }]
5610
+ `, styles: [".mf-editor{display:grid;gap:16px;padding:16px;color:var(--md-sys-color-on-surface)}.mf-editor__toolbar{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:12px;background:var(--md-sys-color-surface-container)}.mf-editor__title{display:flex;flex-direction:column;gap:2px;font-weight:600}.mf-editor__subtitle{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.mf-editor__toolbar .spacer{flex:1}.mf-tabs{min-height:420px}.mf-tab{display:grid;gap:16px;padding:14px 6px 0}.mf-editor__list{display:grid;gap:8px;overflow-x:auto}.mf-editor__row{display:grid;grid-template-columns:2.2fr 2fr 1fr repeat(4,minmax(90px,.8fr));align-items:center;gap:8px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);min-width:720px}.mf-editor__row--head{font-weight:600;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface-container)}.mf-editor__filter{display:inline-flex;align-items:center;gap:8px;font-weight:500}.mf-editor__filter input{accent-color:var(--md-sys-color-primary)}.col code{display:inline-block;font-family:inherit;font-size:.85rem;padding:2px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.mf-btn{min-height:36px;padding:0 12px;border-radius:8px;border:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.mf-btn:hover{background:var(--md-sys-color-surface-container)}.mf-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.toggle{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant)}.mf-section{display:grid;gap:12px;padding:16px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface)}.mf-section--full{padding:10px}.mf-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.mf-section__header h3{margin:0;font-size:1.05rem;font-weight:600}.mf-help{margin:6px 0 0;font-size:.9rem;color:var(--md-sys-color-on-surface-variant)}.mf-note{padding:10px 12px;border-radius:10px;border:1px dashed var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface-variant);font-size:.9rem}.mf-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-action-card,.mf-custom-card,.mf-custom-message-card{display:grid;gap:10px;padding:14px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high)}.mf-action-card__title,.mf-custom-card__title{font-weight:600;color:var(--md-sys-color-on-surface)}.mf-actions-layout{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-toggle-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;align-items:start}.mf-hooks-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.mf-hook-field textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem}.mf-actions-row{display:inline-flex;gap:8px;align-items:center}.mf-actions-row--end{justify-content:flex-end;width:100%}.mf-custom-actions,.mf-custom-messages{display:grid;gap:12px}.mf-custom-card__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.mf-custom-card__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;align-items:center}.mf-messages-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.mf-empty{margin:0;color:var(--md-sys-color-on-surface-variant)}\n"] }]
5620
5611
  }], ctorParameters: () => [{ type: undefined, decorators: [{
5621
5612
  type: Inject,
5622
5613
  args: [SETTINGS_PANEL_DATA]
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@praxisui/manual-form",
3
- "version": "9.0.0-beta.85",
3
+ "version": "9.0.0-beta.88",
4
4
  "description": "Manual form toolkit for Praxis UI: container, instance factory and editor bridge for @praxisui/* fields.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/core": "^9.0.0-beta.85",
9
- "@praxisui/dynamic-fields": "^9.0.0-beta.85",
10
- "@praxisui/settings-panel": "^9.0.0-beta.85",
11
- "@praxisui/metadata-editor": "^9.0.0-beta.85",
8
+ "@praxisui/core": "^9.0.0-beta.88",
9
+ "@praxisui/dynamic-fields": "^9.0.0-beta.88",
10
+ "@praxisui/settings-panel": "^9.0.0-beta.88",
11
+ "@praxisui/metadata-editor": "^9.0.0-beta.88",
12
12
  "@angular/cdk": "^21.0.0",
13
13
  "@angular/forms": "^21.0.0",
14
14
  "@angular/material": "^21.0.0",
15
15
  "@angular/router": "^21.0.0",
16
- "@praxisui/ai": "^9.0.0-beta.85",
16
+ "@praxisui/ai": "^9.0.0-beta.88",
17
17
  "rxjs": "~7.8.0"
18
18
  },
19
19
  "dependencies": {