@praxisui/metadata-editor 9.0.0-beta.70 → 9.0.0-beta.72

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-10T23:38:40.443Z",
3
+ "generatedAt": "2026-07-12T00:55:35.176Z",
4
4
  "packageName": "@praxisui/metadata-editor",
5
- "packageVersion": "9.0.0-beta.70",
5
+ "packageVersion": "9.0.0-beta.72",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -14,24 +14,32 @@
14
14
  {
15
15
  "name": "controlType",
16
16
  "type": "FieldControlType",
17
- "required": false
17
+ "required": false,
18
+ "description": "Tipo de controle do campo alvo.",
19
+ "label": "Tipo de controle"
18
20
  },
19
21
  {
20
22
  "name": "seed",
21
23
  "type": "Partial<FieldDefinition>",
22
- "required": false
24
+ "required": false,
25
+ "description": "Valores iniciais do FieldDefinition para hidratar o editor.",
26
+ "label": "Seed"
23
27
  }
24
28
  ],
25
29
  "outputs": [
26
30
  {
27
31
  "name": "applied",
28
32
  "type": "Partial<FieldDefinition>",
29
- "required": false
33
+ "required": false,
34
+ "description": "Disparado quando o patch de metadata e aplicado.",
35
+ "label": "Aplicado"
30
36
  },
31
37
  {
32
38
  "name": "cancel",
33
39
  "type": "void",
34
- "required": false
40
+ "required": false,
41
+ "description": "Disparado quando o usuario cancela a edicao.",
42
+ "label": "Cancelar"
35
43
  }
36
44
  ],
37
45
  "configSchemaId": null,
@@ -109,6 +117,11 @@
109
117
  "resolver": "field-metadata-validation-rules",
110
118
  "description": "Field validation rules and contextual validators."
111
119
  },
120
+ {
121
+ "kind": "dateRangeShortcuts",
122
+ "resolver": "metadata-editor-date-range-shortcut-catalog",
123
+ "description": "Governed static date range shortcut catalog for dateRange and inlineDateRange metadata."
124
+ },
112
125
  {
113
126
  "kind": "contextHint",
114
127
  "resolver": "metadata-editor-context-hints",
@@ -927,6 +940,176 @@
927
940
  "field-metadata-loaded"
928
941
  ]
929
942
  },
943
+ {
944
+ "operationId": "dateRangeShortcuts.configure",
945
+ "title": "Configure governed date range shortcuts",
946
+ "scope": "fieldMetadataPath",
947
+ "targetKind": "dateRangeShortcuts",
948
+ "target": {
949
+ "kind": "dateRangeShortcuts",
950
+ "resolver": "metadata-editor-date-range-shortcut-catalog",
951
+ "ambiguityPolicy": "fail",
952
+ "required": false
953
+ },
954
+ "inputSchema": {
955
+ "type": "object",
956
+ "required": [
957
+ "shortcuts"
958
+ ],
959
+ "properties": {
960
+ "shortcuts": {
961
+ "type": "array",
962
+ "items": {
963
+ "anyOf": [
964
+ {
965
+ "enum": [
966
+ "today",
967
+ "yesterday",
968
+ "thisWeek",
969
+ "lastWeek",
970
+ "thisMonth",
971
+ "lastMonth",
972
+ "thisYear",
973
+ "lastYear"
974
+ ]
975
+ },
976
+ {
977
+ "type": "object",
978
+ "required": [
979
+ "id",
980
+ "label",
981
+ "startDate",
982
+ "endDate"
983
+ ],
984
+ "additionalProperties": false,
985
+ "properties": {
986
+ "id": {
987
+ "type": "string",
988
+ "minLength": 1
989
+ },
990
+ "label": {
991
+ "type": "string",
992
+ "minLength": 1
993
+ },
994
+ "startDate": {
995
+ "type": "string",
996
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
997
+ },
998
+ "endDate": {
999
+ "type": "string",
1000
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
1001
+ },
1002
+ "timeZone": {
1003
+ "type": "string"
1004
+ },
1005
+ "icon": {
1006
+ "type": "string"
1007
+ },
1008
+ "description": {
1009
+ "type": "string"
1010
+ },
1011
+ "tone": {
1012
+ "enum": [
1013
+ "neutral",
1014
+ "info",
1015
+ "success",
1016
+ "warning"
1017
+ ]
1018
+ },
1019
+ "effectiveFrom": {
1020
+ "type": "string",
1021
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
1022
+ },
1023
+ "effectiveTo": {
1024
+ "type": "string",
1025
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
1026
+ },
1027
+ "order": {
1028
+ "type": "number"
1029
+ }
1030
+ }
1031
+ }
1032
+ ]
1033
+ }
1034
+ },
1035
+ "inlineQuickPresets": {
1036
+ "type": "object",
1037
+ "properties": {
1038
+ "enabled": {
1039
+ "type": "boolean"
1040
+ },
1041
+ "maxVisible": {
1042
+ "type": "number"
1043
+ },
1044
+ "position": {
1045
+ "enum": [
1046
+ "auto",
1047
+ "footer",
1048
+ "start",
1049
+ "end"
1050
+ ]
1051
+ }
1052
+ }
1053
+ },
1054
+ "applyMode": {
1055
+ "enum": [
1056
+ "auto",
1057
+ "explicit"
1058
+ ]
1059
+ }
1060
+ }
1061
+ },
1062
+ "effects": [
1063
+ {
1064
+ "kind": "compile-domain-patch",
1065
+ "handler": "metadata-date-range-shortcuts-configure",
1066
+ "handlerContract": {
1067
+ "reads": [
1068
+ "fieldMetadata.controlType",
1069
+ "fieldMetadata.shortcuts",
1070
+ "fieldMetadata.inlineQuickPresets",
1071
+ "fieldMetadata.inlineOverlay",
1072
+ "ConfigRegistryService"
1073
+ ],
1074
+ "writes": [
1075
+ "fieldMetadata.shortcuts",
1076
+ "fieldMetadata.inlineQuickPresets",
1077
+ "fieldMetadata.inlineOverlay.applyMode"
1078
+ ],
1079
+ "identityKeys": [
1080
+ "field.name",
1081
+ "shortcuts[].id"
1082
+ ],
1083
+ "failureModes": [
1084
+ "control-type-not-date-range",
1085
+ "duplicate-shortcut-id",
1086
+ "invalid-static-date-range-shortcut",
1087
+ "unsupported-shortcut-tone",
1088
+ "executable-shortcut-metadata"
1089
+ ],
1090
+ "description": "Configures built-in and backend-resolved static date range shortcuts through the canonical shortcuts array; JSON metadata may not contain calculateRange or executable expressions."
1091
+ }
1092
+ }
1093
+ ],
1094
+ "destructive": false,
1095
+ "requiresConfirmation": false,
1096
+ "validators": [
1097
+ "date-range-shortcuts-static-canonical",
1098
+ "date-range-shortcuts-no-executable-metadata",
1099
+ "date-range-shortcuts-unique-ids",
1100
+ "metadata-round-trip"
1101
+ ],
1102
+ "affectedPaths": [
1103
+ "fieldMetadata.shortcuts",
1104
+ "fieldMetadata.inlineQuickPresets",
1105
+ "fieldMetadata.inlineOverlay.applyMode"
1106
+ ],
1107
+ "submissionImpact": "affects-schema-backed-data",
1108
+ "preconditions": [
1109
+ "field-metadata-loaded",
1110
+ "editor-properties-loaded"
1111
+ ]
1112
+ },
930
1113
  {
931
1114
  "operationId": "normalization.apply",
932
1115
  "title": "Apply schema normalization",
@@ -1111,6 +1294,24 @@
1111
1294
  "code": "METADATA_CONTEXT_HINT_I18N_COMPATIBLE",
1112
1295
  "description": "Authoring hint text must remain compatible with metadata-editor i18n."
1113
1296
  },
1297
+ {
1298
+ "validatorId": "date-range-shortcuts-static-canonical",
1299
+ "level": "error",
1300
+ "code": "METADATA_DATE_RANGE_SHORTCUTS_STATIC_CANONICAL",
1301
+ "description": "Date range shortcuts must be built-in ids or static backend-resolved ranges with id, label, startDate and endDate."
1302
+ },
1303
+ {
1304
+ "validatorId": "date-range-shortcuts-no-executable-metadata",
1305
+ "level": "error",
1306
+ "code": "METADATA_DATE_RANGE_SHORTCUTS_NO_EXECUTABLE_METADATA",
1307
+ "description": "Metadata shortcuts must not contain calculateRange, executable expressions, local calendar-law rules, or frontend business-day logic."
1308
+ },
1309
+ {
1310
+ "validatorId": "date-range-shortcuts-unique-ids",
1311
+ "level": "error",
1312
+ "code": "METADATA_DATE_RANGE_SHORTCUTS_UNIQUE_IDS",
1313
+ "description": "Static business shortcuts must use unique ids inside the date range field."
1314
+ },
1114
1315
  {
1115
1316
  "validatorId": "normalization-preserves-canonical-fields",
1116
1317
  "level": "error",
@@ -1134,6 +1335,7 @@
1134
1335
  "FieldMetadata is the canonical edited document shape; backend x-ui-derived metadata must not be rewritten into host-only aliases.",
1135
1336
  "Control type changes require both dynamic-fields discovery and metadata-editor visual coverage.",
1136
1337
  "Option source cascades preserve x-ui optionSource.dependsOn and optionSource.dependencyFilterMap semantics.",
1338
+ "Date range business shortcuts are authored as built-in ids or backend-resolved static ranges; browser metadata never carries calculateRange code or business calendar rules.",
1137
1339
  "JSON-only support is incomplete when visual editor coverage is required.",
1138
1340
  "Schema normalization must preserve advanced canonical properties through open, edit, apply/save, reopen and runtime consumption."
1139
1341
  ],
@@ -1216,6 +1418,48 @@
1216
1418
  },
1217
1419
  "isPositive": true
1218
1420
  },
