@praxisui/core 9.0.67 → 9.0.68-rc.1

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-09-07T00:54:55.301Z",
3
+ "generatedAt": "2026-09-09T11:40:45.048Z",
4
4
  "packageName": "@praxisui/core",
5
- "packageVersion": "9.0.67",
5
+ "packageVersion": "9.0.68-rc.1",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 4,
@@ -560,6 +560,30 @@
560
560
  "layout"
561
561
  ],
562
562
  "lib": "@praxisui/core",
563
+ "ports": [
564
+ {
565
+ "id": "context",
566
+ "label": "Page context",
567
+ "direction": "input",
568
+ "semanticKind": "view-context",
569
+ "description": "Runtime context shared with child widgets, separate from the authored page and business authorization.",
570
+ "schema": {
571
+ "id": "Record<string, unknown>",
572
+ "kind": "ts-type",
573
+ "ref": "Record<string, unknown>"
574
+ },
575
+ "compatibility": {
576
+ "acceptsSemanticKinds": [
577
+ "view-context"
578
+ ],
579
+ "schemaMode": "structural"
580
+ },
581
+ "exposure": {
582
+ "public": true,
583
+ "group": "data"
584
+ }
585
+ }
586
+ ],
563
587
  "source": "projects/praxis-core/src/lib/widgets/dynamic-widget-page.metadata.ts",
564
588
  "exportName": "PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA",
565
589
  "componentCapabilities": [
@@ -993,6 +1017,12 @@
993
1017
  "valueKind": "string",
994
1018
  "description": "Altura base das linhas do canvas (ex: 80px)."
995
1019
  },
1020
+ {
1021
+ "path": "page.layout.paddingInline",
1022
+ "category": "layout",
1023
+ "valueKind": "string",
1024
+ "description": "Margem lateral compartilhada da pagina: medida CSS ou var(); 0px remove, omitido herda o token --pdx-page-padding-inline do host. Override por deviceLayouts.*.layout.paddingInline."
1025
+ },
996
1026
  {
997
1027
  "path": "page.canvas.gap",
998
1028
  "category": "layout",
@@ -1120,6 +1150,12 @@
1120
1150
  "valueKind": "object",
1121
1151
  "description": "Componente standalone que implementa SettingsValueProvider para editar definition.inputs."
1122
1152
  },
1153
+ {
1154
+ "path": "ComponentDocMeta.configEditor.loadComponent",
1155
+ "category": "widgets",
1156
+ "valueKind": "object",
1157
+ "description": "Loader assíncrono publicado pela lib dona para materializar o editor somente quando o authoring for solicitado."
1158
+ },
1123
1159
  {
1124
1160
  "path": "ComponentDocMeta.configEditor.title",
1125
1161
  "category": "widgets",
@@ -1482,6 +1518,30 @@
1482
1518
  "valueKind": "string",
1483
1519
  "description": "Subtítulo do shell."
1484
1520
  },
