@praxisui/core 9.0.0-beta.17 → 9.0.0-beta.19

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-06-24T15:54:00.036Z",
3
+ "generatedAt": "2026-06-24T23:02:12.024Z",
4
4
  "packageName": "@praxisui/core",
5
- "packageVersion": "9.0.0-beta.17",
5
+ "packageVersion": "9.0.0-beta.19",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -453,7 +453,7 @@
453
453
  },
454
454
  "praxis-dynamic-page": {
455
455
  "id": "praxis-dynamic-page",
456
- "description": "Pagina dinamica com widgets e composition.links em layout responsivo, incluindo mediacao runtime para rich-content hospedado.",
456
+ "description": "Página dinâmica com widgets e composition.links em layout responsivo, incluindo mediação runtime para rich-content hospedado.",
457
457
  "category": "page",
458
458
  "inputs": [
459
459
  {
@@ -1167,25 +1167,25 @@
1167
1167
  "path": "page.layoutPreset",
1168
1168
  "category": "layout",
1169
1169
  "valueKind": "string",
1170
- "description": "ID canonico opcional do preset estrutural da pagina."
1170
+ "description": "ID canônico opcional do preset estrutural da página."
1171
1171
  },
1172
1172
  {
1173
1173
  "path": "page.layoutPresetOptions",
1174
1174
  "category": "layout",
1175
1175
  "valueKind": "object",
1176
- "description": "Opcoes especificas do preset estrutural consumidas por builders e runtimes futuros."
1176
+ "description": "Opções específicas do preset estrutural consumidas por builders e runtimes futuros."
1177
1177
  },
1178
1178
  {
1179
1179
  "path": "page.themePreset",
1180
1180
  "category": "appearance",
1181
1181
  "valueKind": "string",
1182
- "description": "ID opcional do preset de tema para shell, graficos, densidade e defaults visuais."
1182
+ "description": "ID opcional do preset de tema para shell, gráficos, densidade e defaults visuais."
1183
1183
  },
1184
1184
  {
1185
1185
  "path": "page.layout",
1186
1186
  "category": "layout",
1187
1187
  "valueKind": "object",
1188
- "description": "Layout base da pagina."
1188
+ "description": "Layout base da página."
1189
1189
  },
1190
1190
  {
1191
1191
  "path": "page.layout.orientation",
@@ -1265,25 +1265,25 @@
1265
1265
  "path": "page.canvas.items.<widgetKey>.constraints.minColSpan",
1266
1266
  "category": "layout",
1267
1267
  "valueKind": "number",
1268
- "description": "Span minimo de colunas permitido."
1268
+ "description": "Span mínimo de colunas permitido."
1269
1269
  },
1270
1270
  {
1271
1271
  "path": "page.canvas.items.<widgetKey>.constraints.minRowSpan",
1272
1272
  "category": "layout",
1273
1273
  "valueKind": "number",
1274
- "description": "Span minimo de linhas permitido."
1274
+ "description": "Span mínimo de linhas permitido."
1275
1275
  },
1276
1276
  {
1277
1277
  "path": "page.canvas.items.<widgetKey>.constraints.maxColSpan",
1278
1278
  "category": "layout",
1279
1279
  "valueKind": "number",
1280
- "description": "Span maximo de colunas permitido."
1280
+ "description": "Span máximo de colunas permitido."
1281
1281
  },
1282
1282
  {
1283
1283
  "path": "page.canvas.items.<widgetKey>.constraints.maxRowSpan",
1284
1284
  "category": "layout",
1285
1285
  "valueKind": "number",
1286
- "description": "Span maximo de linhas permitido."
1286
+ "description": "Span máximo de linhas permitido."
1287
1287
  },
1288
1288
  {
1289
1289
  "path": "page.canvas.items.<widgetKey>.constraints.lockPosition",
@@ -1301,31 +1301,31 @@
1301
1301
  "path": "page.widgets[].definition.inputs.hostCapabilities",
1302
1302
  "category": "widgets",
1303
1303
  "valueKind": "object",
1304
- "description": "Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Nao pertence ao JSON persistido."
1304
+ "description": "Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Não pertence ao JSON persistido."
1305
1305
  },
1306
1306
  {
1307
1307
  "path": "page.widgets[].definition.inputs.hostCapabilities.dispatchAction",
1308
1308
  "category": "widgets",
1309
1309
  "valueKind": "object",
1310
- "description": "Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na pagina."
1310
+ "description": "Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na página."
1311
1311
  },
1312
1312
  {
1313
1313
  "path": "page.widgets[].definition.inputs.hostCapabilities.isActionAvailable",
1314
1314
  "category": "widgets",
1315
1315
  "valueKind": "object",
1316
- "description": "Resolver runtime de disponibilidade de actionId para rich content hospedado na pagina."
1316
+ "description": "Resolver runtime de disponibilidade de actionId para rich content hospedado na página."
1317
1317
  },
1318
1318
  {
1319
1319
  "path": "page.widgets[].definition.inputs.hostCapabilities.hasCapability",
1320
1320
  "category": "widgets",
1321
1321
  "valueKind": "object",
1322
- "description": "Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na pagina."
1322
+ "description": "Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na página."
1323
1323
  },
1324
1324
  {
1325
1325
  "path": "page.widgets[].shell",
1326
1326
  "category": "shell",
1327
1327
  "valueKind": "object",
1328
- "description": "Configuracao do shell do widget."
1328
+ "description": "Configuração do shell do widget."
1329
1329
  },
1330
1330
  {
1331
1331
  "path": "page.widgets[].shell.kind",
@@ -1341,19 +1341,19 @@
1341
1341
  "path": "page.widgets[].shell.title",
1342
1342
  "category": "shell",
1343
1343
  "valueKind": "string",
1344
- "description": "Titulo do shell."
1344
+ "description": "Título do shell."
1345
1345
  },
1346
1346
  {
1347
1347
  "path": "page.widgets[].shell.subtitle",
1348
1348
  "category": "shell",
1349
1349
  "valueKind": "string",
1350
- "description": "Subtitulo do shell."
1350
+ "description": "Subtítulo do shell."
1351
1351
  },
1352
1352
  {
1353
1353
  "path": "page.widgets[].shell.icon",
1354
1354
  "category": "shell",
1355
1355
  "valueKind": "string",
1356
- "description": "Icone do shell."
1356
+ "description": "Ícone do shell."
1357
1357
  },
1358
1358
  {
1359
1359
  "path": "page.widgets[].shell.showHeader",
@@ -1365,25 +1365,25 @@
1365
1365
  "path": "page.widgets[].shell.actions",
1366
1366
  "category": "shell",
1367
1367
  "valueKind": "array",
1368
- "description": "Acoes do shell."
1368
+ "description": "Ações do shell."
1369
1369
  },
1370
1370
  {
1371
1371
  "path": "page.widgets[].shell.actions[].id",
1372
1372
  "category": "shell",
1373
1373
  "valueKind": "string",
1374
- "description": "ID da acao."
1374
+ "description": "ID da ação."
1375
1375
  },
1376
1376
  {
1377
1377
  "path": "page.widgets[].shell.actions[].label",
1378
1378
  "category": "shell",
1379
1379
  "valueKind": "string",
1380
- "description": "Label da acao."
1380
+ "description": "Label da ação."
1381
1381
  },
1382
1382
  {
1383
1383
  "path": "page.widgets[].shell.actions[].icon",
1384
1384
  "category": "shell",
1385
1385
  "valueKind": "string",
1386
- "description": "Icone da acao."
1386
+ "description": "Ícone da ação."
1387
1387
  },
1388
1388
  {
1389
1389
  "path": "page.widgets[].shell.actions[].variant",
@@ -1394,7 +1394,7 @@
1394
1394
  "text",
1395
1395
  "outlined"
1396
1396
  ],
1397
- "description": "Estilo visual da acao."
1397
+ "description": "Estilo visual da ação."
1398
1398
  },
1399
1399
  {
1400
1400
  "path": "page.widgets[].shell.actions[].placement",
@@ -1404,13 +1404,13 @@
1404
1404
  "header",
1405
1405
  "window"
1406
1406
  ],
1407
- "description": "Posicionamento da acao."
1407
+ "description": "Posicionamento da ação."
1408
1408
  },
1409
1409
  {
1410
1410
  "path": "page.widgets[].shell.actions[].emit",
1411
1411
  "category": "shell",
1412
1412
  "valueKind": "string",
1413
- "description": "Evento emitido ao acionar a acao."
1413
+ "description": "Evento emitido ao acionar a ação."
1414
1414
  },
1415
1415
  {
1416
1416
  "path": "page.state.schema.<token>.type",
@@ -1428,7 +1428,7 @@
1428
1428
  "path": "page.state.schema.<token>.persist",
1429
1429
  "category": "state",
1430
1430
  "valueKind": "boolean",
1431
- "description": "Indica se o path primario deve ser persistido com a pagina."
1431
+ "description": "Indica se o path primário deve ser persistido com a página."
1432
1432
  },
1433
1433
  {
1434
1434
  "path": "page.state.schema.<token>.mergeStrategy",
@@ -1446,7 +1446,7 @@
1446
1446
  "path": "page.state.schema.<token>.description",
1447
1447
  "category": "state",
1448
1448
  "valueKind": "string",
1449
- "description": "Descricao opcional do path para builders e catalogos AI."
1449
+ "description": "Descrição opcional do path para builders e catálogos AI."
1450
1450
  },
1451
1451
  {
1452
1452
  "path": "page.state.schema.<token>.tags",
@@ -1500,7 +1500,7 @@
1500
1500
  "path": "page.state.derived.<token>.compute.options",
1501
1501
  "category": "state",
1502
1502
  "valueKind": "object",
1503
- "description": "Opcoes do operador ou transformer."
1503
+ "description": "Opções do operador ou transformer."
1504
1504
  },
1505
1505
  {
1506
1506
  "path": "page.state.derived.<token>.compute.transformerId",
@@ -1512,7 +1512,7 @@
1512
1512
  "path": "page.state.derived.<token>.description",
1513
1513
  "category": "state",
1514
1514
  "valueKind": "string",
1515
- "description": "Descricao opcional do estado derivado."
1515
+ "description": "Descrição opcional do estado derivado."
1516
1516
  },
1517
1517
  {
1518
1518
  "path": "page.state.derived.<token>.cache",
@@ -1566,7 +1566,7 @@
1566
1566
  "path": "page.composition.links[].from.ref.nestedPath[].index",
1567
1567
  "category": "connections",
1568
1568
  "valueKind": "number",
1569
- "description": "Indice auxiliar para diagnostico visual; nao use como identidade primaria."
1569
+ "description": "Índice auxiliar para diagnóstico visual; não use como identidade primária."
1570
1570
  },
1571
1571
  {
1572
1572
  "path": "page.composition.links[].from.ref.nestedPath[].componentType",
@@ -1614,7 +1614,7 @@
1614
1614
  "path": "page.composition.links[].to.ref.nestedPath[].index",
1615
1615
  "category": "connections",
1616
1616
  "valueKind": "number",
1617
- "description": "Indice auxiliar para diagnostico visual; nao use como identidade primaria."
1617
+ "description": "Índice auxiliar para diagnóstico visual; não use como identidade primária."
1618
1618
  },
1619
1619
  {
1620
1620
  "path": "page.composition.links[].to.ref.nestedPath[].componentType",
@@ -1847,15 +1847,15 @@
1847
1847
  "Nao gere links nested via owner.widgetEvent, bindingPath profundo, page.connections ou wrappers host-specific. widgetEvent e bridge legada/avancada, nao contrato principal de authoring.",
1848
1848
  "Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.",
1849
1849
  "pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.",
1850
- "Este catalogo e especifico para o runtime praxis-dynamic-page; operacoes de authoring/mutacao pertencem ao manifesto do praxis-page-builder.",
1850
+ "Este catálogo é específico para o runtime praxis-dynamic-page; operações de authoring/mutação pertencem ao manifesto do praxis-page-builder.",
1851
1851
  "WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.",
1852
1852
  "Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.",
1853
- "page.canvas.items e um mapa por widget key; nao modele canvas.items como array.",
1854
- "Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; nao trate ambos como a mesma \"expression\".",
1853
+ "page.canvas.items é um mapa por widget key; não modele canvas.items como array.",
1854
+ "Taxonomia editorial: condition usa Json Logic canônico; transform usa pipeline declarativo; não trate ambos como a mesma \"expression\".",
1855
1855
  "Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.",
1856
1856
  "Para renomear um link, inclua {_beforeKey:\"link-id-anterior\"} no item.",
1857
- "Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmacao.",
1858
- "Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; nao serialize funcoes nem tente persistir page.widgets[].definition.inputs.hostCapabilities.",
1857
+ "Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmação.",
1858
+ "Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; não serialize funções nem tente persistir page.widgets[].definition.inputs.hostCapabilities.",
1859
1859
  "Use ids estaveis para links e keys estaveis para widgets.",
1860
1860
  "Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.",
1861
1861
  "Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).",
@@ -1895,7 +1895,7 @@
1895
1895
  },