1421
+ {
1422
+ "id": "configure-date-range-business-shortcut",
1423
+ "request": "Add a fiscal competence period resolved by the backend to this inline date range.",
1424
+ "operationId": "dateRangeShortcuts.configure",
1425
+ "params": {
1426
+ "shortcuts": [
1427
+ "thisMonth",
1428
+ {
1429
+ "id": "competencia-fiscal-marco",
1430
+ "label": "Fiscal competence March",
1431
+ "startDate": "2026-03-01",
1432
+ "endDate": "2026-03-31",
1433
+ "timeZone": "America/Sao_Paulo",
1434
+ "tone": "success"
1435
+ }
1436
+ ],
1437
+ "inlineQuickPresets": {
1438
+ "enabled": true,
1439
+ "position": "start",
1440
+ "maxVisible": 4
1441
+ },
1442
+ "applyMode": "explicit"
1443
+ },
1444
+ "isPositive": true
1445
+ },
1446
+ {
1447
+ "id": "reject-date-range-executable-shortcut",
1448
+ "request": "Add a date range shortcut that calculates fiscal holidays in calculateRange from JSON.",
1449
+ "operationId": "dateRangeShortcuts.configure",
1450
+ "params": {
1451
+ "shortcuts": [
1452
+ {
1453
+ "id": "legal-days",
1454
+ "label": "Legal days",
1455
+ "startDate": "2026-03-01",
1456
+ "endDate": "2026-03-31",
1457
+ "calculateRange": "() => legalCalendar()"
1458
+ }
1459
+ ]
1460
+ },
1461
+ "isPositive": false
1462
+ },
1219
1463
  {
1220
1464
  "id": "normalize-seed",
1221
1465
  "request": "Normalize this imported field metadata while preserving advanced properties.",
@@ -1272,7 +1516,7 @@
1272
1516
  "chunkIndex": 0,
1273
1517
  "chunkKind": "summary",
1274
1518
  "content": "Component ID: praxis-metadata-editor\nSelector: praxis-field-metadata-editor\nFriendly Name: Praxis Metadata Editor\nDescription: Editor for field metadata and schema helpers.\nLib/Package: @praxisui/metadata-editor\nTags: widget, metadata, configurable\nInputs:\n - controlType (FieldControlType)\n - seed (Partial<FieldDefinition>)\nOutputs:\n - applied (Partial<FieldDefinition>)\n - cancel (void)\n",
1275
- "sourcePointer": "praxis-ui-angular/projects/praxis-metadata-editor/src/lib/praxis-metadata-editor.metadata.ts",
1519
+ "sourcePointer": "projects/praxis-metadata-editor/src/lib/praxis-metadata-editor.metadata.ts",
1276
1520
  "contentHash": "553cc0efd72287cd0ae4903ef352e67534fb20b5423f32e39526318f988697f4",
1277
1521
  "sourceKind": "component_definition",
1278
1522
  "sourceId": "praxis-metadata-editor",
@@ -1281,9 +1525,9 @@
1281
1525
  {
1282
1526
  "chunkIndex": 1,
1283
1527
  "chunkKind": "authoring_manifest",
1284
- "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-metadata-editor\",\n \"ownerPackage\": \"@praxisui/metadata-editor\",\n \"configSchemaId\": \"FieldMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"controlType\",\n \"type\": \"FieldControlType\",\n \"description\": \"Canonical control type used to resolve editor property coverage.\"\n },\n {\n \"name\": \"seed\",\n \"type\": \"Partial<FieldMetadata | FieldDefinition>\",\n \"description\": \"Initial canonical field metadata used to hydrate the editor.\"\n },\n {\n \"name\": \"fields\",\n \"type\": \"Array<FieldMetadata | FieldDefinition>\",\n \"description\": \"Available fields used by cascade authoring and context validation.\"\n },\n {\n \"name\": \"properties\",\n \"type\": \"EditorProperty[]\",\n \"description\": \"Renderer property catalog resolved from ConfigRegistryService.\"\n },\n {\n \"name\": \"form\",\n \"type\": \"FormGroup\",\n \"description\": \"Dynamic form generated from canonical editor properties by DynamicFormFactoryService.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"fieldMetadata\",\n \"resolver\": \"field-metadata-json-path\",\n \"description\": \"Canonical FieldMetadata root and property paths.\"\n },\n {\n \"kind\": \"controlType\",\n \"resolver\": \"dynamic-fields-control-type-discovery\",\n \"description\": \"Control type selected from dynamic-fields discovery and editor config registry.\"\n },\n {\n \"kind\": \"optionSource\",\n \"resolver\": \"field-metadata-option-source\",\n \"description\": \"Canonical option source including backend x-ui option source fields where applicable.\"\n },\n {\n \"kind\": \"cascade\",\n \"resolver\": \"metadata-editor-cascade-rules\",\n \"description\": \"Cascade dependencies and dependency filter mappings edited through CascadeManagerTab.\"\n },\n {\n \"kind\": \"renderer\",\n \"resolver\": \"metadata-editor-renderer-property\",\n \"description\": \"Dynamic editor renderer property coverage and editor component mapping.\"\n },\n {\n \"kind\": \"validation\",\n \"resolver\": \"field-metadata-validation-rules\",\n \"description\": \"Field validation rules and contextual validators.\"\n },\n {\n \"kind\": \"contextHint\",\n \"resolver\": \"metadata-editor-context-hints\",\n \"description\": \"Authoring hints, help text and contextual guidance for metadata editors.\"\n },\n {\n \"kind\": \"normalization\",\n \"resolver\": \"metadata-editor-schema-normalizer\",\n \"description\": \"Schema normalization and seed hydration rules.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"fieldMetadata.property.set\",\n \"title\": \"Set FieldMetadata property\",\n \"scope\": \"fieldMetadataPath\",\n \"targetKind\": \"fieldMetadata\",\n \"target\": {\n \"kind\": \"fieldMetadata\",\n \"resolver\": \"field-metadata-json-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"path\",\n \"value\"\n ],\n \"properties\": {\n \"path\": {\n \"enum\": [\n \"name\",\n \"label\",\n \"description\",\n \"controlType\",\n \"placeholder\",\n \"defaultValue\",\n \"group\",\n \"order\",\n \"required\",\n \"disabled\",\n \"readOnly\",\n \"hidden\",\n \"source\",\n \"transient\",\n \"submitPolicy\",\n \"hint\",\n \"helpText\",\n \"tooltip\",\n \"valuePresentation\",\n \"presentation\",\n \"presentation.presenter\",\n \"presentation.tone\",\n \"presentation.appearance\",\n \"presentation.icon\",\n \"presentation.label\",\n \"presentation.badge\",\n \"presentation.tooltip\",\n \"presentationRules\",\n \"options\",\n \"optionSource\",\n \"validators\",\n \"conditionalRequired\",\n \"conditionalDisplay\",\n \"visibleIn\",\n \"ariaLabel\",\n \"ariaDescribedBy\"\n ]\n },\n \"value\": {},\n \"merge\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-field-property-set\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata\",\n \"fieldMetadataPath\",\n \"SchemaNormalizerService\"\n ],\n \"writes\": [\n \"fieldMetadata\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"path\"\n ],\n \"failureModes\": [\n \"unknown-field-metadata-path\",\n \"non-canonical-shape\",\n \"readonly-field\",\n \"normalization-failed\"\n ],\n \"description\": \"Sets a canonical FieldMetadata property through a governed metadata path and re-runs schema normalization.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"field-metadata-shape-canonical\",\n \"field-path-supported-by-editor\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"controlType.set\",\n \"title\": \"Set control type\",\n \"scope\": \"controlType\",\n \"targetKind\": \"controlType\",\n \"target\": {\n \"kind\": \"controlType\",\n \"resolver\": \"dynamic-fields-control-type-discovery\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"controlType\"\n ],\n \"properties\": {\n \"controlType\": {\n \"type\": \"string\"\n },\n \"preserveCompatibleProperties\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-control-type-set\",\n \"handlerContract\": {\n \"reads\": [\n \"FieldControlType\",\n \"ConfigRegistryService\",\n \"dynamic-fields-discovery\",\n \"fieldMetadata\"\n ],\n \"writes\": [\n \"fieldMetadata.controlType\",\n \"properties\",\n \"normalizedSeed\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"controlType\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"controlType\"\n ],\n \"properties\": {\n \"controlType\": {\n \"type\": \"string\"\n },\n \"preserveCompatibleProperties\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"control-type-not-discovered\",\n \"editor-coverage-missing\",\n \"incompatible-metadata-preservation\"\n ],\n \"description\": \"Changes control type only when dynamic-fields discovery and metadata-editor config registry both expose renderer/editor coverage.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"control-type-exists-in-discovery\",\n \"editor-coverage-exists\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.controlType\",\n \"properties\",\n \"normalizedSeed\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"dynamic-fields-discovery-loaded\"\n ]\n },\n {\n \"operationId\": \"optionSource.configure\",\n \"title\": \"Configure option source\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"optionSource\",\n \"target\": {\n \"kind\": \"optionSource\",\n \"resolver\": \"field-metadata-option-source\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"static\",\n \"remote\",\n \"resource\",\n \"lookup\"\n ]\n },\n \"resource\": {\n \"type\": \"string\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"valueField\": {\n \"type\": \"string\"\n },\n \"labelField\": {\n \"type\": \"string\"\n },\n \"dependsOn\": {\n \"type\": \"string\"\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\"\n },\n \"display\": {\n \"type\": \"object\",\n \"properties\": {\n \"preset\": {\n \"enum\": [\n \"compact\",\n \"rich\",\n \"directory\",\n \"status\",\n \"reference\",\n \"hierarchical\"\n ]\n },\n \"usage\": {\n \"enum\": [\n \"form\",\n \"filter\",\n \"table-cell\",\n \"dashboard\",\n \"wizard\",\n \"review\"\n ]\n },\n \"density\": {\n \"enum\": [\n \"compact\",\n \"comfortable\",\n \"rich\"\n ]\n },\n \"selectedLayout\": {\n \"enum\": [\n \"card\",\n \"inline\",\n \"compact\",\n \"token\"\n ]\n },\n \"resultLayout\": {\n \"enum\": [\n \"list\",\n \"denseList\",\n \"table\",\n \"card\"\n ]\n },\n \"primaryPropertyPath\": {\n \"type\": \"string\"\n },\n \"fields\": {\n \"type\": \"array\"\n },\n \"secondaryPropertyPaths\": {\n \"type\": \"array\"\n },\n \"badgePropertyPaths\": {\n \"type\": \"array\"\n },\n \"statusToneMap\": {\n \"type\": \"object\"\n }\n }\n },\n \"detail\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"surface\",\n \"route\",\n \"href\"\n ]\n },\n \"surfaceId\": {\n \"type\": \"string\"\n },\n \"presentation\": {\n \"enum\": [\n \"drawer\",\n \"modal\"\n ]\n },\n \"preferredWidget\": {\n \"type\": \"string\"\n },\n \"mode\": {\n \"enum\": [\n \"view\",\n \"edit\",\n \"create\"\n ]\n }\n }\n },\n \"options\": {\n \"type\": \"array\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-option-source-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.optionSource\",\n \"backend.x-ui.optionSource\",\n \"SchemaNormalizerService\"\n ],\n \"writes\": [\n \"fieldMetadata.optionSource\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"optionSource.kind\",\n \"optionSource.resource\"\n ],\n \"failureModes\": [\n \"invalid-option-source-kind\",\n \"remote-source-missing-governed-resource\",\n \"dependency-filter-map-invalid\"\n ],\n \"description\": \"Configures canonical optionSource fields while preserving backend x-ui dependsOn and dependencyFilterMap semantics.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"option-source-shape-canonical\",\n \"remote-option-source-governed\",\n \"cascade-backend-shape-preserved\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.optionSource\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"cascade.configure\",\n \"title\": \"Configure cascade rule\",\n \"scope\": \"interaction\",\n \"targetKind\": \"cascade\",\n \"target\": {\n \"kind\": \"cascade\",\n \"resolver\": \"metadata-editor-cascade-rules\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"dependentField\"\n ],\n \"properties\": {\n \"dependentField\": {\n \"type\": \"string\"\n },\n \"sourceField\": {\n \"type\": \"string\"\n },\n \"strategy\": {\n \"enum\": [\n \"replace\",\n \"merge\"\n ]\n },\n \"debounceMs\": {\n \"type\": \"number\"\n },\n \"loadMode\": {\n \"enum\": [\n \"immediate\",\n \"manual\",\n \"respectLoadOn\"\n ]\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\"\n },\n \"optionSource\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"static\",\n \"remote\",\n \"resource\",\n \"lookup\"\n ]\n },\n \"resource\": {\n \"type\": \"string\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"dependsOn\": {\n \"type\": \"string\"\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-cascade-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CascadeManagerTabComponent\",\n \"CascadeRulesService\",\n \"fields\",\n \"fieldMetadata.optionSource\",\n \"fieldMetadata.dependencyFields\",\n \"fieldMetadata.dependencyFilterMap\"\n ],\n \"writes\": [\n \"fieldMetadata.dependencyFields\",\n \"fieldMetadata.enableDependencyCascade\",\n \"fieldMetadata.resetOnDependentChange\",\n \"fieldMetadata.dependencyFilterMap\",\n \"fieldMetadata.dependencyValuePath\",\n \"fieldMetadata.dependencyMergeStrategy\",\n \"fieldMetadata.dependencyDebounceMs\",\n \"fieldMetadata.dependencyLoadOnChange\",\n \"fieldMetadata.optionSource.dependsOn\",\n \"fieldMetadata.optionSource.dependencyFilterMap\"\n ],\n \"identityKeys\": [\n \"dependentField\",\n \"sourceField\"\n ],\n \"failureModes\": [\n \"dependent-field-not-found\",\n \"source-field-not-found\",\n \"cascade-cycle-detected\",\n \"dependency-filter-map-invalid\"\n ],\n \"description\": \"Applies cascade dependencies through CascadeRulesService using the metadata-editor save contract while preserving backend x-ui optionSource dependency semantics during hydration.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"cascade-fields-exist\",\n \"cascade-cycle-free\",\n \"cascade-backend-shape-preserved\",\n \"option-source-shape-canonical\",\n \"remote-option-source-governed\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.dependencyFields\",\n \"fieldMetadata.enableDependencyCascade\",\n \"fieldMetadata.resetOnDependentChange\",\n \"fieldMetadata.dependencyFilterMap\",\n \"fieldMetadata.dependencyValuePath\",\n \"fieldMetadata.dependencyMergeStrategy\",\n \"fieldMetadata.dependencyDebounceMs\",\n \"fieldMetadata.dependencyLoadOnChange\",\n \"fieldMetadata.optionSource.dependsOn\",\n \"fieldMetadata.optionSource.dependencyFilterMap\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"field-list-loaded\"\n ]\n },\n {\n \"operationId\": \"renderer.configure\",\n \"title\": \"Configure renderer coverage\",\n \"scope\": \"editorCoverage\",\n \"targetKind\": \"renderer\",\n \"target\": {\n \"kind\": \"renderer\",\n \"resolver\": \"metadata-editor-renderer-property\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"propertyName\",\n \"editorType\"\n ],\n \"properties\": {\n \"propertyName\": {\n \"type\": \"string\"\n },\n \"editorType\": {\n \"type\": \"string\"\n },\n \"group\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"options\": {\n \"type\": \"array\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-renderer-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"DynamicEditorRendererComponent\",\n \"EditorComponentRegistryService\",\n \"ConfigRegistryService\",\n \"EditorProperty\"\n ],\n \"writes\": [\n \"properties\",\n \"editorCoverage\"\n ],\n \"identityKeys\": [\n \"controlType\",\n \"propertyName\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"propertyName\",\n \"editorType\"\n ],\n \"properties\": {\n \"propertyName\": {\n \"type\": \"string\"\n },\n \"editorType\": {\n \"type\": \"string\"\n },\n \"group\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"editor-type-not-registered\",\n \"property-not-covered\",\n \"json-only-coverage-not-accepted\"\n ],\n \"description\": \"Configures visual renderer coverage for a metadata property and rejects JSON-only support for required visual authoring.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"renderer-editor-type-registered\",\n \"visual-editor-coverage-required\",\n \"editor-coverage-exists\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"properties\",\n \"editorCoverage\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-registry-loaded\"\n ]\n },\n {\n \"operationId\": \"validationRule.add\",\n \"title\": \"Add validation rule\",\n \"scope\": \"fieldMetadataPath\",\n \"targetKind\": \"validation\",\n \"target\": {\n \"kind\": \"validation\",\n \"resolver\": \"field-metadata-validation-rules\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"rule\"\n ],\n \"properties\": {\n \"rule\": {\n \"type\": \"object\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"contextValidatorId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-validation-rule-add\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.validators\",\n \"ContextValidatorRegistryService\",\n \"DynamicFormFactoryService\"\n ],\n \"writes\": [\n \"fieldMetadata.validators\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"rule.type\",\n \"contextValidatorId\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"rule\"\n ],\n \"properties\": {\n \"rule\": {\n \"type\": \"object\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"contextValidatorId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"validation-rule-invalid\",\n \"context-validator-not-registered\",\n \"duplicate-validation-rule\"\n ],\n \"description\": \"Adds a canonical validation rule and verifies contextual validator availability before persistence.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"validation-rule-canonical\",\n \"context-validator-registered\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.validators\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"contextHint.set\",\n \"title\": \"Set metadata context hint\",\n \"scope\": \"meta\",\n \"targetKind\": \"contextHint\",\n \"target\": {\n \"kind\": \"contextHint\",\n \"resolver\": \"metadata-editor-context-hints\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"hintPath\",\n \"value\"\n ],\n \"properties\": {\n \"hintPath\": {\n \"enum\": [\n \"hint\",\n \"helpText\",\n \"description\",\n \"tooltip\",\n \"ariaLabel\",\n \"ariaDescribedBy\"\n ]\n },\n \"value\": {},\n \"localeKey\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-context-hint-set\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.hint\",\n \"fieldMetadata.helpText\",\n \"fieldMetadata.description\",\n \"fieldMetadata.tooltip\",\n \"fieldMetadata.ariaLabel\",\n \"fieldMetadata.ariaDescribedBy\",\n \"metadata-editor-i18n\"\n ],\n \"writes\": [\n \"fieldMetadata.hint\",\n \"fieldMetadata.helpText\",\n \"fieldMetadata.description\",\n \"fieldMetadata.tooltip\",\n \"fieldMetadata.ariaLabel\",\n \"fieldMetadata.ariaDescribedBy\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"hintPath\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"hintPath\",\n \"value\"\n ],\n \"properties\": {\n \"hintPath\": {\n \"enum\": [\n \"hint\",\n \"helpText\",\n \"description\",\n \"tooltip\",\n \"ariaLabel\",\n \"ariaDescribedBy\"\n ]\n },\n \"value\": {},\n \"localeKey\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"hint-path-not-canonical\",\n \"hint-value-not-serializable\",\n \"i18n-key-missing\"\n ],\n \"description\": \"Sets structured FieldMetadata hint/help/accessibility text through canonical metadata paths and metadata-editor i18n constraints.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"context-hint-shape-canonical\",\n \"context-hint-i18n-compatible\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.hint\",\n \"fieldMetadata.helpText\",\n \"fieldMetadata.description\",\n \"fieldMetadata.tooltip\",\n \"fieldMetadata.ariaLabel\",\n \"fieldMetadata.ariaDescribedBy\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"normalization.apply\",\n \"title\": \"Apply schema normalization\",\n \"scope\": \"runtimeCoverage\",\n \"targetKind\": \"normalization\",\n \"target\": {\n \"kind\": \"normalization\",\n \"resolver\": \"metadata-editor-schema-normalizer\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"hydrate-seed\",\n \"coerce-types\",\n \"apply-defaults\",\n \"preserve-advanced-properties\"\n ]\n },\n \"preserveUnknownCanonicalFields\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-normalization-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"SchemaNormalizerService\",\n \"fieldMetadata\",\n \"properties\",\n \"DynamicFormFactoryService\"\n ],\n \"writes\": [\n \"normalizedSeed\",\n \"form\",\n \"fieldMetadata\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"controlType\",\n \"mode\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"hydrate-seed\",\n \"coerce-types\",\n \"apply-defaults\",\n \"preserve-advanced-properties\"\n ]\n },\n \"preserveUnknownCanonicalFields\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"normalizer-missing\",\n \"type-coercion-failed\",\n \"advanced-property-lost\",\n \"runtime-editor-drift\"\n ],\n \"description\": \"Runs metadata-editor schema normalization while preserving canonical advanced FieldMetadata properties and editor/runtime round-trip.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"normalization-preserves-canonical-fields\",\n \"runtime-editor-round-trip\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"normalizedSeed\",\n \"form\",\n \"fieldMetadata\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"field-metadata-loaded\",\n \"editor-properties-loaded\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"field-metadata-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_FIELD_SHAPE_CANONICAL\",\n \"description\": \"Edited metadata must remain compatible with canonical FieldMetadata.\"\n },\n {\n \"validatorId\": \"field-path-supported-by-editor\",\n \"level\": \"error\",\n \"code\": \"METADATA_FIELD_PATH_SUPPORTED\",\n \"description\": \"Edited paths must be supported by visual editor coverage or explicitly delegated.\"\n },\n {\n \"validatorId\": \"control-type-exists-in-discovery\",\n \"level\": \"error\",\n \"code\": \"METADATA_CONTROL_TYPE_DISCOVERED\",\n \"description\": \"Control type must exist in dynamic-fields discovery.\"\n },\n {\n \"validatorId\": \"editor-coverage-exists\",\n \"level\": \"error\",\n \"code\": \"METADATA_EDITOR_COVERAGE_EXISTS\",\n \"description\": \"Control type and property must have metadata-editor coverage.\"\n },\n {\n \"validatorId\": \"option-source-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_OPTION_SOURCE_CANONICAL\",\n \"description\": \"Option source must use canonical FieldMetadata/x-ui shape.\"\n },\n {\n \"validatorId\": \"remote-option-source-governed\",\n \"level\": \"error\",\n \"code\": \"METADATA_REMOTE_OPTION_SOURCE_GOVERNED\",\n \"description\": \"Remote option sources must resolve through governed resource or endpoint metadata.\"\n },\n {\n \"validatorId\": \"cascade-fields-exist\",\n \"level\": \"error\",\n \"code\": \"METADATA_CASCADE_FIELDS_EXIST\",\n \"description\": \"Cascade source and dependent fields must exist.\"\n },\n {\n \"validatorId\": \"cascade-cycle-free\",\n \"level\": \"error\",\n \"code\": \"METADATA_CASCADE_CYCLE_FREE\",\n \"description\": \"Cascade dependencies must not create cycles.\"\n },\n {\n \"validatorId\": \"cascade-backend-shape-preserved\",\n \"level\": \"error\",\n \"code\": \"METADATA_CASCADE_BACKEND_SHAPE_PRESERVED\",\n \"description\": \"Cascade config must preserve x-ui optionSource dependsOn and dependencyFilterMap semantics.\"\n },\n {\n \"validatorId\": \"renderer-editor-type-registered\",\n \"level\": \"error\",\n \"code\": \"METADATA_RENDERER_TYPE_REGISTERED\",\n \"description\": \"Renderer editor type must be registered.\"\n },\n {\n \"validatorId\": \"visual-editor-coverage-required\",\n \"level\": \"error\",\n \"code\": \"METADATA_VISUAL_COVERAGE_REQUIRED\",\n \"description\": \"JSON-only support is not accepted for required visual authoring coverage.\"\n },\n {\n \"validatorId\": \"validation-rule-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_VALIDATION_RULE_CANONICAL\",\n \"description\": \"Validation rule must use canonical metadata shape.\"\n },\n {\n \"validatorId\": \"context-validator-registered\",\n \"level\": \"error\",\n \"code\": \"METADATA_CONTEXT_VALIDATOR_REGISTERED\",\n \"description\": \"Contextual validator must be registered before use.\"\n },\n {\n \"validatorId\": \"context-hint-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_CONTEXT_HINT_CANONICAL\",\n \"description\": \"Context hints must remain structured metadata, not free-form host-only strings.\"\n },\n {\n \"validatorId\": \"context-hint-i18n-compatible\",\n \"level\": \"warning\",\n \"code\": \"METADATA_CONTEXT_HINT_I18N_COMPATIBLE\",\n \"description\": \"Authoring hint text must remain compatible with metadata-editor i18n.\"\n },\n {\n \"validatorId\": \"normalization-preserves-canonical-fields\",\n \"level\": \"error\",\n \"code\": \"METADATA_NORMALIZATION_PRESERVES_FIELDS\",\n \"description\": \"Normalization must not drop canonical advanced FieldMetadata properties.\"\n },\n {\n \"validatorId\": \"runtime-editor-round-trip\",\n \"level\": \"error\",\n \"code\": \"METADATA_RUNTIME_EDITOR_ROUND_TRIP\",\n \"description\": \"Runtime and editor must consume the same normalized metadata shape.\"\n },\n {\n \"validatorId\": \"metadata-round-trip\",\n \"level\": \"error\",\n \"code\": \"METADATA_ROUND_TRIP\",\n \"description\": \"Open, edit, apply/save, reopen and runtime consume must preserve metadata.\"\n }\n ],\n \"roundTripRequirements\": [\n \"FieldMetadata is the canonical edited document shape; backend x-ui-derived metadata must not be rewritten into host-only aliases.\",\n \"Control type changes require both dynamic-fields discovery and metadata-editor visual coverage.\",\n \"Option source cascades preserve x-ui optionSource.dependsOn and optionSource.dependencyFilterMap semantics.\",\n \"JSON-only support is incomplete when visual editor coverage is required.\",\n \"Schema normalization must preserve advanced canonical properties through open, edit, apply/save, reopen and runtime consumption.\"\n ],\n \"examples\": [\n {\n \"id\": \"set-label\",\n \"request\": \"Set this field label to Customer name.\",\n \"operationId\": \"fieldMetadata.property.set\",\n \"params\": {\n \"path\": \"label\",\n \"value\": \"Customer name\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-control-type\",\n \"request\": \"Change this field to a select control.\",\n \"operationId\": \"controlType.set\",\n \"params\": {\n \"controlType\": \"select\",\n \"preserveCompatibleProperties\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-remote-options\",\n \"request\": \"Load options from the customers resource using id and name.\",\n \"operationId\": \"optionSource.configure\",\n \"params\": {\n \"kind\": \"resource\",\n \"resource\": \"customers\",\n \"valueField\": \"id\",\n \"labelField\": \"name\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-cascade\",\n \"request\": \"Filter city options when state changes.\",\n \"operationId\": \"cascade.configure\",\n \"params\": {\n \"dependentField\": \"city\",\n \"sourceField\": \"state\",\n \"dependencyFilterMap\": {\n \"stateId\": \"state.id\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-renderer\",\n \"request\": \"Expose placeholder in the visual editor as a text field.\",\n \"operationId\": \"renderer.configure\",\n \"params\": {\n \"propertyName\": \"placeholder\",\n \"editorType\": \"text\",\n \"group\": \"Presentation\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-required-validation\",\n \"request\": \"Make this field required with a validation message.\",\n \"operationId\": \"validationRule.add\",\n \"params\": {\n \"rule\": {\n \"type\": \"required\"\n },\n \"message\": \"Required field\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-context-hint\",\n \"request\": \"Add a contextual hint for sales users.\",\n \"operationId\": \"contextHint.set\",\n \"params\": {\n \"hintPath\": \"helpText\",\n \"value\": \"Use the legal customer name.\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"normalize-seed\",\n \"request\": \"Normalize this imported field metadata while preserving advanced properties.\",\n \"operationId\": \"normalization.apply\",\n \"params\": {\n \"mode\": \"preserve-advanced-properties\",\n \"preserveUnknownCanonicalFields\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unknown-control\",\n \"request\": \"Use an unknown control type named magic-picker.\",\n \"operationId\": \"controlType.set\",\n \"params\": {\n \"controlType\": \"magic-picker\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-json-only-coverage\",\n \"request\": \"Support this field only by editing raw JSON.\",\n \"operationId\": \"renderer.configure\",\n \"params\": {\n \"propertyName\": \"optionSource\",\n \"editorType\": \"json\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-cascade-cycle\",\n \"request\": \"Make field A depend on B and B depend on A.\",\n \"operationId\": \"cascade.configure\",\n \"params\": {\n \"dependentField\": \"a\",\n \"sourceField\": \"b\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-host-only-option-source\",\n \"request\": \"Save a host-only URL string as the option source.\",\n \"operationId\": \"optionSource.configure\",\n \"params\": {\n \"kind\": \"remote\",\n \"endpoint\": \"local-only://options\"\n },\n \"isPositive\": false\n }\n ]\n}",
1285
- "sourcePointer": "praxis-ui-angular/projects/praxis-metadata-editor/src/lib/ai/praxis-metadata-editor-authoring-manifest.ts",
1286
- "contentHash": "e1b5c8a8e412ec0e62be8abdc6a9c443499f6133bf363977516e14f2df2aa232",
1528
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-metadata-editor\",\n \"ownerPackage\": \"@praxisui/metadata-editor\",\n \"configSchemaId\": \"FieldMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"controlType\",\n \"type\": \"FieldControlType\",\n \"description\": \"Canonical control type used to resolve editor property coverage.\"\n },\n {\n \"name\": \"seed\",\n \"type\": \"Partial<FieldMetadata | FieldDefinition>\",\n \"description\": \"Initial canonical field metadata used to hydrate the editor.\"\n },\n {\n \"name\": \"fields\",\n \"type\": \"Array<FieldMetadata | FieldDefinition>\",\n \"description\": \"Available fields used by cascade authoring and context validation.\"\n },\n {\n \"name\": \"properties\",\n \"type\": \"EditorProperty[]\",\n \"description\": \"Renderer property catalog resolved from ConfigRegistryService.\"\n },\n {\n \"name\": \"form\",\n \"type\": \"FormGroup\",\n \"description\": \"Dynamic form generated from canonical editor properties by DynamicFormFactoryService.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"fieldMetadata\",\n \"resolver\": \"field-metadata-json-path\",\n \"description\": \"Canonical FieldMetadata root and property paths.\"\n },\n {\n \"kind\": \"controlType\",\n \"resolver\": \"dynamic-fields-control-type-discovery\",\n \"description\": \"Control type selected from dynamic-fields discovery and editor config registry.\"\n },\n {\n \"kind\": \"optionSource\",\n \"resolver\": \"field-metadata-option-source\",\n \"description\": \"Canonical option source including backend x-ui option source fields where applicable.\"\n },\n {\n \"kind\": \"cascade\",\n \"resolver\": \"metadata-editor-cascade-rules\",\n \"description\": \"Cascade dependencies and dependency filter mappings edited through CascadeManagerTab.\"\n },\n {\n \"kind\": \"renderer\",\n \"resolver\": \"metadata-editor-renderer-property\",\n \"description\": \"Dynamic editor renderer property coverage and editor component mapping.\"\n },\n {\n \"kind\": \"validation\",\n \"resolver\": \"field-metadata-validation-rules\",\n \"description\": \"Field validation rules and contextual validators.\"\n },\n {\n \"kind\": \"dateRangeShortcuts\",\n \"resolver\": \"metadata-editor-date-range-shortcut-catalog\",\n \"description\": \"Governed static date range shortcut catalog for dateRange and inlineDateRange metadata.\"\n },\n {\n \"kind\": \"contextHint\",\n \"resolver\": \"metadata-editor-context-hints\",\n \"description\": \"Authoring hints, help text and contextual guidance for metadata editors.\"\n },\n {\n \"kind\": \"normalization\",\n \"resolver\": \"metadata-editor-schema-normalizer\",\n \"description\": \"Schema normalization and seed hydration rules.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"fieldMetadata.property.set\",\n \"title\": \"Set FieldMetadata property\",\n \"scope\": \"fieldMetadataPath\",\n \"targetKind\": \"fieldMetadata\",\n \"target\": {\n \"kind\": \"fieldMetadata\",\n \"resolver\": \"field-metadata-json-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"path\",\n \"value\"\n ],\n \"properties\": {\n \"path\": {\n \"enum\": [\n \"name\",\n \"label\",\n \"description\",\n \"controlType\",\n \"placeholder\",\n \"defaultValue\",\n \"group\",\n \"order\",\n \"required\",\n \"disabled\",\n \"readOnly\",\n \"hidden\",\n \"source\",\n \"transient\",\n \"submitPolicy\",\n \"hint\",\n \"helpText\",\n \"tooltip\",\n \"valuePresentation\",\n \"presentation\",\n \"presentation.presenter\",\n \"presentation.tone\",\n \"presentation.appearance\",\n \"presentation.icon\",\n \"presentation.label\",\n \"presentation.badge\",\n \"presentation.tooltip\",\n \"presentationRules\",\n \"options\",\n \"optionSource\",\n \"validators\",\n \"conditionalRequired\",\n \"conditionalDisplay\",\n \"visibleIn\",\n \"ariaLabel\",\n \"ariaDescribedBy\"\n ]\n },\n \"value\": {},\n \"merge\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-field-property-set\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata\",\n \"fieldMetadataPath\",\n \"SchemaNormalizerService\"\n ],\n \"writes\": [\n \"fieldMetadata\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"path\"\n ],\n \"failureModes\": [\n \"unknown-field-metadata-path\",\n \"non-canonical-shape\",\n \"readonly-field\",\n \"normalization-failed\"\n ],\n \"description\": \"Sets a canonical FieldMetadata property through a governed metadata path and re-runs schema normalization.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"field-metadata-shape-canonical\",\n \"field-path-supported-by-editor\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"controlType.set\",\n \"title\": \"Set control type\",\n \"scope\": \"controlType\",\n \"targetKind\": \"controlType\",\n \"target\": {\n \"kind\": \"controlType\",\n \"resolver\": \"dynamic-fields-control-type-discovery\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"controlType\"\n ],\n \"properties\": {\n \"controlType\": {\n \"type\": \"string\"\n },\n \"preserveCompatibleProperties\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-control-type-set\",\n \"handlerContract\": {\n \"reads\": [\n \"FieldControlType\",\n \"ConfigRegistryService\",\n \"dynamic-fields-discovery\",\n \"fieldMetadata\"\n ],\n \"writes\": [\n \"fieldMetadata.controlType\",\n \"properties\",\n \"normalizedSeed\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"controlType\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"controlType\"\n ],\n \"properties\": {\n \"controlType\": {\n \"type\": \"string\"\n },\n \"preserveCompatibleProperties\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"control-type-not-discovered\",\n \"editor-coverage-missing\",\n \"incompatible-metadata-preservation\"\n ],\n \"description\": \"Changes control type only when dynamic-fields discovery and metadata-editor config registry both expose renderer/editor coverage.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"control-type-exists-in-discovery\",\n \"editor-coverage-exists\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.controlType\",\n \"properties\",\n \"normalizedSeed\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"dynamic-fields-discovery-loaded\"\n ]\n },\n {\n \"operationId\": \"optionSource.configure\",\n \"title\": \"Configure option source\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"optionSource\",\n \"target\": {\n \"kind\": \"optionSource\",\n \"resolver\": \"field-metadata-option-source\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"static\",\n \"remote\",\n \"resource\",\n \"lookup\"\n ]\n },\n \"resource\": {\n \"type\": \"string\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"valueField\": {\n \"type\": \"string\"\n },\n \"labelField\": {\n \"type\": \"string\"\n },\n \"dependsOn\": {\n \"type\": \"string\"\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\"\n },\n \"display\": {\n \"type\": \"object\",\n \"properties\": {\n \"preset\": {\n \"enum\": [\n \"compact\",\n \"rich\",\n \"directory\",\n \"status\",\n \"reference\",\n \"hierarchical\"\n ]\n },\n \"usage\": {\n \"enum\": [\n \"form\",\n \"filter\",\n \"table-cell\",\n \"dashboard\",\n \"wizard\",\n \"review\"\n ]\n },\n \"density\": {\n \"enum\": [\n \"compact\",\n \"comfortable\",\n \"rich\"\n ]\n },\n \"selectedLayout\": {\n \"enum\": [\n \"card\",\n \"inline\",\n \"compact\",\n \"token\"\n ]\n },\n \"resultLayout\": {\n \"enum\": [\n \"list\",\n \"denseList\",\n \"table\",\n \"card\"\n ]\n },\n \"primaryPropertyPath\": {\n \"type\": \"string\"\n },\n \"fields\": {\n \"type\": \"array\"\n },\n \"secondaryPropertyPaths\": {\n \"type\": \"array\"\n },\n \"badgePropertyPaths\": {\n \"type\": \"array\"\n },\n \"statusToneMap\": {\n \"type\": \"object\"\n }\n }\n },\n \"detail\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"surface\",\n \"route\",\n \"href\"\n ]\n },\n \"surfaceId\": {\n \"type\": \"string\"\n },\n \"presentation\": {\n \"enum\": [\n \"drawer\",\n \"modal\"\n ]\n },\n \"preferredWidget\": {\n \"type\": \"string\"\n },\n \"mode\": {\n \"enum\": [\n \"view\",\n \"edit\",\n \"create\"\n ]\n }\n }\n },\n \"options\": {\n \"type\": \"array\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-option-source-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.optionSource\",\n \"backend.x-ui.optionSource\",\n \"SchemaNormalizerService\"\n ],\n \"writes\": [\n \"fieldMetadata.optionSource\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"optionSource.kind\",\n \"optionSource.resource\"\n ],\n \"failureModes\": [\n \"invalid-option-source-kind\",\n \"remote-source-missing-governed-resource\",\n \"dependency-filter-map-invalid\"\n ],\n \"description\": \"Configures canonical optionSource fields while preserving backend x-ui dependsOn and dependencyFilterMap semantics.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"option-source-shape-canonical\",\n \"remote-option-source-governed\",\n \"cascade-backend-shape-preserved\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.optionSource\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"cascade.configure\",\n \"title\": \"Configure cascade rule\",\n \"scope\": \"interaction\",\n \"targetKind\": \"cascade\",\n \"target\": {\n \"kind\": \"cascade\",\n \"resolver\": \"metadata-editor-cascade-rules\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"dependentField\"\n ],\n \"properties\": {\n \"dependentField\": {\n \"type\": \"string\"\n },\n \"sourceField\": {\n \"type\": \"string\"\n },\n \"strategy\": {\n \"enum\": [\n \"replace\",\n \"merge\"\n ]\n },\n \"debounceMs\": {\n \"type\": \"number\"\n },\n \"loadMode\": {\n \"enum\": [\n \"immediate\",\n \"manual\",\n \"respectLoadOn\"\n ]\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\"\n },\n \"optionSource\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"static\",\n \"remote\",\n \"resource\",\n \"lookup\"\n ]\n },\n \"resource\": {\n \"type\": \"string\"\n },\n \"endpoint\": {\n \"type\": \"string\"\n },\n \"dependsOn\": {\n \"type\": \"string\"\n },\n \"dependencyFilterMap\": {\n \"type\": \"object\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-cascade-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CascadeManagerTabComponent\",\n \"CascadeRulesService\",\n \"fields\",\n \"fieldMetadata.optionSource\",\n \"fieldMetadata.dependencyFields\",\n \"fieldMetadata.dependencyFilterMap\"\n ],\n \"writes\": [\n \"fieldMetadata.dependencyFields\",\n \"fieldMetadata.enableDependencyCascade\",\n \"fieldMetadata.resetOnDependentChange\",\n \"fieldMetadata.dependencyFilterMap\",\n \"fieldMetadata.dependencyValuePath\",\n \"fieldMetadata.dependencyMergeStrategy\",\n \"fieldMetadata.dependencyDebounceMs\",\n \"fieldMetadata.dependencyLoadOnChange\",\n \"fieldMetadata.optionSource.dependsOn\",\n \"fieldMetadata.optionSource.dependencyFilterMap\"\n ],\n \"identityKeys\": [\n \"dependentField\",\n \"sourceField\"\n ],\n \"failureModes\": [\n \"dependent-field-not-found\",\n \"source-field-not-found\",\n \"cascade-cycle-detected\",\n \"dependency-filter-map-invalid\"\n ],\n \"description\": \"Applies cascade dependencies through CascadeRulesService using the metadata-editor save contract while preserving backend x-ui optionSource dependency semantics during hydration.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"cascade-fields-exist\",\n \"cascade-cycle-free\",\n \"cascade-backend-shape-preserved\",\n \"option-source-shape-canonical\",\n \"remote-option-source-governed\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.dependencyFields\",\n \"fieldMetadata.enableDependencyCascade\",\n \"fieldMetadata.resetOnDependentChange\",\n \"fieldMetadata.dependencyFilterMap\",\n \"fieldMetadata.dependencyValuePath\",\n \"fieldMetadata.dependencyMergeStrategy\",\n \"fieldMetadata.dependencyDebounceMs\",\n \"fieldMetadata.dependencyLoadOnChange\",\n \"fieldMetadata.optionSource.dependsOn\",\n \"fieldMetadata.optionSource.dependencyFilterMap\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"field-list-loaded\"\n ]\n },\n {\n \"operationId\": \"renderer.configure\",\n \"title\": \"Configure renderer coverage\",\n \"scope\": \"editorCoverage\",\n \"targetKind\": \"renderer\",\n \"target\": {\n \"kind\": \"renderer\",\n \"resolver\": \"metadata-editor-renderer-property\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"propertyName\",\n \"editorType\"\n ],\n \"properties\": {\n \"propertyName\": {\n \"type\": \"string\"\n },\n \"editorType\": {\n \"type\": \"string\"\n },\n \"group\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"options\": {\n \"type\": \"array\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-renderer-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"DynamicEditorRendererComponent\",\n \"EditorComponentRegistryService\",\n \"ConfigRegistryService\",\n \"EditorProperty\"\n ],\n \"writes\": [\n \"properties\",\n \"editorCoverage\"\n ],\n \"identityKeys\": [\n \"controlType\",\n \"propertyName\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"propertyName\",\n \"editorType\"\n ],\n \"properties\": {\n \"propertyName\": {\n \"type\": \"string\"\n },\n \"editorType\": {\n \"type\": \"string\"\n },\n \"group\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"editor-type-not-registered\",\n \"property-not-covered\",\n \"json-only-coverage-not-accepted\"\n ],\n \"description\": \"Configures visual renderer coverage for a metadata property and rejects JSON-only support for required visual authoring.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"renderer-editor-type-registered\",\n \"visual-editor-coverage-required\",\n \"editor-coverage-exists\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"properties\",\n \"editorCoverage\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-registry-loaded\"\n ]\n },\n {\n \"operationId\": \"validationRule.add\",\n \"title\": \"Add validation rule\",\n \"scope\": \"fieldMetadataPath\",\n \"targetKind\": \"validation\",\n \"target\": {\n \"kind\": \"validation\",\n \"resolver\": \"field-metadata-validation-rules\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"rule\"\n ],\n \"properties\": {\n \"rule\": {\n \"type\": \"object\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"contextValidatorId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-validation-rule-add\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.validators\",\n \"ContextValidatorRegistryService\",\n \"DynamicFormFactoryService\"\n ],\n \"writes\": [\n \"fieldMetadata.validators\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"rule.type\",\n \"contextValidatorId\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"rule\"\n ],\n \"properties\": {\n \"rule\": {\n \"type\": \"object\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"contextValidatorId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"validation-rule-invalid\",\n \"context-validator-not-registered\",\n \"duplicate-validation-rule\"\n ],\n \"description\": \"Adds a canonical validation rule and verifies contextual validator availability before persistence.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"validation-rule-canonical\",\n \"context-validator-registered\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.validators\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"contextHint.set\",\n \"title\": \"Set metadata context hint\",\n \"scope\": \"meta\",\n \"targetKind\": \"contextHint\",\n \"target\": {\n \"kind\": \"contextHint\",\n \"resolver\": \"metadata-editor-context-hints\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"hintPath\",\n \"value\"\n ],\n \"properties\": {\n \"hintPath\": {\n \"enum\": [\n \"hint\",\n \"helpText\",\n \"description\",\n \"tooltip\",\n \"ariaLabel\",\n \"ariaDescribedBy\"\n ]\n },\n \"value\": {},\n \"localeKey\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-context-hint-set\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.hint\",\n \"fieldMetadata.helpText\",\n \"fieldMetadata.description\",\n \"fieldMetadata.tooltip\",\n \"fieldMetadata.ariaLabel\",\n \"fieldMetadata.ariaDescribedBy\",\n \"metadata-editor-i18n\"\n ],\n \"writes\": [\n \"fieldMetadata.hint\",\n \"fieldMetadata.helpText\",\n \"fieldMetadata.description\",\n \"fieldMetadata.tooltip\",\n \"fieldMetadata.ariaLabel\",\n \"fieldMetadata.ariaDescribedBy\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"hintPath\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"hintPath\",\n \"value\"\n ],\n \"properties\": {\n \"hintPath\": {\n \"enum\": [\n \"hint\",\n \"helpText\",\n \"description\",\n \"tooltip\",\n \"ariaLabel\",\n \"ariaDescribedBy\"\n ]\n },\n \"value\": {},\n \"localeKey\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"hint-path-not-canonical\",\n \"hint-value-not-serializable\",\n \"i18n-key-missing\"\n ],\n \"description\": \"Sets structured FieldMetadata hint/help/accessibility text through canonical metadata paths and metadata-editor i18n constraints.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"context-hint-shape-canonical\",\n \"context-hint-i18n-compatible\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.hint\",\n \"fieldMetadata.helpText\",\n \"fieldMetadata.description\",\n \"fieldMetadata.tooltip\",\n \"fieldMetadata.ariaLabel\",\n \"fieldMetadata.ariaDescribedBy\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"field-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"dateRangeShortcuts.configure\",\n \"title\": \"Configure governed date range shortcuts\",\n \"scope\": \"fieldMetadataPath\",\n \"targetKind\": \"dateRangeShortcuts\",\n \"target\": {\n \"kind\": \"dateRangeShortcuts\",\n \"resolver\": \"metadata-editor-date-range-shortcut-catalog\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"shortcuts\"\n ],\n \"properties\": {\n \"shortcuts\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"today\",\n \"yesterday\",\n \"thisWeek\",\n \"lastWeek\",\n \"thisMonth\",\n \"lastMonth\",\n \"thisYear\",\n \"lastYear\"\n ]\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"label\",\n \"startDate\",\n \"endDate\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"startDate\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n },\n \"timeZone\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"tone\": {\n \"enum\": [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\"\n ]\n },\n \"effectiveFrom\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n },\n \"effectiveTo\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n },\n \"order\": {\n \"type\": \"number\"\n }\n }\n }\n ]\n }\n },\n \"inlineQuickPresets\": {\n \"type\": \"object\",\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"maxVisible\": {\n \"type\": \"number\"\n },\n \"position\": {\n \"enum\": [\n \"auto\",\n \"footer\",\n \"start\",\n \"end\"\n ]\n }\n }\n },\n \"applyMode\": {\n \"enum\": [\n \"auto\",\n \"explicit\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-date-range-shortcuts-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"fieldMetadata.controlType\",\n \"fieldMetadata.shortcuts\",\n \"fieldMetadata.inlineQuickPresets\",\n \"fieldMetadata.inlineOverlay\",\n \"ConfigRegistryService\"\n ],\n \"writes\": [\n \"fieldMetadata.shortcuts\",\n \"fieldMetadata.inlineQuickPresets\",\n \"fieldMetadata.inlineOverlay.applyMode\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"shortcuts[].id\"\n ],\n \"failureModes\": [\n \"control-type-not-date-range\",\n \"duplicate-shortcut-id\",\n \"invalid-static-date-range-shortcut\",\n \"unsupported-shortcut-tone\",\n \"executable-shortcut-metadata\"\n ],\n \"description\": \"Configures built-in and backend-resolved static date range shortcuts through the canonical shortcuts array; JSON metadata may not contain calculateRange or executable expressions.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"date-range-shortcuts-static-canonical\",\n \"date-range-shortcuts-no-executable-metadata\",\n \"date-range-shortcuts-unique-ids\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"fieldMetadata.shortcuts\",\n \"fieldMetadata.inlineQuickPresets\",\n \"fieldMetadata.inlineOverlay.applyMode\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"field-metadata-loaded\",\n \"editor-properties-loaded\"\n ]\n },\n {\n \"operationId\": \"normalization.apply\",\n \"title\": \"Apply schema normalization\",\n \"scope\": \"runtimeCoverage\",\n \"targetKind\": \"normalization\",\n \"target\": {\n \"kind\": \"normalization\",\n \"resolver\": \"metadata-editor-schema-normalizer\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"hydrate-seed\",\n \"coerce-types\",\n \"apply-defaults\",\n \"preserve-advanced-properties\"\n ]\n },\n \"preserveUnknownCanonicalFields\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"metadata-normalization-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"SchemaNormalizerService\",\n \"fieldMetadata\",\n \"properties\",\n \"DynamicFormFactoryService\"\n ],\n \"writes\": [\n \"normalizedSeed\",\n \"form\",\n \"fieldMetadata\"\n ],\n \"identityKeys\": [\n \"field.name\",\n \"controlType\",\n \"mode\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"hydrate-seed\",\n \"coerce-types\",\n \"apply-defaults\",\n \"preserve-advanced-properties\"\n ]\n },\n \"preserveUnknownCanonicalFields\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"normalizer-missing\",\n \"type-coercion-failed\",\n \"advanced-property-lost\",\n \"runtime-editor-drift\"\n ],\n \"description\": \"Runs metadata-editor schema normalization while preserving canonical advanced FieldMetadata properties and editor/runtime round-trip.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"normalization-preserves-canonical-fields\",\n \"runtime-editor-round-trip\",\n \"metadata-round-trip\"\n ],\n \"affectedPaths\": [\n \"normalizedSeed\",\n \"form\",\n \"fieldMetadata\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"field-metadata-loaded\",\n \"editor-properties-loaded\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"field-metadata-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_FIELD_SHAPE_CANONICAL\",\n \"description\": \"Edited metadata must remain compatible with canonical FieldMetadata.\"\n },\n {\n \"validatorId\": \"field-path-supported-by-editor\",\n \"level\": \"error\",\n \"code\": \"METADATA_FIELD_PATH_SUPPORTED\",\n \"description\": \"Edited paths must be supported by visual editor coverage or explicitly delegated.\"\n },\n {\n \"validatorId\": \"control-type-exists-in-discovery\",\n \"level\": \"error\",\n \"code\": \"METADATA_CONTROL_TYPE_DISCOVERED\",\n \"description\": \"Control type must exist in dynamic-fields discovery.\"\n },\n {\n \"validatorId\": \"editor-coverage-exists\",\n \"level\": \"error\",\n \"code\": \"METADATA_EDITOR_COVERAGE_EXISTS\",\n \"description\": \"Control type and property must have metadata-editor coverage.\"\n },\n {\n \"validatorId\": \"option-source-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_OPTION_SOURCE_CANONICAL\",\n \"description\": \"Option source must use canonical FieldMetadata/x-ui shape.\"\n },\n {\n \"validatorId\": \"remote-option-source-governed\",\n \"level\": \"error\",\n \"code\": \"METADATA_REMOTE_OPTION_SOURCE_GOVERNED\",\n \"description\": \"Remote option sources must resolve through governed resource or endpoint metadata.\"\n },\n {\n \"validatorId\": \"cascade-fields-exist\",\n \"level\": \"error\",\n \"code\": \"METADATA_CASCADE_FIELDS_EXIST\",\n \"description\": \"Cascade source and dependent fields must exist.\"\n },\n {\n \"validatorId\": \"cascade-cycle-free\",\n \"level\": \"error\",\n \"code\": \"METADATA_CASCADE_CYCLE_FREE\",\n \"description\": \"Cascade dependencies must not create cycles.\"\n },\n {\n \"validatorId\": \"cascade-backend-shape-preserved\",\n \"level\": \"error\",\n \"code\": \"METADATA_CASCADE_BACKEND_SHAPE_PRESERVED\",\n \"description\": \"Cascade config must preserve x-ui optionSource dependsOn and dependencyFilterMap semantics.\"\n },\n {\n \"validatorId\": \"renderer-editor-type-registered\",\n \"level\": \"error\",\n \"code\": \"METADATA_RENDERER_TYPE_REGISTERED\",\n \"description\": \"Renderer editor type must be registered.\"\n },\n {\n \"validatorId\": \"visual-editor-coverage-required\",\n \"level\": \"error\",\n \"code\": \"METADATA_VISUAL_COVERAGE_REQUIRED\",\n \"description\": \"JSON-only support is not accepted for required visual authoring coverage.\"\n },\n {\n \"validatorId\": \"validation-rule-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_VALIDATION_RULE_CANONICAL\",\n \"description\": \"Validation rule must use canonical metadata shape.\"\n },\n {\n \"validatorId\": \"context-validator-registered\",\n \"level\": \"error\",\n \"code\": \"METADATA_CONTEXT_VALIDATOR_REGISTERED\",\n \"description\": \"Contextual validator must be registered before use.\"\n },\n {\n \"validatorId\": \"context-hint-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_CONTEXT_HINT_CANONICAL\",\n \"description\": \"Context hints must remain structured metadata, not free-form host-only strings.\"\n },\n {\n \"validatorId\": \"context-hint-i18n-compatible\",\n \"level\": \"warning\",\n \"code\": \"METADATA_CONTEXT_HINT_I18N_COMPATIBLE\",\n \"description\": \"Authoring hint text must remain compatible with metadata-editor i18n.\"\n },\n {\n \"validatorId\": \"date-range-shortcuts-static-canonical\",\n \"level\": \"error\",\n \"code\": \"METADATA_DATE_RANGE_SHORTCUTS_STATIC_CANONICAL\",\n \"description\": \"Date range shortcuts must be built-in ids or static backend-resolved ranges with id, label, startDate and endDate.\"\n },\n {\n \"validatorId\": \"date-range-shortcuts-no-executable-metadata\",\n \"level\": \"error\",\n \"code\": \"METADATA_DATE_RANGE_SHORTCUTS_NO_EXECUTABLE_METADATA\",\n \"description\": \"Metadata shortcuts must not contain calculateRange, executable expressions, local calendar-law rules, or frontend business-day logic.\"\n },\n {\n \"validatorId\": \"date-range-shortcuts-unique-ids\",\n \"level\": \"error\",\n \"code\": \"METADATA_DATE_RANGE_SHORTCUTS_UNIQUE_IDS\",\n \"description\": \"Static business shortcuts must use unique ids inside the date range field.\"\n },\n {\n \"validatorId\": \"normalization-preserves-canonical-fields\",\n \"level\": \"error\",\n \"code\": \"METADATA_NORMALIZATION_PRESERVES_FIELDS\",\n \"description\": \"Normalization must not drop canonical advanced FieldMetadata properties.\"\n },\n {\n \"validatorId\": \"runtime-editor-round-trip\",\n \"level\": \"error\",\n \"code\": \"METADATA_RUNTIME_EDITOR_ROUND_TRIP\",\n \"description\": \"Runtime and editor must consume the same normalized metadata shape.\"\n },\n {\n \"validatorId\": \"metadata-round-trip\",\n \"level\": \"error\",\n \"code\": \"METADATA_ROUND_TRIP\",\n \"description\": \"Open, edit, apply/save, reopen and runtime consume must preserve metadata.\"\n }\n ],\n \"roundTripRequirements\": [\n \"FieldMetadata is the canonical edited document shape; backend x-ui-derived metadata must not be rewritten into host-only aliases.\",\n \"Control type changes require both dynamic-fields discovery and metadata-editor visual coverage.\",\n \"Option source cascades preserve x-ui optionSource.dependsOn and optionSource.dependencyFilterMap semantics.\",\n \"Date range business shortcuts are authored as built-in ids or backend-resolved static ranges; browser metadata never carries calculateRange code or business calendar rules.\",\n \"JSON-only support is incomplete when visual editor coverage is required.\",\n \"Schema normalization must preserve advanced canonical properties through open, edit, apply/save, reopen and runtime consumption.\"\n ],\n \"examples\": [\n {\n \"id\": \"set-label\",\n \"request\": \"Set this field label to Customer name.\",\n \"operationId\": \"fieldMetadata.property.set\",\n \"params\": {\n \"path\": \"label\",\n \"value\": \"Customer name\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-control-type\",\n \"request\": \"Change this field to a select control.\",\n \"operationId\": \"controlType.set\",\n \"params\": {\n \"controlType\": \"select\",\n \"preserveCompatibleProperties\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-remote-options\",\n \"request\": \"Load options from the customers resource using id and name.\",\n \"operationId\": \"optionSource.configure\",\n \"params\": {\n \"kind\": \"resource\",\n \"resource\": \"customers\",\n \"valueField\": \"id\",\n \"labelField\": \"name\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-cascade\",\n \"request\": \"Filter city options when state changes.\",\n \"operationId\": \"cascade.configure\",\n \"params\": {\n \"dependentField\": \"city\",\n \"sourceField\": \"state\",\n \"dependencyFilterMap\": {\n \"stateId\": \"state.id\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-renderer\",\n \"request\": \"Expose placeholder in the visual editor as a text field.\",\n \"operationId\": \"renderer.configure\",\n \"params\": {\n \"propertyName\": \"placeholder\",\n \"editorType\": \"text\",\n \"group\": \"Presentation\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-required-validation\",\n \"request\": \"Make this field required with a validation message.\",\n \"operationId\": \"validationRule.add\",\n \"params\": {\n \"rule\": {\n \"type\": \"required\"\n },\n \"message\": \"Required field\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-context-hint\",\n \"request\": \"Add a contextual hint for sales users.\",\n \"operationId\": \"contextHint.set\",\n \"params\": {\n \"hintPath\": \"helpText\",\n \"value\": \"Use the legal customer name.\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-date-range-business-shortcut\",\n \"request\": \"Add a fiscal competence period resolved by the backend to this inline date range.\",\n \"operationId\": \"dateRangeShortcuts.configure\",\n \"params\": {\n \"shortcuts\": [\n \"thisMonth\",\n {\n \"id\": \"competencia-fiscal-marco\",\n \"label\": \"Fiscal competence March\",\n \"startDate\": \"2026-03-01\",\n \"endDate\": \"2026-03-31\",\n \"timeZone\": \"America/Sao_Paulo\",\n \"tone\": \"success\"\n }\n ],\n \"inlineQuickPresets\": {\n \"enabled\": true,\n \"position\": \"start\",\n \"maxVisible\": 4\n },\n \"applyMode\": \"explicit\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-date-range-executable-shortcut\",\n \"request\": \"Add a date range shortcut that calculates fiscal holidays in calculateRange from JSON.\",\n \"operationId\": \"dateRangeShortcuts.configure\",\n \"params\": {\n \"shortcuts\": [\n {\n \"id\": \"legal-days\",\n \"label\": \"Legal days\",\n \"startDate\": \"2026-03-01\",\n \"endDate\": \"2026-03-31\",\n \"calculateRange\": \"() => legalCalendar()\"\n }\n ]\n },\n \"isPositive\": false\n },\n {\n \"id\": \"normalize-seed\",\n \"request\": \"Normalize this imported field metadata while preserving advanced properties.\",\n \"operationId\": \"normalization.apply\",\n \"params\": {\n \"mode\": \"preserve-advanced-properties\",\n \"preserveUnknownCanonicalFields\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unknown-control\",\n \"request\": \"Use an unknown control type named magic-picker.\",\n \"operationId\": \"controlType.set\",\n \"params\": {\n \"controlType\": \"magic-picker\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-json-only-coverage\",\n \"request\": \"Support this field only by editing raw JSON.\",\n \"operationId\": \"renderer.configure\",\n \"params\": {\n \"propertyName\": \"optionSource\",\n \"editorType\": \"json\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-cascade-cycle\",\n \"request\": \"Make field A depend on B and B depend on A.\",\n \"operationId\": \"cascade.configure\",\n \"params\": {\n \"dependentField\": \"a\",\n \"sourceField\": \"b\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-host-only-option-source\",\n \"request\": \"Save a host-only URL string as the option source.\",\n \"operationId\": \"optionSource.configure\",\n \"params\": {\n \"kind\": \"remote\",\n \"endpoint\": \"local-only://options\"\n },\n \"isPositive\": false\n }\n ]\n}",
1529
+ "sourcePointer": "projects/praxis-metadata-editor/src/lib/ai/praxis-metadata-editor-authoring-manifest.ts",
1530
+ "contentHash": "36e19b751364399ea66de39c7b8339429baafa0098cd8d5a48e0e12c0bd34512",
1287
1531
  "sourceKind": "component_definition",
1288
1532
  "sourceId": "praxis-metadata-editor",
1289
1533
  "corpusVersion": "1.0.0"
@@ -1292,7 +1536,7 @@
1292
1536
  "chunkIndex": 2,
1293
1537
  "chunkKind": "recipe",
1294
1538
  "content": "{\n \"_comment\": \"Receita para o Editor de Metadados (FieldMetadata).\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-metadata-editor\",\n \"variantId\": \"base\",\n \"useWhen\": \"Base metadata editor configuration.\",\n \"examplePrompts\": [\n \"configure field metadata editor\",\n \"set up metadata editor preview and permissions\"\n ]\n },\n \"metadata\": {\n \"schema\": {\n \"id\": \"product-schema\",\n \"version\": \"1.0\"\n },\n \"permissions\": {\n \"edit\": [\"admin\"],\n \"view\": [\"user\", \"guest\"]\n },\n \"preview\": {\n \"live\": true,\n \"mode\": \"form\"\n },\n \"fieldDefinitions\": [\n {\n \"name\": \"sku\",\n \"label\": \"SKU\",\n \"controlType\": \"input\",\n \"validationHelpers\": {\n \"mask\": \"AAA-9999\",\n \"regex\": \"^[A-Z]{3}-\\\\d{4}$\"\n }\n },\n {\n \"name\": \"category\",\n \"label\": \"Categoria\",\n \"controlType\": \"select\",\n \"options\": [\"Electronics\", \"Books\"]\n },\n {\n \"name\": \"subcategory\",\n \"label\": \"Subcategoria\",\n \"controlType\": \"select\",\n \"cascades\": [\n {\n \"triggerField\": \"category\",\n \"action\": \"filterOptions\",\n \"endpoint\": \"/api/subcategories?category={category}\"\n }\n ]\n }\n ]\n }\n}\n",
1295
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-field-metadata-editor.json",
1539
+ "sourcePointer": "examples/ai-recipes/praxis-field-metadata-editor.json",
1296
1540
  "contentHash": "0a14f9e033581145b92c9f8c2f5d636f5f5cc13bef7ca5d72189e15086155c27",
1297
1541
  "sourceKind": "component_definition",
1298
1542
  "sourceId": "praxis-metadata-editor",
@@ -5172,25 +5172,30 @@ const dateRangeProperties = [
5172
5172
  { name: 'showShortcuts', label: 'Habilitar atalhos', editorType: 'checkbox', group: 'Atalhos', hint: 'Exibe painel lateral com presets de datas.' },
5173
5173
  {
5174
5174
  name: 'shortcutsPosition', label: 'Posição do painel', editorType: 'select', group: 'Atalhos', options: [
5175
+ { value: 'auto', text: 'Automática' },
5176
+ { value: 'below', text: 'Abaixo' },
5175
5177
  { value: 'left', text: 'Esquerda' },
5176
5178
  { value: 'right', text: 'Direita' },
5177
- ], hint: 'Escolhe em qual lado o painel de atalhos abre.'
5179
+ ], hint: 'Escolhe a posição preferencial do overlay externo de atalhos do dateRange.'
5178
5180
  },
5179
5181
  { name: 'applyOnShortcutClick', label: 'Aplicar ao clicar', editorType: 'checkbox', group: 'Atalhos', hint: 'Compatibilidade legada para atalhos do date-range base. No inlineDateRange, prefira inlineQuickPresetsApplyMode.' },
5180
5182
  {
5181
- name: 'shortcuts', label: 'Atalhos visíveis', editorType: 'select', group: 'Atalhos', multiple: true, options: [
5182
- { value: 'today', text: 'Hoje' },
5183
- { value: 'yesterday', text: 'Ontem' },
5184
- { value: 'thisWeek', text: 'Esta semana' },
5185
- { value: 'lastWeek', text: 'Semana passada' },
5186
- { value: 'thisMonth', text: 'Este mês' },
5187
- { value: 'lastMonth', text: 'Mês passado' },
5188
- { value: 'thisYear', text: 'Este ano' },
5189
- { value: 'lastYear', text: 'Ano passado' },
5190
- ], hint: 'Selecione quais presets mostrar no painel de atalhos.'
5183
+ name: 'shortcuts',
5184
+ label: 'Atalhos visíveis (JSON)',
5185
+ editorType: 'textarea',
5186
+ group: 'Atalhos',
5187
+ hint: 'Array canônico com ids built-in e presets estáticos resolvidos pelo backend. Ex.: ["today", {"id":"periodo-votacao-2026","label":"Período de votação","startDate":"2026-07-06","endDate":"2026-10-04","timeZone":"America/Sao_Paulo","tone":"info"}]. Não informe calculateRange em JSON.'
5191
5188
  },
5192
5189
  { name: 'inlineQuickPresets.enabled', label: 'Atalhos inline', editorType: 'checkbox', group: 'Atalhos', hint: 'Exibe chips rápidos ao lado do campo no modo inlineDateRange.' },
5193
5190
  { name: 'inlineQuickPresets.maxVisible', label: 'Qtd. chips inline', editorType: 'number', group: 'Atalhos', hint: 'Define o número máximo de atalhos inline visíveis (1 a 8).' },
5191
+ {
5192
+ name: 'inlineQuickPresets.position', label: 'Posição inline', editorType: 'select', group: 'Atalhos', options: [
5193
+ { value: 'auto', text: 'Automática' },
5194
+ { value: 'footer', text: 'Rodapé' },
5195
+ { value: 'start', text: 'Início lógico' },
5196
+ { value: 'end', text: 'Fim lógico' },
5197
+ ], hint: 'Define se atalhos inline aparecem no rodapé, início lógico, fim lógico ou em fallback automático.'
5198
+ },
5194
5199
  { name: 'inlineQuickPresetsAriaLabel', label: 'ARIA atalhos inline', editorType: 'text', group: 'Atalhos', hint: 'Rótulo de acessibilidade do grupo de atalhos rápidos inline.' },
5195
5200
  {
5196
5201
  name: 'inlineOverlay.applyMode',
@@ -10348,6 +10353,12 @@ class FieldMetadataEditorComponent {
10348
10353
  patch.links = parsedLinks;
10349
10354
  }
10350
10355
  }
10356
+ if (typeof patch.shortcuts === 'string') {
10357
+ const parsedShortcuts = this.parseArrayTextarea(patch.shortcuts);
10358
+ if (parsedShortcuts) {
10359
+ patch.shortcuts = parsedShortcuts;
10360
+ }
10361
+ }
10351
10362
  this.normalizeEntityLookupPatchValues(patch);
10352
10363
  this.normalizeArrayPatchValues(patch);
10353
10364
  this.normalizePresentationPatchValues(patch);
@@ -11867,6 +11878,20 @@ const BASE_CAPABILITIES = [
11867
11878
  description: 'Ordered Json Logic presentation rules edited by a guided builder for common conditions and semantic visual effects.',
11868
11879
  safetyNotes: 'Rules may only affect tone, icon, label, badge, appearance and tooltip; they must not mutate submitted values or execute commands.',
11869
11880
  },
11881
+ {
11882
+ path: 'seed.shortcuts',
11883
+ category: 'behavior',
11884
+ valueKind: 'array',
11885
+ description: 'Canonical dateRange/inlineDateRange shortcut catalog with built-in ids and backend-resolved static business periods.',
11886
+ safetyNotes: 'Use dateRangeShortcuts.configure; JSON metadata must not contain calculateRange, executable expressions, fiscal/legal/electoral rules, holiday rules, or business-day counting logic.',
11887
+ },
11888
+ {
11889
+ path: 'seed.inlineQuickPresets.position',
11890
+ category: 'layout',
11891
+ valueKind: 'enum',
11892
+ allowedValues: ['auto', 'footer', 'start', 'end'],
11893
+ description: 'Logical placement for inline date range quick presets, with runtime fallback for narrow/touch layouts.',
11894
+ },
11870
11895
  ];