1521
+ {
1522
+ "path": "page.widgets[].shell.avatar",
1523
+ "category": "shell",
1524
+ "valueKind": "object",
1525
+ "description": "Avatar opcional com imageSrc, name e initials; usa templates como ${transient.employee.avatarUrl}. Sem imagem, usa iniciais ou ícone."
1526
+ },
1527
+ {
1528
+ "path": "page.widgets[].shell.avatar.imageSrc",
1529
+ "category": "shell",
1530
+ "valueKind": "string",
1531
+ "description": "URL da foto ou template do shell; dados transitórios não são persistidos."
1532
+ },
1533
+ {
1534
+ "path": "page.widgets[].shell.avatar.name",
1535
+ "category": "shell",
1536
+ "valueKind": "string",
1537
+ "description": "Nome para acessibilidade e iniciais; aceita template do shell."
1538
+ },
1539
+ {
1540
+ "path": "page.widgets[].shell.avatar.initials",
1541
+ "category": "shell",
1542
+ "valueKind": "string",
1543
+ "description": "Iniciais opcionais que substituem as derivadas do nome."
1544
+ },
1485
1545
  {
1486
1546
  "path": "page.widgets[].shell.icon",
1487
1547
  "category": "shell",
@@ -3045,9 +3105,9 @@
3045
3105
  {
3046
3106
  "chunkIndex": 2,
3047
3107
  "chunkKind": "capabilities",
3048
- "content": "Component Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do binding.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].condition\n Category: connections\n Kind: expression\n Description: Guarda opcional em Json Logic.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform\n Category: connections\n Kind: object\n Description: Transform declarativo: pick-path, query-context, template, constant ou select-case total.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.fallbackValue\n Category: connections\n Kind: object\n Description: Fallback JSON explicito do pipeline quando a projecao resolve undefined; use null, objeto ou colecao conforme o contrato do destino.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.cases\n Category: connections\n Kind: array\n Description: Branches do select-case, cada uma com guarda Json Logic canonica em when e valor total em value.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.defaultValue\n Category: connections\n Kind: object\n Description: Valor total obrigatorio do select-case quando nenhuma branch corresponde; permite empty/reset sem um segundo binding.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].policy\n Category: connections\n Kind: object\n Description: Politica operacional opcional do binding.\n\nComponent Capability:\n - Path: page\n Category: page\n Kind: object\n Description: Definicao da pagina (WidgetPageDefinition).\n\nComponent Capability:\n - Path: context\n Category: context\n Kind: object\n Description: Contexto extra mesclado ao page.context.\n\nComponent Capability:\n - Path: enableCustomization\n Category: behavior\n Kind: boolean\n Description: Habilita modo de edicao.\n\nComponent Capability:\n - Path: showSettingsButton\n Category: behavior\n Kind: boolean\n Description: Exibe botao de settings.\n\nComponent Capability:\n - Path: strictValidation\n Category: behavior\n Kind: boolean\n Description: Validacao estrita do widget loader.\n\nComponent Capability:\n - Path: layoutOptions\n Category: layout\n Kind: object\n Description: Overrides residuais do host aceitos apenas para compatibilidade de migracao.\n\nComponent Capability:\n - Path: layoutOptions.cols\n Category: layout\n Kind: number\n Description: Compat: numero de colunas usado para derivar canvas padrao.\n\nComponent Capability:\n - Path: layoutOptions.rowHeight\n Category: layout\n Kind: number\n Description: Compat: altura de linha usada para derivar rowUnit do canvas.\n\nComponent Capability:\n - Path: layoutOptions.gap\n Category: layout\n Kind: number\n Description: Compat: espacamento usado para derivar gap do canvas.\n\nComponent Capability:\n - Path: pageIdentity\n Category: identity\n Kind: object\n Description: Identidade de persistencia da pagina.\n\nComponent Capability:\n - Path: pageIdentity.appId\n Category: identity\n Kind: string\n Description: App id (opcional).\n\nComponent Capability:\n - Path: pageIdentity.tenantId\n Category: identity\n Kind: string\n Description: Tenant id.\n\nComponent Capability:\n - Path: pageIdentity.userId\n Category: identity\n Kind: string\n Description: User id.\n\nComponent Capability:\n - Path: pageIdentity.routePath\n Category: identity\n Kind: string\n Description: Rota base da pagina.\n\nComponent Capability:\n - Path: pageIdentity.locale\n Category: identity\n Kind: string\n Description: Locale.\n\nComponent Capability:\n - Path: page.canvas\n Category: layout\n Kind: object\n Description: Canvas espacial canonico da pagina.\n\nComponent Capability:\n - Path: page.canvas.mode\n Category: layout\n Kind: string\n Description: Modo do canvas. O builder usa grid canonico.\n\nComponent Capability:\n - Path: page.canvas.columns\n Category: layout\n Kind: number\n Description: Numero de colunas do canvas.\n\nComponent Capability:\n - Path: page.canvas.rowUnit\n Category: layout\n Kind: string\n Description: Altura base das linhas do canvas (ex: 80px).\n\nComponent Capability:\n - Path: page.canvas.gap\n Category: layout\n Kind: string\n Description: Espacamento entre itens do canvas.\n\nComponent Capability:\n - Path: page.canvas.autoRows\n Category: layout\n Kind: string\n Description: Politica de auto rows do canvas.\n\nComponent Capability:\n - Path: page.canvas.items\n Category: layout\n Kind: object\n Description: Mapa canonico de posicionamento espacial por widget key.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.col\n Category: layout\n Kind: number\n Description: Coluna inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.row\n Category: layout\n Kind: number\n Description: Linha inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.colSpan\n Category: layout\n Kind: number\n Description: Colunas ocupadas.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.rowSpan\n Category: layout\n Kind: number\n Description: Linhas ocupadas.\n\nComponent Capability:\n - Path: page.state\n Category: state\n Kind: object\n Description: Estado declarativo opcional da pagina.",
3108
+ "content": "Component Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do binding.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].condition\n Category: connections\n Kind: expression\n Description: Guarda opcional em Json Logic.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform\n Category: connections\n Kind: object\n Description: Transform declarativo: pick-path, query-context, template, constant ou select-case total.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.fallbackValue\n Category: connections\n Kind: object\n Description: Fallback JSON explicito do pipeline quando a projecao resolve undefined; use null, objeto ou colecao conforme o contrato do destino.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.cases\n Category: connections\n Kind: array\n Description: Branches do select-case, cada uma com guarda Json Logic canonica em when e valor total em value.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.defaultValue\n Category: connections\n Kind: object\n Description: Valor total obrigatorio do select-case quando nenhuma branch corresponde; permite empty/reset sem um segundo binding.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].policy\n Category: connections\n Kind: object\n Description: Politica operacional opcional do binding.\n\nComponent Capability:\n - Path: page\n Category: page\n Kind: object\n Description: Definicao da pagina (WidgetPageDefinition).\n\nComponent Capability:\n - Path: context\n Category: context\n Kind: object\n Description: Contexto extra mesclado ao page.context.\n\nComponent Capability:\n - Path: enableCustomization\n Category: behavior\n Kind: boolean\n Description: Habilita modo de edicao.\n\nComponent Capability:\n - Path: showSettingsButton\n Category: behavior\n Kind: boolean\n Description: Exibe botao de settings.\n\nComponent Capability:\n - Path: strictValidation\n Category: behavior\n Kind: boolean\n Description: Validacao estrita do widget loader.\n\nComponent Capability:\n - Path: layoutOptions\n Category: layout\n Kind: object\n Description: Overrides residuais do host aceitos apenas para compatibilidade de migracao.\n\nComponent Capability:\n - Path: layoutOptions.cols\n Category: layout\n Kind: number\n Description: Compat: numero de colunas usado para derivar canvas padrao.\n\nComponent Capability:\n - Path: layoutOptions.rowHeight\n Category: layout\n Kind: number\n Description: Compat: altura de linha usada para derivar rowUnit do canvas.\n\nComponent Capability:\n - Path: layoutOptions.gap\n Category: layout\n Kind: number\n Description: Compat: espacamento usado para derivar gap do canvas.\n\nComponent Capability:\n - Path: pageIdentity\n Category: identity\n Kind: object\n Description: Identidade de persistencia da pagina.\n\nComponent Capability:\n - Path: pageIdentity.appId\n Category: identity\n Kind: string\n Description: App id (opcional).\n\nComponent Capability:\n - Path: pageIdentity.tenantId\n Category: identity\n Kind: string\n Description: Tenant id.\n\nComponent Capability:\n - Path: pageIdentity.userId\n Category: identity\n Kind: string\n Description: User id.\n\nComponent Capability:\n - Path: pageIdentity.routePath\n Category: identity\n Kind: string\n Description: Rota base da pagina.\n\nComponent Capability:\n - Path: pageIdentity.locale\n Category: identity\n Kind: string\n Description: Locale.\n\nComponent Capability:\n - Path: page.canvas\n Category: layout\n Kind: object\n Description: Canvas espacial canonico da pagina.\n\nComponent Capability:\n - Path: page.canvas.mode\n Category: layout\n Kind: string\n Description: Modo do canvas. O builder usa grid canonico.\n\nComponent Capability:\n - Path: page.canvas.columns\n Category: layout\n Kind: number\n Description: Numero de colunas do canvas.\n\nComponent Capability:\n - Path: page.canvas.rowUnit\n Category: layout\n Kind: string\n Description: Altura base das linhas do canvas (ex: 80px).\n\nComponent Capability:\n - Path: page.layout.paddingInline\n Category: layout\n Kind: string\n Description: Margem lateral compartilhada da pagina: medida CSS ou var(); 0px remove, omitido herda o token --pdx-page-padding-inline do host. Override por deviceLayouts.*.layout.paddingInline.\n\nComponent Capability:\n - Path: page.canvas.gap\n Category: layout\n Kind: string\n Description: Espacamento entre itens do canvas.\n\nComponent Capability:\n - Path: page.canvas.autoRows\n Category: layout\n Kind: string\n Description: Politica de auto rows do canvas.\n\nComponent Capability:\n - Path: page.canvas.items\n Category: layout\n Kind: object\n Description: Mapa canonico de posicionamento espacial por widget key.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.col\n Category: layout\n Kind: number\n Description: Coluna inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.row\n Category: layout\n Kind: number\n Description: Linha inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.colSpan\n Category: layout\n Kind: number\n Description: Colunas ocupadas.",
3049
3109
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3050
- "contentHash": "a267d04c2d778e17e255cadbf244eb9e1efba04cf222c04f99725f5a3aab8c70",
3110
+ "contentHash": "1c2568286cfabf897c08293c33d554a66719468a715adeb3dd3a2112f3713e37",
3051
3111
  "sourceKind": "component_definition",
3052
3112
  "sourceId": "praxis-dynamic-page",
3053
3113
  "corpusVersion": "1.0.0"
@@ -3055,9 +3115,9 @@
3055
3115
  {
3056
3116
  "chunkIndex": 3,
3057
3117
  "chunkKind": "capabilities",
3058
- "content": "Component Capability:\n - Path: page.state.values\n Category: state\n Kind: object\n Description: Valores primarios persistiveis do estado da pagina.\n\nComponent Capability:\n - Path: page.state.schema\n Category: state\n Kind: object\n Description: Descritores dos paths de estado primario.\n\nComponent Capability:\n - Path: page.state.derived\n Category: state\n Kind: object\n Description: Descritores de estado derivado recomputado pelo runtime.\n\nComponent Capability:\n - Path: page.widgets\n Category: widgets\n Kind: array\n Description: Widgets da pagina.\n\nComponent Capability:\n - Path: page.widgets[].key\n Category: widgets\n Kind: string\n Description: ID unico do widget.\n\nComponent Capability:\n - Path: page.widgets[].className\n Category: widgets\n Kind: string\n Description: Classe CSS do widget.\n\nComponent Capability:\n - Path: page.widgets[].definition\n Category: widgets\n Kind: object\n Description: Definicao do widget (WidgetDefinition).\n\nComponent Capability:\n - Path: page.widgets[].definition.id\n Category: widgets\n Kind: string\n Description: ID do componente registrado.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs\n Category: widgets\n Kind: object\n Description: Inputs do componente.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs.document\n Category: widgets\n Kind: object\n Description: RichContentDocument quando definition.id for praxis-rich-content.\n\nComponent Capability:\n - Path: page.widgets[].definition.bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem de aplicacao dos inputs.\n\nComponent Capability:\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\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.component\n Category: widgets\n Kind: object\n Description: Componente standalone que implementa SettingsValueProvider para editar definition.inputs.\n\nComponent Capability:\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\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.contextResolver\n Category: widgets\n Kind: object\n Description: Resolver canonico de contexto transiente para o editor; catálogos, schemas, capabilities, targets e diagnostics devem ser passados por context/contextDiagnostics e nao persistidos em definition.inputs.\n\nComponent Capability:\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\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n\nComponent Capability:\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n\nComponent Capability:\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n\nComponent Capability:\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n\nComponent Capability:\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n\nComponent Capability:\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n\nComponent Capability:\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n\nComponent Capability:\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n\nComponent Capability:\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).\n\nComponent Capability:\n - Path: page.i18n\n Category: localization\n Kind: object\n Description: Catálogo de copy de negócio da página, resolvido apenas na projeção runtime.\n\nComponent Capability:\n - Path: page.i18n.fallbackLocale\n Category: localization\n Kind: string\n Description: Locale de fallback do catálogo próprio da página.\n\nComponent Capability:\n - Path: page.i18n.dictionaries\n Category: localization\n Kind: object\n Description: Dicionários locale -> chave semântica -> texto usados por descritores PraxisTextValue explícitos.",
3118
+ "content": "Component Capability:\n - Path: page.canvas.items.<widgetKey>.rowSpan\n Category: layout\n Kind: number\n Description: Linhas ocupadas.\n\nComponent Capability:\n - Path: page.state\n Category: state\n Kind: object\n Description: Estado declarativo opcional da pagina.\n\nComponent Capability:\n - Path: page.state.values\n Category: state\n Kind: object\n Description: Valores primarios persistiveis do estado da pagina.\n\nComponent Capability:\n - Path: page.state.schema\n Category: state\n Kind: object\n Description: Descritores dos paths de estado primario.\n\nComponent Capability:\n - Path: page.state.derived\n Category: state\n Kind: object\n Description: Descritores de estado derivado recomputado pelo runtime.\n\nComponent Capability:\n - Path: page.widgets\n Category: widgets\n Kind: array\n Description: Widgets da pagina.\n\nComponent Capability:\n - Path: page.widgets[].key\n Category: widgets\n Kind: string\n Description: ID unico do widget.\n\nComponent Capability:\n - Path: page.widgets[].className\n Category: widgets\n Kind: string\n Description: Classe CSS do widget.\n\nComponent Capability:\n - Path: page.widgets[].definition\n Category: widgets\n Kind: object\n Description: Definicao do widget (WidgetDefinition).\n\nComponent Capability:\n - Path: page.widgets[].definition.id\n Category: widgets\n Kind: string\n Description: ID do componente registrado.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs\n Category: widgets\n Kind: object\n Description: Inputs do componente.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs.document\n Category: widgets\n Kind: object\n Description: RichContentDocument quando definition.id for praxis-rich-content.\n\nComponent Capability:\n - Path: page.widgets[].definition.bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem de aplicacao dos inputs.\n\nComponent Capability:\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\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.component\n Category: widgets\n Kind: object\n Description: Componente standalone que implementa SettingsValueProvider para editar definition.inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.loadComponent\n Category: widgets\n Kind: object\n Description: Loader assíncrono publicado pela lib dona para materializar o editor somente quando o authoring for solicitado.\n\nComponent Capability:\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\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.contextResolver\n Category: widgets\n Kind: object\n Description: Resolver canonico de contexto transiente para o editor; catálogos, schemas, capabilities, targets e diagnostics devem ser passados por context/contextDiagnostics e nao persistidos em definition.inputs.\n\nComponent Capability:\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\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n\nComponent Capability:\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n\nComponent Capability:\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n\nComponent Capability:\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n\nComponent Capability:\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n\nComponent Capability:\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n\nComponent Capability:\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n\nComponent Capability:\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n\nComponent Capability:\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).",
3059
3119
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3060
- "contentHash": "6b2a7005cdcaf1254342fab1f1d43885eb41fe8941d62261ebe13d34f0806e66",
3120
+ "contentHash": "fe893bce91d45580181acff6ecec8cc2339eae2af9777b75d4a8bbc3223c0a91",
3061
3121
  "sourceKind": "component_definition",
3062
3122
  "sourceId": "praxis-dynamic-page",
3063
3123
  "corpusVersion": "1.0.0"
@@ -3065,9 +3125,9 @@
3065
3125
  {
3066
3126
  "chunkIndex": 4,
3067
3127
  "chunkKind": "capabilities",
3068
- "content": "Component Capability:\n - Path: page.layoutPreset\n Category: layout\n Kind: string\n Description: ID canônico opcional do preset estrutural da página.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.layout\n Category: layout\n Kind: object\n Description: Layout base da página.\n\nComponent Capability:\n - Path: page.layout.orientation\n Category: layout\n Kind: enum\n Description: Orientacao do grid (vertical/columns).\n\nComponent Capability:\n - Path: page.layout.columns\n Category: layout\n Kind: number\n Description: Numero de colunas (quando orientation=columns).\n\nComponent Capability:\n - Path: page.layout.gap\n Category: layout\n Kind: string\n Description: Gap entre widgets (ex: 16px).\n\nComponent Capability:\n - Path: page.layout.breakpoints\n Category: layout\n Kind: object\n Description: Colunas por breakpoint.\n\nComponent Capability:\n - Path: page.layout.breakpoints.sm\n Category: layout\n Kind: number\n Description: Colunas para breakpoint sm.\n\nComponent Capability:\n - Path: page.layout.breakpoints.md\n Category: layout\n Kind: number\n Description: Colunas para breakpoint md.\n\nComponent Capability:\n - Path: page.layout.breakpoints.lg\n Category: layout\n Kind: number\n Description: Colunas para breakpoint lg.\n\nComponent Capability:\n - Path: page.layout.breakpoints.xl\n Category: layout\n Kind: number\n Description: Colunas para breakpoint xl.\n\nComponent Capability:\n - Path: page.canvas.collisionPolicy\n Category: layout\n Kind: enum\n Description: Politica de colisao do canvas espacial.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.zIndex\n Category: layout\n Kind: number\n Description: Camada opcional do item no canvas.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.minColSpan\n Category: layout\n Kind: number\n Description: Span mínimo de colunas permitido.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.minRowSpan\n Category: layout\n Kind: number\n Description: Span mínimo de linhas permitido.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.maxColSpan\n Category: layout\n Kind: number\n Description: Span máximo de colunas permitido.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.maxRowSpan\n Category: layout\n Kind: number\n Description: Span máximo de linhas permitido.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.widgets[].shell\n Category: shell\n Kind: object\n Description: Configuração do shell do widget.\n\nComponent Capability:\n - Path: page.widgets[].shell.kind\n Category: shell\n Kind: enum\n Description: Tipo de shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.title\n Category: shell\n Kind: string\n Description: Título do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.subtitle\n Category: shell\n Kind: string\n Description: Subtítulo do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.icon\n Category: shell\n Kind: string\n Description: Ícone do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.showHeader\n Category: shell\n Kind: boolean\n Description: Exibe o header do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions\n Category: shell\n Kind: array\n Description: Ações do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].id\n Category: shell\n Kind: string\n Description: ID da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].label\n Category: shell\n Kind: string\n Description: Label da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].icon\n Category: shell\n Kind: string\n Description: Ícone da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].variant\n Category: shell\n Kind: enum\n Description: Estilo visual da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].placement\n Category: shell\n Kind: enum\n Description: Posicionamento da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].emit\n Category: shell\n Kind: string\n Description: Evento emitido ao acionar a ação.\n\nComponent Capability:\n - Path: page.state.schema.<token>.type\n Category: state\n Kind: string\n Description: Tipo semantico opcional do path de estado.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.state.schema.<token>.tags\n Category: state\n Kind: array\n Description: Tags opcionais para busca e governanca do estado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.dependsOn\n Category: state\n Kind: array\n Description: Paths de estado que alimentam o valor derivado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute\n Category: state\n Kind: object\n Description: Descritor de computacao do estado derivado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.kind\n Category: state\n Kind: enum\n Description: Tipo de computacao do estado derivado.",
3128
+ "content": "Component Capability:\n - Path: page.i18n\n Category: localization\n Kind: object\n Description: Catálogo de copy de negócio da página, resolvido apenas na projeção runtime.\n\nComponent Capability:\n - Path: page.i18n.fallbackLocale\n Category: localization\n Kind: string\n Description: Locale de fallback do catálogo próprio da página.\n\nComponent Capability:\n - Path: page.i18n.dictionaries\n Category: localization\n Kind: object\n Description: Dicionários locale -> chave semântica -> texto usados por descritores PraxisTextValue explícitos.\n\nComponent Capability:\n - Path: page.layoutPreset\n Category: layout\n Kind: string\n Description: ID canônico opcional do preset estrutural da página.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.layout\n Category: layout\n Kind: object\n Description: Layout base da página.\n\nComponent Capability:\n - Path: page.layout.orientation\n Category: layout\n Kind: enum\n Description: Orientacao do grid (vertical/columns).\n\nComponent Capability:\n - Path: page.layout.columns\n Category: layout\n Kind: number\n Description: Numero de colunas (quando orientation=columns).\n\nComponent Capability:\n - Path: page.layout.gap\n Category: layout\n Kind: string\n Description: Gap entre widgets (ex: 16px).\n\nComponent Capability:\n - Path: page.layout.breakpoints\n Category: layout\n Kind: object\n Description: Colunas por breakpoint.\n\nComponent Capability:\n - Path: page.layout.breakpoints.sm\n Category: layout\n Kind: number\n Description: Colunas para breakpoint sm.\n\nComponent Capability:\n - Path: page.layout.breakpoints.md\n Category: layout\n Kind: number\n Description: Colunas para breakpoint md.\n\nComponent Capability:\n - Path: page.layout.breakpoints.lg\n Category: layout\n Kind: number\n Description: Colunas para breakpoint lg.\n\nComponent Capability:\n - Path: page.layout.breakpoints.xl\n Category: layout\n Kind: number\n Description: Colunas para breakpoint xl.\n\nComponent Capability:\n - Path: page.canvas.collisionPolicy\n Category: layout\n Kind: enum\n Description: Politica de colisao do canvas espacial.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.zIndex\n Category: layout\n Kind: number\n Description: Camada opcional do item no canvas.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.minColSpan\n Category: layout\n Kind: number\n Description: Span mínimo de colunas permitido.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.minRowSpan\n Category: layout\n Kind: number\n Description: Span mínimo de linhas permitido.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.maxColSpan\n Category: layout\n Kind: number\n Description: Span máximo de colunas permitido.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.constraints.maxRowSpan\n Category: layout\n Kind: number\n Description: Span máximo de linhas permitido.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.widgets[].shell\n Category: shell\n Kind: object\n Description: Configuração do shell do widget.\n\nComponent Capability:\n - Path: page.widgets[].shell.kind\n Category: shell\n Kind: enum\n Description: Tipo de shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.title\n Category: shell\n Kind: string\n Description: Título do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.subtitle\n Category: shell\n Kind: string\n Description: Subtítulo do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.avatar\n Category: shell\n Kind: object\n Description: Avatar opcional com imageSrc, name e initials; usa templates como ${transient.employee.avatarUrl}. Sem imagem, usa iniciais ou ícone.\n\nComponent Capability:\n - Path: page.widgets[].shell.avatar.imageSrc\n Category: shell\n Kind: string\n Description: URL da foto ou template do shell; dados transitórios não são persistidos.\n\nComponent Capability:\n - Path: page.widgets[].shell.avatar.name\n Category: shell\n Kind: string\n Description: Nome para acessibilidade e iniciais; aceita template do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.avatar.initials\n Category: shell\n Kind: string\n Description: Iniciais opcionais que substituem as derivadas do nome.\n\nComponent Capability:\n - Path: page.widgets[].shell.icon\n Category: shell\n Kind: string\n Description: Ícone do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.showHeader\n Category: shell\n Kind: boolean\n Description: Exibe o header do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions\n Category: shell\n Kind: array\n Description: Ações do shell.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].id\n Category: shell\n Kind: string\n Description: ID da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].label\n Category: shell\n Kind: string\n Description: Label da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].icon\n Category: shell\n Kind: string\n Description: Ícone da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].variant\n Category: shell\n Kind: enum\n Description: Estilo visual da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].placement\n Category: shell\n Kind: enum\n Description: Posicionamento da ação.\n\nComponent Capability:\n - Path: page.widgets[].shell.actions[].emit\n Category: shell\n Kind: string\n Description: Evento emitido ao acionar a ação.\n\nComponent Capability:\n - Path: page.state.schema.<token>.type\n Category: state\n Kind: string\n Description: Tipo semantico opcional do path de estado.\n\nComponent Capability:\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.",
3069
3129
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3070
- "contentHash": "09a54b99e55feb49655a01920a36c8862ac437e108dce1f74620118b6de2d3cc",
3130
+ "contentHash": "da6f09230dbdd2913d63208f1f37362df9ed2697b5cb5ad0ffd5eea95e898ab7",
3071
3131
  "sourceKind": "component_definition",
3072
3132
  "sourceId": "praxis-dynamic-page",
3073
3133
  "corpusVersion": "1.0.0"
@@ -3075,9 +3135,9 @@
3075
3135
  {
3076
3136
  "chunkIndex": 5,
3077
3137
  "chunkKind": "capabilities",
3078
- "content": "Component Capability:\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\nComponent Capability:\n - Path: page.state.derived.<token>.compute.value\n Category: state\n Kind: object\n Description: Valor template para compute.kind=template.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.operator\n Category: state\n Kind: string\n Description: Operador para compute.kind=operator.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.options\n Category: state\n Kind: object\n Description: Opções do operador ou transformer.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.transformerId\n Category: state\n Kind: string\n Description: Identificador do transformer para compute.kind=transformer.\n\nComponent Capability:\n - Path: page.state.derived.<token>.description\n Category: state\n Kind: string\n Description: Descrição opcional do estado derivado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.cache\n Category: state\n Kind: boolean\n Description: Permite cache futuro do valor derivado.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].from.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de origem.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].from.ref.port\n Category: connections\n Kind: string\n Description: Porta de origem do componente.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de origem.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].to.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de destino.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].to.ref.port\n Category: connections\n Kind: string\n Description: Porta de destino do componente.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de destino.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.grouping\n Category: layout\n Kind: array\n Description: Modelo semantico opcional de secoes, abas, areas hero e rails.\n\nComponent Capability:\n - Path: page.grouping[].kind\n Category: layout\n Kind: enum\n Description: Tipo do agrupamento semantico.\n\nComponent Capability:\n - Path: page.grouping[].id\n Category: layout\n Kind: string\n Description: Identificador estavel do agrupamento.\n\nComponent Capability:\n - Path: page.grouping[].label\n Category: layout\n Kind: string\n Description: Rotulo opcional do agrupamento.\n\nComponent Capability:\n - Path: page.grouping[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets pertencentes ao agrupamento section, hero ou rail.\n\nComponent Capability:\n - Path: page.grouping[].layout\n Category: layout\n Kind: enum\n Description: Layout opcional para agrupamento section.\n\nComponent Capability:\n - Path: page.grouping[].tabs\n Category: layout\n Kind: array\n Description: Abas do agrupamento kind=tabs.\n\nComponent Capability:\n - Path: page.grouping[].tabs[].id\n Category: layout\n Kind: string\n Description: Identificador estavel da aba.\n\nComponent Capability:\n - Path: page.grouping[].tabs[].label\n Category: layout\n Kind: string\n Description: Rotulo da aba.\n\nComponent Capability:\n - Path: page.grouping[].tabs[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets renderizados dentro da aba.\n\nComponent Capability:\n - Path: page.grouping[].emphasis\n Category: layout\n Kind: enum\n Description: Enfase opcional para agrupamento hero.\n\nComponent Capability:\n - Path: page.grouping[].side\n Category: layout\n Kind: enum\n Description: Lado do rail quando kind=rail.\n\nComponent Capability:\n - Path: page.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa canonico de widget key para slot semantico de preset.\n\nComponent Capability:\n - Path: page.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes opcionais de layout por dispositivo.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop\n Category: layout\n Kind: object\n Description: Overrides de layout para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet\n Category: layout\n Kind: object\n Description: Overrides de layout para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile\n Category: layout\n Kind: object\n Description: Overrides de layout para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para tablet.",
3138
+ "content": "Component Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.state.schema.<token>.tags\n Category: state\n Kind: array\n Description: Tags opcionais para busca e governanca do estado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.dependsOn\n Category: state\n Kind: array\n Description: Paths de estado que alimentam o valor derivado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute\n Category: state\n Kind: object\n Description: Descritor de computacao do estado derivado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.kind\n Category: state\n Kind: enum\n Description: Tipo de computacao do estado derivado.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.state.derived.<token>.compute.value\n Category: state\n Kind: object\n Description: Valor template para compute.kind=template.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.operator\n Category: state\n Kind: string\n Description: Operador para compute.kind=operator.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.options\n Category: state\n Kind: object\n Description: Opções do operador ou transformer.\n\nComponent Capability:\n - Path: page.state.derived.<token>.compute.transformerId\n Category: state\n Kind: string\n Description: Identificador do transformer para compute.kind=transformer.\n\nComponent Capability:\n - Path: page.state.derived.<token>.description\n Category: state\n Kind: string\n Description: Descrição opcional do estado derivado.\n\nComponent Capability:\n - Path: page.state.derived.<token>.cache\n Category: state\n Kind: boolean\n Description: Permite cache futuro do valor derivado.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].from.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de origem.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].from.ref.port\n Category: connections\n Kind: string\n Description: Porta de origem do componente.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de origem.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].to.ref\n Category: connections\n Kind: object\n Description: Referencia estruturada do endpoint de destino.\n\nComponent Capability:\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\nComponent Capability:\n - Path: page.composition.links[].to.ref.port\n Category: connections\n Kind: string\n Description: Porta de destino do componente.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.direction\n Category: connections\n Kind: string\n Description: Direcao da porta de destino.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: page.grouping\n Category: layout\n Kind: array\n Description: Modelo semantico opcional de secoes, abas, areas hero e rails.\n\nComponent Capability:\n - Path: page.grouping[].kind\n Category: layout\n Kind: enum\n Description: Tipo do agrupamento semantico.\n\nComponent Capability:\n - Path: page.grouping[].id\n Category: layout\n Kind: string\n Description: Identificador estavel do agrupamento.\n\nComponent Capability:\n - Path: page.grouping[].label\n Category: layout\n Kind: string\n Description: Rotulo opcional do agrupamento.\n\nComponent Capability:\n - Path: page.grouping[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets pertencentes ao agrupamento section, hero ou rail.\n\nComponent Capability:\n - Path: page.grouping[].layout\n Category: layout\n Kind: enum\n Description: Layout opcional para agrupamento section.\n\nComponent Capability:\n - Path: page.grouping[].tabs\n Category: layout\n Kind: array\n Description: Abas do agrupamento kind=tabs.\n\nComponent Capability:\n - Path: page.grouping[].tabs[].id\n Category: layout\n Kind: string\n Description: Identificador estavel da aba.\n\nComponent Capability:\n - Path: page.grouping[].tabs[].label\n Category: layout\n Kind: string\n Description: Rotulo da aba.\n\nComponent Capability:\n - Path: page.grouping[].tabs[].widgetKeys\n Category: layout\n Kind: array\n Description: Widgets renderizados dentro da aba.\n\nComponent Capability:\n - Path: page.grouping[].emphasis\n Category: layout\n Kind: enum\n Description: Enfase opcional para agrupamento hero.\n\nComponent Capability:\n - Path: page.grouping[].side\n Category: layout\n Kind: enum\n Description: Lado do rail quando kind=rail.\n\nComponent Capability:\n - Path: page.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa canonico de widget key para slot semantico de preset.\n\nComponent Capability:\n - Path: page.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes opcionais de layout por dispositivo.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop\n Category: layout\n Kind: object\n Description: Overrides de layout para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet\n Category: layout\n Kind: object\n Description: Overrides de layout para tablet.",
3079
3139
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3080
- "contentHash": "ca1403a372c363adb3a72bb54548d9ffa18f6d24666eef9d9bd1cd88b6ff42be",
3140
+ "contentHash": "865818f5b35a9fc517441ec930534d07e95fb81e33c6cea25a29cca99d76e27e",
3081
3141
  "sourceKind": "component_definition",
3082
3142
  "sourceId": "praxis-dynamic-page",
3083
3143
  "corpusVersion": "1.0.0"
@@ -3085,9 +3145,9 @@
3085
3145
  {
3086
3146
  "chunkIndex": 6,
3087
3147
  "chunkKind": "capabilities",
3088
- "content": "Component Capability:\n - Path: page.deviceLayouts.tablet.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em mobile.\n\nCapability Note:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links pode despachar actions globais via to.kind = global-action e receber continuations exatas via from.kind = global-action.\n\nCapability Note:\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\nCapability Note:\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\nCapability Note:\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\nCapability Note:\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n\nCapability Note:\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\nCapability Note:\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. UiCompositionPlanTemplateReference pode piná-lo por registryKey + configSha256, mas precisa ser resolvido pelo backend governado antes da compilação. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n\nCapability Note:\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\nCapability Note:\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\nCapability Note:\n - Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.\n\nCapability Note:\n - pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.\n\nCapability Note:\n - authoringCapabilities é um grant transitório do host para limitar affordances visíveis; não integra WidgetPageDefinition, não é persistido e não concede autoridade de edição à IA.\n\nCapability Note:\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\nCapability Note:\n - WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, i18n, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.\n\nCapability Note:\n - Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.\n\nCapability Note:\n - page.canvas.items é um mapa por widget key; não modele canvas.items como array.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canônico; transform usa pipeline declarativo; não trate ambos como a mesma \"expression\".\n\nCapability Note:\n - Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.\n\nCapability Note:\n - Para renomear um link, inclua {_beforeKey:\"link-id-anterior\"} no item.\n\nCapability Note:\n - Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmação.\n\nCapability Note:\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\nCapability Note:\n - Use ids estaveis para links e keys estaveis para widgets.\n\nCapability Note:\n - Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.\n\nCapability Note:\n - Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).\n\nCapability Note:\n - Link tipico de master-detail: component-port(table.rowClick) -> component-port(form.resourceId) com transform map payload.row.id.",
3148
+ "content": "Component Capability:\n - Path: page.deviceLayouts.mobile\n Category: layout\n Kind: object\n Description: Overrides de layout para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em desktop.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em tablet.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.layout\n Category: layout\n Kind: object\n Description: Override de WidgetPageLayout para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.canvas\n Category: layout\n Kind: object\n Description: Override de canvas para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.groupingOverrides\n Category: layout\n Kind: array\n Description: Overrides de agrupamentos para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.widgetOverrides\n Category: layout\n Kind: object\n Description: Overrides por widget key para mobile.\n\nComponent Capability:\n - Path: page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden\n Category: layout\n Kind: boolean\n Description: Oculta o widget em mobile.\n\nCapability Note:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links pode despachar actions globais via to.kind = global-action e receber continuations exatas via from.kind = global-action.\n\nCapability Note:\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\nCapability Note:\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\nCapability Note:\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\nCapability Note:\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n\nCapability Note:\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\nCapability Note:\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. UiCompositionPlanTemplateReference pode piná-lo por registryKey + configSha256, mas precisa ser resolvido pelo backend governado antes da compilação. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n\nCapability Note:\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\nCapability Note:\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\nCapability Note:\n - Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.\n\nCapability Note:\n - pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.\n\nCapability Note:\n - authoringCapabilities é um grant transitório do host para limitar affordances visíveis; não integra WidgetPageDefinition, não é persistido e não concede autoridade de edição à IA.\n\nCapability Note:\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\nCapability Note:\n - WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, i18n, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.\n\nCapability Note:\n - Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.\n\nCapability Note:\n - page.canvas.items é um mapa por widget key; não modele canvas.items como array.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canônico; transform usa pipeline declarativo; não trate ambos como a mesma \"expression\".\n\nCapability Note:\n - Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.\n\nCapability Note:\n - Para renomear um link, inclua {_beforeKey:\"link-id-anterior\"} no item.\n\nCapability Note:\n - Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmação.\n\nCapability Note:\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\nCapability Note:\n - Use ids estaveis para links e keys estaveis para widgets.\n\nCapability Note:\n - Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.\n\nCapability Note:\n - Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).\n\nCapability Note:\n - Link tipico de master-detail: component-port(table.rowClick) -> component-port(form.resourceId) com transform map payload.row.id.",
3089
3149
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3090
- "contentHash": "c127bf746d97bc0ffa7527c6eec1c1116342aa6b7e9bd33be2942b33a0121015",
3150
+ "contentHash": "5ead390a37077baba38267ff156ee549773b4706b728e829085305bdfe4b8db3",
3091
3151
  "sourceKind": "component_definition",
3092
3152
  "sourceId": "praxis-dynamic-page",
3093
3153
  "corpusVersion": "1.0.0"
@@ -4145,9 +4205,9 @@
4145
4205
  {
4146
4206
  "chunkIndex": 112,
4147
4207
  "chunkKind": "recipe",
4148
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"certification\",\"certification\":{\"status\":\"laboratory-candidate\",\"route\":\"/dynamic-page-lab/archetypes/master-detail-tabs\",\"legacyEvidence\":[\"ERGadm00229 · Vínculos funcionais\",\"Dossiê tabulado com detalhe e coleções relacionadas ao registro selecionado\"],\"acceptance\":[\"Filtros inline Praxis contra o DTO remoto\",\"Seleção mestre propagada e revogável\",\"Tabs lazy e ids estáveis\",\"Formulário em apresentação dentro de tab\",\"Coleções filhas descobertas por item surfaces reais\",\"Troca ou remoção da seleção invalida o contexto anterior\",\"Nenhum dado local ou route mock permitido\"]}}",
4208
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"certification\",\"certification\":{\"status\":\"laboratory-candidate\",\"route\":\"/dynamic-page-lab/archetypes/master-detail-tabs\",\"legacyEvidence\":[\"ERGadm00229 · Vínculos funcionais\",\"Dossiê tabulado com detalhe e coleções relacionadas ao registro selecionado\"],\"acceptance\":[\"Filtros inline Praxis contra o DTO remoto\",\"Seleção mestre propagada e revogável\",\"Tabs lazy e ids estáveis\",\"Formulário em apresentação dentro de tab\",\"Coleções filhas descobertas por item surfaces reais\",\"Troca ou remoção da seleção invalida o contexto anterior\",\"Shell filho identifica o funcionário pelo contexto canônico, inclusive em tela cheia\",\"Toolbar da folha preserva ações governadas sem repetir o título do shell\",\"Nenhum dado local ou route mock permitido\"]}}",
4149
4209
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.ergon-archetype-master-detail-tabs.json",
4150
- "contentHash": "5748f266a7000a0e8c7a3937b29f68254ba3a7452b04252ff25a57127d511713",
4210
+ "contentHash": "6ef707c4615e9d18dd761d147a1bc1bdf70d79baf757ac50e2db7356752b2178",
4151
4211
  "sourceKind": "component_definition",
4152
4212
  "sourceId": "praxis-dynamic-page",
4153
4213
  "corpusVersion": "1.0.0"
@@ -4215,9 +4275,9 @@
4215
4275
  {
4216
4276
  "chunkIndex": 119,
4217
4277
  "chunkKind": "recipe",
4218
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan\",\"authoringPlan\":{\"layoutPreset\":\"resource-master-detail-tabs\",\"themePreset\":\"workspace-balanced\",\"state\":{\"values\":{\"employeeFilter\":{},\"selectedEmployee\":null,\"selectedEmployeeId\":null,\"selectedEmployeeIdentity\":null},\"derived\":{\"detailTitle\":{\"dependsOn\":[\"selectedEmployeeIdentity\",\"selectedEmployee\"],\"compute\":{\"kind\":\"operator\",\"operator\":\"coalesce\",\"options\":{\"paths\":[\"selectedEmployeeIdentity.displayLabel\",\"selectedEmployeeIdentity.title.value\",\"selectedEmployee.nomeCompleto\"],\"fallback\":\"Nenhum funcionário selecionado\"}}},\"detailSubtitle\":{\"dependsOn\":[\"selectedEmployee\"],\"compute\":{\"kind\":\"operator\",\"operator\":\"select-case\",\"options\":{\"cases\":[{\"when\":{\"!!\":{\"var\":\"state.selectedEmployee\"}},\"template\":\"${state.selectedEmployee.cargoNome} · ${state.selectedEmployee.departamentoNome} · Código ${state.selectedEmployee.id}\"}],\"defaultValue\":\"Selecione um registro na tabela para consultar o detalhe publicado pelo Quick Start.\"}}}}},\"canvas\":{\"mode\":\"grid\",\"columns\":12,\"rowUnit\":\"auto\",\"gap\":\"16px\",\"autoRows\":\"content\",\"items\":{\"filters\":{\"col\":1,\"row\":1,\"colSpan\":12,\"rowSpan\":1},\"master\":{\"col\":1,\"row\":2,\"colSpan\":12,\"rowSpan\":1},\"workspace\":{\"col\":1,\"row\":3,\"colSpan\":12,\"rowSpan\":1}}},\"deviceLayouts\":{\"mobile\":{\"canvas\":{\"mode\":\"grid\",\"columns\":1,\"rowUnit\":\"auto\",\"gap\":\"12px\",\"autoRows\":\"content\",\"items\":{\"filters\":{\"col\":1,\"row\":1,\"colSpan\":1,\"rowSpan\":1},\"master\":{\"col\":1,\"row\":2,\"colSpan\":1,\"rowSpan\":1},\"workspace\":{\"col\":1,\"row\":3,\"colSpan\":1,\"rowSpan\":1}}}}}}}",
4278
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan\",\"authoringPlan\":{\"layoutPreset\":\"resource-master-detail-tabs\",\"themePreset\":\"workspace-balanced\",\"state\":{\"values\":{\"employeeFilter\":{},\"selectedEmployee\":null,\"selectedEmployeeId\":null,\"selectedEmployeeIdentity\":null},\"derived\":{\"detailTitle\":{\"dependsOn\":[\"selectedEmployeeIdentity\",\"selectedEmployee\"],\"compute\":{\"kind\":\"operator\",\"operator\":\"coalesce\",\"options\":{\"paths\":[\"selectedEmployeeIdentity.displayLabel\",\"selectedEmployeeIdentity.title.value\",\"selectedEmployee.nomeCompleto\"],\"fallback\":\"Nenhum funcionário selecionado\"}}},\"detailSubtitle\":{\"dependsOn\":[\"selectedEmployee\"],\"compute\":{\"kind\":\"operator\",\"operator\":\"select-case\",\"options\":{\"cases\":[{\"when\":{\"!!\":{\"var\":\"state.selectedEmployee\"}},\"template\":\"${state.selectedEmployee.cargoNome} · ${state.selectedEmployee.departamentoNome} · Código ${state.selectedEmployee.id}\"}],\"defaultValue\":\"Selecione um registro na tabela para consultar o detalhe publicado pelo Quick Start.\"}}},\"payrollContext\":{\"dependsOn\":[\"selectedEmployeeId\",\"selectedEmployeeIdentity\"],\"compute\":{\"kind\":\"template\",\"value\":{\"parentResourceId\":\"${state.selectedEmployeeId}\",\"parentIdentity\":\"${state.selectedEmployeeIdentity}\"}}}}},\"canvas\":{\"mode\":\"grid\",\"columns\":12,\"rowUnit\":\"auto\",\"gap\":\"16px\",\"autoRows\":\"content\",\"items\":{\"filters\":{\"col\":1,\"row\":1,\"colSpan\":12,\"rowSpan\":1},\"master\":{\"col\":1,\"row\":2,\"colSpan\":12,\"rowSpan\":1},\"workspace\":{\"col\":1,\"row\":3,\"colSpan\":12,\"rowSpan\":1}}},\"deviceLayouts\":{\"mobile\":{\"canvas\":{\"mode\":\"grid\",\"columns\":1,\"rowUnit\":\"auto\",\"gap\":\"12px\",\"autoRows\":\"content\",\"items\":{\"filters\":{\"col\":1,\"row\":1,\"colSpan\":1,\"rowSpan\":1},\"master\":{\"col\":1,\"row\":2,\"colSpan\":1,\"rowSpan\":1},\"workspace\":{\"col\":1,\"row\":3,\"colSpan\":1,\"rowSpan\":1}}}}}}}",
4219
4279
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.ergon-archetype-master-detail-tabs.json",
4220
- "contentHash": "9be0369bdb9966c815db754d7841274951c713e73f3d690f9c704dee575c016a",
4280
+ "contentHash": "9ea0266543e3021ad8bf2511732ec4f207a7007ad88eecedaf44edaa2f6a4eaa",
4221
4281
  "sourceKind": "component_definition",
4222
4282
  "sourceId": "praxis-dynamic-page",
4223
4283
  "corpusVersion": "1.0.0"
@@ -4235,9 +4295,9 @@
4235
4295
  {
4236
4296
  "chunkIndex": 121,
4237
4297
  "chunkKind": "recipe",
4238
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan.widgets[2]\",\"fragmentPath\":\"authoringPlan.widgets[2]\",\"fragmentIdentity\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\"},\"fragment\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"folder_shared\",\"title\":\"${state.detailTitle}\",\"subtitle\":\"${state.detailSubtitle}\",\"bodyLayout\":\"fill\",\"windowActions\":{\"fullscreen\":true,\"collapsible\":true}},\"bindingOrder\":[\"tabsId\",\"componentInstanceId\",\"configPersistenceStrategy\",\"config\",\"selectedIndex\"]}}",
4298
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan.widgets[2]\",\"fragmentPath\":\"authoringPlan.widgets[2]\",\"fragmentIdentity\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\"},\"fragment\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"folder_shared\",\"title\":\"${state.detailTitle}\",\"subtitle\":\"${state.detailSubtitle}\",\"stickyHeader\":true,\"bodyLayout\":\"fill\",\"windowActions\":{\"fullscreen\":true,\"collapsible\":true}},\"bindingOrder\":[\"tabsId\",\"componentInstanceId\",\"configPersistenceStrategy\",\"config\",\"selectedIndex\"]}}",
4239
4299
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.ergon-archetype-master-detail-tabs.json",
4240
- "contentHash": "c1be066afc789bdae20e85145363769a9967ca8e1257c9ac6c53a1df4fea9f27",
4300
+ "contentHash": "2d5640538744ae254de35cbc8e8e084db8ae3a82be7cb9457626923452248edf",
4241
4301
  "sourceKind": "component_definition",
4242
4302
  "sourceId": "praxis-dynamic-page",
4243
4303
  "corpusVersion": "1.0.0"
@@ -4265,9 +4325,9 @@
4265
4325
  {
4266
4326
  "chunkIndex": 124,
4267
4327
  "chunkKind": "recipe",
4268
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan.widgets[2].inputs.config.tabs\",\"fragmentPath\":\"authoringPlan.widgets[2].inputs.config.tabs\",\"fragmentIdentity\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\"},\"fragment\":[{\"id\":\"dossier\",\"textLabel\":\"Visão geral\",\"icon\":\"badge\",\"widgets\":[{\"id\":\"praxis-dynamic-form\",\"childWidgetKey\":\"employee-dossier-form\",\"bindingOrder\":[\"formId\",\"componentInstanceId\",\"resourcePath\",\"resourceId\",\"emptyState\",\"mode\",\"schemaSource\",\"layoutPolicy\",\"configPersistenceStrategy\",\"enableCustomization\",\"showAiAssistant\",\"readonlyModeGlobal\",\"presentationModeGlobal\",\"fieldIconPolicy\"],\"inputs\":{\"formId\":\"quickstart-employee-tabs-detail\",\"componentInstanceId\":\"quickstart-employee-tabs-detail\",\"resourcePath\":\"human-resources/funcionarios\",\"resourceId\":null,\"emptyState\":{\"icon\":\"touch_app\",\"title\":\"Selecione um funcionário\",\"description\":\"Escolha um registro na tabela para carregar, pela API real, a visão geral em modo de apresentação.\",\"tone\":\"primary\",\"variant\":\"transparent\",\"alignment\":\"center\",\"density\":\"compact\",\"iconContainer\":\"circle\"},\"mode\":\"view\",\"schemaSource\":\"resource\",\"layoutPolicy\":{\"source\":\"schema\",\"intent\":\"detail\",\"preset\":\"compactPresentation\",\"lifecycle\":\"live\",\"persistence\":\"transient\",\"schemaOperation\":\"detail\",\"schemaType\":\"response\",\"detailSummary\":{\"includeFields\":[\"avatarUrl\",\"nomeCompleto\",\"ativo\",\"cargoNome\",\"departamentoNome\",\"dataAdmissao\",\"email\",\"telefone\"],\"columns\":3,\"responsiveColumns\":{\"lg\":3,\"md\":2,\"sm\":1,\"xs\":1},\"widthPrecedence\":\"summary\"}},\"configPersistenceStrategy\":\"input-first\",\"enableCustomization\":false,\"showAiAssistant\":false,\"readonlyModeGlobal\":true,\"presentationModeGlobal\":true,\"fieldIconPolicy\":\"presentation-only\"},\"outputs\":{\"customAction\":\"emit\",\"initializationError\":\"emit\"}}]},{\"id\":\"payroll\",\"textLabel\":{\"key\":\"employeeOperations.dossier.tab.payroll\"},\"icon\":\"payments\",\"widgets\":[{\"id\":\"praxis-related-resource-outlet\",\"childWidgetKey\":\"employee-payroll-history\",\"bindingOrder\":[\"surfaceId\",\"parentResourcePath\",\"parentResourceId\",\"parentIdentity\",\"mode\",\"tableId\",\"tableConfig\"],\"inputs\":{\"surfaceId\":\"payroll-history\",\"mode\":\"inline\",\"tableId\":\"employee-payroll-history\",\"tableConfig\":{\"appearance\":{\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"cardMode\":true,\"horizontalScroll\":false}}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.payroll.title\"},\"subtitle\":{\"key\":\"employeeOperations.payroll.subtitle\"}},\"columns\":[],\"behavior\":{\"pagination\":{\"enabled\":true,\"strategy\":\"server\",\"pageSize\":6,\"pageSizeOptions\":[6,12]}},\"columnProjection\":{\"source\":\"schema\",\"include\":[\"competencia\",\"salarioBruto\",\"totalDescontos\",\"salarioLiquido\",\"qtdEventos\",\"composicaoFolha\"],\"overrides\":{\"competencia\":{\"header\":{\"key\":\"employeeOperations.column.period\"},\"format\":\"MM/yyyy\",\"width\":\"120px\"},\"salarioBruto\":{\"header\":{\"key\":\"employeeOperations.column.gross\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\"},\"totalDescontos\":{\"header\":{\"key\":\"employeeOperations.column.discounts\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\"},\"salarioLiquido\":{\"header\":{\"key\":\"employeeOperations.column.net\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\"},\"qtdEventos\":{\"header\":{\"key\":\"employeeOperations.column.events\"},\"align\":\"center\",\"width\":\"100px\"},\"composicaoFolha\":{\"header\":{\"key\":\"employeeOperations.column.composition\"},\"renderer\":{\"type\":\"badge\",\"badge\":{\"textField\":\"composicaoFolha\",\"variant\":\"soft\",\"color\":\"primary\"}}}}}},\"parentResourcePath\":\"human-resources/funcionarios\",\"parentResourceId\":null,\"parentIdentity\":null,\"compact\":true,\"enableCustomization\":false},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}}]},{\"id\":\"career\",\"textLabel\":{\"key\":\"employeeOperations.dossier.tab.career\"},\"icon\":\"trending_up\",\"widgets\":[{\"id\":\"praxis-related-resource-outlet\",\"childWidgetKey\":\"employee-skills\",\"bindingOrder\":[\"surfaceId\",\"parentResourcePath\",\"parentResourceId\",\"parentIdentity\",\"mode\",\"tableId\",\"tableConfig\"],\"inputs\":{\"surfaceId\":\"skills\",\"mode\":\"inline\",\"tableId\":\"employee-skill-matrix\",\"tableConfig\":{\"appearance\":{\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"cardMode\":true,\"horizontalScroll\":false}}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.skills.title\"}},\"columns\":[],\"behavior\":{\"pagination\":{\"enabled\":false}},\"columnProjection\":{\"source\":\"schema\",\"include\":[\"habilidadeNome\",\"proficiencia\",\"origem\"],\"overrides\":{\"habilidadeNome\":{\"header\":{\"key\":\"employeeOperations.column.skill\"}},\"proficiencia\":{\"header\":{\"key\":\"employeeOperations.column.proficiency\"},\"renderer\":{\"type\":\"progress\",\"progress\":{\"valueExpr\":\"proficiencia\",\"color\":\"primary\",\"showLabel\":true}}},\"origem\":{\"header\":{\"key\":\"employeeOperations.column.origin\"},\"renderer\":{\"type\":\"badge\",\"badge\":{\"textField\":\"origem\",\"variant\":\"outlined\",\"color\":\"accent\"}}}}}},\"parentResourcePath\":\"human-resources/funcionarios\",\"parentResourceId\":null,\"parentIdentity\":null,\"compact\":true,\"enableCustomization\":false},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}},{\"id\":\"praxis-related-resource-outlet\",\"childWidgetKey\":\"employee-career-history\",\"bindingOrder\":[\"surfaceId\",\"parentResourcePath\",\"parentResourceId\",\"parentIdentity\",\"mode\",\"tableId\",\"tableConfig\"],\"inputs\":{\"surfaceId\":\"career-history\",\"mode\":\"inline\",\"tableId\":\"employee-career-history\",\"tableConfig\":{\"appearance\":{\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"cardMode\":true,\"horizontalScroll\":false}}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.career.title\"}},\"columns\":[],\"behavior\":{\"pagination\":{\"enabled\":false}},\"columnProjection\":{\"source\":\"schema\",\"include\":[\"cargoNome\",\"dataInicio\",\"dataFim\",\"observacoes\"],\"overrides\":{\"cargoNome\":{\"header\":{\"key\":\"employeeOperations.portfolio.column.role\"},\"sticky\":\"start\"},\"dataInicio\":{\"header\":{\"key\":\"employeeOperations.column.start\"}},\"dataFim\":{\"header\":{\"key\":\"employeeOperations.column.end\"}},\"observacoes\":{\"header\":{\"key\":\"employeeOperations.column.context\"}}}}},\"parentResourcePath\":\"human-resources/funcionarios\",\"parentResourceId\":null,\"parentIdentity\":null,\"compact\":true,\"enableCustomization\":false},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}}]}]}",
4328
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan.widgets[2].inputs.config.tabs\",\"fragmentPath\":\"authoringPlan.widgets[2].inputs.config.tabs\",\"fragmentIdentity\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\"},\"fragment\":[{\"id\":\"dossier\",\"textLabel\":\"Visão geral\",\"icon\":\"badge\",\"widgets\":[{\"id\":\"praxis-dynamic-form\",\"childWidgetKey\":\"employee-dossier-form\",\"bindingOrder\":[\"formId\",\"componentInstanceId\",\"resourcePath\",\"resourceId\",\"emptyState\",\"mode\",\"schemaSource\",\"layoutPolicy\",\"configPersistenceStrategy\",\"enableCustomization\",\"showAiAssistant\",\"readonlyModeGlobal\",\"presentationModeGlobal\",\"fieldIconPolicy\"],\"inputs\":{\"formId\":\"quickstart-employee-tabs-detail\",\"componentInstanceId\":\"quickstart-employee-tabs-detail\",\"resourcePath\":\"human-resources/funcionarios\",\"resourceId\":null,\"emptyState\":{\"icon\":\"touch_app\",\"title\":\"Selecione um funcionário\",\"description\":\"Escolha um registro na tabela para carregar, pela API real, a visão geral em modo de apresentação.\",\"tone\":\"primary\",\"variant\":\"transparent\",\"alignment\":\"center\",\"density\":\"compact\",\"iconContainer\":\"circle\"},\"mode\":\"view\",\"schemaSource\":\"resource\",\"layoutPolicy\":{\"source\":\"schema\",\"intent\":\"detail\",\"preset\":\"compactPresentation\",\"lifecycle\":\"live\",\"persistence\":\"transient\",\"schemaOperation\":\"detail\",\"schemaType\":\"response\",\"detailSummary\":{\"includeFields\":[\"avatarUrl\",\"nomeCompleto\",\"ativo\",\"cargoNome\",\"departamentoNome\",\"dataAdmissao\",\"email\",\"telefone\"],\"columns\":3,\"responsiveColumns\":{\"lg\":3,\"md\":2,\"sm\":1,\"xs\":1},\"widthPrecedence\":\"summary\"}},\"configPersistenceStrategy\":\"input-first\",\"enableCustomization\":false,\"showAiAssistant\":false,\"readonlyModeGlobal\":true,\"presentationModeGlobal\":true,\"fieldIconPolicy\":\"presentation-only\"},\"outputs\":{\"customAction\":\"emit\",\"initializationError\":\"emit\"}}]},{\"id\":\"payroll\",\"textLabel\":{\"key\":\"employeeOperations.dossier.tab.payroll\"},\"icon\":\"payments\",\"widgets\":[{\"id\":\"praxis-expansion\",\"childWidgetKey\":\"employee-payroll-panels\",\"inputs\":{\"expansionId\":\"quickstart-employee-payroll-panels\",\"configPersistenceStrategy\":\"input-first\",\"enableCustomization\":false,\"config\":{\"panels\":[{\"id\":\"history\",\"title\":\"Consultar histórico de pagamentos\",\"expanded\":true,\"widgets\":[{\"id\":\"praxis-dynamic-page\",\"childWidgetKey\":\"employee-payroll-page\",\"inputs\":{\"autoPersist\":false,\"enableCustomization\":false,\"context\":{\"parentResourceId\":null,\"parentIdentity\":null},\"page\":{\"widgets\":[{\"key\":\"employee-payroll-history\",\"shell\":{\"kind\":\"dashboard-card\",\"preset\":\"frameless\",\"title\":\"Histórico analítico de folha\",\"subtitle\":\"${context.parentIdentity.displayLabel}\",\"stickyHeader\":true,\"windowActions\":{\"collapsible\":false,\"fullscreen\":true}},\"definition\":{\"id\":\"praxis-related-resource-outlet\",\"childWidgetKey\":\"employee-payroll-history\",\"bindingOrder\":[\"surfaceId\",\"parentResourcePath\",\"parentResourceId\",\"parentIdentity\",\"mode\",\"tableId\",\"tableConfig\"],\"inputs\":{\"surfaceId\":\"payroll-history\",\"mode\":\"inline\",\"tableId\":\"employee-payroll-history\",\"tableConfig\":{\"appearance\":{\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"cardMode\":true,\"horizontalScroll\":false}}},\"accessibility\":{\"ariaLabels\":{\"table\":\"Histórico analítico de folha\"}},\"toolbar\":{\"visible\":true},\"columns\":[],\"behavior\":{\"pagination\":{\"enabled\":true,\"strategy\":\"server\",\"pageSize\":6,\"pageSizeOptions\":[6,12]}},\"columnProjection\":{\"source\":\"schema\",\"include\":[\"competencia\",\"salarioBruto\",\"totalDescontos\",\"salarioLiquido\",\"qtdEventos\",\"composicaoFolha\"],\"overrides\":{\"competencia\":{\"header\":{\"key\":\"employeeOperations.column.period\"},\"format\":\"MM/yyyy\",\"width\":\"120px\"},\"salarioBruto\":{\"header\":{\"key\":\"employeeOperations.column.gross\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\"},\"totalDescontos\":{\"header\":{\"key\":\"employeeOperations.column.discounts\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\"},\"salarioLiquido\":{\"header\":{\"key\":\"employeeOperations.column.net\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\"},\"qtdEventos\":{\"header\":{\"key\":\"employeeOperations.column.events\"},\"align\":\"center\",\"width\":\"100px\"},\"composicaoFolha\":{\"header\":{\"key\":\"employeeOperations.column.composition\"},\"renderer\":{\"type\":\"badge\",\"badge\":{\"textField\":\"composicaoFolha\",\"variant\":\"soft\",\"color\":\"primary\"}}}}}},\"parentResourcePath\":\"human-resources/funcionarios\",\"parentResourceId\":\"${parentResourceId}\",\"parentIdentity\":\"${parentIdentity}\",\"compact\":true,\"enableCustomization\":false},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}}}]}}}]}]}}}]},{\"id\":\"career\",\"textLabel\":{\"key\":\"employeeOperations.dossier.tab.career\"},\"icon\":\"trending_up\",\"widgets\":[{\"id\":\"praxis-related-resource-outlet\",\"childWidgetKey\":\"employee-skills\",\"bindingOrder\":[\"surfaceId\",\"parentResourcePath\",\"parentResourceId\",\"parentIdentity\",\"mode\",\"tableId\",\"tableConfig\"],\"inputs\":{\"surfaceId\":\"skills\",\"mode\":\"inline\",\"tableId\":\"employee-skill-matrix\",\"tableConfig\":{\"appearance\":{\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"cardMode\":true,\"horizontalScroll\":false}}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.skills.title\"}},\"columns\":[],\"behavior\":{\"pagination\":{\"enabled\":false}},\"columnProjection\":{\"source\":\"schema\",\"include\":[\"habilidadeNome\",\"proficiencia\",\"origem\"],\"overrides\":{\"habilidadeNome\":{\"header\":{\"key\":\"employeeOperations.column.skill\"}},\"proficiencia\":{\"header\":{\"key\":\"employeeOperations.column.proficiency\"},\"renderer\":{\"type\":\"progress\",\"progress\":{\"valueExpr\":\"proficiencia\",\"color\":\"primary\",\"showLabel\":true}}},\"origem\":{\"header\":{\"key\":\"employeeOperations.column.origin\"},\"renderer\":{\"type\":\"badge\",\"badge\":{\"textField\":\"origem\",\"variant\":\"outlined\",\"color\":\"accent\"}}}}}},\"parentResourcePath\":\"human-resources/funcionarios\",\"parentResourceId\":null,\"parentIdentity\":null,\"compact\":true,\"enableCustomization\":false},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}},{\"id\":\"praxis-related-resource-outlet\",\"childWidgetKey\":\"employee-career-history\",\"bindingOrder\":[\"surfaceId\",\"parentResourcePath\",\"parentResourceId\",\"parentIdentity\",\"mode\",\"tableId\",\"tableConfig\"],\"inputs\":{\"surfaceId\":\"career-history\",\"mode\":\"inline\",\"tableId\":\"employee-career-history\",\"tableConfig\":{\"appearance\":{\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"cardMode\":true,\"horizontalScroll\":false}}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.career.title\"}},\"columns\":[],\"behavior\":{\"pagination\":{\"enabled\":false}},\"columnProjection\":{\"source\":\"schema\",\"include\":[\"cargoNome\",\"dataInicio\",\"dataFim\",\"observacoes\"],\"overrides\":{\"cargoNome\":{\"header\":{\"key\":\"employeeOperations.portfolio.column.role\"},\"sticky\":\"start\"},\"dataInicio\":{\"header\":{\"key\":\"employeeOperations.column.start\"}},\"dataFim\":{\"header\":{\"key\":\"employeeOperations.column.end\"}},\"observacoes\":{\"header\":{\"key\":\"employeeOperations.column.context\"}}}}},\"parentResourcePath\":\"human-resources/funcionarios\",\"parentResourceId\":null,\"parentIdentity\":null,\"compact\":true,\"enableCustomization\":false},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}}]}]}",
4269
4329
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.ergon-archetype-master-detail-tabs.json",
4270
- "contentHash": "6c4b99342f08b32ce5d5dfbab81b7f021b05c36166e7baffef5351e660e0fe0f",
4330
+ "contentHash": "4dce719a75011b5f92b780b476ccad359e280b25a5b7addf8e3f2720b4d60cae",
4271
4331
  "sourceKind": "component_definition",
4272
4332
  "sourceId": "praxis-dynamic-page",
4273
4333
  "corpusVersion": "1.0.0"
@@ -4295,9 +4355,9 @@
4295
4355
  {
4296
4356
  "chunkIndex": 127,
4297
4357
  "chunkKind": "recipe",
4298
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan\",\"authoringPlan\":{\"contextScopes\":[{\"id\":\"quickstart-employee-tabs:detail-context\",\"context\":{\"resourcePath\":{\"kind\":\"constant\",\"value\":\"human-resources/funcionarios\"},\"resourceId\":{\"kind\":\"state\",\"path\":\"selectedEmployeeId\",\"layer\":\"values\",\"initial\":null}},\"targets\":[{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"dossier\",\"index\":0},{\"kind\":\"widget\",\"key\":\"employee-dossier-form\",\"componentType\":\"praxis-dynamic-form\"}]}],\"policy\":{\"missingValuePolicy\":\"propagate-undefined\",\"distinct\":true},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"quickstart-employee-tabs:related-context\",\"context\":{\"parentResourcePath\":{\"kind\":\"constant\",\"value\":\"human-resources/funcionarios\"},\"parentResourceId\":{\"kind\":\"state\",\"path\":\"selectedEmployeeId\",\"layer\":\"values\",\"initial\":null},\"parentIdentity\":{\"kind\":\"state\",\"path\":\"selectedEmployeeIdentity\",\"layer\":\"values\",\"initial\":null}},\"targets\":[{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"payroll\",\"index\":1},{\"kind\":\"widget\",\"key\":\"employee-payroll-history\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"career\",\"index\":2},{\"kind\":\"widget\",\"key\":\"employee-skills\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"career\",\"index\":2},{\"kind\":\"widget\",\"key\":\"employee-career-history\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"people\",\"index\":3},{\"kind\":\"widget\",\"key\":\"employee-dependents\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"people\",\"index\":3},{\"kind\":\"widget\",\"key\":\"employee-address\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"operations\",\"index\":4},{\"kind\":\"widget\",\"key\":\"employee-missions\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"operations\",\"index\":4},{\"kind\":\"widget\",\"key\":\"employee-equipment-custody\",\"componentType\":\"praxis-related-resource-outlet\"}]}],\"policy\":{\"missingValuePolicy\":\"propagate-undefined\",\"distinct\":true},\"metadata\":{\"source\":\"quickstart-real-http\"}}],\"bindings\":[{\"id\":\"filters.change->state.employeeFilter\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"filters\",\"port\":\"change\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"employeeFilter\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"filters.change->state.employeeFilter:pick\",\"path\":\"payload\",\"inputSource\":\"event\",\"fallbackValue\":{}},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"state.employeeFilter->master.queryContext\",\"intent\":\"state-read\",\"from\":{\"kind\":\"state\",\"path\":\"employeeFilter\"},\"to\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"queryContext\",\"direction\":\"input\"},\"transform\":{\"kind\":\"template\",\"id\":\"state.employeeFilter->master.queryContext:template\",\"template\":{\"filters\":\"${source}\"},\"inputSource\":\"payload\",\"output\":{\"semanticKind\":\"query-context\",\"stableShape\":true}},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"master.selectionChange->state.selectedEmployee\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"selectionChange\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"selectedEmployee\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"master.selectionChange->state.selectedEmployee:pick\",\"path\":\"payload.selectedRows.0\",\"inputSource\":\"event\",\"fallbackValue\":null},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"master.selectionChange->state.selectedEmployeeId\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"selectionChange\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"selectedEmployeeId\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"master.selectionChange->state.selectedEmployeeId:pick\",\"path\":\"payload.selectedRows.0.id\",\"inputSource\":\"event\",\"fallbackValue\":null},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"master.selectionChange->state.selectedEmployeeIdentity\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"selectionChange\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"selectedEmployeeIdentity\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"master.selectionChange->state.selectedEmployeeIdentity:pick\",\"path\":\"payload.resourceIdentity\",\"inputSource\":\"event\",\"fallbackValue\":null},\"metadata\":{\"source\":\"quickstart-real-http\"}}],\"diagnostics\":{\"archetype\":\"master-detail-tabs\",\"adherence\":[\"ja-suportado-mal-nomeado-ou-mal-materializado\"],\"evidence\":\"quickstart-real-http\",\"canonicalResource\":\"human-resources.funcionarios\",\"requiredSurfaces\":[\"POST /api/human-resources/funcionarios/filter\",\"GET /api/human-resources/funcionarios/{id}\",\"GET /api/human-resources/funcionarios/{id}/surfaces\",\"payroll-history\",\"skills\",\"career-history\",\"dependents\",\"address\",\"mission-participations\",\"equipment-custody\"],\"localDataAllowed\":false,\"legacyScreen\":\"ERGadm00229\"}}}",
4358
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan\",\"authoringPlan\":{\"contextScopes\":[{\"id\":\"quickstart-employee-tabs:detail-context\",\"context\":{\"resourcePath\":{\"kind\":\"constant\",\"value\":\"human-resources/funcionarios\"},\"resourceId\":{\"kind\":\"state\",\"path\":\"selectedEmployeeId\",\"layer\":\"values\",\"initial\":null}},\"targets\":[{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"dossier\",\"index\":0},{\"kind\":\"widget\",\"key\":\"employee-dossier-form\",\"componentType\":\"praxis-dynamic-form\"}]}],\"policy\":{\"missingValuePolicy\":\"propagate-undefined\",\"distinct\":true},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"quickstart-employee-tabs:related-context\",\"context\":{\"parentResourcePath\":{\"kind\":\"constant\",\"value\":\"human-resources/funcionarios\"},\"parentResourceId\":{\"kind\":\"state\",\"path\":\"selectedEmployeeId\",\"layer\":\"values\",\"initial\":null},\"parentIdentity\":{\"kind\":\"state\",\"path\":\"selectedEmployeeIdentity\",\"layer\":\"values\",\"initial\":null}},\"targets\":[{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"career\",\"index\":2},{\"kind\":\"widget\",\"key\":\"employee-skills\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"career\",\"index\":2},{\"kind\":\"widget\",\"key\":\"employee-career-history\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"people\",\"index\":3},{\"kind\":\"widget\",\"key\":\"employee-dependents\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"people\",\"index\":3},{\"kind\":\"widget\",\"key\":\"employee-address\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"operations\",\"index\":4},{\"kind\":\"widget\",\"key\":\"employee-missions\",\"componentType\":\"praxis-related-resource-outlet\"}]},{\"widget\":\"workspace\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"operations\",\"index\":4},{\"kind\":\"widget\",\"key\":\"employee-equipment-custody\",\"componentType\":\"praxis-related-resource-outlet\"}]}],\"policy\":{\"missingValuePolicy\":\"propagate-undefined\",\"distinct\":true},\"metadata\":{\"source\":\"quickstart-real-http\"}}],\"bindings\":[{\"id\":\"filters.change->state.employeeFilter\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"filters\",\"port\":\"change\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"employeeFilter\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"filters.change->state.employeeFilter:pick\",\"path\":\"payload\",\"inputSource\":\"event\",\"fallbackValue\":{}},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"state.employeeFilter->master.queryContext\",\"intent\":\"state-read\",\"from\":{\"kind\":\"state\",\"path\":\"employeeFilter\"},\"to\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"queryContext\",\"direction\":\"input\"},\"transform\":{\"kind\":\"template\",\"id\":\"state.employeeFilter->master.queryContext:template\",\"template\":{\"filters\":\"${source}\"},\"inputSource\":\"payload\",\"output\":{\"semanticKind\":\"query-context\",\"stableShape\":true}},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"master.selectionChange->state.selectedEmployee\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"selectionChange\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"selectedEmployee\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"master.selectionChange->state.selectedEmployee:pick\",\"path\":\"payload.selectedRows.0\",\"inputSource\":\"event\",\"fallbackValue\":null},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"master.selectionChange->state.selectedEmployeeId\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"selectionChange\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"selectedEmployeeId\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"master.selectionChange->state.selectedEmployeeId:pick\",\"path\":\"payload.selectedRows.0.id\",\"inputSource\":\"event\",\"fallbackValue\":null},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"master.selectionChange->state.selectedEmployeeIdentity\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"widget\":\"master\",\"port\":\"selectionChange\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"selectedEmployeeIdentity\"},\"transform\":{\"kind\":\"pick-path\",\"id\":\"master.selectionChange->state.selectedEmployeeIdentity:pick\",\"path\":\"payload.resourceIdentity\",\"inputSource\":\"event\",\"fallbackValue\":null},\"metadata\":{\"source\":\"quickstart-real-http\"}},{\"id\":\"state.payrollContext->payroll-page.context\",\"intent\":\"state-read\",\"from\":{\"kind\":\"state\",\"path\":\"payrollContext\",\"layer\":\"derived\"},\"to\":{\"kind\":\"component-port\",\"widget\":\"workspace\",\"port\":\"context\",\"direction\":\"input\",\"nestedPath\":[{\"kind\":\"tab\",\"id\":\"payroll\",\"index\":1},{\"kind\":\"widget\",\"key\":\"employee-payroll-panels\",\"componentType\":\"praxis-expansion\"},{\"kind\":\"panel\",\"id\":\"history\",\"index\":0},{\"kind\":\"widget\",\"key\":\"employee-payroll-page\",\"componentType\":\"praxis-dynamic-page\"}]},\"policy\":{\"missingValuePolicy\":\"propagate-undefined\",\"distinct\":true},\"metadata\":{\"source\":\"quickstart-real-http\"}}],\"diagnostics\":{\"archetype\":\"master-detail-tabs\",\"adherence\":[\"ja-suportado-mal-nomeado-ou-mal-materializado\"],\"evidence\":\"quickstart-real-http\",\"canonicalResource\":\"human-resources.funcionarios\",\"requiredSurfaces\":[\"POST /api/human-resources/funcionarios/filter\",\"GET /api/human-resources/funcionarios/{id}\",\"GET /api/human-resources/funcionarios/{id}/surfaces\",\"payroll-history\",\"skills\",\"career-history\",\"dependents\",\"address\",\"mission-participations\",\"equipment-custody\"],\"localDataAllowed\":false,\"legacyScreen\":\"ERGadm00229\"}}}",
4299
4359
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.ergon-archetype-master-detail-tabs.json",
4300
- "contentHash": "22251e2f6e7311484b60b56a881c80ea6f5871fd45b9e063661e24517e39b99e",
4360
+ "contentHash": "0ed2a57f2c4d905de56e46c1c8ee45e2b4b345afa4241c5fc397708f35fee8ca",
4301
4361
  "sourceKind": "component_definition",
4302
4362
  "sourceId": "praxis-dynamic-page",
4303
4363
  "corpusVersion": "1.0.0"
@@ -5231,6 +5291,16 @@
5231
5291
  "sourceKind": "component_definition",
5232
5292
  "sourceId": "praxis-dynamic-page",
5233
5293
  "corpusVersion": "1.0.0"
5294
+ },
5295
+ {
5296
+ "chunkIndex": 221,
5297
+ "chunkKind": "recipe",
5298
+ "content": "{\"templateMeta\":{\"registryKey\":\"praxis-dynamic-page\",\"variantId\":\"widget-selection-identity\",\"useWhen\":\"Present the selected row identity in a widget header with an avatar and formatted civil date/document, clearing stale presentation on invalid input.\"},\"pageRef\":\"praxis-dynamic-page.widget-selection-identity.page.json\",\"notes\":[\"Fictional local records; illustrative SVGs are available in the workspace public directory. This recipe does not fetch or modify employees.\",\"Keep the four composition links in document order: replace the complete transient identity, format the civil date, format the document, compose the subtitle.\",\"An invalid formatter emits a diagnostic and leaves the label empty because the identity was reset in this event. The mask formats digits; it does not validate CPF check digits.\",\"The literal title prefix preserves an initial and cleared heading. Selection is transient and is not restored after serialization/reopen.\",\"A form consumer must keep its resourceId link and local hydration/error feedback. This recipe proves header presentation only.\"],\"page\":{\"composition\":{\"links\":[{\"id\":\"people-selection-to-identity\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"people\",\"port\":\"selectionChange\",\"direction\":\"output\"}},\"to\":{\"kind\":\"state\",\"ref\":{\"path\":\"employee\",\"layer\":\"transient\",\"writable\":true}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"single-value\",\"steps\":[{\"kind\":\"select-case\",\"phase\":\"link-propagation\",\"config\":{\"cases\":[{\"when\":{\"var\":\"payload.selectedRows.0\"},\"value\":{\"name\":\"${payload.selectedRows.0.name}\",\"avatarUrl\":\"${payload.selectedRows.0.avatarUrl}\",\"birthLabel\":\"\",\"cpfLabel\":\"\",\"subtitle\":\"\"}}],\"defaultValue\":{\"name\":\"\",\"avatarUrl\":null,\"birthLabel\":\"\",\"cpfLabel\":\"\",\"subtitle\":\"\"}}}]}},{\"id\":\"identity-format-birthDate\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"people\",\"port\":\"selectionChange\",\"direction\":\"output\"}},\"to\":{\"kind\":\"state\",\"ref\":{\"path\":\"employee.birthLabel\",\"layer\":\"transient\",\"writable\":true}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"single-value\",\"steps\":[{\"kind\":\"pick-path\",\"phase\":\"link-propagation\",\"config\":{\"path\":\"payload.selectedRows.0.birthDate\"}},{\"kind\":\"format-value\",\"phase\":\"link-propagation\",\"config\":{\"format\":{\"kind\":\"date\",\"locale\":\"pt-BR\"}}}]}},{\"id\":\"identity-format-cpf\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"people\",\"port\":\"selectionChange\",\"direction\":\"output\"}},\"to\":{\"kind\":\"state\",\"ref\":{\"path\":\"employee.cpfLabel\",\"layer\":\"transient\",\"writable\":true}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"single-value\",\"steps\":[{\"kind\":\"pick-path\",\"phase\":\"link-propagation\",\"config\":{\"path\":\"payload.selectedRows.0.cpf\"}},{\"kind\":\"format-value\",\"phase\":\"link-propagation\",\"config\":{\"format\":{\"kind\":\"mask\",\"mask\":\"000.000.000-00\"}}}]}},{\"id\":\"identity-subtitle\",\"intent\":\"state-write\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"people\",\"port\":\"selectionChange\",\"direction\":\"output\"}},\"to\":{\"kind\":\"state\",\"ref\":{\"path\":\"employee.subtitle\",\"layer\":\"transient\",\"writable\":true}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"single-value\",\"steps\":[{\"kind\":\"select-case\",\"phase\":\"link-propagation\",\"config\":{\"cases\":[{\"when\":{\"and\":[{\"var\":\"state.employee.birthLabel\"},{\"var\":\"state.employee.cpfLabel\"}]},\"value\":\"${state.employee.birthLabel} · ${state.employee.cpfLabel}\"},{\"when\":{\"var\":\"state.employee.birthLabel\"},\"value\":\"${state.employee.birthLabel}\"},{\"when\":{\"var\":\"state.employee.cpfLabel\"},\"value\":\"${state.employee.cpfLabel}\"}],\"defaultValue\":\"\"}}]}}]},\"widgets\":[{\"key\":\"people\",\"definition\":{\"id\":\"praxis-table\",\"inputs\":{\"tableId\":\"shell-selection-proof\",\"configPersistenceStrategy\":\"volatile\",\"enableCustomization\":false,\"config\":{\"columns\":[{\"field\":\"name\",\"header\":\"Pessoa de exemplo\"}],\"behavior\":{\"localDataMode\":{\"enabled\":true},\"selection\":{\"enabled\":true,\"type\":\"single\",\"mode\":\"both\",\"allowSelectAll\":false,\"checkboxPosition\":\"start\",\"persistSelection\":false,\"persistOnDataUpdate\":false}},\"toolbar\":{\"visible\":false,\"position\":\"top\"}},\"data\":[{\"id\":\"a\",\"name\":\"Ana Exemplo\",\"birthDate\":\"2000-01-01\",\"cpf\":\"01234567890\",\"avatarUrl\":\"/shell-avatar-proof-a.svg\"},{\"id\":\"b\",\"name\":\"Bruno Exemplo\",\"birthDate\":\"2001-02-02\",\"cpf\":\"111.111.111-11\",\"avatarUrl\":null},{\"id\":\"d\",\"name\":\"Davi Exemplo\",\"birthDate\":\"2001-02-29\",\"cpf\":\"inválido\",\"avatarUrl\":null},{\"id\":\"c\",\"name\":\"Clara Exemplo\",\"birthDate\":\"2002-03-03\",\"cpf\":\"222.222.222-22\",\"avatarUrl\":\"/shell-avatar-proof-c.svg\"}]}}},{\"key\":\"identity\",\"shell\":{\"kind\":\"dashboard-card\",\"showHeader\":true,\"title\":\"Funcionário ${transient.employee.name}\",\"subtitle\":\"${transient.employee.subtitle}\",\"avatar\":{\"imageSrc\":\"${transient.employee.avatarUrl}\",\"name\":\"${transient.employee.name}\"},\"windowActions\":{\"collapsible\":false,\"fullscreen\":false}},\"definition\":{\"id\":\"praxis-dynamic-page\",\"inputs\":{\"page\":{\"widgets\":[]},\"autoPersist\":false,\"enableCustomization\":false,\"showPageSettingsButton\":false}}}]}}",
5299
+ "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.widget-selection-identity.json",
5300
+ "contentHash": "a369adcb02f903bd858bd18f9d6de2307943e775ee5494065a6d17c8f5269792",
5301
+ "sourceKind": "component_definition",
5302
+ "sourceId": "praxis-dynamic-page",
5303
+ "corpusVersion": "1.0.0"
5234
5304
  }
5235
5305
  ]
5236
5306
  },