1896
1896
  {
1897
1897
  "value": "content",
1898
- "label": "Conteudo"
1898
+ "label": "Conteúdo"
1899
1899
  }
1900
1900
  ]
1901
1901
  },
@@ -2036,7 +2036,7 @@
2036
2036
  "options": [
2037
2037
  {
2038
2038
  "value": "icon",
2039
- "label": "Icone"
2039
+ "label": "Ícone"
2040
2040
  },
2041
2041
  {
2042
2042
  "value": "text",
@@ -2097,7 +2097,7 @@
2097
2097
  },
2098
2098
  {
2099
2099
  "value": "rowAction",
2100
- "label": "Acao da linha (praxis-table)"
2100
+ "label": "Ação da linha (praxis-table)"
2101
2101
  },
2102
2102
  {
2103
2103
  "value": "formSubmit",
@@ -2124,7 +2124,7 @@
2124
2124
  "options": [
2125
2125
  {
2126
2126
  "value": "payload.row.id",
2127
- "label": "ID padrao do registro",
2127
+ "label": "ID padrão do registro",
2128
2128
  "example": "rowClick -> resourceId"
2129
2129
  }
2130
2130
  ]
@@ -2605,7 +2605,7 @@
2605
2605
  "type": "STRING"
2606
2606
  }
2607
2607
  ],