11871
11896
  const METADATA_EDITOR_AI_CAPABILITY_CATALOG = {
11872
11897
  version: '1.0.0',
@@ -11984,6 +12009,48 @@ const cascadeSchema = {
11984
12009
  },
11985
12010
  },
11986
12011
  };
12012
+ const staticDateRangeShortcutSchema = {
12013
+ type: 'object',
12014
+ required: ['id', 'label', 'startDate', 'endDate'],
12015
+ additionalProperties: false,
12016
+ properties: {
12017
+ id: { type: 'string', minLength: 1 },
12018
+ label: { type: 'string', minLength: 1 },
12019
+ startDate: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
12020
+ endDate: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
12021
+ timeZone: { type: 'string' },
12022
+ icon: { type: 'string' },
12023
+ description: { type: 'string' },
12024
+ tone: { enum: ['neutral', 'info', 'success', 'warning'] },
12025
+ effectiveFrom: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
12026
+ effectiveTo: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
12027
+ order: { type: 'number' },
12028
+ },
12029
+ };
12030
+ const dateRangeShortcutsSchema = {
12031
+ type: 'object',
12032
+ required: ['shortcuts'],
12033
+ properties: {
12034
+ shortcuts: {
12035
+ type: 'array',
12036
+ items: {
12037
+ anyOf: [
12038
+ { enum: ['today', 'yesterday', 'thisWeek', 'lastWeek', 'thisMonth', 'lastMonth', 'thisYear', 'lastYear'] },
12039
+ staticDateRangeShortcutSchema,
12040
+ ],
12041
+ },
12042
+ },
12043
+ inlineQuickPresets: {
12044
+ type: 'object',
12045
+ properties: {
12046
+ enabled: { type: 'boolean' },
12047
+ maxVisible: { type: 'number' },
12048
+ position: { enum: ['auto', 'footer', 'start', 'end'] },
12049
+ },
12050
+ },
12051
+ applyMode: { enum: ['auto', 'explicit'] },
12052
+ },
12053
+ };
11987
12054
  const PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST = {
11988
12055
  schemaVersion: '1.0.0',
11989
12056
  componentId: 'praxis-metadata-editor',
@@ -12004,6 +12071,7 @@ const PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST = {
12004
12071
  { kind: 'cascade', resolver: 'metadata-editor-cascade-rules', description: 'Cascade dependencies and dependency filter mappings edited through CascadeManagerTab.' },
12005
12072
  { kind: 'renderer', resolver: 'metadata-editor-renderer-property', description: 'Dynamic editor renderer property coverage and editor component mapping.' },
12006
12073
  { kind: 'validation', resolver: 'field-metadata-validation-rules', description: 'Field validation rules and contextual validators.' },
12074
+ { kind: 'dateRangeShortcuts', resolver: 'metadata-editor-date-range-shortcut-catalog', description: 'Governed static date range shortcut catalog for dateRange and inlineDateRange metadata.' },
12007
12075
  { kind: 'contextHint', resolver: 'metadata-editor-context-hints', description: 'Authoring hints, help text and contextual guidance for metadata editors.' },
12008
12076
  { kind: 'normalization', resolver: 'metadata-editor-schema-normalizer', description: 'Schema normalization and seed hydration rules.' },
12009
12077
  ],
@@ -12195,6 +12263,28 @@ const PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST = {
12195
12263
  submissionImpact: 'visual-only',
12196
12264
  preconditions: ['field-metadata-loaded'],
12197
12265
  },
12266
+ {
12267
+ operationId: 'dateRangeShortcuts.configure',
12268
+ title: 'Configure governed date range shortcuts',
12269
+ scope: 'fieldMetadataPath',
12270
+ targetKind: 'dateRangeShortcuts',
12271
+ target: { kind: 'dateRangeShortcuts', resolver: 'metadata-editor-date-range-shortcut-catalog', ambiguityPolicy: 'fail', required: false },
12272
+ inputSchema: dateRangeShortcutsSchema,
12273
+ effects: [{ kind: 'compile-domain-patch', handler: 'metadata-date-range-shortcuts-configure', handlerContract: {
12274
+ reads: ['fieldMetadata.controlType', 'fieldMetadata.shortcuts', 'fieldMetadata.inlineQuickPresets', 'fieldMetadata.inlineOverlay', 'ConfigRegistryService'],
12275
+ writes: ['fieldMetadata.shortcuts', 'fieldMetadata.inlineQuickPresets', 'fieldMetadata.inlineOverlay.applyMode'],
12276
+ identityKeys: ['field.name', 'shortcuts[].id'],
12277
+ inputSchema: dateRangeShortcutsSchema,
12278
+ failureModes: ['control-type-not-date-range', 'duplicate-shortcut-id', 'invalid-static-date-range-shortcut', 'unsupported-shortcut-tone', 'executable-shortcut-metadata'],
12279
+ description: 'Configures built-in and backend-resolved static date range shortcuts through the canonical shortcuts array; JSON metadata may not contain calculateRange or executable expressions.',
12280
+ } }],
12281
+ destructive: false,
12282
+ requiresConfirmation: false,
12283
+ validators: ['date-range-shortcuts-static-canonical', 'date-range-shortcuts-no-executable-metadata', 'date-range-shortcuts-unique-ids', 'metadata-round-trip'],
12284
+ affectedPaths: ['fieldMetadata.shortcuts', 'fieldMetadata.inlineQuickPresets', 'fieldMetadata.inlineOverlay.applyMode'],
12285
+ submissionImpact: 'affects-schema-backed-data',
12286
+ preconditions: ['field-metadata-loaded', 'editor-properties-loaded'],
12287
+ },
12198
12288
  {
12199
12289
  operationId: 'normalization.apply',
12200
12290
  title: 'Apply schema normalization',
@@ -12240,6 +12330,9 @@ const PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST = {
12240
12330
  { validatorId: 'context-validator-registered', level: 'error', code: 'METADATA_CONTEXT_VALIDATOR_REGISTERED', description: 'Contextual validator must be registered before use.' },
12241
12331
  { validatorId: 'context-hint-shape-canonical', level: 'error', code: 'METADATA_CONTEXT_HINT_CANONICAL', description: 'Context hints must remain structured metadata, not free-form host-only strings.' },
12242
12332
  { validatorId: 'context-hint-i18n-compatible', level: 'warning', code: 'METADATA_CONTEXT_HINT_I18N_COMPATIBLE', description: 'Authoring hint text must remain compatible with metadata-editor i18n.' },
12333
+ { validatorId: 'date-range-shortcuts-static-canonical', level: 'error', code: 'METADATA_DATE_RANGE_SHORTCUTS_STATIC_CANONICAL', description: 'Date range shortcuts must be built-in ids or static backend-resolved ranges with id, label, startDate and endDate.' },
12334
+ { validatorId: 'date-range-shortcuts-no-executable-metadata', level: 'error', code: 'METADATA_DATE_RANGE_SHORTCUTS_NO_EXECUTABLE_METADATA', description: 'Metadata shortcuts must not contain calculateRange, executable expressions, local calendar-law rules, or frontend business-day logic.' },
12335
+ { validatorId: 'date-range-shortcuts-unique-ids', level: 'error', code: 'METADATA_DATE_RANGE_SHORTCUTS_UNIQUE_IDS', description: 'Static business shortcuts must use unique ids inside the date range field.' },
12243
12336
  { validatorId: 'normalization-preserves-canonical-fields', level: 'error', code: 'METADATA_NORMALIZATION_PRESERVES_FIELDS', description: 'Normalization must not drop canonical advanced FieldMetadata properties.' },
12244
12337
  { validatorId: 'runtime-editor-round-trip', level: 'error', code: 'METADATA_RUNTIME_EDITOR_ROUND_TRIP', description: 'Runtime and editor must consume the same normalized metadata shape.' },
12245
12338
  { validatorId: 'metadata-round-trip', level: 'error', code: 'METADATA_ROUND_TRIP', description: 'Open, edit, apply/save, reopen and runtime consume must preserve metadata.' },
@@ -12248,6 +12341,7 @@ const PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST = {
12248
12341
  'FieldMetadata is the canonical edited document shape; backend x-ui-derived metadata must not be rewritten into host-only aliases.',
12249
12342
  'Control type changes require both dynamic-fields discovery and metadata-editor visual coverage.',
12250
12343
  'Option source cascades preserve x-ui optionSource.dependsOn and optionSource.dependencyFilterMap semantics.',
12344
+ 'Date range business shortcuts are authored as built-in ids or backend-resolved static ranges; browser metadata never carries calculateRange code or business calendar rules.',
12251
12345
  'JSON-only support is incomplete when visual editor coverage is required.',
12252
12346
  'Schema normalization must preserve advanced canonical properties through open, edit, apply/save, reopen and runtime consumption.',
12253
12347
  ],
@@ -12259,6 +12353,8 @@ const PRAXIS_METADATA_EDITOR_AUTHORING_MANIFEST = {
12259
12353
  { id: 'configure-renderer', request: 'Expose placeholder in the visual editor as a text field.', operationId: 'renderer.configure', params: { propertyName: 'placeholder', editorType: 'text', group: 'Presentation' }, isPositive: true },
12260
12354
  { id: 'add-required-validation', request: 'Make this field required with a validation message.', operationId: 'validationRule.add', params: { rule: { type: 'required' }, message: 'Required field' }, isPositive: true },
12261
12355
  { id: 'set-context-hint', request: 'Add a contextual hint for sales users.', operationId: 'contextHint.set', params: { hintPath: 'helpText', value: 'Use the legal customer name.' }, isPositive: true },
12356
+ { id: 'configure-date-range-business-shortcut', request: 'Add a fiscal competence period resolved by the backend to this inline date range.', operationId: 'dateRangeShortcuts.configure', params: { shortcuts: ['thisMonth', { id: 'competencia-fiscal-marco', label: 'Fiscal competence March', startDate: '2026-03-01', endDate: '2026-03-31', timeZone: 'America/Sao_Paulo', tone: 'success' }], inlineQuickPresets: { enabled: true, position: 'start', maxVisible: 4 }, applyMode: 'explicit' }, isPositive: true },
12357
+ { id: 'reject-date-range-executable-shortcut', request: 'Add a date range shortcut that calculates fiscal holidays in calculateRange from JSON.', operationId: 'dateRangeShortcuts.configure', params: { shortcuts: [{ id: 'legal-days', label: 'Legal days', startDate: '2026-03-01', endDate: '2026-03-31', calculateRange: '() => legalCalendar()' }] }, isPositive: false },
12262
12358
  { id: 'normalize-seed', request: 'Normalize this imported field metadata while preserving advanced properties.', operationId: 'normalization.apply', params: { mode: 'preserve-advanced-properties', preserveUnknownCanonicalFields: true }, isPositive: true },
12263
12359
  { id: 'reject-unknown-control', request: 'Use an unknown control type named magic-picker.', operationId: 'controlType.set', params: { controlType: 'magic-picker' }, isPositive: false },
12264
12360
  { id: 'reject-json-only-coverage', request: 'Support this field only by editing raw JSON.', operationId: 'renderer.configure', params: { propertyName: 'optionSource', editorType: 'json' }, isPositive: false },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/metadata-editor",
3
- "version": "9.0.0-beta.70",
3
+ "version": "9.0.0-beta.72",
4
4
  "description": "Metadata editor for Praxis UI fields and components with runtime integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -8,10 +8,10 @@
8
8
  "@angular/cdk": "^21.0.0",
9
9
  "@angular/forms": "^21.0.0",
10
10
  "@angular/material": "^21.0.0",
11
- "@praxisui/ai": "^9.0.0-beta.70",
12
- "@praxisui/core": "^9.0.0-beta.70",
13
- "@praxisui/dynamic-fields": "^9.0.0-beta.70",
14
- "@praxisui/settings-panel": "^9.0.0-beta.70",
11
+ "@praxisui/ai": "^9.0.0-beta.72",
12
+ "@praxisui/core": "^9.0.0-beta.72",
13
+ "@praxisui/dynamic-fields": "^9.0.0-beta.72",
14
+ "@praxisui/settings-panel": "^9.0.0-beta.72",
15
15
  "rxjs": "~7.8.0"
16
16
  },
17
17
  "dependencies": {