@praxisui/core 9.0.35 → 9.0.37

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-08-29T11:06:11.218Z",
3
+ "generatedAt": "2026-08-30T00:46:55.066Z",
4
4
  "packageName": "@praxisui/core",
5
- "packageVersion": "9.0.35",
5
+ "packageVersion": "9.0.37",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 4,
@@ -655,6 +655,12 @@
655
655
  "description": "Componente registrado que sera compilado para definition.id.",
656
656
  "critical": true
657
657
  },
658
+ {
659
+ "path": "uiCompositionPlan.widgets[].role",
660
+ "category": "layout",
661
+ "valueKind": "string",
662
+ "description": "Papel semantico explicito usado na materializacao de layout; master-detail aceita master, detail, filters, actions, supporting e os slots detail-* do preset oficial."
663
+ },
658
664
  {
659
665
  "path": "uiCompositionPlan.widgets[].shell",
660
666
  "category": "widgets",
@@ -2998,9 +3004,9 @@
2998
3004
  {
2999
3005
  "chunkIndex": 1,
3000
3006
  "chunkKind": "capabilities",
3001
- "content": "Component Capability:\n - Path: uiCompositionPlan\n Category: page\n Kind: object\n Description: Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.\n\nComponent Capability:\n - Path: uiCompositionPlan.version\n Category: page\n Kind: string\n Description: Versao do plano. Valor atual: 1.0.\n\nComponent Capability:\n - Path: uiCompositionPlan.kind\n Category: page\n Kind: string\n Description: Discriminador do plano. Valor atual: praxis.ui-composition-plan.\n\nComponent Capability:\n - Path: uiCompositionPlan.i18n\n Category: page\n Kind: object\n Description: Catalogo de textos de negocio da pagina, compilado para page.i18n. Descritores PraxisTextValue podem declarar apenas key quando a chave existir no dicionario do fallbackLocale; o compilador materializa text no documento executavel.\n\nComponent Capability:\n - Path: uiCompositionPlan.context\n Category: context\n Kind: object\n Description: Contexto explicito da pagina, compilado para page.context; nao substitui contextScopes de autoria.\n\nComponent Capability:\n - Path: uiCompositionPlan.layout\n Category: layout\n Kind: object\n Description: Layout responsivo canonico compilado para page.layout quando a pagina nao usa apenas canvas/preset.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPreset\n Category: layout\n Kind: string\n Description: Preset semantico opcional da composicao planejada.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.\n\nComponent Capability:\n - Path: uiCompositionPlan.grouping\n Category: layout\n Kind: array\n Description: Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa opcional widgetKey -> slot semantico para alinhar widgets gerados a presets de layout sem depender de dominio.\n\nComponent Capability:\n - Path: uiCompositionPlan.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes responsivas opcionais para desktop, tablet e mobile, incluindo canvas, groupingOverrides e widgetOverrides.\n\nComponent Capability:\n - Path: uiCompositionPlan.themePreset\n Category: layout\n Kind: string\n Description: Preset visual opcional do runtime, por exemplo analytics-calm, workspace-balanced ou ops-monitoring.\n\nComponent Capability:\n - Path: uiCompositionPlan.state\n Category: state\n Kind: object\n Description: Estado inicial/declarativo que sera compilado para page.state.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets\n Category: widgets\n Kind: array\n Description: Widgets planejados antes da compilacao para page.widgets.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].key\n Category: widgets\n Kind: string\n Description: ID estavel do widget planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].componentId\n Category: widgets\n Kind: string\n Description: Componente registrado que sera compilado para definition.id.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].shell\n Category: widgets\n Kind: object\n Description: Moldura governada do widget, compilada para page.widgets[].shell sem enriquecimento do host.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].inputs\n Category: widgets\n Kind: object\n Description: Inputs canonicos do componente, compilados para definition.inputs.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem declarativa de binding, compilada para definition.bindingOrder.\n\nComponent Capability:\n - Path: uiCompositionPlan.selectionSyncs\n Category: connections\n Kind: array\n Description: Atalhos declarativos para projetar o mesmo contexto de selecao a partir de varias portas; sempre compilam para links canonicos explicitos.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes\n Category: context\n Kind: array\n Description: Escopos de autoria que distribuem contexto explicito a widgets top-level ou nested; nao criam heranca ambiente no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].context\n Category: context\n Kind: object\n Description: Mapa input -> constant ou state. Constant e state.initial viram inputs explicitos; state tambem gera link state-read canonico.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].context.<token>\n Category: context\n Kind: object\n Description: Descritor constant ou state. Em state, initial aceita um valor JSON opcional materializado no input antes da primeira propagacao; nao cria um segundo state store.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].targets\n Category: context\n Kind: array\n Description: Destinos explicitos do escopo, identificados por widget owner e nestedPath canonico opcional.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings\n Category: connections\n Kind: array\n Description: Bindings declarativos que serao compilados para page.composition.links.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do binding planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem: component-port ou state.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino: component-port, state ou global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando uiCompositionPlan.bindings[].to.kind = global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payload\n Category: connections\n Kind: object\n Description: Payload literal opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payloadExpr\n Category: connections\n Kind: string\n Description: Path de payload opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de origem. Use apenas com endpoint component-port; o owner top-level continua em from.widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de destino. Use apenas com endpoint component-port; o owner top-level continua em to.widget.\n\nComponent 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.",
3007
+ "content": "Component Capability:\n - Path: uiCompositionPlan\n Category: page\n Kind: object\n Description: Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.\n\nComponent Capability:\n - Path: uiCompositionPlan.version\n Category: page\n Kind: string\n Description: Versao do plano. Valor atual: 1.0.\n\nComponent Capability:\n - Path: uiCompositionPlan.kind\n Category: page\n Kind: string\n Description: Discriminador do plano. Valor atual: praxis.ui-composition-plan.\n\nComponent Capability:\n - Path: uiCompositionPlan.i18n\n Category: page\n Kind: object\n Description: Catalogo de textos de negocio da pagina, compilado para page.i18n. Descritores PraxisTextValue podem declarar apenas key quando a chave existir no dicionario do fallbackLocale; o compilador materializa text no documento executavel.\n\nComponent Capability:\n - Path: uiCompositionPlan.context\n Category: context\n Kind: object\n Description: Contexto explicito da pagina, compilado para page.context; nao substitui contextScopes de autoria.\n\nComponent Capability:\n - Path: uiCompositionPlan.layout\n Category: layout\n Kind: object\n Description: Layout responsivo canonico compilado para page.layout quando a pagina nao usa apenas canvas/preset.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPreset\n Category: layout\n Kind: string\n Description: Preset semantico opcional da composicao planejada.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.\n\nComponent Capability:\n - Path: uiCompositionPlan.grouping\n Category: layout\n Kind: array\n Description: Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa opcional widgetKey -> slot semantico para alinhar widgets gerados a presets de layout sem depender de dominio.\n\nComponent Capability:\n - Path: uiCompositionPlan.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes responsivas opcionais para desktop, tablet e mobile, incluindo canvas, groupingOverrides e widgetOverrides.\n\nComponent Capability:\n - Path: uiCompositionPlan.themePreset\n Category: layout\n Kind: string\n Description: Preset visual opcional do runtime, por exemplo analytics-calm, workspace-balanced ou ops-monitoring.\n\nComponent Capability:\n - Path: uiCompositionPlan.state\n Category: state\n Kind: object\n Description: Estado inicial/declarativo que sera compilado para page.state.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets\n Category: widgets\n Kind: array\n Description: Widgets planejados antes da compilacao para page.widgets.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].key\n Category: widgets\n Kind: string\n Description: ID estavel do widget planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].componentId\n Category: widgets\n Kind: string\n Description: Componente registrado que sera compilado para definition.id.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].role\n Category: layout\n Kind: string\n Description: Papel semantico explicito usado na materializacao de layout; master-detail aceita master, detail, filters, actions, supporting e os slots detail-* do preset oficial.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].shell\n Category: widgets\n Kind: object\n Description: Moldura governada do widget, compilada para page.widgets[].shell sem enriquecimento do host.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].inputs\n Category: widgets\n Kind: object\n Description: Inputs canonicos do componente, compilados para definition.inputs.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem declarativa de binding, compilada para definition.bindingOrder.\n\nComponent Capability:\n - Path: uiCompositionPlan.selectionSyncs\n Category: connections\n Kind: array\n Description: Atalhos declarativos para projetar o mesmo contexto de selecao a partir de varias portas; sempre compilam para links canonicos explicitos.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes\n Category: context\n Kind: array\n Description: Escopos de autoria que distribuem contexto explicito a widgets top-level ou nested; nao criam heranca ambiente no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].context\n Category: context\n Kind: object\n Description: Mapa input -> constant ou state. Constant e state.initial viram inputs explicitos; state tambem gera link state-read canonico.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].context.<token>\n Category: context\n Kind: object\n Description: Descritor constant ou state. Em state, initial aceita um valor JSON opcional materializado no input antes da primeira propagacao; nao cria um segundo state store.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].targets\n Category: context\n Kind: array\n Description: Destinos explicitos do escopo, identificados por widget owner e nestedPath canonico opcional.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings\n Category: connections\n Kind: array\n Description: Bindings declarativos que serao compilados para page.composition.links.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do binding planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem: component-port ou state.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino: component-port, state ou global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando uiCompositionPlan.bindings[].to.kind = global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payload\n Category: connections\n Kind: object\n Description: Payload literal opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payloadExpr\n Category: connections\n Kind: string\n Description: Path de payload opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de origem. Use apenas com endpoint component-port; o owner top-level continua em from.widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de destino. Use apenas com endpoint component-port; o owner top-level continua em to.widget.\n\nComponent 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.",
3002
3008
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3003
- "contentHash": "54be67c3bd08d78ff65b5948fc6036c8821297f6544a8e10f6f71b10fc765c3b",
3009
+ "contentHash": "d38f9bc963f7876612dc40b31b87e9ab5f2171fc7de4e5537ffedafcd2d959e1",
3004
3010
  "sourceKind": "component_definition",
3005
3011
  "sourceId": "praxis-dynamic-page",
3006
3012
  "corpusVersion": "1.0.0"
@@ -3008,9 +3014,9 @@
3008
3014
  {
3009
3015
  "chunkIndex": 2,
3010
3016
  "chunkKind": "capabilities",
3011
- "content": "Component 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 ou constant.\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.\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.",
3017
+ "content": "Component 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 ou constant.\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.\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.",
3012
3018
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3013
- "contentHash": "eeedcedf9b18668ab9e9d250e09e77f4fa2a79a47b72993daaf821bd2244674f",
3019
+ "contentHash": "7bd97da307d2d07b7557f35e60d5c9db1450e0f29de5601d193520d61d4446e7",
3014
3020
  "sourceKind": "component_definition",
3015
3021
  "sourceId": "praxis-dynamic-page",
3016
3022
  "corpusVersion": "1.0.0"
@@ -3018,9 +3024,9 @@
3018
3024
  {
3019
3025
  "chunkIndex": 3,
3020
3026
  "chunkKind": "capabilities",
3021
- "content": "Component 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.\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.",
3027
+ "content": "Component 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.\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.",
3022
3028
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3023
- "contentHash": "c79a9fa5368ad1cd50b0464ed879eaadfbd63ef5d95fcecec819c68db9a3ba94",
3029
+ "contentHash": "2b29073ea5f25670582e7dfacea83b76f616f5f7ec0b2c6bbf43c7db6c011d73",
3024
3030
  "sourceKind": "component_definition",
3025
3031
  "sourceId": "praxis-dynamic-page",
3026
3032
  "corpusVersion": "1.0.0"
@@ -3028,9 +3034,9 @@
3028
3034
  {
3029
3035
  "chunkIndex": 4,
3030
3036
  "chunkKind": "capabilities",
3031
- "content": "Component 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.\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.",
3037
+ "content": "Component 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.\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.",
3032
3038
  "sourcePointer": "projects/praxis-core/src/lib/ai/dynamic-page-ai-capabilities.ts",
3033
- "contentHash": "f82c49aa5d86bff7f52d9ce46d3e2f85e125a7889ba8837a70b712f450faf074",
3039
+ "contentHash": "c0b98d308321eb27b55435d78a774022a8927be7898166821dca7e1b619064d6",
3034
3040
  "sourceKind": "component_definition",
3035
3041
  "sourceId": "praxis-dynamic-page",
3036
3042
  "corpusVersion": "1.0.0"
@@ -3218,9 +3224,9 @@
3218
3224
  {
3219
3225
  "chunkIndex": 23,
3220
3226
  "chunkKind": "recipe",
3221
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringGuidance\",\"authoringGuidance\":[\"Resolve projection ids from x-ui.analytics; never infer a query or chart kind from labels.\",\"Keep queryContext when changing between chart and analytic-table.\",\"Offer KPI only when an installed canonical KPI renderer is eligible for the projection.\",\"Keep remote results out of the page document; the recipe stores only contracts and query context.\"]}",
3227
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringGuidance\",\"authoringGuidance\":[\"Resolve projection ids from x-ui.analytics; never infer a query or chart kind from labels.\",\"Keep queryContext when changing between chart and analytic-table.\",\"Use single-point cross-filter toggle semantics: selecting another bucket replaces the filter and repeating the active bucket clears it.\",\"Offer KPI only when an installed canonical KPI renderer is eligible for the projection.\",\"Keep remote results out of the page document; the recipe stores only contracts and query context.\"]}",
3222
3228
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.analytics-dashboard-showcase.json",
3223
- "contentHash": "804dfd13b959c6e6624ec0ae06e4e53d9bb0dbde978d750334105d6b7dba73a4",
3229
+ "contentHash": "75e7e49e332963450bafece618bdbef38a40ffbdac69acf33d1d044ceb6440b7",
3224
3230
  "sourceKind": "component_definition",
3225
3231
  "sourceId": "praxis-dynamic-page",
3226
3232
  "corpusVersion": "1.0.0"
@@ -3228,9 +3234,9 @@
3228
3234
  {
3229
3235
  "chunkIndex": 24,
3230
3236
  "chunkKind": "recipe",
3231
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page\",\"page\":{\"themePreset\":\"executive-command-center\",\"layout\":{\"orientation\":\"columns\",\"columns\":4,\"gap\":\"16px\"},\"deviceLayouts\":{\"desktop\":{\"layout\":{\"orientation\":\"columns\",\"columns\":4,\"gap\":\"16px\"},\"widgetOverrides\":{\"procurementFilter\":{\"order\":10,\"span\":4},\"procurementPresentation\":{\"order\":20,\"span\":2},\"procurementFunnel\":{\"order\":30,\"span\":1},\"procurementPyramid\":{\"order\":40,\"span\":1},\"procurementGauge\":{\"order\":45,\"span\":2},\"missionStatusChart\":{\"order\":50,\"span\":2},\"missionStatusTable\":{\"order\":60,\"span\":2},\"payrollTrend\":{\"order\":70,\"span\":2},\"payrollStackedArea\":{\"order\":80,\"span\":2},\"payrollProfile\":{\"order\":90,\"span\":1},\"payrollProfileTreemap\":{\"order\":95,\"span\":1},\"payrollCombo\":{\"order\":100,\"span\":2},\"absenceCorrelation\":{\"order\":110,\"span\":1}}},\"tablet\":{\"layout\":{\"orientation\":\"columns\",\"columns\":2,\"gap\":\"14px\"}},\"mobile\":{\"layout\":{\"orientation\":\"columns\",\"columns\":1,\"gap\":\"12px\"}}},\"state\":{\"values\":{\"analytics\":{\"procurementQueryContext\":{\"filters\":{}},\"missionQueryContext\":{\"filters\":{}}}}}}}",
3237
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page\",\"page\":{\"themePreset\":\"executive-command-center\",\"layout\":{\"orientation\":\"columns\",\"columns\":4,\"gap\":\"16px\"},\"deviceLayouts\":{\"desktop\":{\"layout\":{\"orientation\":\"columns\",\"columns\":4,\"gap\":\"16px\"},\"widgetOverrides\":{\"procurementFilter\":{\"order\":10,\"span\":4},\"procurementPresentation\":{\"order\":20,\"span\":2},\"procurementFunnel\":{\"order\":30,\"span\":1},\"procurementPyramid\":{\"order\":40,\"span\":1},\"procurementGauge\":{\"order\":45,\"span\":2},\"missionStatusChart\":{\"order\":50,\"span\":2},\"missionStatusTable\":{\"order\":60,\"span\":2},\"payrollTrend\":{\"order\":70,\"span\":2},\"payrollStackedArea\":{\"order\":80,\"span\":2},\"payrollProfile\":{\"order\":90,\"span\":1},\"payrollProfileTreemap\":{\"order\":95,\"span\":1},\"payrollCombo\":{\"order\":100,\"span\":2},\"payrollSalaryHistogram\":{\"order\":105,\"span\":2},\"absenceCorrelation\":{\"order\":110,\"span\":1}}},\"tablet\":{\"layout\":{\"orientation\":\"columns\",\"columns\":2,\"gap\":\"14px\"}},\"mobile\":{\"layout\":{\"orientation\":\"columns\",\"columns\":1,\"gap\":\"12px\"}}},\"state\":{\"values\":{\"analytics\":{\"procurementQueryContext\":{\"filters\":{}},\"missionQueryContext\":{\"filters\":{}}}}}}}",
3232
3238
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.analytics-dashboard-showcase.json",
3233
- "contentHash": "73ea5c8f830d3d012c6c54f70179dd739d0c29611243fea2d8fe827e63fe7d87",
3239
+ "contentHash": "4ad0c12f11baa845b185771d444baa26f7165ec2dcc9f775700461f2857ad7c7",
3234
3240
  "sourceKind": "component_definition",
3235
3241
  "sourceId": "praxis-dynamic-page",
3236
3242
  "corpusVersion": "1.0.0"
@@ -3238,9 +3244,9 @@
3238
3244
  {
3239
3245
  "chunkIndex": 25,
3240
3246
  "chunkKind": "recipe",
3241
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page.widgets\",\"page\":{\"widgets\":[{\"key\":\"procurementFilter\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"filter_alt\",\"title\":\"Filtros governados\",\"subtitle\":\"O DTO remoto preserva a empresa selecionada em todas as apresentações do funil\"},\"definition\":{\"id\":\"praxis-filter\",\"bindingOrder\":[\"resourcePath\",\"filterId\",\"formId\",\"alwaysVisibleFields\",\"selectedFieldIds\",\"disablePersistence\",\"showFilterSettings\",\"showAdvancedButton\",\"showAddButton\",\"showSearchButton\"],\"inputs\":{\"resourcePath\":\"procurement/vw-supplier-procurement-funnel\",\"filterId\":\"analytics-dashboard-procurement-filter\",\"formId\":\"analytics-dashboard-procurement-filter-form\",\"componentInstanceId\":\"analytics-dashboard-procurement-filter\",\"alwaysVisibleFields\":[\"companyId\"],\"selectedFieldIds\":[\"companyId\"],\"disablePersistence\":true,\"showFilterSettings\":false,\"showAdvancedButton\":false,\"showAddButton\":false,\"showSearchButton\":false},\"outputs\":{\"change\":\"emit\",\"clear\":\"emit\"}}},{\"key\":\"procurementPresentation\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"view_quilt\",\"title\":\"Uma projection, três apresentações\",\"subtitle\":\"Gráfico, tabela e indicadores executam o mesmo contrato e preservam o mesmo queryContext\"},\"definition\":{\"id\":\"praxis-analytics-presentation\",\"bindingOrder\":[\"analytics\",\"projectionId\",\"availableFamilies\",\"preferredFamily\",\"queryContext\",\"title\",\"subtitle\",\"enableCustomization\"],\"inputs\":{\"analytics\":{\"projections\":[{\"id\":\"supplier-procurement-funnel\",\"intent\":\"composition\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\"},\"bindings\":{\"primaryDimension\":{\"field\":\"stage\",\"role\":\"category\",\"label\":\"Etapa\"},\"primaryMetrics\":[{\"field\":\"volume\",\"aggregation\":\"sum\",\"label\":\"Fornecedores\"}]},\"defaults\":{\"sort\":[{\"field\":\"stage\",\"direction\":\"asc\"}],\"limit\":6},\"presentationHints\":{\"preferredFamilies\":[\"chart\",\"analytic-table\",\"kpi\"]},\"interactions\":{\"pointSelection\":true}}]},\"projectionId\":\"supplier-procurement-funnel\",\"availableFamilies\":[\"chart\",\"analytic-table\",\"kpi\"],\"preferredFamily\":\"chart\",\"queryContext\":{\"filters\":{}},\"title\":\"Funil de fornecedores\",\"subtitle\":\"Etapas cumulativas derivadas de fatos operacionais persistidos\",\"enableCustomization\":true},\"outputs\":{\"presentationChange\":\"emit\",\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"crossFilter\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"procurementFunnel\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"filter_alt\",\"title\":\"Funnel\",\"subtitle\":\"Ordem canônica 1→6 por bucket rotulado do stats\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"supplier-procurement-funnel-chart\",\"kind\":\"funnel\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\",\"options\":{\"limit\":6,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"stage\",\"label\":\"Etapa\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"volume\",\"label\":\"Fornecedores\",\"aggregation\":\"sum\"}],\"legend\":{\"enabled\":true},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"procurementPyramid\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"change_history\",\"title\":\"Pyramid\",\"subtitle\":\"A mesma série remota com ordem visual invertida pelo renderer\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"supplier-procurement-pyramid-chart\",\"kind\":\"pyramid\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\",\"options\":{\"limit\":6,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"stage\",\"label\":\"Etapa\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"volume\",\"label\":\"Fornecedores\",\"aggregation\":\"sum\"}],\"legend\":{\"enabled\":true},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"procurementGauge\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"speed\",\"title\":\"Conversão no recebimento\",\"subtitle\":\"AVG conversionRate da etapa 6 em uma única faixa governada de 0 a 100%\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"supplier-procurement-receipt-conversion-gauge\",\"kind\":\"gauge\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\",\"options\":{\"limit\":1,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"stage\",\"label\":\"Etapa\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"conversionRate\",\"label\":\"Conversão\",\"aggregation\":\"avg\",\"format\":\"percent\"}],\"filters\":[{\"field\":\"stageOrdersIn\",\"operator\":\"in\",\"values\":[6]}],\"gauge\":{\"scale\":{\"min\":0,\"max\":1}},\"legend\":{\"enabled\":false},\"labels\":{\"enabled\":true,\"format\":\"percent\"},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"missionStatusChart\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"bar_chart\",\"title\":\"Status das missões\",\"subtitle\":\"Selecione uma barra para filtrar a tabela operacional\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-mission-status\",\"kind\":\"horizontal-bar\",\"orientation\":\"horizontal\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/operations/vw-resumo-missoes\",\"operation\":\"group-by\",\"options\":{\"limit\":10,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"status\",\"label\":\"Status\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"missions\",\"label\":\"Missões\",\"aggregation\":\"count\"}],\"events\":{\"pointClick\":{\"action\":\"emit\"},\"selectionChange\":{\"action\":\"emit\",\"mapping\":{\"status\":\"status\"}},\"crossFilter\":{\"action\":\"filter-widget\",\"target\":\"missionStatusTable\",\"mapping\":{\"status\":\"status\"}}},\"legend\":{\"enabled\":false},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"crossFilter\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"missionStatusTable\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"table_rows\",\"title\":\"Portfólio filtrável\",\"subtitle\":\"A tabela remota recebe o filtro emitido pelo chart\"},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\",\"queryContext\"],\"inputs\":{\"resourcePath\":\"operations/vw-resumo-missoes\",\"tableId\":\"analytics-dashboard-mission-status-table\",\"queryContext\":{\"filters\":{}},\"config\":{\"toolbar\":{\"visible\":true,\"title\":\"Missões\",\"subtitle\":\"Resultado operacional remoto\"},\"columns\":[{\"field\":\"titulo\",\"header\":\"Missão\",\"type\":\"text\",\"sticky\":\"start\"},{\"field\":\"status\",\"header\":\"Status\",\"type\":\"badge\"},{\"field\":\"prioridade\",\"header\":\"Prioridade\",\"type\":\"badge\"},{\"field\":\"ameaca\",\"header\":\"Ameaça\",\"type\":\"text\"},{\"field\":\"qtdEventos\",\"header\":\"Eventos\",\"type\":\"number\"}],\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\",\"selectionChange\":\"emit\",\"loadingStateChange\":\"emit\"}}}]}}",
3247
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page.widgets\",\"page\":{\"widgets\":[{\"key\":\"procurementFilter\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"filter_alt\",\"title\":\"Filtros governados\",\"subtitle\":\"O DTO remoto preserva a empresa selecionada em todas as apresentações do funil\"},\"definition\":{\"id\":\"praxis-filter\",\"bindingOrder\":[\"resourcePath\",\"filterId\",\"formId\",\"alwaysVisibleFields\",\"selectedFieldIds\",\"disablePersistence\",\"showFilterSettings\",\"showAdvancedButton\",\"showAddButton\",\"showSearchButton\"],\"inputs\":{\"resourcePath\":\"procurement/vw-supplier-procurement-funnel\",\"filterId\":\"analytics-dashboard-procurement-filter\",\"formId\":\"analytics-dashboard-procurement-filter-form\",\"componentInstanceId\":\"analytics-dashboard-procurement-filter\",\"alwaysVisibleFields\":[\"companyId\"],\"selectedFieldIds\":[\"companyId\"],\"disablePersistence\":true,\"showFilterSettings\":false,\"showAdvancedButton\":false,\"showAddButton\":false,\"showSearchButton\":false},\"outputs\":{\"change\":\"emit\",\"clear\":\"emit\"}}},{\"key\":\"procurementPresentation\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"view_quilt\",\"title\":\"Uma projection, três apresentações\",\"subtitle\":\"Gráfico, tabela e indicadores executam o mesmo contrato e preservam o mesmo queryContext\"},\"definition\":{\"id\":\"praxis-analytics-presentation\",\"bindingOrder\":[\"analytics\",\"projectionId\",\"availableFamilies\",\"preferredFamily\",\"queryContext\",\"title\",\"subtitle\",\"enableCustomization\"],\"inputs\":{\"analytics\":{\"projections\":[{\"id\":\"supplier-procurement-funnel\",\"intent\":\"composition\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\"},\"bindings\":{\"primaryDimension\":{\"field\":\"stage\",\"role\":\"category\",\"label\":\"Etapa\"},\"primaryMetrics\":[{\"field\":\"volume\",\"aggregation\":\"sum\",\"label\":\"Fornecedores\"}]},\"defaults\":{\"sort\":[{\"field\":\"stage\",\"direction\":\"asc\"}],\"limit\":6},\"presentationHints\":{\"preferredFamilies\":[\"chart\",\"analytic-table\",\"kpi\"]},\"interactions\":{\"pointSelection\":true}}]},\"projectionId\":\"supplier-procurement-funnel\",\"availableFamilies\":[\"chart\",\"analytic-table\",\"kpi\"],\"preferredFamily\":\"chart\",\"queryContext\":{\"filters\":{}},\"title\":\"Funil de fornecedores\",\"subtitle\":\"Etapas cumulativas derivadas de fatos operacionais persistidos\",\"enableCustomization\":true},\"outputs\":{\"presentationChange\":\"emit\",\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"crossFilter\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"procurementFunnel\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"filter_alt\",\"title\":\"Funnel\",\"subtitle\":\"Ordem canônica 1→6 por bucket rotulado do stats\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"supplier-procurement-funnel-chart\",\"kind\":\"funnel\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\",\"options\":{\"limit\":6,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"stage\",\"label\":\"Etapa\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"volume\",\"label\":\"Fornecedores\",\"aggregation\":\"sum\"}],\"legend\":{\"enabled\":true},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"procurementPyramid\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"change_history\",\"title\":\"Pyramid\",\"subtitle\":\"A mesma série remota com ordem visual invertida pelo renderer\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"supplier-procurement-pyramid-chart\",\"kind\":\"pyramid\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\",\"options\":{\"limit\":6,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"stage\",\"label\":\"Etapa\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"volume\",\"label\":\"Fornecedores\",\"aggregation\":\"sum\"}],\"legend\":{\"enabled\":true},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"procurementGauge\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"speed\",\"title\":\"Conversão no recebimento\",\"subtitle\":\"AVG conversionRate da etapa 6 em uma única faixa governada de 0 a 100%\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"supplier-procurement-receipt-conversion-gauge\",\"kind\":\"gauge\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/procurement/vw-supplier-procurement-funnel\",\"operation\":\"group-by\",\"options\":{\"limit\":1,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"stage\",\"label\":\"Etapa\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"conversionRate\",\"label\":\"Conversão\",\"aggregation\":\"avg\",\"format\":\"percent\"}],\"filters\":[{\"field\":\"stageOrdersIn\",\"operator\":\"in\",\"values\":[6]}],\"gauge\":{\"scale\":{\"min\":0,\"max\":1}},\"legend\":{\"enabled\":false},\"labels\":{\"enabled\":true,\"format\":\"percent\"},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"missionStatusChart\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"bar_chart\",\"title\":\"Status das missões\",\"subtitle\":\"Selecione uma barra para filtrar; selecione-a novamente para limpar\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"queryContext\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-mission-status\",\"kind\":\"horizontal-bar\",\"orientation\":\"horizontal\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/operations/vw-resumo-missoes\",\"operation\":\"group-by\",\"options\":{\"limit\":10,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"status\",\"label\":\"Status\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"missions\",\"label\":\"Missões\",\"aggregation\":\"count\"}],\"events\":{\"pointClick\":{\"action\":\"emit\"},\"selectionChange\":{\"action\":\"emit\",\"mapping\":{\"status\":\"status\"}},\"crossFilter\":{\"action\":\"filter-widget\",\"target\":\"missionStatusTable\",\"mapping\":{\"status\":\"status\"}}},\"legend\":{\"enabled\":false},\"tooltip\":{\"enabled\":true}},\"queryContext\":{\"filters\":{}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"crossFilter\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"missionStatusTable\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"table_rows\",\"title\":\"Portfólio filtrável\",\"subtitle\":\"A tabela remota recebe o filtro emitido pelo chart\"},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\",\"queryContext\"],\"inputs\":{\"resourcePath\":\"operations/vw-resumo-missoes\",\"tableId\":\"analytics-dashboard-mission-status-table\",\"queryContext\":{\"filters\":{}},\"config\":{\"toolbar\":{\"visible\":true,\"title\":\"Missões\",\"subtitle\":\"Resultado operacional remoto\"},\"columns\":[{\"field\":\"titulo\",\"header\":\"Missão\",\"type\":\"text\",\"sticky\":\"start\"},{\"field\":\"status\",\"header\":\"Status\",\"type\":\"badge\"},{\"field\":\"prioridade\",\"header\":\"Prioridade\",\"type\":\"badge\"},{\"field\":\"ameaca\",\"header\":\"Ameaça\",\"type\":\"text\"},{\"field\":\"qtdEventos\",\"header\":\"Eventos\",\"type\":\"number\"}],\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\",\"selectionChange\":\"emit\",\"loadingStateChange\":\"emit\"}}}]}}",
3242
3248
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.analytics-dashboard-showcase.json",
3243
- "contentHash": "8aebec87a3adc54eacdcb1491b81f1953cda3038597d43779dcf0f622f34a7d7",
3249
+ "contentHash": "fe322f08769a15f3955316d5bc022c4f326db734e7529be04f47d4f863d4455b",
3244
3250
  "sourceKind": "component_definition",
3245
3251
  "sourceId": "praxis-dynamic-page",
3246
3252
  "corpusVersion": "1.0.0"
@@ -3258,9 +3264,9 @@
3258
3264
  {
3259
3265
  "chunkIndex": 27,
3260
3266
  "chunkKind": "recipe",
3261
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page.widgets\",\"page\":{\"widgets\":[{\"key\":\"payrollCombo\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"multiline_chart\",\"title\":\"Bruto × descontos\",\"subtitle\":\"Combo remoto com descontos no eixo secundário\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-payroll-combo\",\"kind\":\"combo\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/human-resources/vw-analytics-folha-pagamento\",\"operation\":\"timeseries\",\"options\":{\"granularity\":\"month\",\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"competencia\",\"label\":\"Competência\",\"role\":\"time\"}],\"metrics\":[{\"field\":\"salarioBruto\",\"label\":\"Massa bruta\",\"aggregation\":\"sum\",\"seriesKind\":\"bar\",\"axis\":\"primary\"},{\"field\":\"totalDescontos\",\"label\":\"Descontos\",\"aggregation\":\"sum\",\"seriesKind\":\"line\",\"axis\":\"secondary\"}],\"legend\":{\"enabled\":true},\"tooltip\":{\"enabled\":true}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"absenceCorrelation\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"scatter_plot\",\"title\":\"Pessoas × dias afastados\",\"subtitle\":\"Dispersão remota por departamento\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-absence-correlation\",\"kind\":\"scatter\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/human-resources/vw-analytics-afastamentos\",\"operation\":\"group-by\",\"options\":{\"limit\":20,\"orderBy\":\"value-desc\"}},\"dimensions\":[{\"field\":\"departamento\",\"label\":\"Departamento\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"funcionarioId\",\"label\":\"Colaboradores\",\"aggregation\":\"distinct-count\"},{\"field\":\"diasAfastado\",\"label\":\"Dias afastados\",\"aggregation\":\"sum\"}],\"events\":{\"pointClick\":{\"action\":\"emit\"},\"selectionChange\":{\"action\":\"emit\"}},\"legend\":{\"enabled\":false},\"tooltip\":{\"enabled\":true}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}}]}}",
3267
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page.widgets\",\"page\":{\"widgets\":[{\"key\":\"payrollCombo\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"multiline_chart\",\"title\":\"Bruto × descontos\",\"subtitle\":\"Combo remoto com descontos no eixo secundário\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-payroll-combo\",\"kind\":\"combo\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/human-resources/vw-analytics-folha-pagamento\",\"operation\":\"timeseries\",\"options\":{\"granularity\":\"month\",\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"competencia\",\"label\":\"Competência\",\"role\":\"time\"}],\"metrics\":[{\"field\":\"salarioBruto\",\"label\":\"Massa bruta\",\"aggregation\":\"sum\",\"seriesKind\":\"bar\",\"axis\":\"primary\"},{\"field\":\"totalDescontos\",\"label\":\"Descontos\",\"aggregation\":\"sum\",\"seriesKind\":\"line\",\"axis\":\"secondary\"}],\"legend\":{\"enabled\":true},\"tooltip\":{\"enabled\":true}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"payrollSalaryHistogram\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"bar_chart\",\"title\":\"Distribuição salarial\",\"subtitle\":\"Histograma remoto por faixas de R$ 5 mil materializadas pelo stats\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-payroll-salary-histogram\",\"kind\":\"bar\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/human-resources/vw-analytics-folha-pagamento\",\"operation\":\"distribution\",\"options\":{\"mode\":\"histogram\",\"bucketSize\":5000,\"orderBy\":\"key-asc\"}},\"dimensions\":[{\"field\":\"salarioLiquido\",\"label\":\"Faixa salarial\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"count\",\"label\":\"Registros\",\"aggregation\":\"count\"}],\"legend\":{\"enabled\":false},\"tooltip\":{\"enabled\":true}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}},{\"key\":\"absenceCorrelation\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"scatter_plot\",\"title\":\"Pessoas × dias afastados\",\"subtitle\":\"Dispersão remota por departamento\"},\"definition\":{\"id\":\"praxis-chart\",\"bindingOrder\":[\"chartDocument\",\"enableCustomization\"],\"inputs\":{\"chartDocument\":{\"version\":\"0.1.0\",\"chartId\":\"analytics-dashboard-absence-correlation\",\"kind\":\"scatter\",\"source\":{\"kind\":\"praxis.stats\",\"resource\":\"/api/human-resources/vw-analytics-afastamentos\",\"operation\":\"group-by\",\"options\":{\"limit\":20,\"orderBy\":\"value-desc\"}},\"dimensions\":[{\"field\":\"departamento\",\"label\":\"Departamento\",\"role\":\"category\"}],\"metrics\":[{\"field\":\"funcionarioId\",\"label\":\"Colaboradores\",\"aggregation\":\"distinct-count\"},{\"field\":\"diasAfastado\",\"label\":\"Dias afastados\",\"aggregation\":\"sum\"}],\"events\":{\"pointClick\":{\"action\":\"emit\"},\"selectionChange\":{\"action\":\"emit\"}},\"legend\":{\"enabled\":false},\"tooltip\":{\"enabled\":true}},\"enableCustomization\":true},\"outputs\":{\"pointClick\":\"emit\",\"selectionChange\":\"emit\",\"loadStateChange\":\"emit\"}}}]}}",
3262
3268
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.analytics-dashboard-showcase.json",
3263
- "contentHash": "2eca366fc68fb796fbecabd968b7b1ce96649b67ff29a540dfb797d1ac31394c",
3269
+ "contentHash": "0068a944341e18f5e09cebc286e0c9abdebe0eb34ebb7d3da667ac93a16db69a",
3264
3270
  "sourceKind": "component_definition",
3265
3271
  "sourceId": "praxis-dynamic-page",
3266
3272
  "corpusVersion": "1.0.0"
@@ -3268,9 +3274,9 @@
3268
3274
  {
3269
3275
  "chunkIndex": 28,
3270
3276
  "chunkKind": "recipe",
3271
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page\",\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"analytics:procurement-filter-change->presentation.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementPresentation\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-analytics-presentation\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:procurement-filter-change->funnel.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFunnel\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-chart\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-funnel-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:procurement-filter-change->pyramid.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementPyramid\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-chart\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-pyramid-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:procurement-filter-change->gauge.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementGauge\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-chart\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-gauge-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:mission-status-crossFilter->table.queryContext.filters.status\",\"intent\":\"data-projection\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"missionStatusChart\",\"port\":\"crossFilter\",\"direction\":\"output\",\"componentType\":\"praxis-chart\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"missionStatusTable\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-table\",\"bindingPath\":\"filters.status\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"single-value\",\"sourceBindings\":[{\"source\":\"event\"}],\"steps\":[{\"id\":\"analytics:pick-mission-status\",\"kind\":\"pick-path\",\"phase\":\"link-propagation\",\"input\":{\"source\":\"event\"},\"config\":{\"path\":\"payload.filters.status\"}}]},\"policy\":{\"debounceMs\":0,\"missingValuePolicy\":\"skip\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}}]}}}",
3277
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page\",\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"analytics:procurement-filter-change->presentation.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementPresentation\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-analytics-presentation\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:procurement-filter-change->funnel.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFunnel\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-chart\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-funnel-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:procurement-filter-change->pyramid.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementPyramid\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-chart\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-pyramid-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:procurement-filter-change->gauge.queryContext\",\"intent\":\"event-propagation\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementFilter\",\"port\":\"change\",\"direction\":\"output\",\"componentType\":\"praxis-filter\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"procurementGauge\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-chart\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"object-fragment\",\"sourceBindings\":[{\"source\":\"payload\"}],\"steps\":[{\"id\":\"analytics:procurement-filter-dto-to-gauge-query-context\",\"kind\":\"object-template\",\"phase\":\"link-propagation\",\"config\":{\"template\":{\"filters\":\"${source}\",\"meta\":{\"source\":\"praxis-filter-change\"}}}}]},\"policy\":{\"debounceMs\":80,\"missingValuePolicy\":\"use-default\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}},{\"id\":\"analytics:mission-status-crossFilter->table.queryContext.filters\",\"intent\":\"data-projection\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"missionStatusChart\",\"port\":\"crossFilter\",\"direction\":\"output\",\"componentType\":\"praxis-chart\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"missionStatusTable\",\"port\":\"queryContext\",\"direction\":\"input\",\"componentType\":\"praxis-table\",\"bindingPath\":\"filters\"}},\"transform\":{\"version\":\"2.0\",\"phase\":\"link-propagation\",\"mode\":\"single-value\",\"sourceBindings\":[{\"source\":\"event\"}],\"steps\":[{\"id\":\"analytics:pick-mission-status\",\"kind\":\"pick-path\",\"phase\":\"link-propagation\",\"input\":{\"source\":\"event\"},\"config\":{\"path\":\"payload.filters\"}}]},\"policy\":{\"debounceMs\":0,\"missingValuePolicy\":\"skip\",\"distinct\":true,\"errorPolicy\":\"diagnostic\"}}]}}}",
3272
3278
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.analytics-dashboard-showcase.json",
3273
- "contentHash": "f1c7a83f89d22866046361fb9f6cbae7b2096ac606a6bde300857613875f0379",
3279
+ "contentHash": "62e9d5b77d8a21398b3f4d7bd717b796187d8d38871ce683700dd708281e456e",
3274
3280
  "sourceKind": "component_definition",
3275
3281
  "sourceId": "praxis-dynamic-page",
3276
3282
  "corpusVersion": "1.0.0"
@@ -5095,8 +5101,593 @@
5095
5101
  }
5096
5102
  }
5097
5103
  ],
5104
+ "configEditor": {
5105
+ "component": "[ref:PraxisRelatedResourceOutletConfigEditorComponent]",
5106
+ "title": "Related resource presentation"
5107
+ },
5108
+ "authoringManifestRef": {
5109
+ "componentId": "praxis-related-resource-outlet",
5110
+ "version": "1.0.0",
5111
+ "source": "PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST"
5112
+ },
5098
5113
  "source": "projects/praxis-core/src/lib/surfaces/praxis-related-resource-outlet.metadata.ts",
5099
5114
  "exportName": "PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA",
5115
+ "authoringManifest": {
5116
+ "schemaVersion": "1.0.0",
5117
+ "componentId": "praxis-related-resource-outlet",
5118
+ "ownerPackage": "@praxisui/core",
5119
+ "configSchemaId": "PraxisRelatedResourceOutletPresentationInputs",
5120
+ "manifestVersion": "1.0.0",
5121
+ "runtimeInputs": [
5122
+ {
5123
+ "name": "title",
5124
+ "type": "string | null",
5125
+ "description": "Optional visual title override."
5126
+ },
5127
+ {
5128
+ "name": "subtitle",
5129
+ "type": "string | null",
5130
+ "description": "Optional visual subtitle override."
5131
+ },
5132
+ {
5133
+ "name": "icon",
5134
+ "type": "string | null",
5135
+ "description": "Optional visual icon override."
5136
+ },
5137
+ {
5138
+ "name": "mode",
5139
+ "type": "'inline' | 'open-action'",
5140
+ "allowedValues": [
5141
+ "inline",
5142
+ "open-action"
5143
+ ],
5144
+ "description": "Outlet display mode."
5145
+ },
5146
+ {
5147
+ "name": "presentation",
5148
+ "type": "'drawer' | 'modal'",
5149
+ "allowedValues": [
5150
+ "drawer",
5151
+ "modal"
5152
+ ],
5153
+ "description": "Host-mediated presentation used by open-action mode."
5154
+ },
5155
+ {
5156
+ "name": "compact",
5157
+ "type": "boolean",
5158
+ "allowedValues": [
5159
+ true,
5160
+ false
5161
+ ],
5162
+ "description": "Compact visual density for non-materialized states."
5163
+ },
5164
+ {
5165
+ "name": "emptyState",
5166
+ "type": "PraxisRelatedResourceOutletEmptyStatePresentation",
5167
+ "description": "Closed presentation-only empty-state subset. Actions, templates and contexts are not authorable here."
5168
+ }
5169
+ ],
5170
+ "editableTargets": [
5171
+ {
5172
+ "kind": "relatedResourceOutletPresentation",
5173
+ "resolver": "component-config",
5174
+ "description": "Persisted visual shell inputs owned by the Related Resource Outlet config editor."
5175
+ },
5176
+ {
5177
+ "kind": "relatedResourceOutletEmptyStatePresentation",
5178
+ "resolver": "component-config",
5179
+ "description": "Persisted presentation-only emptyState subset; opaque empty-state fields are preserved unchanged."
5180
+ }
5181
+ ],
5182
+ "operations": [
5183
+ {
5184
+ "operationId": "related-resource-outlet.presentation.set-title",
5185
+ "title": "Set related-resource title",
5186
+ "description": "Sets only the persisted visual title; relationship metadata and runtime context remain unchanged.",
5187
+ "scope": "global",
5188
+ "targetKind": "relatedResourceOutletPresentation",
5189
+ "target": {
5190
+ "kind": "relatedResourceOutletPresentation",
5191
+ "resolver": "component-config",
5192
+ "ambiguityPolicy": "fail",
5193
+ "required": false
5194
+ },
5195
+ "inputSchema": {
5196
+ "type": "object",
5197
+ "additionalProperties": false,
5198
+ "required": [
5199
+ "value"
5200
+ ],
5201
+ "properties": {
5202
+ "value": {
5203
+ "oneOf": [
5204
+ {
5205
+ "type": "string"
5206
+ },
5207
+ {
5208
+ "type": "null"
5209
+ }
5210
+ ]
5211
+ }
5212
+ }
5213
+ },
5214
+ "effects": [
5215
+ {
5216
+ "kind": "set-value",
5217
+ "path": "title",
5218
+ "inputPath": "value"
5219
+ }
5220
+ ],
5221
+ "destructive": false,
5222
+ "requiresConfirmation": false,
5223
+ "validators": [
5224
+ "component-config-editor-respected",
5225
+ "editor-round-trip-preserve"
5226
+ ],
5227
+ "affectedPaths": [
5228
+ "title"
5229
+ ],
5230
+ "submissionImpact": "visual-only",
5231
+ "preconditions": [
5232
+ "component-config-loaded"
5233
+ ]
5234
+ },
5235
+ {
5236
+ "operationId": "related-resource-outlet.presentation.set-subtitle",
5237
+ "title": "Set related-resource subtitle",
5238
+ "description": "Sets only the persisted visual subtitle; relationship metadata and runtime context remain unchanged.",
5239
+ "scope": "global",
5240
+ "targetKind": "relatedResourceOutletPresentation",
5241
+ "target": {
5242
+ "kind": "relatedResourceOutletPresentation",
5243
+ "resolver": "component-config",
5244
+ "ambiguityPolicy": "fail",
5245
+ "required": false
5246
+ },
5247
+ "inputSchema": {
5248
+ "type": "object",
5249
+ "additionalProperties": false,
5250
+ "required": [
5251
+ "value"
5252
+ ],
5253
+ "properties": {
5254
+ "value": {
5255
+ "oneOf": [
5256
+ {
5257
+ "type": "string"
5258
+ },
5259
+ {
5260
+ "type": "null"
5261
+ }
5262
+ ]
5263
+ }
5264
+ }
5265
+ },
5266
+ "effects": [
5267
+ {
5268
+ "kind": "set-value",
5269
+ "path": "subtitle",
5270
+ "inputPath": "value"
5271
+ }
5272
+ ],
5273
+ "destructive": false,
5274
+ "requiresConfirmation": false,
5275
+ "validators": [
5276
+ "component-config-editor-respected",
5277
+ "editor-round-trip-preserve"
5278
+ ],
5279
+ "affectedPaths": [
5280
+ "subtitle"
5281
+ ],
5282
+ "submissionImpact": "visual-only",
5283
+ "preconditions": [
5284
+ "component-config-loaded"
5285
+ ]
5286
+ },
5287
+ {
5288
+ "operationId": "related-resource-outlet.presentation.set-icon",
5289
+ "title": "Set related-resource icon",
5290
+ "description": "Sets only the persisted visual icon; relationship metadata and runtime context remain unchanged.",
5291
+ "scope": "global",
5292
+ "targetKind": "relatedResourceOutletPresentation",
5293
+ "target": {
5294
+ "kind": "relatedResourceOutletPresentation",
5295
+ "resolver": "component-config",
5296
+ "ambiguityPolicy": "fail",
5297
+ "required": false
5298
+ },
5299
+ "inputSchema": {
5300
+ "type": "object",
5301
+ "additionalProperties": false,
5302
+ "required": [
5303
+ "value"
5304
+ ],
5305
+ "properties": {
5306
+ "value": {
5307
+ "oneOf": [
5308
+ {
5309
+ "type": "string"
5310
+ },
5311
+ {
5312
+ "type": "null"
5313
+ }
5314
+ ]
5315
+ }
5316
+ }
5317
+ },
5318
+ "effects": [
5319
+ {
5320
+ "kind": "set-value",
5321
+ "path": "icon",
5322
+ "inputPath": "value"
5323
+ }
5324
+ ],
5325
+ "destructive": false,
5326
+ "requiresConfirmation": false,
5327
+ "validators": [
5328
+ "component-config-editor-respected",
5329
+ "editor-round-trip-preserve"
5330
+ ],
5331
+ "affectedPaths": [
5332
+ "icon"
5333
+ ],
5334
+ "submissionImpact": "visual-only",
5335
+ "preconditions": [
5336
+ "component-config-loaded"
5337
+ ]
5338
+ },
5339
+ {
5340
+ "operationId": "related-resource-outlet.presentation.set-mode",
5341
+ "title": "Set related-resource display mode",
5342
+ "description": "Selects inline rendering or a host-mediated open action without changing the relationship or its operation.",
5343
+ "scope": "global",
5344
+ "targetKind": "relatedResourceOutletPresentation",
5345
+ "target": {
5346
+ "kind": "relatedResourceOutletPresentation",
5347
+ "resolver": "component-config",
5348
+ "ambiguityPolicy": "fail",
5349
+ "required": false
5350
+ },
5351
+ "inputSchema": {
5352
+ "type": "object",
5353
+ "additionalProperties": false,
5354
+ "required": [
5355
+ "value"
5356
+ ],
5357
+ "properties": {
5358
+ "value": {
5359
+ "enum": [
5360
+ "inline",
5361
+ "open-action"
5362
+ ]
5363
+ }
5364
+ }
5365
+ },
5366
+ "effects": [
5367
+ {
5368
+ "kind": "set-value",
5369
+ "path": "mode",
5370
+ "inputPath": "value"
5371
+ }
5372
+ ],
5373
+ "destructive": false,
5374
+ "requiresConfirmation": false,
5375
+ "validators": [
5376
+ "component-config-editor-respected",
5377
+ "editor-round-trip-preserve"
5378
+ ],
5379
+ "affectedPaths": [
5380
+ "mode"
5381
+ ],
5382
+ "submissionImpact": "visual-only",
5383
+ "preconditions": [
5384
+ "component-config-loaded"
5385
+ ]
5386
+ },
5387
+ {
5388
+ "operationId": "related-resource-outlet.presentation.set-open-presentation",
5389
+ "title": "Set related-resource open presentation",
5390
+ "description": "Selects drawer or modal for the host-mediated open payload without changing target resource semantics.",
5391
+ "scope": "global",
5392
+ "targetKind": "relatedResourceOutletPresentation",
5393
+ "target": {
5394
+ "kind": "relatedResourceOutletPresentation",
5395
+ "resolver": "component-config",
5396
+ "ambiguityPolicy": "fail",
5397
+ "required": false
5398
+ },
5399
+ "inputSchema": {
5400
+ "type": "object",
5401
+ "additionalProperties": false,
5402
+ "required": [
5403
+ "value"
5404
+ ],
5405
+ "properties": {
5406
+ "value": {
5407
+ "enum": [
5408
+ "drawer",
5409
+ "modal"
5410
+ ]
5411
+ }
5412
+ }
5413
+ },
5414
+ "effects": [
5415
+ {
5416
+ "kind": "set-value",
5417
+ "path": "presentation",
5418
+ "inputPath": "value"
5419
+ }
5420
+ ],
5421
+ "destructive": false,
5422
+ "requiresConfirmation": false,
5423
+ "validators": [
5424
+ "component-config-editor-respected",
5425
+ "editor-round-trip-preserve"
5426
+ ],
5427
+ "affectedPaths": [
5428
+ "presentation"
5429
+ ],
5430
+ "submissionImpact": "visual-only",
5431
+ "preconditions": [
5432
+ "component-config-loaded"
5433
+ ]
5434
+ },
5435
+ {
5436
+ "operationId": "related-resource-outlet.presentation.set-compact",
5437
+ "title": "Set compact related-resource states",
5438
+ "description": "Changes only the visual density of non-materialized outlet states.",
5439
+ "scope": "global",
5440
+ "targetKind": "relatedResourceOutletPresentation",
5441
+ "target": {
5442
+ "kind": "relatedResourceOutletPresentation",
5443
+ "resolver": "component-config",
5444
+ "ambiguityPolicy": "fail",
5445
+ "required": false
5446
+ },
5447
+ "inputSchema": {
5448
+ "type": "object",
5449
+ "additionalProperties": false,
5450
+ "required": [
5451
+ "value"
5452
+ ],
5453
+ "properties": {
5454
+ "value": {
5455
+ "type": "boolean"
5456
+ }
5457
+ }
5458
+ },
5459
+ "effects": [
5460
+ {
5461
+ "kind": "set-value",
5462
+ "path": "compact",
5463
+ "inputPath": "value"
5464
+ }
5465
+ ],
5466
+ "destructive": false,
5467
+ "requiresConfirmation": false,
5468
+ "validators": [
5469
+ "component-config-editor-respected",
5470
+ "editor-round-trip-preserve"
5471
+ ],
5472
+ "affectedPaths": [
5473
+ "compact"
5474
+ ],
5475
+ "submissionImpact": "visual-only",
5476
+ "preconditions": [
5477
+ "component-config-loaded"
5478
+ ]
5479
+ },
5480
+ {
5481
+ "operationId": "related-resource-outlet.presentation.configure-empty-state",
5482
+ "title": "Configure related-resource empty-state presentation",
5483
+ "description": "Merges only the closed presentation subset; actions, contexts, images, templates and unknown fields remain opaque.",
5484
+ "scope": "global",
5485
+ "targetKind": "relatedResourceOutletEmptyStatePresentation",
5486
+ "target": {
5487
+ "kind": "relatedResourceOutletEmptyStatePresentation",
5488
+ "resolver": "component-config",
5489
+ "ambiguityPolicy": "fail",
5490
+ "required": false
5491
+ },
5492
+ "inputSchema": {
5493
+ "type": "object",
5494
+ "additionalProperties": false,
5495
+ "minProperties": 1,
5496
+ "properties": {
5497
+ "title": {
5498
+ "oneOf": [
5499
+ {
5500
+ "type": "string"
5501
+ },
5502
+ {
5503
+ "type": "null"
5504
+ }
5505
+ ]
5506
+ },
5507
+ "message": {
5508
+ "oneOf": [
5509
+ {
5510
+ "type": "string"
5511
+ },
5512
+ {
5513
+ "type": "null"
5514
+ }
5515
+ ]
5516
+ },
5517
+ "description": {
5518
+ "oneOf": [
5519
+ {
5520
+ "type": "string"
5521
+ },
5522
+ {
5523
+ "type": "null"
5524
+ }
5525
+ ]
5526
+ },
5527
+ "icon": {
5528
+ "oneOf": [
5529
+ {
5530
+ "type": "string"
5531
+ },
5532
+ {
5533
+ "type": "null"
5534
+ }
5535
+ ]
5536
+ },
5537
+ "tone": {
5538
+ "oneOf": [
5539
+ {
5540
+ "enum": [
5541
+ "neutral",
5542
+ "primary",
5543
+ "secondary"
5544
+ ]
5545
+ },
5546
+ {
5547
+ "type": "null"
5548
+ }
5549
+ ]
5550
+ },
5551
+ "variant": {
5552
+ "oneOf": [
5553
+ {
5554
+ "enum": [
5555
+ "card",
5556
+ "inline",
5557
+ "panel",
5558
+ "transparent"
5559
+ ]
5560
+ },
5561
+ {
5562
+ "type": "null"
5563
+ }
5564
+ ]
5565
+ },
5566
+ "alignment": {
5567
+ "oneOf": [
5568
+ {
5569
+ "enum": [
5570
+ "start",
5571
+ "center"
5572
+ ]
5573
+ },
5574
+ {
5575
+ "type": "null"
5576
+ }
5577
+ ]
5578
+ },
5579
+ "density": {
5580
+ "oneOf": [
5581
+ {
5582
+ "enum": [
5583
+ "compact",
5584
+ "comfortable"
5585
+ ]
5586
+ },
5587
+ {
5588
+ "type": "null"
5589
+ }
5590
+ ]
5591
+ },
5592
+ "iconContainer": {
5593
+ "oneOf": [
5594
+ {
5595
+ "enum": [
5596
+ "none",
5597
+ "circle",
5598
+ "soft"
5599
+ ]
5600
+ },
5601
+ {
5602
+ "type": "null"
5603
+ }
5604
+ ]
5605
+ }
5606
+ }
5607
+ },
5608
+ "effects": [
5609
+ {
5610
+ "kind": "merge-object",
5611
+ "path": "emptyState"
5612
+ }
5613
+ ],
5614
+ "destructive": false,
5615
+ "requiresConfirmation": false,
5616
+ "validators": [
5617
+ "component-config-editor-respected",
5618
+ "editor-round-trip-preserve"
5619
+ ],
5620
+ "affectedPaths": [
5621
+ "emptyState.title",
5622
+ "emptyState.message",
5623
+ "emptyState.description",
5624
+ "emptyState.icon",
5625
+ "emptyState.tone",
5626
+ "emptyState.variant",
5627
+ "emptyState.alignment",
5628
+ "emptyState.density",
5629
+ "emptyState.iconContainer"
5630
+ ],
5631
+ "submissionImpact": "visual-only",
5632
+ "preconditions": [
5633
+ "component-config-loaded"
5634
+ ]
5635
+ }
5636
+ ],
5637
+ "validators": [
5638
+ {
5639
+ "validatorId": "component-config-editor-respected",
5640
+ "level": "error",
5641
+ "code": "RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED",
5642
+ "description": "Only paths owned by the published config editor may be authored."
5643
+ },
5644
+ {
5645
+ "validatorId": "editor-round-trip-preserve",
5646
+ "level": "error",
5647
+ "code": "RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE",
5648
+ "description": "Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift."
5649
+ }
5650
+ ],
5651
+ "roundTripRequirements": [
5652
+ "Opening the editor must never materialize runtime inputs or mutate the persisted widget definition.",
5653
+ "Apply, Save, Reset and Reopen must preserve every input outside the presentation-only editor boundary byte-for-byte.",
5654
+ "parentResourceId, surfaceId, surface, parentRecord, queryContext, state, relationship semantics and tableConfig are never authorable by this manifest.",
5655
+ "Unknown root inputs and unknown or behavior-bearing emptyState fields remain opaque and are preserved unchanged."
5656
+ ],
5657
+ "examples": [
5658
+ {
5659
+ "id": "set-related-resource-shell",
5660
+ "request": "Show the related participants inline with the title Participants and compact states.",
5661
+ "operationId": "related-resource-outlet.presentation.set-title",
5662
+ "params": {
5663
+ "value": "Participants"
5664
+ },
5665
+ "isPositive": true
5666
+ },
5667
+ {
5668
+ "id": "set-related-resource-empty-state-copy",
5669
+ "request": "Use No participants yet as the empty-state title.",
5670
+ "operationId": "related-resource-outlet.presentation.configure-empty-state",
5671
+ "params": {
5672
+ "title": "No participants yet"
5673
+ },
5674
+ "isPositive": true
5675
+ },
5676
+ {
5677
+ "id": "reject-related-resource-relationship-authoring",
5678
+ "request": "Change the child resource path, parent field, filter operation and tableConfig from this outlet editor.",
5679
+ "operationId": "related-resource-outlet.presentation.configure-empty-state",
5680
+ "params": {
5681
+ "childResourcePath": "operations/participants",
5682
+ "childParentField": "missionId",
5683
+ "tableConfig": {
5684
+ "columns": []
5685
+ }
5686
+ },
5687
+ "isPositive": false
5688
+ }
5689
+ ]
5690
+ },
5100
5691
  "chunks": [
5101
5692
  {
5102
5693
  "chunkIndex": 0,
@@ -5110,10 +5701,150 @@
5110
5701
  },
5111
5702
  {
5112
5703
  "chunkIndex": 1,
5704
+ "chunkKind": "authoring_manifest",
5705
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.set-title\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set related-resource title Sets only the persisted visual title; relationship metadata and runtime context remain unchanged. Effects: set-value. Show the related participants inline with the title Participants and compact states.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"value\"],\"properties\":[\"value\"],\"semanticTerms\":[\"value\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"title\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-related-resource-shell\",\"request\":\"Show the related participants inline with the title Participants and compact states.\",\"operationId\":\"related-resource-outlet.presentation.set-title\",\"params\":{\"value\":\"Participants\"},\"isPositive\":true}],\"negativeExamples\":[]}",
5706
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5707
+ "contentHash": "8278420c9c2c775062a1a5a83cf7349cdf6916dbfe85e8f7c0340677d88bf5f1",
5708
+ "sourceKind": "component_definition",
5709
+ "sourceId": "praxis-related-resource-outlet",
5710
+ "corpusVersion": "1.0.0"
5711
+ },
5712
+ {
5713
+ "chunkIndex": 2,
5714
+ "chunkKind": "authoring_manifest",
5715
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.set-subtitle\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set related-resource subtitle Sets only the persisted visual subtitle; relationship metadata and runtime context remain unchanged. Effects: set-value.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"value\"],\"properties\":[\"value\"],\"semanticTerms\":[\"value\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"subtitle\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
5716
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5717
+ "contentHash": "d6960b6c40aed34d2e86ea82d02010d41e2f528c3cbda1e4354fb1788f060659",
5718
+ "sourceKind": "component_definition",
5719
+ "sourceId": "praxis-related-resource-outlet",
5720
+ "corpusVersion": "1.0.0"
5721
+ },
5722
+ {
5723
+ "chunkIndex": 3,
5724
+ "chunkKind": "authoring_manifest",
5725
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.set-icon\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set related-resource icon Sets only the persisted visual icon; relationship metadata and runtime context remain unchanged. Effects: set-value.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"value\"],\"properties\":[\"value\"],\"semanticTerms\":[\"value\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"icon\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
5726
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5727
+ "contentHash": "e551d19b92f6f283a31451f405d2b34dfc8bdd94b8b7e16cdec30f3ddbd422dc",
5728
+ "sourceKind": "component_definition",
5729
+ "sourceId": "praxis-related-resource-outlet",
5730
+ "corpusVersion": "1.0.0"
5731
+ },
5732
+ {
5733
+ "chunkIndex": 4,
5734
+ "chunkKind": "authoring_manifest",
5735
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.set-mode\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set related-resource display mode Selects inline rendering or a host-mediated open action without changing the relationship or its operation. Effects: set-value.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"value\"],\"properties\":[\"value\"],\"semanticTerms\":[\"value\",\"inline\",\"open-action\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"mode\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
5736
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5737
+ "contentHash": "641b896f9dec24ffe0140af2f7e7622b0ed453919ad66e06af19c7625b751551",
5738
+ "sourceKind": "component_definition",
5739
+ "sourceId": "praxis-related-resource-outlet",
5740
+ "corpusVersion": "1.0.0"
5741
+ },
5742
+ {
5743
+ "chunkIndex": 5,
5744
+ "chunkKind": "authoring_manifest",
5745
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.set-open-presentation\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set related-resource open presentation Selects drawer or modal for the host-mediated open payload without changing target resource semantics. Effects: set-value.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"value\"],\"properties\":[\"value\"],\"semanticTerms\":[\"value\",\"drawer\",\"modal\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"presentation\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
5746
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5747
+ "contentHash": "fc2317046325aec88d643633f18be1535f244cc41d80a3c06fdfb88eb46bbd10",
5748
+ "sourceKind": "component_definition",
5749
+ "sourceId": "praxis-related-resource-outlet",
5750
+ "corpusVersion": "1.0.0"
5751
+ },
5752
+ {
5753
+ "chunkIndex": 6,
5754
+ "chunkKind": "authoring_manifest",
5755
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.set-compact\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set compact related-resource states Changes only the visual density of non-materialized outlet states. Effects: set-value.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"value\"],\"properties\":[\"value\"],\"semanticTerms\":[\"value\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"compact\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
5756
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5757
+ "contentHash": "c9edbf623be77d3d5d9d078aefb035391ff593b32e6392811308514c393c6246",
5758
+ "sourceKind": "component_definition",
5759
+ "sourceId": "praxis-related-resource-outlet",
5760
+ "corpusVersion": "1.0.0"
5761
+ },
5762
+ {
5763
+ "chunkIndex": 7,
5764
+ "chunkKind": "authoring_manifest",
5765
+ "content": "{\"operationId\":\"related-resource-outlet.presentation.configure-empty-state\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure related-resource empty-state presentation Merges only the closed presentation subset; actions, contexts, images, templates and unknown fields remain opaque. Effects: merge-object. Use No participants yet as the empty-state title. Change the child resource path, parent field, filter operation and tableConfig from this outlet editor.\",\"scope\":\"global\",\"target\":{\"kind\":\"relatedResourceOutletEmptyStatePresentation\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"title\",\"message\",\"description\",\"icon\",\"tone\",\"variant\",\"alignment\",\"density\",\"iconContainer\"],\"semanticTerms\":[\"title\",\"message\",\"description\",\"icon\",\"tone\",\"variant\",\"alignment\",\"density\",\"iconContainer\",\"neutral\",\"primary\",\"secondary\",\"card\",\"inline\",\"panel\",\"transparent\",\"start\",\"center\",\"compact\",\"comfortable\",\"none\",\"circle\",\"soft\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"emptyState.title\",\"emptyState.message\",\"emptyState.description\",\"emptyState.icon\",\"emptyState.tone\",\"emptyState.variant\",\"emptyState.alignment\",\"emptyState.density\",\"emptyState.iconContainer\"],\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}],\"preconditions\":[\"component-config-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-related-resource-empty-state-copy\",\"request\":\"Use No participants yet as the empty-state title.\",\"operationId\":\"related-resource-outlet.presentation.configure-empty-state\",\"params\":{\"title\":\"No participants yet\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-related-resource-relationship-authoring\",\"request\":\"Change the child resource path, parent field, filter operation and tableConfig from this outlet editor.\",\"operationId\":\"related-resource-outlet.presentation.configure-empty-state\",\"params\":{\"childResourcePath\":\"operations/participants\",\"childParentField\":\"missionId\",\"tableConfig\":{\"columns\":[]}},\"isPositive\":false}]}",
5766
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5767
+ "contentHash": "dc007310376360c368a9ca658e05a65d99295220b958a6c0d9d448ea5c30ce77",
5768
+ "sourceKind": "component_definition",
5769
+ "sourceId": "praxis-related-resource-outlet",
5770
+ "corpusVersion": "1.0.0"
5771
+ },
5772
+ {
5773
+ "chunkIndex": 8,
5774
+ "chunkKind": "authoring_manifest",
5775
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"identity\"}",
5776
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5777
+ "contentHash": "6b5571568c817ab7c022d9e2f2995454bc0f44a81be0477931e025eda91da3b5",
5778
+ "sourceKind": "component_definition",
5779
+ "sourceId": "praxis-related-resource-outlet",
5780
+ "corpusVersion": "1.0.0"
5781
+ },
5782
+ {
5783
+ "chunkIndex": 9,
5784
+ "chunkKind": "authoring_manifest",
5785
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"title\",\"type\":\"string | null\",\"description\":\"Optional visual title override.\"},{\"name\":\"subtitle\",\"type\":\"string | null\",\"description\":\"Optional visual subtitle override.\"},{\"name\":\"icon\",\"type\":\"string | null\",\"description\":\"Optional visual icon override.\"},{\"name\":\"mode\",\"type\":\"'inline' | 'open-action'\",\"allowedValues\":[\"inline\",\"open-action\"],\"description\":\"Outlet display mode.\"},{\"name\":\"presentation\",\"type\":\"'drawer' | 'modal'\",\"allowedValues\":[\"drawer\",\"modal\"],\"description\":\"Host-mediated presentation used by open-action mode.\"},{\"name\":\"compact\",\"type\":\"boolean\",\"allowedValues\":[true,false],\"description\":\"Compact visual density for non-materialized states.\"},{\"name\":\"emptyState\",\"type\":\"PraxisRelatedResourceOutletEmptyStatePresentation\",\"description\":\"Closed presentation-only empty-state subset. Actions, templates and contexts are not authorable here.\"}]}",
5786
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5787
+ "contentHash": "141f4c37757d6130f4fcde81694c64c2282779d180a600de6d206b57cab24d84",
5788
+ "sourceKind": "component_definition",
5789
+ "sourceId": "praxis-related-resource-outlet",
5790
+ "corpusVersion": "1.0.0"
5791
+ },
5792
+ {
5793
+ "chunkIndex": 10,
5794
+ "chunkKind": "authoring_manifest",
5795
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"description\":\"Persisted visual shell inputs owned by the Related Resource Outlet config editor.\"},{\"kind\":\"relatedResourceOutletEmptyStatePresentation\",\"resolver\":\"component-config\",\"description\":\"Persisted presentation-only emptyState subset; opaque empty-state fields are preserved unchanged.\"}]}",
5796
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5797
+ "contentHash": "d6e859708fc704d82fe5ac8adff7f29b13163cc180e26e7a3b0d58f5a5eda88c",
5798
+ "sourceKind": "component_definition",
5799
+ "sourceId": "praxis-related-resource-outlet",
5800
+ "corpusVersion": "1.0.0"
5801
+ },
5802
+ {
5803
+ "chunkIndex": 11,
5804
+ "chunkKind": "authoring_manifest",
5805
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"related-resource-outlet.presentation.set-title\",\"title\":\"Set related-resource title\",\"description\":\"Sets only the persisted visual title; relationship metadata and runtime context remain unchanged.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletPresentation\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"value\"],\"properties\":{\"value\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"title\",\"inputPath\":\"value\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"title\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]},{\"operationId\":\"related-resource-outlet.presentation.set-subtitle\",\"title\":\"Set related-resource subtitle\",\"description\":\"Sets only the persisted visual subtitle; relationship metadata and runtime context remain unchanged.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletPresentation\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"value\"],\"properties\":{\"value\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"subtitle\",\"inputPath\":\"value\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"subtitle\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]},{\"operationId\":\"related-resource-outlet.presentation.set-icon\",\"title\":\"Set related-resource icon\",\"description\":\"Sets only the persisted visual icon; relationship metadata and runtime context remain unchanged.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletPresentation\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"value\"],\"properties\":{\"value\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"icon\",\"inputPath\":\"value\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"icon\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]},{\"operationId\":\"related-resource-outlet.presentation.set-mode\",\"title\":\"Set related-resource display mode\",\"description\":\"Selects inline rendering or a host-mediated open action without changing the relationship or its operation.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletPresentation\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"value\"],\"properties\":{\"value\":{\"enum\":[\"inline\",\"open-action\"]}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"mode\",\"inputPath\":\"value\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"mode\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]},{\"operationId\":\"related-resource-outlet.presentation.set-open-presentation\",\"title\":\"Set related-resource open presentation\",\"description\":\"Selects drawer or modal for the host-mediated open payload without changing target resource semantics.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletPresentation\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"value\"],\"properties\":{\"value\":{\"enum\":[\"drawer\",\"modal\"]}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"presentation\",\"inputPath\":\"value\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"presentation\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]},{\"operationId\":\"related-resource-outlet.presentation.set-compact\",\"title\":\"Set compact related-resource states\",\"description\":\"Changes only the visual density of non-materialized outlet states.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletPresentation\",\"target\":{\"kind\":\"relatedResourceOutletPresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"value\"],\"properties\":{\"value\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"compact\",\"inputPath\":\"value\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"compact\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]},{\"operationId\":\"related-resource-outlet.presentation.configure-empty-state\",\"title\":\"Configure related-resource empty-state presentation\",\"description\":\"Merges only the closed presentation subset; actions, contexts, images, templates and unknown fields remain opaque.\",\"scope\":\"global\",\"targetKind\":\"relatedResourceOutletEmptyStatePresentation\",\"target\":{\"kind\":\"relatedResourceOutletEmptyStatePresentation\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"title\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"message\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"description\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"icon\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"tone\":{\"oneOf\":[{\"enum\":[\"neutral\",\"primary\",\"secondary\"]},{\"type\":\"null\"}]},\"variant\":{\"oneOf\":[{\"enum\":[\"card\",\"inline\",\"panel\",\"transparent\"]},{\"type\":\"null\"}]},\"alignment\":{\"oneOf\":[{\"enum\":[\"start\",\"center\"]},{\"type\":\"null\"}]},\"density\":{\"oneOf\":[{\"enum\":[\"compact\",\"comfortable\"]},{\"type\":\"null\"}]},\"iconContainer\":{\"oneOf\":[{\"enum\":[\"none\",\"circle\",\"soft\"]},{\"type\":\"null\"}]}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"emptyState\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"component-config-editor-respected\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"emptyState.title\",\"emptyState.message\",\"emptyState.description\",\"emptyState.icon\",\"emptyState.tone\",\"emptyState.variant\",\"emptyState.alignment\",\"emptyState.density\",\"emptyState.iconContainer\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"component-config-loaded\"]}]}",
5806
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5807
+ "contentHash": "82326b632ac4e0f138cb68b3318a88b5e1a0d0dab267adea9c58af61857569eb",
5808
+ "sourceKind": "component_definition",
5809
+ "sourceId": "praxis-related-resource-outlet",
5810
+ "corpusVersion": "1.0.0"
5811
+ },
5812
+ {
5813
+ "chunkIndex": 12,
5814
+ "chunkKind": "authoring_manifest",
5815
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED\",\"description\":\"Only paths owned by the published config editor may be authored.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE\",\"description\":\"Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.\"}]}",
5816
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5817
+ "contentHash": "d0fb0a87aa8ef98b8291757354fb9fff9f6b4f105c64e2b70b3191e658dc6a63",
5818
+ "sourceKind": "component_definition",
5819
+ "sourceId": "praxis-related-resource-outlet",
5820
+ "corpusVersion": "1.0.0"
5821
+ },
5822
+ {
5823
+ "chunkIndex": 13,
5824
+ "chunkKind": "authoring_manifest",
5825
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"Opening the editor must never materialize runtime inputs or mutate the persisted widget definition.\",\"Apply, Save, Reset and Reopen must preserve every input outside the presentation-only editor boundary byte-for-byte.\",\"parentResourceId, surfaceId, surface, parentRecord, queryContext, state, relationship semantics and tableConfig are never authorable by this manifest.\",\"Unknown root inputs and unknown or behavior-bearing emptyState fields remain opaque and are preserved unchanged.\"]}",
5826
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5827
+ "contentHash": "4092810a04c004443c220baef928bcf380c006cea605819dff49bc5450032020",
5828
+ "sourceKind": "component_definition",
5829
+ "sourceId": "praxis-related-resource-outlet",
5830
+ "corpusVersion": "1.0.0"
5831
+ },
5832
+ {
5833
+ "chunkIndex": 14,
5834
+ "chunkKind": "authoring_manifest",
5835
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-related-resource-outlet\",\"ownerPackage\":\"@praxisui/core\",\"configSchemaId\":\"PraxisRelatedResourceOutletPresentationInputs\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"set-related-resource-shell\",\"request\":\"Show the related participants inline with the title Participants and compact states.\",\"operationId\":\"related-resource-outlet.presentation.set-title\",\"params\":{\"value\":\"Participants\"},\"isPositive\":true},{\"id\":\"set-related-resource-empty-state-copy\",\"request\":\"Use No participants yet as the empty-state title.\",\"operationId\":\"related-resource-outlet.presentation.configure-empty-state\",\"params\":{\"title\":\"No participants yet\"},\"isPositive\":true},{\"id\":\"reject-related-resource-relationship-authoring\",\"request\":\"Change the child resource path, parent field, filter operation and tableConfig from this outlet editor.\",\"operationId\":\"related-resource-outlet.presentation.configure-empty-state\",\"params\":{\"childResourcePath\":\"operations/participants\",\"childParentField\":\"missionId\",\"tableConfig\":{\"columns\":[]}},\"isPositive\":false}]}",
5836
+ "sourcePointer": "projects/praxis-core/src/lib/ai/praxis-related-resource-outlet-authoring-manifest.ts",
5837
+ "contentHash": "07500d246df4bc97245ede755c714debb647bba12d811d73b34d886ce94f2f4c",
5838
+ "sourceKind": "component_definition",
5839
+ "sourceId": "praxis-related-resource-outlet",
5840
+ "corpusVersion": "1.0.0"
5841
+ },
5842
+ {
5843
+ "chunkIndex": 15,
5113
5844
  "chunkKind": "recipe",
5114
- "content": "{\"_comment\":\"Recipe para agentes usarem surface.relatedResource com o runtime canonico praxis-related-resource-outlet.\",\"_comment2\":\"O filtro pai-filho deve vir de relatedResource.childParentField; nao duplique a mesma regra em composition.links quando o outlet puder resolver.\",\"templateMeta\":{\"registryKey\":\"praxis-related-resource-outlet\",\"variantId\":\"inline-table-child-resource\",\"status\":\"public-example\",\"useWhen\":\"Render a related child resource from surfaceId or ResourceSurfaceCatalogItem.relatedResource without hand-writing table filters or host-specific code.\",\"examplePrompts\":[\"renderize recursos relacionados de uma linha selecionada\",\"crie tabela filha a partir de relatedResource\",\"mostrar participantes filtrados pela missao selecionada sem composition manual\"]},\"platformValue\":{\"canonicalContract\":\"praxis-metadata-starter publishes ResourceSurfaceCatalogItem.relatedResource in the surfaces catalog.\",\"angularRuntime\":\"@praxisui/core discovers the requested surface by surfaceId when needed, resolves relatedResource into a SurfaceOpenPayload and materializes praxis-table through DynamicWidgetLoader.\",\"migrationValue\":\"Hosts keep only surfaceId plus parentRecord or parentResourceId in the page; parent-child filtering is declared once in metadata.\",\"agentCorpus\":\"This recipe keeps surfaceId, parentResourcePath, parentResourceId and parentRecord explicit so agents do not infer relationships from labels.\"},\"authoringGuidance\":[\"Use praxis-related-resource-outlet with surfaceId when the parent resource publishes item-level surfaces.\",\"Pass surface directly only when the host already has the ResourceSurfaceCatalogItem available.\",\"Pass parentRecord when the selected row is available; pass parentResourceId when only the id is available.\",\"Do not repeat childParentField filters in composition.links unless the page intentionally overrides queryContext.\",\"Keep availability fail-closed; permission-limited and not-found states should render as outlet states instead of empty tables.\",\"Omit emptyState for the default related-resource empty copy; the runtime derives contextual copy and create action from surface.relatedResource. Pass emptyState only when domain-specific wording must override the platform default.\",\"Use mode=open-action when the host owns drawer/dialog orchestration; use mode=inline for embedded child tables.\"],\"teaches\":[\"surface.relatedResource\",\"surfaceId\",\"praxis-related-resource-outlet\",\"related-resource.childParentField\",\"related-resource.childResourcePath\",\"resourceEvent\",\"surfaceOpen\"],\"page\":{\"layout\":{\"orientation\":\"columns\",\"columns\":2,\"gap\":\"16px\"},\"widgets\":[{\"key\":\"missionParticipants\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"hub\",\"title\":\"Related participants\",\"subtitle\":\"Child table resolved from surface.relatedResource\"},\"definition\":{\"id\":\"praxis-related-resource-outlet\",\"bindingOrder\":[\"surfaceId\",\"parentRecord\",\"parentResourceId\",\"parentResourcePath\",\"mode\"],\"inputs\":{\"mode\":\"inline\",\"surfaceId\":\"team\",\"parentResourcePath\":\"operations/missoes\",\"parentResourceId\":1,\"parentRecord\":{\"id\":1,\"titulo\":\"Atlantic Shield\",\"status\":\"PLANEJADA\"}},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}}}]}}",
5845
+ "content": "{\"_comment\":\"Recipe para agentes usarem surface.relatedResource com o runtime canonico praxis-related-resource-outlet.\",\"_comment2\":\"O filtro pai-filho deve vir de relatedResource.childParentField; nao duplique a mesma regra em composition.links quando o outlet puder resolver.\",\"_comment3\":\"O configEditor e o manifest do outlet authoram apenas title, subtitle, icon, mode, presentation, compact e o subset visual fechado de emptyState; todo contexto e semantica de relacionamento permanecem opacos.\",\"templateMeta\":{\"registryKey\":\"praxis-related-resource-outlet\",\"variantId\":\"inline-table-child-resource\",\"status\":\"public-example\",\"useWhen\":\"Render a related child resource from surfaceId or ResourceSurfaceCatalogItem.relatedResource without hand-writing table filters or host-specific code.\",\"examplePrompts\":[\"renderize recursos relacionados de uma linha selecionada\",\"crie tabela filha a partir de relatedResource\",\"mostrar participantes filtrados pela missao selecionada sem composition manual\"]},\"platformValue\":{\"canonicalContract\":\"praxis-metadata-starter publishes ResourceSurfaceCatalogItem.relatedResource in the surfaces catalog.\",\"angularRuntime\":\"@praxisui/core discovers the requested surface by surfaceId when needed, resolves relatedResource into a SurfaceOpenPayload and materializes praxis-table through DynamicWidgetLoader.\",\"migrationValue\":\"Hosts keep only surfaceId plus parentRecord or parentResourceId in the page; parent-child filtering is declared once in metadata.\",\"agentCorpus\":\"This recipe keeps surfaceId, parentResourcePath, parentResourceId and parentRecord explicit so agents do not infer relationships from labels.\"},\"authoringGuidance\":[\"Use praxis-related-resource-outlet with surfaceId when the parent resource publishes item-level surfaces.\",\"Pass surface directly only when the host already has the ResourceSurfaceCatalogItem available.\",\"Pass parentRecord when the selected row is available; pass parentResourceId when only the id is available.\",\"Do not repeat childParentField filters in composition.links unless the page intentionally overrides queryContext.\",\"Keep availability fail-closed; permission-limited and not-found states should render as outlet states instead of empty tables.\",\"Omit emptyState for the default related-resource empty copy; the runtime derives contextual copy and create action from surface.relatedResource. Pass emptyState only when domain-specific wording must override the platform default.\",\"Use mode=open-action when the host owns drawer/dialog orchestration; use mode=inline for embedded child tables.\",\"Use the published config editor for presentation only. Never author parentResourceId, resource paths, childParentField, operations, filters, queryContext, surface/runtime state or tableConfig through the outlet editor.\"],\"teaches\":[\"surface.relatedResource\",\"surfaceId\",\"praxis-related-resource-outlet\",\"related-resource.childParentField\",\"related-resource.childResourcePath\",\"resourceEvent\",\"surfaceOpen\"],\"page\":{\"layout\":{\"orientation\":\"columns\",\"columns\":2,\"gap\":\"16px\"},\"widgets\":[{\"key\":\"missionParticipants\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"hub\",\"title\":\"Related participants\",\"subtitle\":\"Child table resolved from surface.relatedResource\"},\"definition\":{\"id\":\"praxis-related-resource-outlet\",\"bindingOrder\":[\"surfaceId\",\"parentRecord\",\"parentResourceId\",\"parentResourcePath\",\"mode\"],\"inputs\":{\"mode\":\"inline\",\"surfaceId\":\"team\",\"parentResourcePath\":\"operations/missoes\",\"parentResourceId\":1,\"parentRecord\":{\"id\":1,\"titulo\":\"Atlantic Shield\",\"status\":\"PLANEJADA\"}},\"outputs\":{\"widgetEvent\":\"emit\",\"resourceEvent\":\"emit\",\"surfaceOpen\":\"emit\"}}}]}}",
5115
5846
  "sourcePointer": "examples/ai-recipes/praxis-related-resource-outlet.json",
5116
- "contentHash": "78e8662251848fd16b257c70c5dc826a83e3c3d5672c5c484a977b1d92f7c519",
5847
+ "contentHash": "6560318b2040dc7a9a60e4762aaa4e5ea744094e9be249c5a9230b32d7b7b235",
5117
5848
  "sourceKind": "component_definition",
5118
5849
  "sourceId": "praxis-related-resource-outlet",
5119
5850
  "corpusVersion": "1.0.0"