2608
- "safetyNotes": "Use transform pick-path payload.row.id para master-detail padrao.",
2608
+ "safetyNotes": "Use transform pick-path payload.row.id para master-detail padrão.",
2609
2609
  "patchTemplate": {
2610
2610
  "page": {
2611
2611
  "composition": {
@@ -2679,7 +2679,7 @@
2679
2679
  "type": "STRING"
2680
2680
  }
2681
2681
  ],
2682
- "safetyNotes": "Padrao master-detail: rowClick -> resourceId com transform pick-path payload.row.id.",
2682
+ "safetyNotes": "Padrão master-detail: rowClick -> resourceId com transform pick-path payload.row.id.",
2683
2683
  "patchTemplate": {
2684
2684
  "page": {
2685
2685
  "composition": {
@@ -2735,9 +2735,9 @@
2735
2735
  {
2736
2736
  "id": "page.template.applyMasterDetail",
2737
2737
  "intentExamples": [
2738
- "criar pagina master detail",
2738
+ "criar página master detail",
2739
2739
  "setup master detail",
2740
- "tabela e formulario",
2740
+ "tabela e formulário",
2741
2741
  "master-detail"
2742
2742
  ],
2743
2743
  "operation": "create",
@@ -2757,7 +2757,7 @@
2757
2757
  "type": "STRING"
2758
2758
  }
2759
2759
  ],
2760
- "safetyNotes": "Padrao master-detail: tabela (rowClick) -> formulario (resourceId) com transform pick-path payload.row.id.",
2760
+ "safetyNotes": "Padrão master-detail: tabela (rowClick) -> formulario (resourceId) com transform pick-path payload.row.id.",
2761
2761
  "patchTemplate": {
2762
2762
  "page": {
2763
2763
  "widgets": [
@@ -2858,30 +2858,30 @@
2858
2858
  },
2859
2859
  "hints": [
2860
2860
  "praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.",
2861
- "Mutacoes agentic de pagina pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.",
2861
+ "Mutações agentic de página pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.",
2862
2862
  "WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.",
2863
- "page.canvas.items e um mapa por widget key, nao um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.",
2863
+ "page.canvas.items é um mapa por widget key, não um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.",
2864
2864
  "Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).",
2865
- "Preferir mudancas incrementais: alterar/estender em vez de substituir toda a pagina.",
2865
+ "Preferir mudanças incrementais: alterar/estender em vez de substituir toda a página.",
2866
2866
  "Para remover um item, envie {_remove: true} junto ao widget/link.",
2867
2867
  "Para substituir um item inteiro, envie {_replace: true}.",
2868
2868
  "Para alterar origem/destino de link, use {_beforeKey} com o id antigo.",
2869
2869
  "Use keys estaveis para widgets e ids estaveis para links ao criar composicoes.",
2870
2870
  "resourcePath sempre e o path base do recurso (sem /filter, /all).",
2871
- "Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns nao forem definidas.",
2872
- "Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config nao for definida.",
2873
- "Quando um widget praxis-rich-content estiver hospedado na pagina, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.",
2871
+ "Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns não forem definidas.",
2872
+ "Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config não for definida.",
2873
+ "Quando um widget praxis-rich-content estiver hospedado na página, definition.inputs.document continua sendo o contrato persistido; hostCapabilities é injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.",
2874
2874
  "Praxis List pode filtrar via config.dataSource.query (enviado para /filter).",
2875
2875
  "Quando houver recursos secundarios (ex.: enderecos), use contextHints.addressResourcePath.",
2876
2876
  "Exemplo master-detail: tabela emite rowClick -> form.resourceId via transform pick-path payload.row.id.",
2877
2877
  "Pattern Master-Detail: { \"id\":\"master.rowClick->detail.resourceId\", \"from\":{\"kind\":\"component-port\",\"ref\":{\"port\":\"rowClick\",\"direction\":\"output\"}}, \"to\":{\"kind\":\"component-port\",\"ref\":{\"port\":\"resourceId\",\"direction\":\"input\"}}, \"transform\":{\"steps\":[{\"kind\":\"pick-path\",\"config\":{\"path\":\"payload.row.id\"}}]}}",
2878
2878
  "Ao criar widgets, use inputs minimos e complemente depois (evite inventar campos).",
2879
2879
  "Quando widgets ja existem, interpretar ports de origem/destino antes de conectar.",
2880
- "Intencao comum: criar pagina master-detail = criar tabela + criar formulario + conectar selecao via composition.links.",
2881
- "Intencao comum: ajustar pagina existente = modificar apenas widgets/inputs necessarios.",
2880
+ "Intenção comum: criar página master-detail = criar tabela + criar formulário + conectar seleção via composition.links.",
2881
+ "Intenção comum: ajustar página existente = modificar apenas widgets/inputs necessários.",
2882
2882
  "Exemplo de link canonico (master-detail): { id:\"masterTable.rowClick->detailForm.resourceId\", from:{kind:\"component-port\",ref:{widget:\"masterTable\",port:\"rowClick\",direction:\"output\"}}, to:{kind:\"component-port\",ref:{widget:\"detailForm\",port:\"resourceId\",direction:\"input\"}}, intent:\"event-propagation\", transform:{version:\"2.0\",phase:\"link-propagation\",mode:\"single-value\",steps:[{kind:\"pick-path\",phase:\"link-propagation\",input:{source:\"event\"},config:{path:\"payload.row.id\"}}]}}",
2883
- "Exemplo de widget tabela (minimo): { key:\"masterTable\", definition:{ id:\"praxis-table\", inputs:{ resourcePath:\"/api/x\" }}}",
2884
- "Exemplo de widget formulario (minimo): { key:\"detailForm\", definition:{ id:\"praxis-dynamic-form\", inputs:{ resourcePath:\"/api/x\", mode:\"view\" }}}",
2883
+ "Exemplo de widget tabela (mínimo): { key:\"masterTable\", definition:{ id:\"praxis-table\", inputs:{ resourcePath:\"/api/x\" }}}",
2884
+ "Exemplo de widget formulário (mínimo): { key:\"detailForm\", definition:{ id:\"praxis-dynamic-form\", inputs:{ resourcePath:\"/api/x\", mode:\"view\" }}}",
2885
2885
  "Se houver idField conhecido, use transform pick-path payload.row.{idField} em links canonicos."
2886
2886
  ]
2887
2887
  },
@@ -2889,9 +2889,9 @@
2889
2889
  {
2890
2890
  "chunkIndex": 0,
2891
2891
  "chunkKind": "summary",
2892
- "content": "Component ID: praxis-dynamic-page\nSelector: praxis-dynamic-page\nFriendly Name: Dynamic Page\nDescription: Pagina dinamica com widgets e composition.links em layout responsivo, incluindo mediacao runtime para rich-content hospedado.\nCategory: page\nLib/Package: @praxisui/core\nTags: widget, page, dynamic, layout\nInputs:\n - page (WidgetPageDefinition)\n - context (Record<string, any>)\n - strictValidation (boolean)\n - enableCustomization (boolean)\n - showPageSettingsButton (boolean)\n - shellEditorComponent (Type<any>)\n - pageEditorComponent (Type<any>)\n - autoPersist (boolean)\n - pageIdentity (PageIdentity)\n - componentInstanceId (string)\nOutputs:\n - pageChange (WidgetPageDefinition)\n - widgetEvent (WidgetEventEnvelope)\n - widgetDiagnosticsChange (Record<string, WidgetResolutionDiagnostic>)\n",
2892
+ "content": "Component ID: praxis-dynamic-page\nSelector: praxis-dynamic-page\nFriendly Name: Dynamic Page\nDescription: Página dinâmica com widgets e composition.links em layout responsivo, incluindo mediação runtime para rich-content hospedado.\nCategory: page\nLib/Package: @praxisui/core\nTags: widget, page, dynamic, layout\nInputs:\n - page (WidgetPageDefinition)\n - context (Record<string, any>)\n - strictValidation (boolean)\n - enableCustomization (boolean)\n - showPageSettingsButton (boolean)\n - shellEditorComponent (Type<any>)\n - pageEditorComponent (Type<any>)\n - autoPersist (boolean)\n - pageIdentity (PageIdentity)\n - componentInstanceId (string)\nOutputs:\n - pageChange (WidgetPageDefinition)\n - widgetEvent (WidgetEventEnvelope)\n - widgetDiagnosticsChange (Record<string, WidgetResolutionDiagnostic>)\n",
2893
2893
  "sourcePointer": "praxis-ui-angular/projects/praxis-core/src/lib/widgets/dynamic-widget-page.metadata.ts",
2894
- "contentHash": "23b76ca93bbdd9d75bf248746bc66f363d016bf012286c02441a284bafdf5270",
2894
+ "contentHash": "7575dbf241f37111a9acc2367fc82ced61f9ddf28586125b3a3b346d35a1fb7a",
2895
2895
  "sourceKind": "component_definition",
2896
2896
  "sourceId": "praxis-dynamic-page",
2897
2897
  "corpusVersion": "1.0.0"
@@ -2899,9 +2899,9 @@
2899
2899
  {
2900
2900
  "chunkIndex": 1,
2901
2901
  "chunkKind": "capabilities",
2902
- "content": "Component Capabilities:\n - Path: uiCompositionPlan\n Category: page\n Kind: object\n Description: Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.\n - Path: uiCompositionPlan.version\n Category: page\n Kind: string\n Description: Versao do plano. Valor atual: 1.0.\n - Path: uiCompositionPlan.kind\n Category: page\n Kind: string\n Description: Discriminador do plano. Valor atual: praxis.ui-composition-plan.\n - Path: uiCompositionPlan.layoutPreset\n Category: layout\n Kind: string\n Description: Preset semantico opcional da composicao planejada.\n - Path: uiCompositionPlan.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.\n - Path: uiCompositionPlan.grouping\n Category: layout\n Kind: array\n Description: Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.\n - Path: uiCompositionPlan.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa opcional widgetKey -> slot semantico para alinhar widgets gerados a presets de layout sem depender de dominio.\n - Path: uiCompositionPlan.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes responsivas opcionais para desktop, tablet e mobile, incluindo canvas, groupingOverrides e widgetOverrides.\n - Path: uiCompositionPlan.themePreset\n Category: layout\n Kind: string\n Description: Preset visual opcional do runtime, por exemplo analytics-calm, workspace-balanced ou ops-monitoring.\n - Path: uiCompositionPlan.state\n Category: state\n Kind: object\n Description: Estado inicial/declarativo que sera compilado para page.state.\n - Path: uiCompositionPlan.widgets\n Category: widgets\n Kind: array\n Description: Widgets planejados antes da compilacao para page.widgets.\n - Path: uiCompositionPlan.widgets[].key\n Category: widgets\n Kind: string\n Description: ID estavel do widget planejado.\n - Path: uiCompositionPlan.widgets[].componentId\n Category: widgets\n Kind: string\n Description: Componente registrado que sera compilado para definition.id.\n - Path: uiCompositionPlan.widgets[].inputs\n Category: widgets\n Kind: object\n Description: Inputs canonicos do componente, compilados para definition.inputs.\n - Path: uiCompositionPlan.widgets[].bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem declarativa de binding, compilada para definition.bindingOrder.\n - Path: uiCompositionPlan.bindings\n Category: connections\n Kind: array\n Description: Bindings declarativos que serao compilados para page.composition.links.\n - Path: uiCompositionPlan.bindings[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do binding planejado.\n - Path: uiCompositionPlan.bindings[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem: component-port ou state.\n - Path: uiCompositionPlan.bindings[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino: component-port, state ou global-action.\n - Path: uiCompositionPlan.bindings[].to.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando uiCompositionPlan.bindings[].to.kind = global-action.\n - Path: uiCompositionPlan.bindings[].to.payload\n Category: connections\n Kind: object\n Description: Payload literal opcional para destino global-action planejado.\n - Path: uiCompositionPlan.bindings[].to.payloadExpr\n Category: connections\n Kind: string\n Description: Path de payload opcional para destino global-action planejado.\n - Path: uiCompositionPlan.bindings[].from.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de origem. Use apenas com endpoint component-port; o owner top-level continua em from.widget.\n - Path: uiCompositionPlan.bindings[].to.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de destino. Use apenas com endpoint component-port; o owner top-level continua em to.widget.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de origem no segmento nested, quando existir.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de origem para contexto visual/diagnostico; nao use como identidade primaria persistida.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de origem, usado como verificacao auxiliar, nao como identidade primaria.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de destino no segmento nested, quando existir.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de destino para contexto visual/diagnostico; nao use como identidade primaria persistida.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de destino, usado como verificacao auxiliar, nao como identidade primaria.\n - Path: uiCompositionPlan.bindings[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do binding.\n - Path: uiCompositionPlan.bindings[].condition\n Category: connections\n Kind: expression\n Description: Guarda opcional em Json Logic.\n - Path: uiCompositionPlan.bindings[].transform\n Category: connections\n Kind: object\n Description: Transform declarativo: pick-path, query-context, template ou constant.\n - Path: uiCompositionPlan.bindings[].policy\n Category: connections\n Kind: object\n Description: Politica operacional opcional do binding.\n - Path: page\n Category: page\n Kind: object\n Description: Definicao da pagina (WidgetPageDefinition).\n - Path: context\n Category: context\n Kind: object\n Description: Contexto extra mesclado ao page.context.\n - Path: enableCustomization\n Category: behavior\n Kind: boolean\n Description: Habilita modo de edicao.\n - Path: showSettingsButton\n Category: behavior\n Kind: boolean\n Description: Exibe botao de settings.\n - Path: strictValidation\n Category: behavior\n Kind: boolean\n Description: Validacao estrita do widget loader.\n - Path: layoutOptions\n Category: layout\n Kind: object\n Description: Overrides residuais do host aceitos apenas para compatibilidade de migracao.\n - Path: layoutOptions.cols\n Category: layout\n Kind: number\n Description: Compat: numero de colunas usado para derivar canvas padrao.\n - Path: layoutOptions.rowHeight\n Category: layout\n Kind: number\n Description: Compat: altura de linha usada para derivar rowUnit do canvas.\n - Path: layoutOptions.gap\n Category: layout\n Kind: number\n Description: Compat: espacamento usado para derivar gap do canvas.\n - Path: pageIdentity\n Category: identity\n Kind: object\n Description: Identidade de persistencia da pagina.\n - Path: pageIdentity.appId\n Category: identity\n Kind: string\n Description: App id (opcional).\n - Path: pageIdentity.tenantId\n Category: identity\n Kind: string\n Description: Tenant id.\n - Path: pageIdentity.userId\n Category: identity\n Kind: string\n Description: User id.\n - Path: pageIdentity.routePath\n Category: identity\n Kind: string\n Description: Rota base da pagina.\n - Path: pageIdentity.locale\n Category: identity\n Kind: string\n Description: Locale.\n - Path: page.canvas\n Category: layout\n Kind: object\n Description: Canvas espacial canonico da pagina.\n - Path: page.canvas.mode\n Category: layout\n Kind: string\n Description: Modo do canvas. O builder usa grid canonico.\n - Path: page.canvas.columns\n Category: layout\n Kind: number\n Description: Numero de colunas do canvas.\n - Path: page.canvas.rowUnit\n Category: layout\n Kind: string\n Description: Altura base das linhas do canvas (ex: 80px).\n - Path: page.canvas.gap\n Category: layout\n Kind: string\n Description: Espacamento entre itens do canvas.\n - Path: page.canvas.autoRows\n Category: layout\n Kind: string\n Description: Politica de auto rows do canvas.\n - Path: page.canvas.items\n Category: layout\n Kind: object\n Description: Mapa canonico de posicionamento espacial por widget key.\n - Path: page.canvas.items.<widgetKey>.col\n Category: layout\n Kind: number\n Description: Coluna inicial (1-based).\n - Path: page.canvas.items.<widgetKey>.row\n Category: layout\n Kind: number\n Description: Linha inicial (1-based).\n - Path: page.canvas.items.<widgetKey>.colSpan\n Category: layout\n Kind: number\n Description: Colunas ocupadas.\n - Path: page.canvas.items.<widgetKey>.rowSpan\n Category: layout\n Kind: number\n Description: Linhas ocupadas.\n - Path: page.state\n Category: state\n Kind: object\n Description: Estado declarativo opcional da pagina.\n - Path: page.state.values\n Category: state\n Kind: object\n Description: Valores primarios persistiveis do estado da pagina.\n - Path: page.state.schema\n Category: state\n Kind: object\n Description: Descritores dos paths de estado primario.\n - Path: page.state.derived\n Category: state\n Kind: object\n Description: Descritores de estado derivado recomputado pelo runtime.\n - Path: page.widgets\n Category: widgets\n Kind: array\n Description: Widgets da pagina.\n - Path: page.widgets[].key\n Category: widgets\n Kind: string\n Description: ID unico do widget.\n - Path: page.widgets[].className\n Category: widgets\n Kind: string\n Description: Classe CSS do widget.\n - Path: page.widgets[].definition\n Category: widgets\n Kind: object\n Description: Definicao do widget (WidgetDefinition).\n - Path: page.widgets[].definition.id\n Category: widgets\n Kind: string\n Description: ID do componente registrado.\n - Path: page.widgets[].definition.inputs\n Category: widgets\n Kind: object\n Description: Inputs do componente.\n - Path: page.widgets[].definition.inputs.document\n Category: widgets\n Kind: object\n Description: RichContentDocument quando definition.id for praxis-rich-content.\n - Path: page.widgets[].definition.bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem de aplicacao dos inputs.\n - Path: ComponentDocMeta.configEditor\n Category: widgets\n Kind: object\n Description: Editor canonico de inputs publicado pela lib dona do componente e aberto pelo settings-panel do host.\n - Path: ComponentDocMeta.configEditor.component\n Category: widgets\n Kind: object\n Description: Componente standalone que implementa SettingsValueProvider para editar definition.inputs.\n - Path: ComponentDocMeta.configEditor.title\n Category: widgets\n Kind: string\n Description: Titulo opcional usado pelo host ao abrir o editor de inputs do componente.\n - Path: ComponentDocMeta.authoringManifestRef\n Category: widgets\n Kind: object\n Description: Referencia canonica para o manifesto executavel de authoring por IA publicado pela lib dona do componente.\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.\n - Path: ComponentDocMeta.authoringManifestRef.source\n Category: widgets\n Kind: string\n Description: Simbolo, modulo ou registry id estavel do manifesto usado para delegar edicoes governadas.\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n - Path: page.composition.links[].to.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de destino, incluindo global-action para command-dispatch declarativo.\n - Path: page.composition.links[].to.ref.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando page.composition.links[].to.kind = global-action.\n - Path: page.composition.links[].to.ref.payload\n Category: connections\n Kind: object\n Description: Payload estruturado opcional da action global persistida; quando omitido, o valor transformado do link segue como delivery value.\n - Path: page.composition.links[].to.ref.payloadExpr\n Category: connections\n Kind: expression\n Description: Escape avancado explicito de payload da action global persistida.\n - Path: page.composition.links[].to.ref.meta\n Category: connections\n Kind: object\n Description: Metadados opcionais do GlobalActionRef persistido, sem criar executor paralelo.\n - Path: page.composition.links[].from.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de origem persistido. Omita para top-level; nao serialize nestedPath: [].\n - Path: page.composition.links[].from.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n - Path: page.composition.links[].to.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de destino persistido. Omita para top-level; nao serialize nestedPath: [].\n - Path: page.composition.links[].to.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n - Path: page.composition.links[].condition\n Category: connections\n Kind: expression\n Description: Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).\n - Path: page.layoutPreset\n Category: layout\n Kind: string\n Description: ID canonico opcional do preset estrutural da pagina.\n - Path: page.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes especificas do preset estrutural consumidas por builders e runtimes futuros.\n - Path: page.themePreset\n Category: appearance\n Kind: string\n Description: ID opcional do preset de tema para shell, graficos, densidade e defaults visuais.\n - Path: page.layout\n Category: layout\n Kind: object\n Description: Layout base da pagina.\n - Path: page.layout.orientation\n Category: layout\n Kind: enum\n Description: Orientacao do grid (vertical/columns).\n - Path: page.layout.columns\n Category: layout\n Kind: number\n Description: Numero de colunas (quando orientation=columns).\n - Path: page.layout.gap\n Category: layout\n Kind: string\n Description: Gap entre widgets (ex: 16px).\n - Path: page.layout.breakpoints\n Category: layout\n Kind: object\n Description: Colunas por breakpoint.\n - Path: page.layout.breakpoints.sm\n Category: layout\n Kind: number\n Description: Colunas para breakpoint sm.\n - Path: page.layout.breakpoints.md\n Category: layout\n Kind: number\n Description: Colunas para breakpoint md.\n - Path: page.layout.breakpoints.lg\n Category: layout\n Kind: number\n Description: Colunas para breakpoint lg.\n - Path: page.layout.breakpoints.xl\n Category: layout\n Kind: number\n Description: Colunas para breakpoint xl.\n - Path: page.canvas.collisionPolicy\n Category: layout\n Kind: enum\n Description: Politica de colisao do canvas espacial.\n - Path: page.canvas.items.<widgetKey>.zIndex\n Category: layout\n Kind: number\n Description: Camada opcional do item no canvas.\n - Path: page.canvas.items.<widgetKey>.constraints\n Category: layout\n Kind: object\n Description: Restricoes opcionais de posicao e tamanho do item no canvas.\n - Path: page.canvas.items.<widgetKey>.constraints.minColSpan\n Category: layout\n Kind: number\n Description: Span minimo de colunas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.minRowSpan\n Category: layout\n Kind: number\n Description: Span minimo de linhas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.maxColSpan\n Category: layout\n Kind: number\n Description: Span maximo de colunas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.maxRowSpan\n Category: layout\n Kind: number\n Description: Span maximo de linhas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.lockPosition\n Category: layout\n Kind: boolean\n Description: Bloqueia alteracao de posicao do item no canvas.\n - Path: page.canvas.items.<widgetKey>.constraints.lockSize\n Category: layout\n Kind: boolean\n Description: Bloqueia alteracao de tamanho do item no canvas.\n - Path: page.widgets[].definition.inputs.hostCapabilities\n Category: widgets\n Kind: object\n Description: Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Nao pertence ao JSON persistido.\n - Path: page.widgets[].definition.inputs.hostCapabilities.dispatchAction\n Category: widgets\n Kind: object\n Description: Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na pagina.\n - Path: page.widgets[].definition.inputs.hostCapabilities.isActionAvailable\n Category: widgets\n Kind: object\n Description: Resolver runtime de disponibilidade de actionId para rich content hospedado na pagina.\n - Path: page.widgets[].definition.inputs.hostCapabilities.hasCapability\n Category: widgets\n Kind: object\n Description: Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na pagina.\n - Path: page.widgets[].shell\n Category: shell\n Kind: object\n Description: Configuracao do shell do widget.\n - Path: page.widgets[].shell.kind\n Category: shell\n Kind: enum\n Description: Tipo de shell.\n - Path: page.widgets[].shell.title\n Category: shell\n Kind: string\n Description: Titulo do shell.\n - Path: page.widgets[].shell.subtitle\n Category: shell\n Kind: string\n Description: Subtitulo do shell.\n - Path: page.widgets[].shell.icon\n Category: shell\n Kind: string\n Description: Icone do shell.\n - Path: page.widgets[].shell.showHeader\n Category: shell\n Kind: boolean\n Description: Exibe o header do shell.\n - Path: page.widgets[].shell.actions\n Category: shell\n Kind: array\n Description: Acoes do shell.\n - Path: page.widgets[].shell.actions[].id\n Category: shell\n Kind: string\n Description: ID da acao.\n - Path: page.widgets[].shell.actions[].label\n Category: shell\n Kind: string\n Description: Label da acao.\n - Path: page.widgets[].shell.actions[].icon\n Category: shell\n Kind: string\n Description: Icone da acao.\n - Path: page.widgets[].shell.actions[].variant\n Category: shell\n Kind: enum\n Description: Estilo visual da acao.\n - Path: page.widgets[].shell.actions[].placement\n Category: shell\n Kind: enum\n Description: Posicionamento da acao.\n - Path: page.widgets[].shell.actions[].emit\n Category: shell\n Kind: string\n Description: Evento emitido ao acionar a acao.\n - Path: page.state.schema.<token>.type\n Category: state\n Kind: string\n Description: Tipo semantico opcional do path de estado.\n - Path: page.state.schema.<token>.initial\n Category: state\n Kind: object\n Description: Valor inicial usado quando page.state.values omite o path.\n - Path: page.state.schema.<token>.persist\n Category: state\n Kind: boolean\n Description: Indica se o path primario deve ser persistido com a pagina.\n - Path: page.state.schema.<token>.mergeStrategy\n Category: state\n Kind: enum\n Description: Como escritas de widget/estado combinam com o valor atual.\n - Path: page.state.schema.<token>.description\n Category: state\n Kind: string\n Description: Descricao opcional do path para builders e catalogos AI.\n - Path: page.state.schema.<token>.tags\n Category: state\n Kind: array\n Description: Tags opcionais para busca e governanca do estado.\n - Path: page.state.derived.<token>.dependsOn\n Category: state\n Kind: array\n Description: Paths de estado que alimentam o valor derivado.\n - Path: page.state.derived.<token>.compute\n Category: state\n Kind: object\n Description: Descritor de computacao do estado derivado.\n - Path: page.state.derived.<token>.compute.kind\n Category: state\n Kind: enum\n Description: Tipo de computacao do estado derivado.\n - Path: page.state.derived.<token>.compute.expression\n Category: state\n Kind: expression\n Description: Expressao Json Logic para compute.kind=json-logic.\n - Path: page.state.derived.<token>.compute.value\n Category: state\n Kind: object\n Description: Valor template para compute.kind=template.\n - Path: page.state.derived.<token>.compute.operator\n Category: state\n Kind: string\n Description: Operador para compute.kind=operator.\n - Path: page.state.derived.<token>.compute.options\n Category: state\n Kind: object\n Description: Opcoes do operador ou transformer.\n - Path: page.state.derived.<token>.compute.transformerId\n Category: state\n Kind: string\n Description: Identificador do transformer para compute.kind=transformer.\n - Path: page.state.derived.<token>.description\n Category: state\n Kind: string\n Description: Descricao opcional do estado derivado.\n - Path: page.state.derived.<token>.cache\n Category: state\n Kind: boolean\n Description: Permite cache futuro do valor derivado.\n - Path: page.composition.links[].from.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de origem, como component-port ou state.\n - Path: page.composition.links[].from.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de origem.\n - Path: page.composition.links[].from.ref.widget\n Category: connections\n Kind: string\n Description: Widget top-level dono do endpoint de origem.\n - Path: page.composition.links[].from.ref.port\n Category: connections\n Kind: string\n Description: Porta de origem do componente.\n - Path: page.composition.links[].from.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de origem.\n - Path: page.composition.links[].from.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem.\n - Path: page.composition.links[].from.ref.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural do segmento nested de origem.\n - Path: page.composition.links[].from.ref.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar para diagnostico visual; nao use como identidade primaria.\n - Path: page.composition.links[].from.ref.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de origem.\n - Path: page.composition.links[].to.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de destino.\n - Path: page.composition.links[].to.ref.widget\n Category: connections\n Kind: string\n Description: Widget top-level dono do endpoint de destino.\n - Path: page.composition.links[].to.ref.port\n Category: connections\n Kind: string\n Description: Porta de destino do componente.\n - Path: page.composition.links[].to.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de destino.\n - Path: page.composition.links[].to.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino.\n - Path: page.composition.links[].to.ref.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural do segmento nested de destino.\n - Path: page.composition.links[].to.ref.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar para diagnostico visual; nao use como identidade primaria.\n - Path: page.composition.links[].to.ref.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de destino.\n - Path: page.grouping\n Category: layout\n Kind: array\n Description: Modelo semantico opcional de secoes, abas, areas hero e rails.\n - Path: page.grouping[].kind\n Category: layout\n Kind: enum\n Description: Tipo do agrupamento semantico.\n - Path: page.grouping[].id\n Category: layout\n Kind: string\n Description: Identificador estavel do agrupamento.\n - Path: page.grouping[].label\n Category: layout\n Kind: string\n Description: Rotulo opcional do agrupamento.\n - Path: page.grouping[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets pertencentes ao agrupamento section, hero ou rail.\n - Path: page.grouping[].layout\n Category: layout\n Kind: enum\n Description: Layout opcional para agrupamento section.\n - Path: page.grouping[].tabs\n Category: layout\n Kind: array\n Description: Abas do agrupamento kind=tabs.\n - Path: page.grouping[].tabs[].id\n Category: layout\n Kind: string\n Description: Identificador estavel da aba.\n - Path: page.grouping[].tabs[].label\n Category: layout\n Kind: string\n Description: Rotulo da aba.\n - Path: page.grouping[].tabs[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets renderizados dentro da aba.\n - Path: page.grouping[].emphasis\n Category: layout\n Kind: enum\n Description: Enfase opcional para agrupamento hero.\n - Path: page.grouping[].side\n Category: layout\n Kind: enum\n Description: Lado do rail quando kind=rail.\n - Path: page.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa canonico de widget key para slot semantico de preset.\n - Path: page.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes opcionais de layout por dispositivo.\n - Path: page.deviceLayouts.desktop\n Category: layout\n Kind: object\n Description: Overrides de layout para desktop.\n - Path: page.deviceLayouts.tablet\n Category: layout\n Kind: object\n Description: Overrides de layout para tablet.\n - Path: page.deviceLayouts.mobile\n Category: layout\n Kind: object\n Description: Overrides de layout para mobile.\n - Path: page.deviceLayouts.desktop.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para desktop.\n - Path: page.deviceLayouts.desktop.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para desktop.\n - Path: page.deviceLayouts.desktop.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para desktop.\n - Path: page.deviceLayouts.desktop.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para desktop.\n - Path: page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em desktop.\n - Path: page.deviceLayouts.tablet.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para tablet.\n - Path: page.deviceLayouts.tablet.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para tablet.\n - Path: page.deviceLayouts.tablet.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para tablet.\n - Path: page.deviceLayouts.tablet.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para tablet.\n - Path: page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em tablet.\n - Path: page.deviceLayouts.mobile.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para mobile.\n - Path: page.deviceLayouts.mobile.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para mobile.\n - Path: page.deviceLayouts.mobile.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para mobile.\n - Path: page.deviceLayouts.mobile.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para mobile.\n - Path: page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em mobile.\nCapability Notes:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links tambem pode despachar actions globais via to.kind = global-action.\n - Conteudo editorial rico deve ser modelado como widget praxis-rich-content com definition.inputs.document: RichContentDocument, nao como DSL local do page-builder.\n - Quando definition.id = praxis-rich-content em uma pagina dinamica, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e mediado em runtime pelo host praxis-dynamic-page e nao deve ser serializado no JSON da pagina.\n - Edicao visual de inputs de widget deve usar ComponentDocMeta.configEditor ou ComponentDocMeta.authoringManifestRef publicado pela lib dona do componente; nao criar editor local no page-builder para semantica de outro pacote.\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n - Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n - Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.\n - Nao gere links nested via owner.widgetEvent, bindingPath profundo, page.connections ou wrappers host-specific. widgetEvent e bridge legada/avancada, nao contrato principal de authoring.\n - Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.\n - pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.\n - Este catalogo e especifico para o runtime praxis-dynamic-page; operacoes de authoring/mutacao pertencem ao manifesto do praxis-page-builder.\n - WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.\n - Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.\n - page.canvas.items e um mapa por widget key; nao modele canvas.items como array.\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; nao trate ambos como a mesma \"expression\".\n - Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.\n - Para renomear um link, inclua {_beforeKey:\"link-id-anterior\"} no item.\n - Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmacao.\n - Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; nao serialize funcoes nem tente persistir page.widgets[].definition.inputs.hostCapabilities.\n - Use ids estaveis para links e keys estaveis para widgets.\n - Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.\n - Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).\n - Link tipico de master-detail: component-port(table.rowClick) -> component-port(form.resourceId) com transform map payload.row.id.\n",
2902
+ "content": "Component Capabilities:\n - Path: uiCompositionPlan\n Category: page\n Kind: object\n Description: Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.\n - Path: uiCompositionPlan.version\n Category: page\n Kind: string\n Description: Versao do plano. Valor atual: 1.0.\n - Path: uiCompositionPlan.kind\n Category: page\n Kind: string\n Description: Discriminador do plano. Valor atual: praxis.ui-composition-plan.\n - Path: uiCompositionPlan.layoutPreset\n Category: layout\n Kind: string\n Description: Preset semantico opcional da composicao planejada.\n - Path: uiCompositionPlan.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.\n - Path: uiCompositionPlan.grouping\n Category: layout\n Kind: array\n Description: Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.\n - Path: uiCompositionPlan.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa opcional widgetKey -> slot semantico para alinhar widgets gerados a presets de layout sem depender de dominio.\n - Path: uiCompositionPlan.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes responsivas opcionais para desktop, tablet e mobile, incluindo canvas, groupingOverrides e widgetOverrides.\n - Path: uiCompositionPlan.themePreset\n Category: layout\n Kind: string\n Description: Preset visual opcional do runtime, por exemplo analytics-calm, workspace-balanced ou ops-monitoring.\n - Path: uiCompositionPlan.state\n Category: state\n Kind: object\n Description: Estado inicial/declarativo que sera compilado para page.state.\n - Path: uiCompositionPlan.widgets\n Category: widgets\n Kind: array\n Description: Widgets planejados antes da compilacao para page.widgets.\n - Path: uiCompositionPlan.widgets[].key\n Category: widgets\n Kind: string\n Description: ID estavel do widget planejado.\n - Path: uiCompositionPlan.widgets[].componentId\n Category: widgets\n Kind: string\n Description: Componente registrado que sera compilado para definition.id.\n - Path: uiCompositionPlan.widgets[].inputs\n Category: widgets\n Kind: object\n Description: Inputs canonicos do componente, compilados para definition.inputs.\n - Path: uiCompositionPlan.widgets[].bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem declarativa de binding, compilada para definition.bindingOrder.\n - Path: uiCompositionPlan.bindings\n Category: connections\n Kind: array\n Description: Bindings declarativos que serao compilados para page.composition.links.\n - Path: uiCompositionPlan.bindings[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do binding planejado.\n - Path: uiCompositionPlan.bindings[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem: component-port ou state.\n - Path: uiCompositionPlan.bindings[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino: component-port, state ou global-action.\n - Path: uiCompositionPlan.bindings[].to.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando uiCompositionPlan.bindings[].to.kind = global-action.\n - Path: uiCompositionPlan.bindings[].to.payload\n Category: connections\n Kind: object\n Description: Payload literal opcional para destino global-action planejado.\n - Path: uiCompositionPlan.bindings[].to.payloadExpr\n Category: connections\n Kind: string\n Description: Path de payload opcional para destino global-action planejado.\n - Path: uiCompositionPlan.bindings[].from.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de origem. Use apenas com endpoint component-port; o owner top-level continua em from.widget.\n - Path: uiCompositionPlan.bindings[].to.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de destino. Use apenas com endpoint component-port; o owner top-level continua em to.widget.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de origem no segmento nested, quando existir.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de origem para contexto visual/diagnostico; nao use como identidade primaria persistida.\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de origem, usado como verificacao auxiliar, nao como identidade primaria.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de destino no segmento nested, quando existir.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de destino para contexto visual/diagnostico; nao use como identidade primaria persistida.\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de destino, usado como verificacao auxiliar, nao como identidade primaria.\n - Path: uiCompositionPlan.bindings[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do binding.\n - Path: uiCompositionPlan.bindings[].condition\n Category: connections\n Kind: expression\n Description: Guarda opcional em Json Logic.\n - Path: uiCompositionPlan.bindings[].transform\n Category: connections\n Kind: object\n Description: Transform declarativo: pick-path, query-context, template ou constant.\n - Path: uiCompositionPlan.bindings[].policy\n Category: connections\n Kind: object\n Description: Politica operacional opcional do binding.\n - Path: page\n Category: page\n Kind: object\n Description: Definicao da pagina (WidgetPageDefinition).\n - Path: context\n Category: context\n Kind: object\n Description: Contexto extra mesclado ao page.context.\n - Path: enableCustomization\n Category: behavior\n Kind: boolean\n Description: Habilita modo de edicao.\n - Path: showSettingsButton\n Category: behavior\n Kind: boolean\n Description: Exibe botao de settings.\n - Path: strictValidation\n Category: behavior\n Kind: boolean\n Description: Validacao estrita do widget loader.\n - Path: layoutOptions\n Category: layout\n Kind: object\n Description: Overrides residuais do host aceitos apenas para compatibilidade de migracao.\n - Path: layoutOptions.cols\n Category: layout\n Kind: number\n Description: Compat: numero de colunas usado para derivar canvas padrao.\n - Path: layoutOptions.rowHeight\n Category: layout\n Kind: number\n Description: Compat: altura de linha usada para derivar rowUnit do canvas.\n - Path: layoutOptions.gap\n Category: layout\n Kind: number\n Description: Compat: espacamento usado para derivar gap do canvas.\n - Path: pageIdentity\n Category: identity\n Kind: object\n Description: Identidade de persistencia da pagina.\n - Path: pageIdentity.appId\n Category: identity\n Kind: string\n Description: App id (opcional).\n - Path: pageIdentity.tenantId\n Category: identity\n Kind: string\n Description: Tenant id.\n - Path: pageIdentity.userId\n Category: identity\n Kind: string\n Description: User id.\n - Path: pageIdentity.routePath\n Category: identity\n Kind: string\n Description: Rota base da pagina.\n - Path: pageIdentity.locale\n Category: identity\n Kind: string\n Description: Locale.\n - Path: page.canvas\n Category: layout\n Kind: object\n Description: Canvas espacial canonico da pagina.\n - Path: page.canvas.mode\n Category: layout\n Kind: string\n Description: Modo do canvas. O builder usa grid canonico.\n - Path: page.canvas.columns\n Category: layout\n Kind: number\n Description: Numero de colunas do canvas.\n - Path: page.canvas.rowUnit\n Category: layout\n Kind: string\n Description: Altura base das linhas do canvas (ex: 80px).\n - Path: page.canvas.gap\n Category: layout\n Kind: string\n Description: Espacamento entre itens do canvas.\n - Path: page.canvas.autoRows\n Category: layout\n Kind: string\n Description: Politica de auto rows do canvas.\n - Path: page.canvas.items\n Category: layout\n Kind: object\n Description: Mapa canonico de posicionamento espacial por widget key.\n - Path: page.canvas.items.<widgetKey>.col\n Category: layout\n Kind: number\n Description: Coluna inicial (1-based).\n - Path: page.canvas.items.<widgetKey>.row\n Category: layout\n Kind: number\n Description: Linha inicial (1-based).\n - Path: page.canvas.items.<widgetKey>.colSpan\n Category: layout\n Kind: number\n Description: Colunas ocupadas.\n - Path: page.canvas.items.<widgetKey>.rowSpan\n Category: layout\n Kind: number\n Description: Linhas ocupadas.\n - Path: page.state\n Category: state\n Kind: object\n Description: Estado declarativo opcional da pagina.\n - Path: page.state.values\n Category: state\n Kind: object\n Description: Valores primarios persistiveis do estado da pagina.\n - Path: page.state.schema\n Category: state\n Kind: object\n Description: Descritores dos paths de estado primario.\n - Path: page.state.derived\n Category: state\n Kind: object\n Description: Descritores de estado derivado recomputado pelo runtime.\n - Path: page.widgets\n Category: widgets\n Kind: array\n Description: Widgets da pagina.\n - Path: page.widgets[].key\n Category: widgets\n Kind: string\n Description: ID unico do widget.\n - Path: page.widgets[].className\n Category: widgets\n Kind: string\n Description: Classe CSS do widget.\n - Path: page.widgets[].definition\n Category: widgets\n Kind: object\n Description: Definicao do widget (WidgetDefinition).\n - Path: page.widgets[].definition.id\n Category: widgets\n Kind: string\n Description: ID do componente registrado.\n - Path: page.widgets[].definition.inputs\n Category: widgets\n Kind: object\n Description: Inputs do componente.\n - Path: page.widgets[].definition.inputs.document\n Category: widgets\n Kind: object\n Description: RichContentDocument quando definition.id for praxis-rich-content.\n - Path: page.widgets[].definition.bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem de aplicacao dos inputs.\n - Path: ComponentDocMeta.configEditor\n Category: widgets\n Kind: object\n Description: Editor canonico de inputs publicado pela lib dona do componente e aberto pelo settings-panel do host.\n - Path: ComponentDocMeta.configEditor.component\n Category: widgets\n Kind: object\n Description: Componente standalone que implementa SettingsValueProvider para editar definition.inputs.\n - Path: ComponentDocMeta.configEditor.title\n Category: widgets\n Kind: string\n Description: Titulo opcional usado pelo host ao abrir o editor de inputs do componente.\n - Path: ComponentDocMeta.authoringManifestRef\n Category: widgets\n Kind: object\n Description: Referencia canonica para o manifesto executavel de authoring por IA publicado pela lib dona do componente.\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.\n - Path: ComponentDocMeta.authoringManifestRef.source\n Category: widgets\n Kind: string\n Description: Simbolo, modulo ou registry id estavel do manifesto usado para delegar edicoes governadas.\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n - Path: page.composition.links[].to.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de destino, incluindo global-action para command-dispatch declarativo.\n - Path: page.composition.links[].to.ref.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando page.composition.links[].to.kind = global-action.\n - Path: page.composition.links[].to.ref.payload\n Category: connections\n Kind: object\n Description: Payload estruturado opcional da action global persistida; quando omitido, o valor transformado do link segue como delivery value.\n - Path: page.composition.links[].to.ref.payloadExpr\n Category: connections\n Kind: expression\n Description: Escape avancado explicito de payload da action global persistida.\n - Path: page.composition.links[].to.ref.meta\n Category: connections\n Kind: object\n Description: Metadados opcionais do GlobalActionRef persistido, sem criar executor paralelo.\n - Path: page.composition.links[].from.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de origem persistido. Omita para top-level; nao serialize nestedPath: [].\n - Path: page.composition.links[].from.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n - Path: page.composition.links[].to.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de destino persistido. Omita para top-level; nao serialize nestedPath: [].\n - Path: page.composition.links[].to.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n - Path: page.composition.links[].condition\n Category: connections\n Kind: expression\n Description: Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).\n - Path: page.layoutPreset\n Category: layout\n Kind: string\n Description: ID canônico opcional do preset estrutural da página.\n - Path: page.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opções específicas do preset estrutural consumidas por builders e runtimes futuros.\n - Path: page.themePreset\n Category: appearance\n Kind: string\n Description: ID opcional do preset de tema para shell, gráficos, densidade e defaults visuais.\n - Path: page.layout\n Category: layout\n Kind: object\n Description: Layout base da página.\n - Path: page.layout.orientation\n Category: layout\n Kind: enum\n Description: Orientacao do grid (vertical/columns).\n - Path: page.layout.columns\n Category: layout\n Kind: number\n Description: Numero de colunas (quando orientation=columns).\n - Path: page.layout.gap\n Category: layout\n Kind: string\n Description: Gap entre widgets (ex: 16px).\n - Path: page.layout.breakpoints\n Category: layout\n Kind: object\n Description: Colunas por breakpoint.\n - Path: page.layout.breakpoints.sm\n Category: layout\n Kind: number\n Description: Colunas para breakpoint sm.\n - Path: page.layout.breakpoints.md\n Category: layout\n Kind: number\n Description: Colunas para breakpoint md.\n - Path: page.layout.breakpoints.lg\n Category: layout\n Kind: number\n Description: Colunas para breakpoint lg.\n - Path: page.layout.breakpoints.xl\n Category: layout\n Kind: number\n Description: Colunas para breakpoint xl.\n - Path: page.canvas.collisionPolicy\n Category: layout\n Kind: enum\n Description: Politica de colisao do canvas espacial.\n - Path: page.canvas.items.<widgetKey>.zIndex\n Category: layout\n Kind: number\n Description: Camada opcional do item no canvas.\n - Path: page.canvas.items.<widgetKey>.constraints\n Category: layout\n Kind: object\n Description: Restricoes opcionais de posicao e tamanho do item no canvas.\n - Path: page.canvas.items.<widgetKey>.constraints.minColSpan\n Category: layout\n Kind: number\n Description: Span mínimo de colunas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.minRowSpan\n Category: layout\n Kind: number\n Description: Span mínimo de linhas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.maxColSpan\n Category: layout\n Kind: number\n Description: Span máximo de colunas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.maxRowSpan\n Category: layout\n Kind: number\n Description: Span máximo de linhas permitido.\n - Path: page.canvas.items.<widgetKey>.constraints.lockPosition\n Category: layout\n Kind: boolean\n Description: Bloqueia alteracao de posicao do item no canvas.\n - Path: page.canvas.items.<widgetKey>.constraints.lockSize\n Category: layout\n Kind: boolean\n Description: Bloqueia alteracao de tamanho do item no canvas.\n - Path: page.widgets[].definition.inputs.hostCapabilities\n Category: widgets\n Kind: object\n Description: Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Não pertence ao JSON persistido.\n - Path: page.widgets[].definition.inputs.hostCapabilities.dispatchAction\n Category: widgets\n Kind: object\n Description: Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na página.\n - Path: page.widgets[].definition.inputs.hostCapabilities.isActionAvailable\n Category: widgets\n Kind: object\n Description: Resolver runtime de disponibilidade de actionId para rich content hospedado na página.\n - Path: page.widgets[].definition.inputs.hostCapabilities.hasCapability\n Category: widgets\n Kind: object\n Description: Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na página.\n - Path: page.widgets[].shell\n Category: shell\n Kind: object\n Description: Configuração do shell do widget.\n - Path: page.widgets[].shell.kind\n Category: shell\n Kind: enum\n Description: Tipo de shell.\n - Path: page.widgets[].shell.title\n Category: shell\n Kind: string\n Description: Título do shell.\n - Path: page.widgets[].shell.subtitle\n Category: shell\n Kind: string\n Description: Subtítulo do shell.\n - Path: page.widgets[].shell.icon\n Category: shell\n Kind: string\n Description: Ícone do shell.\n - Path: page.widgets[].shell.showHeader\n Category: shell\n Kind: boolean\n Description: Exibe o header do shell.\n - Path: page.widgets[].shell.actions\n Category: shell\n Kind: array\n Description: Ações do shell.\n - Path: page.widgets[].shell.actions[].id\n Category: shell\n Kind: string\n Description: ID da ação.\n - Path: page.widgets[].shell.actions[].label\n Category: shell\n Kind: string\n Description: Label da ação.\n - Path: page.widgets[].shell.actions[].icon\n Category: shell\n Kind: string\n Description: Ícone da ação.\n - Path: page.widgets[].shell.actions[].variant\n Category: shell\n Kind: enum\n Description: Estilo visual da ação.\n - Path: page.widgets[].shell.actions[].placement\n Category: shell\n Kind: enum\n Description: Posicionamento da ação.\n - Path: page.widgets[].shell.actions[].emit\n Category: shell\n Kind: string\n Description: Evento emitido ao acionar a ação.\n - Path: page.state.schema.<token>.type\n Category: state\n Kind: string\n Description: Tipo semantico opcional do path de estado.\n - Path: page.state.schema.<token>.initial\n Category: state\n Kind: object\n Description: Valor inicial usado quando page.state.values omite o path.\n - Path: page.state.schema.<token>.persist\n Category: state\n Kind: boolean\n Description: Indica se o path primário deve ser persistido com a página.\n - Path: page.state.schema.<token>.mergeStrategy\n Category: state\n Kind: enum\n Description: Como escritas de widget/estado combinam com o valor atual.\n - Path: page.state.schema.<token>.description\n Category: state\n Kind: string\n Description: Descrição opcional do path para builders e catálogos AI.\n - Path: page.state.schema.<token>.tags\n Category: state\n Kind: array\n Description: Tags opcionais para busca e governanca do estado.\n - Path: page.state.derived.<token>.dependsOn\n Category: state\n Kind: array\n Description: Paths de estado que alimentam o valor derivado.\n - Path: page.state.derived.<token>.compute\n Category: state\n Kind: object\n Description: Descritor de computacao do estado derivado.\n - Path: page.state.derived.<token>.compute.kind\n Category: state\n Kind: enum\n Description: Tipo de computacao do estado derivado.\n - Path: page.state.derived.<token>.compute.expression\n Category: state\n Kind: expression\n Description: Expressao Json Logic para compute.kind=json-logic.\n - Path: page.state.derived.<token>.compute.value\n Category: state\n Kind: object\n Description: Valor template para compute.kind=template.\n - Path: page.state.derived.<token>.compute.operator\n Category: state\n Kind: string\n Description: Operador para compute.kind=operator.\n - Path: page.state.derived.<token>.compute.options\n Category: state\n Kind: object\n Description: Opções do operador ou transformer.\n - Path: page.state.derived.<token>.compute.transformerId\n Category: state\n Kind: string\n Description: Identificador do transformer para compute.kind=transformer.\n - Path: page.state.derived.<token>.description\n Category: state\n Kind: string\n Description: Descrição opcional do estado derivado.\n - Path: page.state.derived.<token>.cache\n Category: state\n Kind: boolean\n Description: Permite cache futuro do valor derivado.\n - Path: page.composition.links[].from.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de origem, como component-port ou state.\n - Path: page.composition.links[].from.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de origem.\n - Path: page.composition.links[].from.ref.widget\n Category: connections\n Kind: string\n Description: Widget top-level dono do endpoint de origem.\n - Path: page.composition.links[].from.ref.port\n Category: connections\n Kind: string\n Description: Porta de origem do componente.\n - Path: page.composition.links[].from.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de origem.\n - Path: page.composition.links[].from.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem.\n - Path: page.composition.links[].from.ref.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural do segmento nested de origem.\n - Path: page.composition.links[].from.ref.nestedPath[].index\n Category: connections\n Kind: number\n Description: Índice auxiliar para diagnóstico visual; não use como identidade primária.\n - Path: page.composition.links[].from.ref.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de origem.\n - Path: page.composition.links[].to.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de destino.\n - Path: page.composition.links[].to.ref.widget\n Category: connections\n Kind: string\n Description: Widget top-level dono do endpoint de destino.\n - Path: page.composition.links[].to.ref.port\n Category: connections\n Kind: string\n Description: Porta de destino do componente.\n - Path: page.composition.links[].to.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de destino.\n - Path: page.composition.links[].to.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino.\n - Path: page.composition.links[].to.ref.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural do segmento nested de destino.\n - Path: page.composition.links[].to.ref.nestedPath[].index\n Category: connections\n Kind: number\n Description: Índice auxiliar para diagnóstico visual; não use como identidade primária.\n - Path: page.composition.links[].to.ref.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de destino.\n - Path: page.grouping\n Category: layout\n Kind: array\n Description: Modelo semantico opcional de secoes, abas, areas hero e rails.\n - Path: page.grouping[].kind\n Category: layout\n Kind: enum\n Description: Tipo do agrupamento semantico.\n - Path: page.grouping[].id\n Category: layout\n Kind: string\n Description: Identificador estavel do agrupamento.\n - Path: page.grouping[].label\n Category: layout\n Kind: string\n Description: Rotulo opcional do agrupamento.\n - Path: page.grouping[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets pertencentes ao agrupamento section, hero ou rail.\n - Path: page.grouping[].layout\n Category: layout\n Kind: enum\n Description: Layout opcional para agrupamento section.\n - Path: page.grouping[].tabs\n Category: layout\n Kind: array\n Description: Abas do agrupamento kind=tabs.\n - Path: page.grouping[].tabs[].id\n Category: layout\n Kind: string\n Description: Identificador estavel da aba.\n - Path: page.grouping[].tabs[].label\n Category: layout\n Kind: string\n Description: Rotulo da aba.\n - Path: page.grouping[].tabs[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets renderizados dentro da aba.\n - Path: page.grouping[].emphasis\n Category: layout\n Kind: enum\n Description: Enfase opcional para agrupamento hero.\n - Path: page.grouping[].side\n Category: layout\n Kind: enum\n Description: Lado do rail quando kind=rail.\n - Path: page.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa canonico de widget key para slot semantico de preset.\n - Path: page.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes opcionais de layout por dispositivo.\n - Path: page.deviceLayouts.desktop\n Category: layout\n Kind: object\n Description: Overrides de layout para desktop.\n - Path: page.deviceLayouts.tablet\n Category: layout\n Kind: object\n Description: Overrides de layout para tablet.\n - Path: page.deviceLayouts.mobile\n Category: layout\n Kind: object\n Description: Overrides de layout para mobile.\n - Path: page.deviceLayouts.desktop.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para desktop.\n - Path: page.deviceLayouts.desktop.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para desktop.\n - Path: page.deviceLayouts.desktop.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para desktop.\n - Path: page.deviceLayouts.desktop.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para desktop.\n - Path: page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em desktop.\n - Path: page.deviceLayouts.tablet.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para tablet.\n - Path: page.deviceLayouts.tablet.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para tablet.\n - Path: page.deviceLayouts.tablet.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para tablet.\n - Path: page.deviceLayouts.tablet.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para tablet.\n - Path: page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em tablet.\n - Path: page.deviceLayouts.mobile.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para mobile.\n - Path: page.deviceLayouts.mobile.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para mobile.\n - Path: page.deviceLayouts.mobile.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para mobile.\n - Path: page.deviceLayouts.mobile.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para mobile.\n - Path: page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em mobile.\nCapability Notes:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links tambem pode despachar actions globais via to.kind = global-action.\n - Conteudo editorial rico deve ser modelado como widget praxis-rich-content com definition.inputs.document: RichContentDocument, nao como DSL local do page-builder.\n - Quando definition.id = praxis-rich-content em uma pagina dinamica, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e mediado em runtime pelo host praxis-dynamic-page e nao deve ser serializado no JSON da pagina.\n - Edicao visual de inputs de widget deve usar ComponentDocMeta.configEditor ou ComponentDocMeta.authoringManifestRef publicado pela lib dona do componente; nao criar editor local no page-builder para semantica de outro pacote.\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n - Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n - Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.\n - Nao gere links nested via owner.widgetEvent, bindingPath profundo, page.connections ou wrappers host-specific. widgetEvent e bridge legada/avancada, nao contrato principal de authoring.\n - Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.\n - pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.\n - Este catálogo é específico para o runtime praxis-dynamic-page; operações de authoring/mutação pertencem ao manifesto do praxis-page-builder.\n - WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.\n - Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.\n - page.canvas.items é um mapa por widget key; não modele canvas.items como array.\n - Taxonomia editorial: condition usa Json Logic canônico; transform usa pipeline declarativo; não trate ambos como a mesma \"expression\".\n - Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.\n - Para renomear um link, inclua {_beforeKey:\"link-id-anterior\"} no item.\n - Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmação.\n - Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; não serialize funções nem tente persistir page.widgets[].definition.inputs.hostCapabilities.\n - Use ids estaveis para links e keys estaveis para widgets.\n - Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.\n - Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).\n - Link tipico de master-detail: component-port(table.rowClick) -> component-port(form.resourceId) com transform map payload.row.id.\n",
2903
2903
  "sourcePointer": "praxis-ui-angular/projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
2904
- "contentHash": "238a3c1c176f9fbf724464c08f93e392e73a9da03d5b4331e54439314ea25e3f",
2904
+ "contentHash": "1ae805862c00c852d72e21ff688836728ba62781aef99b3f2bce6282b1a5b0e0",
2905
2905
  "sourceKind": "component_definition",
2906
2906
  "sourceId": "praxis-dynamic-page",
2907
2907
  "corpusVersion": "1.0.0"
@@ -2909,9 +2909,9 @@
2909
2909
  {
2910
2910
  "chunkIndex": 2,
2911
2911
  "chunkKind": "context_pack",
2912
- "content": "{\n \"componentContext\": {\n \"version\": \"v1.0\",\n \"optionsByPath\": {\n \"page.layout.orientation\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"vertical\",\n \"label\": \"Vertical\"\n },\n {\n \"value\": \"columns\",\n \"label\": \"Colunas\"\n }\n ]\n },\n \"page.canvas.mode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"grid\",\n \"label\": \"Grid\"\n }\n ]\n },\n \"page.canvas.autoRows\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"fixed\",\n \"label\": \"Linhas fixas\"\n },\n {\n \"value\": \"content\",\n \"label\": \"Conteudo\"\n }\n ]\n },\n \"page.canvas.collisionPolicy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"block\",\n \"label\": \"Bloquear colisao\"\n },\n {\n \"value\": \"swap\",\n \"label\": \"Trocar posicao\"\n }\n ]\n },\n \"page.grouping[].kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"section\",\n \"label\": \"Secao\"\n },\n {\n \"value\": \"tabs\",\n \"label\": \"Abas\"\n },\n {\n \"value\": \"hero\",\n \"label\": \"Hero\"\n },\n {\n \"value\": \"rail\",\n \"label\": \"Rail\"\n }\n ]\n },\n \"page.grouping[].layout\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"stack\",\n \"label\": \"Empilhado\"\n },\n {\n \"value\": \"grid\",\n \"label\": \"Grid\"\n },\n {\n \"value\": \"row\",\n \"label\": \"Linha\"\n }\n ]\n },\n \"page.grouping[].emphasis\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"high\",\n \"label\": \"Alta\"\n },\n {\n \"value\": \"medium\",\n \"label\": \"Media\"\n }\n ]\n },\n \"page.grouping[].side\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"left\",\n \"label\": \"Esquerda\"\n },\n {\n \"value\": \"right\",\n \"label\": \"Direita\"\n }\n ]\n },\n \"page.state.schema.<token>.mergeStrategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"replace\",\n \"label\": \"Substituir\"\n },\n {\n \"value\": \"merge\",\n \"label\": \"Mesclar\"\n },\n {\n \"value\": \"append\",\n \"label\": \"Acrescentar\"\n },\n {\n \"value\": \"remove-keys\",\n \"label\": \"Remover chaves\"\n }\n ]\n },\n \"page.state.derived.<token>.compute.kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"json-logic\",\n \"label\": \"Json Logic\"\n },\n {\n \"value\": \"template\",\n \"label\": \"Template\"\n },\n {\n \"value\": \"operator\",\n \"label\": \"Operador\"\n },\n {\n \"value\": \"transformer\",\n \"label\": \"Transformer\"\n }\n ]\n },\n \"page.widgets[].shell.kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"dashboard-card\",\n \"label\": \"Dashboard Card\"\n },\n {\n \"value\": \"none\",\n \"label\": \"Sem shell\"\n }\n ]\n },\n \"page.widgets[].shell.actions[].variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"icon\",\n \"label\": \"Icone\"\n },\n {\n \"value\": \"text\",\n \"label\": \"Texto\"\n },\n {\n \"value\": \"outlined\",\n \"label\": \"Outlined\"\n }\n ]\n },\n \"page.widgets[].shell.actions[].placement\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"header\",\n \"label\": \"Header\"\n },\n {\n \"value\": \"window\",\n \"label\": \"Janela\"\n }\n ]\n },\n \"page.composition.version\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"1.0.0\",\n \"label\": \"Schema canonico 1.0.0\"\n }\n ]\n },\n \"page.composition.links[].intent\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"event-propagation\",\n \"label\": \"Propagacao de evento\"\n },\n {\n \"value\": \"state-read\",\n \"label\": \"Leitura de estado\"\n },\n {\n \"value\": \"state-write\",\n \"label\": \"Escrita de estado\"\n }\n ]\n },\n \"page.composition.links[].from.ref.port\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"rowClick\",\n \"label\": \"Clique na linha (praxis-table)\",\n \"example\": \"Usar table.rowClick -> form.resourceId via transform pick-path payload.row.id\"\n },\n {\n \"value\": \"rowAction\",\n \"label\": \"Acao da linha (praxis-table)\"\n },\n {\n \"value\": \"formSubmit\",\n \"label\": \"Submit do formulario (praxis-dynamic-form)\"\n }\n ]\n },\n \"page.composition.links[].to.ref.port\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"resourceId\",\n \"label\": \"ID do registro (praxis-dynamic-form)\",\n \"example\": \"transform pick-path payload.row.id\"\n },\n {\n \"value\": \"mode\",\n \"label\": \"Modo do formulario (create|edit|view)\"\n }\n ]\n },\n \"page.composition.links[].transform.steps[].config.path\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"payload.row.id\",\n \"label\": \"ID padrao do registro\",\n \"example\": \"rowClick -> resourceId\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"page.widget.remove\",\n \"intentExamples\": [\n \"remover widget\",\n \"excluir widget\",\n \"apagar widget\"\n ],\n \"requiresExistingTarget\": true,\n \"scope\": \"ROW\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{target}}\",\n \"_remove\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.connection.remove\",\n \"intentExamples\": [\n \"remover conexao\",\n \"excluir conexao\",\n \"apagar conexao\"\n ],\n \"requiresExistingTarget\": true,\n \"scope\": \"ROW\",\n \"params\": [\n {\n \"name\": \"id\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"_beforeKey\": \"{{target}}\",\n \"id\": \"{{params.id}}\",\n \"_remove\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.layout.orientation.set\",\n \"intentExamples\": [\n \"orientacao\",\n \"orientation\",\n \"layout vertical\",\n \"layout colunas\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"orientation\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"page.layout.columns.set\",\n \"intentExamples\": [\n \"colunas\",\n \"columns\",\n \"qtde colunas\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"columns\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"page.layout.gap.set\",\n \"intentExamples\": [\n \"gap\",\n \"espacamento\",\n \"espaco entre widgets\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"gap\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.sm.set\",\n \"intentExamples\": [\n \"breakpoint sm\",\n \"colunas sm\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"sm\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.md.set\",\n \"intentExamples\": [\n \"breakpoint md\",\n \"colunas md\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"md\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.lg.set\",\n \"intentExamples\": [\n \"breakpoint lg\",\n \"colunas lg\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"lg\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.xl.set\",\n \"intentExamples\": [\n \"breakpoint xl\",\n \"colunas xl\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"xl\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.connection.set\",\n \"intentExamples\": [\n \"set connection\",\n \"definir conexao\",\n \"valor fixo\",\n \"set constante\"\n ],\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"fromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toInput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"value\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"{{params.fromOutput}}\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"{{params.toInput}}\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"constant-value\",\n \"kind\": \"constant\",\n \"phase\": \"link-propagation\",\n \"config\": {\n \"value\": \"{{params.value}}\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.widget.upsert\",\n \"intentExamples\": [\n \"adicionar widget\",\n \"novo widget\",\n \"inserir widget\",\n \"atualizar widget\"\n ],\n \"params\": [\n {\n \"name\": \"widgetKey\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"widgetType\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.widgetKey}}\",\n \"definition\": {\n \"id\": \"{{params.widgetType}}\",\n \"inputs\": {},\n \"bindingOrder\": []\n },\n \"_replace\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.connection.move\",\n \"intentExamples\": [\n \"mover conexao\",\n \"alterar conexao\",\n \"editar conexao\",\n \"trocar conexao\"\n ],\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"fromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toInput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeFromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeFromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeToWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeToInput\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"_beforeKey\": \"{{params.beforeFromWidget}}.{{params.beforeFromOutput}}->{{params.beforeToWidget}}.{{params.beforeToInput}}\",\n \"id\": \"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"{{params.fromOutput}}\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"{{params.toInput}}\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n }\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.widget.createTable\",\n \"intentExamples\": [\n \"criar tabela\",\n \"adicionar tabela\",\n \"widget tabela\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"widgetKey\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Use apenas resourcePath base. Evite inventar colunas; deixe config minima.\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.widgetKey}}\",\n \"definition\": {\n \"id\": \"praxis-table\",\n \"bindingOrder\": [\n \"config\",\n \"resourcePath\"\n ],\n \"inputs\": {\n \"resourcePath\": \"{{params.resourcePath}}\",\n \"tableId\": \"{{params.widgetKey}}\"\n }\n },\n \"_replace\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.widget.createForm\",\n \"intentExamples\": [\n \"criar formulario\",\n \"adicionar formulario\",\n \"widget formulario\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"widgetKey\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"mode\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Use resourcePath base e mode=create|edit|view. Evite inventar campos.\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.widgetKey}}\",\n \"definition\": {\n \"id\": \"praxis-dynamic-form\",\n \"bindingOrder\": [\n \"resourcePath\",\n \"formId\",\n \"resourceId\"\n ],\n \"inputs\": {\n \"resourcePath\": \"{{params.resourcePath}}\",\n \"formId\": \"{{params.widgetKey}}\",\n \"mode\": \"{{params.mode}}\"\n }\n },\n \"_replace\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.connection.bindRowToForm\",\n \"intentExamples\": [\n \"conectar tabela ao formulario\",\n \"master detail\",\n \"master-detail\",\n \"detalhe\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"fromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toInput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"map\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Use transform pick-path payload.row.id para master-detail padrao.\",\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"{{params.fromOutput}}\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"{{params.toInput}}\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"pick-master-detail-value\",\n \"kind\": \"pick-path\",\n \"phase\": \"link-propagation\",\n \"input\": {\n \"source\": \"event\"\n },\n \"config\": {\n \"path\": \"{{params.map}}\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.connection.bindMasterDetail\",\n \"intentExamples\": [\n \"master detail\",\n \"master-detail\",\n \"conectar tabela ao formulario\",\n \"detalhe\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Padrao master-detail: rowClick -> resourceId com transform pick-path payload.row.id.\",\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.fromWidget}}.rowClick->{{params.toWidget}}.resourceId\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"rowClick\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"resourceId\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"pick-master-row-id\",\n \"kind\": \"pick-path\",\n \"phase\": \"link-propagation\",\n \"input\": {\n \"source\": \"event\"\n },\n \"config\": {\n \"path\": \"payload.row.id\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.template.applyMasterDetail\",\n \"intentExamples\": [\n \"criar pagina master detail\",\n \"setup master detail\",\n \"tabela e formulario\",\n \"master-detail\"\n ],\n \"operation\": \"create\",\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"tableId\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"formId\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Padrao master-detail: tabela (rowClick) -> formulario (resourceId) com transform pick-path payload.row.id.\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.tableId}}\",\n \"definition\": {\n \"id\": \"praxis-table\",\n \"bindingOrder\": [\n \"config\",\n \"resourcePath\"\n ],\n \"inputs\": {\n \"tableId\": \"{{params.tableId}}\",\n \"resourcePath\": \"{{params.resourcePath}}\"\n },\n \"outputs\": {\n \"rowClick\": \"emit\"\n }\n },\n \"_replace\": true\n },\n {\n \"key\": \"{{params.formId}}\",\n \"definition\": {\n \"id\": \"praxis-dynamic-form\",\n \"bindingOrder\": [\n \"resourcePath\",\n \"formId\",\n \"resourceId\"\n ],\n \"inputs\": {\n \"formId\": \"{{params.formId}}\",\n \"resourcePath\": \"{{params.resourcePath}}\",\n \"mode\": \"view\"\n }\n },\n \"_replace\": true\n }\n ],\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.tableId}}.rowClick->{{params.formId}}.resourceId\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.tableId}}\",\n \"port\": \"rowClick\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.formId}}\",\n \"port\": \"resourceId\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"pick-master-row-id\",\n \"kind\": \"pick-path\",\n \"phase\": \"link-propagation\",\n \"input\": {\n \"source\": \"event\"\n },\n \"config\": {\n \"path\": \"payload.row.id\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n }\n ],\n \"fieldResolvers\": {\n \"page.widgets[]\": [\n \"key\"\n ],\n \"page.composition.links[]\": [\n \"id\"\n ]\n },\n \"hints\": [\n \"praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.\",\n \"Mutacoes agentic de pagina pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.\",\n \"WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.\",\n \"page.canvas.items e um mapa por widget key, nao um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.\",\n \"Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).\",\n \"Preferir mudancas incrementais: alterar/estender em vez de substituir toda a pagina.\",\n \"Para remover um item, envie {_remove: true} junto ao widget/link.\",\n \"Para substituir um item inteiro, envie {_replace: true}.\",\n \"Para alterar origem/destino de link, use {_beforeKey} com o id antigo.\",\n \"Use keys estaveis para widgets e ids estaveis para links ao criar composicoes.\",\n \"resourcePath sempre e o path base do recurso (sem /filter, /all).\",\n \"Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns nao forem definidas.\",\n \"Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config nao for definida.\",\n \"Quando um widget praxis-rich-content estiver hospedado na pagina, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.\",\n \"Praxis List pode filtrar via config.dataSource.query (enviado para /filter).\",\n \"Quando houver recursos secundarios (ex.: enderecos), use contextHints.addressResourcePath.\",\n \"Exemplo master-detail: tabela emite rowClick -> form.resourceId via transform pick-path payload.row.id.\",\n \"Pattern Master-Detail: { \\\"id\\\":\\\"master.rowClick->detail.resourceId\\\", \\\"from\\\":{\\\"kind\\\":\\\"component-port\\\",\\\"ref\\\":{\\\"port\\\":\\\"rowClick\\\",\\\"direction\\\":\\\"output\\\"}}, \\\"to\\\":{\\\"kind\\\":\\\"component-port\\\",\\\"ref\\\":{\\\"port\\\":\\\"resourceId\\\",\\\"direction\\\":\\\"input\\\"}}, \\\"transform\\\":{\\\"steps\\\":[{\\\"kind\\\":\\\"pick-path\\\",\\\"config\\\":{\\\"path\\\":\\\"payload.row.id\\\"}}]}}\",\n \"Ao criar widgets, use inputs minimos e complemente depois (evite inventar campos).\",\n \"Quando widgets ja existem, interpretar ports de origem/destino antes de conectar.\",\n \"Intencao comum: criar pagina master-detail = criar tabela + criar formulario + conectar selecao via composition.links.\",\n \"Intencao comum: ajustar pagina existente = modificar apenas widgets/inputs necessarios.\",\n \"Exemplo de link canonico (master-detail): { id:\\\"masterTable.rowClick->detailForm.resourceId\\\", from:{kind:\\\"component-port\\\",ref:{widget:\\\"masterTable\\\",port:\\\"rowClick\\\",direction:\\\"output\\\"}}, to:{kind:\\\"component-port\\\",ref:{widget:\\\"detailForm\\\",port:\\\"resourceId\\\",direction:\\\"input\\\"}}, intent:\\\"event-propagation\\\", transform:{version:\\\"2.0\\\",phase:\\\"link-propagation\\\",mode:\\\"single-value\\\",steps:[{kind:\\\"pick-path\\\",phase:\\\"link-propagation\\\",input:{source:\\\"event\\\"},config:{path:\\\"payload.row.id\\\"}}]}}\",\n \"Exemplo de widget tabela (minimo): { key:\\\"masterTable\\\", definition:{ id:\\\"praxis-table\\\", inputs:{ resourcePath:\\\"/api/x\\\" }}}\",\n \"Exemplo de widget formulario (minimo): { key:\\\"detailForm\\\", definition:{ id:\\\"praxis-dynamic-form\\\", inputs:{ resourcePath:\\\"/api/x\\\", mode:\\\"view\\\" }}}\",\n \"Se houver idField conhecido, use transform pick-path payload.row.{idField} em links canonicos.\"\n ]\n }\n}",
2912
+ "content": "{\n \"componentContext\": {\n \"version\": \"v1.0\",\n \"optionsByPath\": {\n \"page.layout.orientation\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"vertical\",\n \"label\": \"Vertical\"\n },\n {\n \"value\": \"columns\",\n \"label\": \"Colunas\"\n }\n ]\n },\n \"page.canvas.mode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"grid\",\n \"label\": \"Grid\"\n }\n ]\n },\n \"page.canvas.autoRows\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"fixed\",\n \"label\": \"Linhas fixas\"\n },\n {\n \"value\": \"content\",\n \"label\": \"Conteúdo\"\n }\n ]\n },\n \"page.canvas.collisionPolicy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"block\",\n \"label\": \"Bloquear colisao\"\n },\n {\n \"value\": \"swap\",\n \"label\": \"Trocar posicao\"\n }\n ]\n },\n \"page.grouping[].kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"section\",\n \"label\": \"Secao\"\n },\n {\n \"value\": \"tabs\",\n \"label\": \"Abas\"\n },\n {\n \"value\": \"hero\",\n \"label\": \"Hero\"\n },\n {\n \"value\": \"rail\",\n \"label\": \"Rail\"\n }\n ]\n },\n \"page.grouping[].layout\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"stack\",\n \"label\": \"Empilhado\"\n },\n {\n \"value\": \"grid\",\n \"label\": \"Grid\"\n },\n {\n \"value\": \"row\",\n \"label\": \"Linha\"\n }\n ]\n },\n \"page.grouping[].emphasis\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"high\",\n \"label\": \"Alta\"\n },\n {\n \"value\": \"medium\",\n \"label\": \"Media\"\n }\n ]\n },\n \"page.grouping[].side\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"left\",\n \"label\": \"Esquerda\"\n },\n {\n \"value\": \"right\",\n \"label\": \"Direita\"\n }\n ]\n },\n \"page.state.schema.<token>.mergeStrategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"replace\",\n \"label\": \"Substituir\"\n },\n {\n \"value\": \"merge\",\n \"label\": \"Mesclar\"\n },\n {\n \"value\": \"append\",\n \"label\": \"Acrescentar\"\n },\n {\n \"value\": \"remove-keys\",\n \"label\": \"Remover chaves\"\n }\n ]\n },\n \"page.state.derived.<token>.compute.kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"json-logic\",\n \"label\": \"Json Logic\"\n },\n {\n \"value\": \"template\",\n \"label\": \"Template\"\n },\n {\n \"value\": \"operator\",\n \"label\": \"Operador\"\n },\n {\n \"value\": \"transformer\",\n \"label\": \"Transformer\"\n }\n ]\n },\n \"page.widgets[].shell.kind\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"dashboard-card\",\n \"label\": \"Dashboard Card\"\n },\n {\n \"value\": \"none\",\n \"label\": \"Sem shell\"\n }\n ]\n },\n \"page.widgets[].shell.actions[].variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"icon\",\n \"label\": \"Ícone\"\n },\n {\n \"value\": \"text\",\n \"label\": \"Texto\"\n },\n {\n \"value\": \"outlined\",\n \"label\": \"Outlined\"\n }\n ]\n },\n \"page.widgets[].shell.actions[].placement\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"header\",\n \"label\": \"Header\"\n },\n {\n \"value\": \"window\",\n \"label\": \"Janela\"\n }\n ]\n },\n \"page.composition.version\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"1.0.0\",\n \"label\": \"Schema canonico 1.0.0\"\n }\n ]\n },\n \"page.composition.links[].intent\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"event-propagation\",\n \"label\": \"Propagacao de evento\"\n },\n {\n \"value\": \"state-read\",\n \"label\": \"Leitura de estado\"\n },\n {\n \"value\": \"state-write\",\n \"label\": \"Escrita de estado\"\n }\n ]\n },\n \"page.composition.links[].from.ref.port\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"rowClick\",\n \"label\": \"Clique na linha (praxis-table)\",\n \"example\": \"Usar table.rowClick -> form.resourceId via transform pick-path payload.row.id\"\n },\n {\n \"value\": \"rowAction\",\n \"label\": \"Ação da linha (praxis-table)\"\n },\n {\n \"value\": \"formSubmit\",\n \"label\": \"Submit do formulario (praxis-dynamic-form)\"\n }\n ]\n },\n \"page.composition.links[].to.ref.port\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"resourceId\",\n \"label\": \"ID do registro (praxis-dynamic-form)\",\n \"example\": \"transform pick-path payload.row.id\"\n },\n {\n \"value\": \"mode\",\n \"label\": \"Modo do formulario (create|edit|view)\"\n }\n ]\n },\n \"page.composition.links[].transform.steps[].config.path\": {\n \"mode\": \"suggested\",\n \"options\": [\n {\n \"value\": \"payload.row.id\",\n \"label\": \"ID padrão do registro\",\n \"example\": \"rowClick -> resourceId\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"page.widget.remove\",\n \"intentExamples\": [\n \"remover widget\",\n \"excluir widget\",\n \"apagar widget\"\n ],\n \"requiresExistingTarget\": true,\n \"scope\": \"ROW\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{target}}\",\n \"_remove\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.connection.remove\",\n \"intentExamples\": [\n \"remover conexao\",\n \"excluir conexao\",\n \"apagar conexao\"\n ],\n \"requiresExistingTarget\": true,\n \"scope\": \"ROW\",\n \"params\": [\n {\n \"name\": \"id\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"_beforeKey\": \"{{target}}\",\n \"id\": \"{{params.id}}\",\n \"_remove\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.layout.orientation.set\",\n \"intentExamples\": [\n \"orientacao\",\n \"orientation\",\n \"layout vertical\",\n \"layout colunas\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"orientation\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"page.layout.columns.set\",\n \"intentExamples\": [\n \"colunas\",\n \"columns\",\n \"qtde colunas\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"columns\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"page.layout.gap.set\",\n \"intentExamples\": [\n \"gap\",\n \"espacamento\",\n \"espaco entre widgets\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"gap\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.sm.set\",\n \"intentExamples\": [\n \"breakpoint sm\",\n \"colunas sm\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"sm\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.md.set\",\n \"intentExamples\": [\n \"breakpoint md\",\n \"colunas md\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"md\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.lg.set\",\n \"intentExamples\": [\n \"breakpoint lg\",\n \"colunas lg\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"lg\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.layout.breakpoints.xl.set\",\n \"intentExamples\": [\n \"breakpoint xl\",\n \"colunas xl\"\n ],\n \"patchTemplate\": {\n \"page\": {\n \"layout\": {\n \"breakpoints\": {\n \"xl\": \"{{value}}\"\n }\n }\n }\n }\n },\n {\n \"id\": \"page.connection.set\",\n \"intentExamples\": [\n \"set connection\",\n \"definir conexao\",\n \"valor fixo\",\n \"set constante\"\n ],\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"fromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toInput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"value\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"{{params.fromOutput}}\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"{{params.toInput}}\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"constant-value\",\n \"kind\": \"constant\",\n \"phase\": \"link-propagation\",\n \"config\": {\n \"value\": \"{{params.value}}\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.widget.upsert\",\n \"intentExamples\": [\n \"adicionar widget\",\n \"novo widget\",\n \"inserir widget\",\n \"atualizar widget\"\n ],\n \"params\": [\n {\n \"name\": \"widgetKey\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"widgetType\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.widgetKey}}\",\n \"definition\": {\n \"id\": \"{{params.widgetType}}\",\n \"inputs\": {},\n \"bindingOrder\": []\n },\n \"_replace\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.connection.move\",\n \"intentExamples\": [\n \"mover conexao\",\n \"alterar conexao\",\n \"editar conexao\",\n \"trocar conexao\"\n ],\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"fromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toInput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeFromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeFromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeToWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"beforeToInput\",\n \"type\": \"STRING\"\n }\n ],\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"_beforeKey\": \"{{params.beforeFromWidget}}.{{params.beforeFromOutput}}->{{params.beforeToWidget}}.{{params.beforeToInput}}\",\n \"id\": \"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"{{params.fromOutput}}\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"{{params.toInput}}\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n }\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.widget.createTable\",\n \"intentExamples\": [\n \"criar tabela\",\n \"adicionar tabela\",\n \"widget tabela\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"widgetKey\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Use apenas resourcePath base. Evite inventar colunas; deixe config minima.\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.widgetKey}}\",\n \"definition\": {\n \"id\": \"praxis-table\",\n \"bindingOrder\": [\n \"config\",\n \"resourcePath\"\n ],\n \"inputs\": {\n \"resourcePath\": \"{{params.resourcePath}}\",\n \"tableId\": \"{{params.widgetKey}}\"\n }\n },\n \"_replace\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.widget.createForm\",\n \"intentExamples\": [\n \"criar formulario\",\n \"adicionar formulario\",\n \"widget formulario\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"widgetKey\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"mode\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Use resourcePath base e mode=create|edit|view. Evite inventar campos.\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.widgetKey}}\",\n \"definition\": {\n \"id\": \"praxis-dynamic-form\",\n \"bindingOrder\": [\n \"resourcePath\",\n \"formId\",\n \"resourceId\"\n ],\n \"inputs\": {\n \"resourcePath\": \"{{params.resourcePath}}\",\n \"formId\": \"{{params.widgetKey}}\",\n \"mode\": \"{{params.mode}}\"\n }\n },\n \"_replace\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"page.connection.bindRowToForm\",\n \"intentExamples\": [\n \"conectar tabela ao formulario\",\n \"master detail\",\n \"master-detail\",\n \"detalhe\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"fromOutput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toInput\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"map\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Use transform pick-path payload.row.id para master-detail padrão.\",\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"{{params.fromOutput}}\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"{{params.toInput}}\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"pick-master-detail-value\",\n \"kind\": \"pick-path\",\n \"phase\": \"link-propagation\",\n \"input\": {\n \"source\": \"event\"\n },\n \"config\": {\n \"path\": \"{{params.map}}\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.connection.bindMasterDetail\",\n \"intentExamples\": [\n \"master detail\",\n \"master-detail\",\n \"conectar tabela ao formulario\",\n \"detalhe\"\n ],\n \"operation\": \"create\",\n \"scope\": \"ROW\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"fromWidget\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"toWidget\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Padrão master-detail: rowClick -> resourceId com transform pick-path payload.row.id.\",\n \"patchTemplate\": {\n \"page\": {\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.fromWidget}}.rowClick->{{params.toWidget}}.resourceId\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.fromWidget}}\",\n \"port\": \"rowClick\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.toWidget}}\",\n \"port\": \"resourceId\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"pick-master-row-id\",\n \"kind\": \"pick-path\",\n \"phase\": \"link-propagation\",\n \"input\": {\n \"source\": \"event\"\n },\n \"config\": {\n \"path\": \"payload.row.id\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n },\n {\n \"id\": \"page.template.applyMasterDetail\",\n \"intentExamples\": [\n \"criar página master detail\",\n \"setup master detail\",\n \"tabela e formulário\",\n \"master-detail\"\n ],\n \"operation\": \"create\",\n \"scope\": \"GLOBAL\",\n \"valueType\": \"OBJECT\",\n \"params\": [\n {\n \"name\": \"tableId\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"formId\",\n \"type\": \"STRING\"\n },\n {\n \"name\": \"resourcePath\",\n \"type\": \"STRING\"\n }\n ],\n \"safetyNotes\": \"Padrão master-detail: tabela (rowClick) -> formulario (resourceId) com transform pick-path payload.row.id.\",\n \"patchTemplate\": {\n \"page\": {\n \"widgets\": [\n {\n \"key\": \"{{params.tableId}}\",\n \"definition\": {\n \"id\": \"praxis-table\",\n \"bindingOrder\": [\n \"config\",\n \"resourcePath\"\n ],\n \"inputs\": {\n \"tableId\": \"{{params.tableId}}\",\n \"resourcePath\": \"{{params.resourcePath}}\"\n },\n \"outputs\": {\n \"rowClick\": \"emit\"\n }\n },\n \"_replace\": true\n },\n {\n \"key\": \"{{params.formId}}\",\n \"definition\": {\n \"id\": \"praxis-dynamic-form\",\n \"bindingOrder\": [\n \"resourcePath\",\n \"formId\",\n \"resourceId\"\n ],\n \"inputs\": {\n \"formId\": \"{{params.formId}}\",\n \"resourcePath\": \"{{params.resourcePath}}\",\n \"mode\": \"view\"\n }\n },\n \"_replace\": true\n }\n ],\n \"composition\": {\n \"version\": \"1.0.0\",\n \"links\": [\n {\n \"id\": \"{{params.tableId}}.rowClick->{{params.formId}}.resourceId\",\n \"from\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.tableId}}\",\n \"port\": \"rowClick\",\n \"direction\": \"output\"\n }\n },\n \"to\": {\n \"kind\": \"component-port\",\n \"ref\": {\n \"widget\": \"{{params.formId}}\",\n \"port\": \"resourceId\",\n \"direction\": \"input\"\n }\n },\n \"intent\": \"event-propagation\",\n \"transform\": {\n \"version\": \"2.0\",\n \"phase\": \"link-propagation\",\n \"mode\": \"single-value\",\n \"steps\": [\n {\n \"id\": \"pick-master-row-id\",\n \"kind\": \"pick-path\",\n \"phase\": \"link-propagation\",\n \"input\": {\n \"source\": \"event\"\n },\n \"config\": {\n \"path\": \"payload.row.id\"\n }\n }\n ]\n },\n \"metadata\": {\n \"source\": \"persisted-composition-link\"\n },\n \"_replace\": true\n }\n ]\n }\n }\n }\n }\n ],\n \"fieldResolvers\": {\n \"page.widgets[]\": [\n \"key\"\n ],\n \"page.composition.links[]\": [\n \"id\"\n ]\n },\n \"hints\": [\n \"praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.\",\n \"Mutações agentic de página pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.\",\n \"WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.\",\n \"page.canvas.items é um mapa por widget key, não um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.\",\n \"Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).\",\n \"Preferir mudanças incrementais: alterar/estender em vez de substituir toda a página.\",\n \"Para remover um item, envie {_remove: true} junto ao widget/link.\",\n \"Para substituir um item inteiro, envie {_replace: true}.\",\n \"Para alterar origem/destino de link, use {_beforeKey} com o id antigo.\",\n \"Use keys estaveis para widgets e ids estaveis para links ao criar composicoes.\",\n \"resourcePath sempre e o path base do recurso (sem /filter, /all).\",\n \"Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns não forem definidas.\",\n \"Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config não for definida.\",\n \"Quando um widget praxis-rich-content estiver hospedado na página, definition.inputs.document continua sendo o contrato persistido; hostCapabilities é injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.\",\n \"Praxis List pode filtrar via config.dataSource.query (enviado para /filter).\",\n \"Quando houver recursos secundarios (ex.: enderecos), use contextHints.addressResourcePath.\",\n \"Exemplo master-detail: tabela emite rowClick -> form.resourceId via transform pick-path payload.row.id.\",\n \"Pattern Master-Detail: { \\\"id\\\":\\\"master.rowClick->detail.resourceId\\\", \\\"from\\\":{\\\"kind\\\":\\\"component-port\\\",\\\"ref\\\":{\\\"port\\\":\\\"rowClick\\\",\\\"direction\\\":\\\"output\\\"}}, \\\"to\\\":{\\\"kind\\\":\\\"component-port\\\",\\\"ref\\\":{\\\"port\\\":\\\"resourceId\\\",\\\"direction\\\":\\\"input\\\"}}, \\\"transform\\\":{\\\"steps\\\":[{\\\"kind\\\":\\\"pick-path\\\",\\\"config\\\":{\\\"path\\\":\\\"payload.row.id\\\"}}]}}\",\n \"Ao criar widgets, use inputs minimos e complemente depois (evite inventar campos).\",\n \"Quando widgets ja existem, interpretar ports de origem/destino antes de conectar.\",\n \"Intenção comum: criar página master-detail = criar tabela + criar formulário + conectar seleção via composition.links.\",\n \"Intenção comum: ajustar página existente = modificar apenas widgets/inputs necessários.\",\n \"Exemplo de link canonico (master-detail): { id:\\\"masterTable.rowClick->detailForm.resourceId\\\", from:{kind:\\\"component-port\\\",ref:{widget:\\\"masterTable\\\",port:\\\"rowClick\\\",direction:\\\"output\\\"}}, to:{kind:\\\"component-port\\\",ref:{widget:\\\"detailForm\\\",port:\\\"resourceId\\\",direction:\\\"input\\\"}}, intent:\\\"event-propagation\\\", transform:{version:\\\"2.0\\\",phase:\\\"link-propagation\\\",mode:\\\"single-value\\\",steps:[{kind:\\\"pick-path\\\",phase:\\\"link-propagation\\\",input:{source:\\\"event\\\"},config:{path:\\\"payload.row.id\\\"}}]}}\",\n \"Exemplo de widget tabela (mínimo): { key:\\\"masterTable\\\", definition:{ id:\\\"praxis-table\\\", inputs:{ resourcePath:\\\"/api/x\\\" }}}\",\n \"Exemplo de widget formulário (mínimo): { key:\\\"detailForm\\\", definition:{ id:\\\"praxis-dynamic-form\\\", inputs:{ resourcePath:\\\"/api/x\\\", mode:\\\"view\\\" }}}\",\n \"Se houver idField conhecido, use transform pick-path payload.row.{idField} em links canonicos.\"\n ]\n }\n}",
2913
2913
  "sourcePointer": "praxis-ui-angular/projects/praxis-core/src/lib/ai/dynamic-page-context-pack.ts",
2914
- "contentHash": "5fc35b691915fa7b8c766ae72c7eabe6b418785ea424a794dfd70cef3bd31624",
2914
+ "contentHash": "700715ca6fe6e50f477ffb731a5397282e49c42f00d3cb60e4d3222a94497361",
2915
2915
  "sourceKind": "component_definition",
2916
2916
  "sourceId": "praxis-dynamic-page",
2917
2917
  "corpusVersion": "1.0.0"