@praxisui/core 9.0.4-rc.40 → 9.0.4-rc.42

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-10T11:49:21.807Z",
3
+ "generatedAt": "2026-08-10T19:08:21.527Z",
4
4
  "packageName": "@praxisui/core",
5
- "packageVersion": "9.0.4-rc.40",
5
+ "packageVersion": "9.0.4-rc.42",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 4,
@@ -3457,9 +3457,9 @@
3457
3457
  {
3458
3458
  "chunkIndex": 53,
3459
3459
  "chunkKind": "recipe",
3460
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page.widgets\",\"page\":{\"widgets\":[{\"key\":\"employeePortfolio\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"groups\",\"title\":{\"key\":\"employeeOperations.portfolio.shell.title\",\"text\":\"Gestão de pessoas\"},\"subtitle\":{\"key\":\"employeeOperations.portfolio.shell.subtitle\",\"text\":\"Encontre funcionários, atualize vínculos e consulte o dossiê sem sair da carteira\"},\"windowActions\":{\"collapsible\":false,\"fullscreen\":true}},\"definition\":{\"id\":\"praxis-crud\",\"bindingOrder\":[\"crudId\",\"componentInstanceId\",\"tableConfigPersistenceStrategy\",\"metadata\"],\"inputs\":{\"crudId\":\"employee-operations-casework\",\"componentInstanceId\":\"employee-operations-casework\",\"tableConfigPersistenceStrategy\":\"volatile\",\"metadata\":{\"component\":\"praxis-crud\",\"resource\":{\"path\":\"human-resources/funcionarios\",\"idField\":\"id\",\"endpointKey\":\"human-resources.funcionarios\",\"title\":{\"key\":\"employeeOperations.portfolio.resource.title\",\"text\":\"Funcionários\"},\"formTitle\":{\"key\":\"employeeOperations.portfolio.resource.formTitle\",\"text\":\"Cadastro do funcionário\"}},\"table\":{\"ai\":{\"assistant\":{\"enabled\":false}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.portfolio.toolbar.title\",\"text\":\"Carteira de funcionários\"},\"subtitle\":{\"key\":\"employeeOperations.portfolio.toolbar.subtitle\",\"text\":\"Dados cadastrais, área, vínculo e remuneração em uma única visão\"},\"search\":{\"enabled\":true,\"placeholder\":{\"key\":\"employeeOperations.portfolio.search.placeholder\",\"text\":\"Buscar por nome, e-mail, cargo ou departamento\"}},\"filters\":{\"enabled\":true,\"showAdvancedButton\":true,\"quickFilters\":[{\"id\":\"active-employees\",\"label\":{\"key\":\"employeeOperations.portfolio.quickFilter.active\",\"text\":\"Ativos\"},\"icon\":\"check_circle\",\"filter\":{\"ativo\":true}},{\"id\":\"inactive-employees\",\"label\":{\"key\":\"employeeOperations.portfolio.quickFilter.inactive\",\"text\":\"Inativos\"},\"icon\":\"block\",\"filter\":{\"ativo\":false}}]},\"columnsVisibility\":{\"enabled\":true},\"densityToggle\":{\"enabled\":true}},\"columns\":[{\"field\":\"avatarUrl\",\"header\":{\"key\":\"employeeOperations.portfolio.column.person\",\"text\":\"Pessoa\"},\"type\":\"string\",\"width\":\"76px\",\"renderer\":{\"type\":\"avatar\",\"avatar\":{\"srcField\":\"avatarUrl\",\"altField\":\"nomeCompleto\",\"initialsField\":\"nomeCompleto\",\"shape\":\"circle\",\"size\":36}}},{\"field\":\"nomeCompleto\",\"header\":{\"key\":\"employeeOperations.portfolio.column.employee\",\"text\":\"Funcionário\"},\"type\":\"string\",\"width\":\"220px\",\"sticky\":\"start\"},{\"field\":\"ativo\",\"header\":{\"key\":\"employeeOperations.portfolio.column.employment\",\"text\":\"Vínculo\"},\"type\":\"boolean\",\"format\":\"active-inactive\",\"width\":\"120px\",\"align\":\"center\",\"conditionalRenderers\":[{\"condition\":{\"==\":[{\"var\":\"ativo\"},true]},\"renderer\":{\"type\":\"badge\",\"badge\":{\"text\":{\"key\":\"employeeOperations.portfolio.status.active\",\"text\":\"Ativo\"},\"color\":\"success\",\"variant\":\"filled\",\"icon\":\"check_circle\"}}},{\"condition\":{\"==\":[{\"var\":\"ativo\"},false]},\"renderer\":{\"type\":\"badge\",\"badge\":{\"text\":{\"key\":\"employeeOperations.portfolio.status.inactive\",\"text\":\"Inativo\"},\"color\":\"warn\",\"variant\":\"outlined\",\"icon\":\"block\"}}}]},{\"field\":\"cargoNome\",\"header\":{\"key\":\"employeeOperations.portfolio.column.role\",\"text\":\"Cargo\"},\"type\":\"string\",\"width\":\"190px\",\"renderer\":{\"type\":\"chip\",\"chip\":{\"textField\":\"cargoNome\",\"variant\":\"outlined\",\"color\":\"primary\"}}},{\"field\":\"departamentoNome\",\"header\":{\"key\":\"employeeOperations.portfolio.column.department\",\"text\":\"Departamento\"},\"type\":\"string\",\"width\":\"220px\",\"renderer\":{\"type\":\"badge\",\"badge\":{\"textField\":\"departamentoNome\",\"variant\":\"soft\",\"color\":\"accent\"}}},{\"field\":\"dataAdmissao\",\"header\":{\"key\":\"employeeOperations.portfolio.column.hiredAt\",\"text\":\"Admissão\"},\"type\":\"date\",\"format\":\"dd/MM/yyyy\",\"width\":\"132px\"},{\"field\":\"salario\",\"header\":{\"key\":\"employeeOperations.portfolio.column.salary\",\"text\":\"Salário base\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\",\"width\":\"150px\"},{\"field\":\"email\",\"header\":{\"key\":\"employeeOperations.portfolio.column.contact\",\"text\":\"Contato\"},\"type\":\"string\",\"width\":\"240px\"}],\"behavior\":{\"pagination\":{\"enabled\":true,\"strategy\":\"server\",\"pageSize\":8,\"pageSizeOptions\":[8,16,32],\"position\":\"bottom\"},\"sorting\":{\"enabled\":true,\"strategy\":\"server\",\"defaultSort\":{\"column\":\"id\",\"direction\":\"asc\"}},\"filtering\":{\"enabled\":true,\"strategy\":\"server\",\"debounceTime\":300,\"advancedFilters\":{\"enabled\":true,\"settings\":{\"alwaysVisibleFields\":[\"departamentoIdsIn\",\"dataAdmissaoRange\",\"salarioBetween\"],\"allowSaveTags\":true,\"advancedOpenMode\":\"modal\",\"advancedClearButtonsEnabled\":true,\"changeDebounceMs\":300}}},\"selection\":{\"enabled\":true,\"type\":\"single\",\"mode\":\"row\",\"persistSelection\":false},\"density\":\"compact\"},\"actions\":{\"row\":{\"enabled\":true,\"display\":\"icons\",\"position\":\"end\",\"sticky\":\"end\",\"header\":{\"label\":{\"key\":\"employeeOperations.portfolio.actions.header\",\"text\":\"Ações\"},\"icon\":\"bolt\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.actions.tooltip\",\"text\":\"Visualizar, editar ou atualizar o vínculo\"}},\"behavior\":{\"enabled\":true,\"maxInline\":{\"xs\":0,\"sm\":1,\"md\":2,\"lg\":3},\"autoStrategy\":\"breakpoints\"},\"actions\":[{\"id\":\"view\",\"label\":{\"key\":\"employeeOperations.portfolio.action.view\",\"text\":\"Visualizar\"},\"icon\":\"visibility\",\"action\":\"view\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.view.tooltip\",\"text\":\"Ver dados do funcionário\"}},{\"id\":\"edit\",\"label\":{\"key\":\"employeeOperations.portfolio.action.edit\",\"text\":\"Editar\"},\"icon\":\"edit\",\"action\":\"edit\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.edit.tooltip\",\"text\":\"Editar dados do funcionário\"}},{\"id\":\"deactivate\",\"label\":{\"key\":\"employeeOperations.portfolio.action.deactivate\",\"text\":\"Inativar\"},\"icon\":\"person_off\",\"color\":\"warn\",\"action\":\"deactivate\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.deactivate.tooltip\",\"text\":\"Inativar vínculo e registrar motivo e vigência\"},\"visibleWhen\":{\"==\":[{\"var\":\"ativo\"},true]}},{\"id\":\"reactivate\",\"label\":{\"key\":\"employeeOperations.portfolio.action.reactivate\",\"text\":\"Reativar\"},\"icon\":\"person_add\",\"color\":\"primary\",\"action\":\"reactivate\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.reactivate.tooltip\",\"text\":\"Reativar vínculo e registrar motivo e vigência\"},\"visibleWhen\":{\"==\":[{\"var\":\"ativo\"},false]}}]}},\"appearance\":{\"density\":\"compact\",\"stickyHeader\":true,\"stripedRows\":false,\"hoverHighlight\":true,\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"horizontalScroll\":false,\"cardMode\":true,\"priorityColumns\":[\"nomeCompleto\",\"ativo\",\"cargoNome\"]}}},\"export\":{\"enabled\":true,\"formats\":[\"csv\",\"excel\"],\"general\":{\"includeHeaders\":true,\"respectFilters\":true,\"applyFormatting\":true,\"defaultFileName\":\"carteira-funcionarios\",\"includeColumns\":\"visible\",\"scope\":\"currentPage\",\"maxRows\":5000},\"excel\":{\"sheetName\":\"Funcionários\",\"autoFitColumns\":true,\"freezeHeaders\":true}}},\"defaults\":{\"openMode\":\"drawer\"},\"actions\":[{\"action\":\"create\",\"openMode\":\"drawer\"},{\"action\":\"view\",\"openMode\":\"drawer\"},{\"action\":\"edit\",\"openMode\":\"drawer\"}]}},\"outputs\":{\"rowClick\":\"emit\",\"rowAction\":\"emit\",\"selectionChange\":\"emit\",\"afterSave\":\"emit\",\"afterDelete\":\"emit\"}}}]}}",
3460
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"page.widgets\",\"page\":{\"widgets\":[{\"key\":\"employeePortfolio\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"groups\",\"title\":{\"key\":\"employeeOperations.portfolio.shell.title\",\"text\":\"Gestão de pessoas\"},\"subtitle\":{\"key\":\"employeeOperations.portfolio.shell.subtitle\",\"text\":\"Encontre funcionários, atualize vínculos e consulte o dossiê sem sair da carteira\"},\"windowActions\":{\"collapsible\":false,\"fullscreen\":true}},\"definition\":{\"id\":\"praxis-crud\",\"bindingOrder\":[\"crudId\",\"componentInstanceId\",\"tableConfigPersistenceStrategy\",\"metadata\"],\"inputs\":{\"crudId\":\"employee-operations-casework\",\"componentInstanceId\":\"employee-operations-casework\",\"tableConfigPersistenceStrategy\":\"volatile\",\"metadata\":{\"component\":\"praxis-crud\",\"resource\":{\"path\":\"human-resources/funcionarios\",\"idField\":\"id\",\"endpointKey\":\"human-resources.funcionarios\",\"title\":{\"key\":\"employeeOperations.portfolio.resource.title\",\"text\":\"Funcionários\"},\"formTitle\":{\"key\":\"employeeOperations.portfolio.resource.formTitle\",\"text\":\"Cadastro do funcionário\"}},\"table\":{\"ai\":{\"assistant\":{\"enabled\":false}},\"toolbar\":{\"visible\":true,\"title\":{\"key\":\"employeeOperations.portfolio.toolbar.title\",\"text\":\"Carteira de funcionários\"},\"subtitle\":{\"key\":\"employeeOperations.portfolio.toolbar.subtitle\",\"text\":\"Dados cadastrais, área, vínculo e remuneração em uma única visão\"},\"search\":{\"enabled\":true,\"placeholder\":{\"key\":\"employeeOperations.portfolio.search.placeholder\",\"text\":\"Buscar por nome, e-mail, cargo ou departamento\"}},\"filters\":{\"enabled\":true,\"showAdvancedButton\":true,\"quickFilters\":[{\"id\":\"active-employees\",\"label\":{\"key\":\"employeeOperations.portfolio.quickFilter.active\",\"text\":\"Ativos\"},\"icon\":\"check_circle\",\"filter\":{\"ativo\":true}},{\"id\":\"inactive-employees\",\"label\":{\"key\":\"employeeOperations.portfolio.quickFilter.inactive\",\"text\":\"Inativos\"},\"icon\":\"block\",\"filter\":{\"ativo\":false}}]},\"columnsVisibility\":{\"enabled\":true},\"densityToggle\":{\"enabled\":true}},\"columns\":[{\"field\":\"avatarUrl\",\"header\":{\"key\":\"employeeOperations.portfolio.column.person\",\"text\":\"Pessoa\"},\"type\":\"string\",\"width\":\"76px\",\"renderer\":{\"type\":\"avatar\",\"avatar\":{\"srcField\":\"avatarUrl\",\"altField\":\"nomeCompleto\",\"initialsField\":\"nomeCompleto\",\"shape\":\"circle\",\"size\":36}}},{\"field\":\"nomeCompleto\",\"header\":{\"key\":\"employeeOperations.portfolio.column.employee\",\"text\":\"Funcionário\"},\"type\":\"string\",\"width\":\"220px\",\"sticky\":\"start\"},{\"field\":\"ativo\",\"header\":{\"key\":\"employeeOperations.portfolio.column.employment\",\"text\":\"Vínculo\"},\"type\":\"boolean\",\"format\":\"active-inactive\",\"width\":\"120px\",\"align\":\"center\",\"conditionalRenderers\":[{\"condition\":{\"==\":[{\"var\":\"ativo\"},true]},\"renderer\":{\"type\":\"badge\",\"badge\":{\"text\":{\"key\":\"employeeOperations.portfolio.status.active\",\"text\":\"Ativo\"},\"color\":\"success\",\"variant\":\"filled\",\"icon\":\"check_circle\"}}},{\"condition\":{\"==\":[{\"var\":\"ativo\"},false]},\"renderer\":{\"type\":\"badge\",\"badge\":{\"text\":{\"key\":\"employeeOperations.portfolio.status.inactive\",\"text\":\"Inativo\"},\"color\":\"warn\",\"variant\":\"outlined\",\"icon\":\"block\"}}}]},{\"field\":\"cargoNome\",\"header\":{\"key\":\"employeeOperations.portfolio.column.role\",\"text\":\"Cargo\"},\"type\":\"string\",\"width\":\"190px\",\"renderer\":{\"type\":\"chip\",\"chip\":{\"textField\":\"cargoNome\",\"variant\":\"outlined\",\"color\":\"primary\"}}},{\"field\":\"departamentoNome\",\"header\":{\"key\":\"employeeOperations.portfolio.column.department\",\"text\":\"Departamento\"},\"type\":\"string\",\"width\":\"220px\",\"renderer\":{\"type\":\"badge\",\"badge\":{\"textField\":\"departamentoNome\",\"variant\":\"soft\",\"color\":\"accent\"}}},{\"field\":\"dataAdmissao\",\"header\":{\"key\":\"employeeOperations.portfolio.column.hiredAt\",\"text\":\"Admissão\"},\"type\":\"date\",\"format\":\"dd/MM/yyyy\",\"width\":\"132px\"},{\"field\":\"salario\",\"header\":{\"key\":\"employeeOperations.portfolio.column.salary\",\"text\":\"Salário base\"},\"type\":\"currency\",\"format\":\"BRL|symbol|2\",\"align\":\"end\",\"width\":\"150px\"},{\"field\":\"email\",\"header\":{\"key\":\"employeeOperations.portfolio.column.contact\",\"text\":\"Contato\"},\"type\":\"string\",\"width\":\"240px\"}],\"behavior\":{\"pagination\":{\"enabled\":true,\"strategy\":\"server\",\"pageSize\":8,\"pageSizeOptions\":[8,16,32],\"position\":\"bottom\"},\"sorting\":{\"enabled\":true,\"strategy\":\"server\",\"defaultSort\":{\"column\":\"id\",\"direction\":\"asc\"}},\"filtering\":{\"enabled\":true,\"strategy\":\"server\",\"debounceTime\":300,\"advancedFilters\":{\"enabled\":true,\"settings\":{\"alwaysVisibleFields\":[\"departamentoIdsIn\",\"dataAdmissaoRange\",\"salarioBetween\"],\"allowSaveTags\":true,\"tags\":[{\"id\":\"executive-pay-band\",\"label\":\"Faixa executiva\",\"patch\":{\"salarioBetween\":[39000,40000]}}],\"advancedOpenMode\":\"modal\",\"advancedClearButtonsEnabled\":true,\"changeDebounceMs\":300}}},\"selection\":{\"enabled\":true,\"type\":\"single\",\"mode\":\"row\",\"persistSelection\":false},\"density\":\"compact\"},\"actions\":{\"row\":{\"enabled\":true,\"display\":\"icons\",\"position\":\"end\",\"sticky\":\"end\",\"header\":{\"label\":{\"key\":\"employeeOperations.portfolio.actions.header\",\"text\":\"Ações\"},\"icon\":\"bolt\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.actions.tooltip\",\"text\":\"Visualizar, editar ou atualizar o vínculo\"}},\"behavior\":{\"enabled\":true,\"maxInline\":{\"xs\":0,\"sm\":1,\"md\":2,\"lg\":3},\"autoStrategy\":\"breakpoints\"},\"actions\":[{\"id\":\"view\",\"label\":{\"key\":\"employeeOperations.portfolio.action.view\",\"text\":\"Visualizar\"},\"icon\":\"visibility\",\"action\":\"view\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.view.tooltip\",\"text\":\"Ver dados do funcionário\"}},{\"id\":\"edit\",\"label\":{\"key\":\"employeeOperations.portfolio.action.edit\",\"text\":\"Editar\"},\"icon\":\"edit\",\"action\":\"edit\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.edit.tooltip\",\"text\":\"Editar dados do funcionário\"}},{\"id\":\"deactivate\",\"label\":{\"key\":\"employeeOperations.portfolio.action.deactivate\",\"text\":\"Inativar\"},\"icon\":\"person_off\",\"color\":\"warn\",\"action\":\"deactivate\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.deactivate.tooltip\",\"text\":\"Inativar vínculo e registrar motivo e vigência\"},\"visibleWhen\":{\"==\":[{\"var\":\"ativo\"},true]}},{\"id\":\"reactivate\",\"label\":{\"key\":\"employeeOperations.portfolio.action.reactivate\",\"text\":\"Reativar\"},\"icon\":\"person_add\",\"color\":\"primary\",\"action\":\"reactivate\",\"tooltip\":{\"key\":\"employeeOperations.portfolio.action.reactivate.tooltip\",\"text\":\"Reativar vínculo e registrar motivo e vigência\"},\"visibleWhen\":{\"==\":[{\"var\":\"ativo\"},false]}}]}},\"appearance\":{\"density\":\"compact\",\"stickyHeader\":true,\"stripedRows\":false,\"hoverHighlight\":true,\"responsive\":{\"breakpoints\":{\"mobile\":640},\"mobile\":{\"horizontalScroll\":false,\"cardMode\":true,\"priorityColumns\":[\"nomeCompleto\",\"ativo\",\"cargoNome\"]}}},\"export\":{\"enabled\":true,\"formats\":[\"csv\",\"excel\"],\"general\":{\"includeHeaders\":true,\"respectFilters\":true,\"applyFormatting\":true,\"defaultFileName\":\"carteira-funcionarios\",\"includeColumns\":\"visible\",\"scope\":\"currentPage\",\"maxRows\":5000},\"excel\":{\"sheetName\":\"Funcionários\",\"autoFitColumns\":true,\"freezeHeaders\":true}}},\"defaults\":{\"openMode\":\"drawer\"},\"actions\":[{\"action\":\"create\",\"openMode\":\"drawer\"},{\"action\":\"view\",\"openMode\":\"drawer\"},{\"action\":\"edit\",\"openMode\":\"drawer\"}]}},\"outputs\":{\"rowClick\":\"emit\",\"rowAction\":\"emit\",\"selectionChange\":\"emit\",\"afterSave\":\"emit\",\"afterDelete\":\"emit\"}}}]}}",
3461
3461
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.employee-operations-casework.json",
3462
- "contentHash": "783403abf5d155e13490b14a2e5b783116189fe4379fc3490786f8b62d87eab8",
3462
+ "contentHash": "11c99ab6f7a9a8ab68953f7cdd9be1d2f28bcf965d1e1ae05f4add1c2b5bc274",
3463
3463
  "sourceKind": "component_definition",
3464
3464
  "sourceId": "praxis-dynamic-page",
3465
3465
  "corpusVersion": "1.0.0"
@@ -16285,6 +16285,7 @@ class SurfaceOpenMaterializerService {
16285
16285
  formId: `${formIdPrefix}.create`,
16286
16286
  icon: 'add',
16287
16287
  color: 'primary',
16288
+ appearance: 'filled',
16288
16289
  type: 'button',
16289
16290
  position: 'end',
16290
16291
  target: { scope: 'collection' },
@@ -16301,6 +16302,7 @@ class SurfaceOpenMaterializerService {
16301
16302
  formId: `${formIdPrefix}.edit`,
16302
16303
  icon: 'edit',
16303
16304
  color: 'primary',
16305
+ appearance: 'tonal',
16304
16306
  type: 'button',
16305
16307
  position: 'end',
16306
16308
  target: {
@@ -16320,6 +16322,7 @@ class SurfaceOpenMaterializerService {
16320
16322
  formId: `${formIdPrefix}.delete`,
16321
16323
  icon: 'delete',
16322
16324
  color: 'warn',
16325
+ appearance: 'text',
16323
16326
  type: 'button',
16324
16327
  position: 'end',
16325
16328
  target: {
@@ -32227,7 +32230,7 @@ class PraxisResourceIdentityComponent {
32227
32230
  </div>
32228
32231
  }
32229
32232
  </div>
32230
- `, isInline: true, styles: [":host{display:block;min-width:0}.identity{display:grid;gap:var(--pdx-resource-identity-gap, .375rem);min-width:0}.identity__primary{display:flex;align-items:center;gap:var(--pdx-resource-identity-primary-gap, .625rem);min-width:0;flex-wrap:wrap}.identity__key{display:inline-flex;align-items:center;min-height:1.75rem;padding:.125rem .625rem;border-radius:var(--pdx-resource-identity-key-radius, .5rem);background:var(--pdx-resource-identity-key-bg, var(--md-sys-color-primary));color:var(--pdx-resource-identity-key-fg, var(--md-sys-color-on-primary));font:var(--pdx-resource-identity-key-font, 600 .8125rem/1.25rem var(--md-sys-typescale-label-large-font-family, inherit));letter-spacing:.02em;white-space:nowrap}.identity__key-label{font-weight:500;opacity:.84;margin-inline-end:.25rem}.identity__title{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--pdx-resource-identity-title-color, var(--md-sys-color-on-surface));font:var(--pdx-resource-identity-title-font, 600 1.125rem/1.4 var(--md-sys-typescale-title-medium-font-family, inherit))}.identity__metadata{display:flex;align-items:center;gap:.375rem .5rem;flex-wrap:wrap;color:var(--md-sys-color-on-surface-variant)}.identity__meta{display:inline-flex;align-items:center;gap:.25rem;min-width:0;font-size:.8125rem;line-height:1.25rem}.identity__meta+.identity__meta:not(.identity__meta--chip):before{content:\"\\b7\";margin-inline-end:.25rem;color:var(--md-sys-color-outline)}.identity__meta--chip{padding:.0625rem .5rem;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.identity__meta-label{color:var(--md-sys-color-outline)}.identity--compact{gap:.25rem}.identity--compact .identity__key{min-height:1.5rem;padding-inline:.5rem}.identity--compact .identity__title{font-size:1rem}@media(max-width:600px){.identity__primary{align-items:flex-start;gap:.375rem .5rem}.identity__title{flex:1 1 12rem;white-space:normal;overflow:visible}.identity__metadata{gap:.25rem .375rem}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
32233
+ `, isInline: true, styles: [":host{display:block;min-width:0}.identity{display:grid;gap:var(--pdx-resource-identity-gap, .375rem);min-width:0}.identity__primary{display:flex;align-items:center;gap:var(--pdx-resource-identity-primary-gap, .625rem);min-width:0;flex-wrap:wrap}.identity__key{display:inline-flex;align-items:center;min-height:1.75rem;padding:.125rem .625rem;border-radius:var(--pdx-resource-identity-key-radius, .5rem);background:var(--pdx-resource-identity-key-bg, var(--md-sys-color-primary));color:var(--pdx-resource-identity-key-fg, var(--md-sys-color-on-primary));font:var(--pdx-resource-identity-key-font, 600 .8125rem/1.25rem var(--md-sys-typescale-label-large-font-family, inherit));letter-spacing:.02em;white-space:nowrap}.identity__key-label{font-weight:500;opacity:.84;margin-inline-end:.25rem}.identity__title{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--pdx-resource-identity-title-color, var(--md-sys-color-on-surface));font:var(--pdx-resource-identity-title-font, 600 1.125rem/1.4 var(--md-sys-typescale-title-medium-font-family, inherit))}.identity__metadata{display:flex;align-items:center;gap:.375rem .5rem;flex-wrap:wrap;color:var(--md-sys-color-on-surface-variant)}.identity__meta{display:inline-flex;align-items:center;gap:.25rem;min-width:0;font-size:.8125rem;line-height:1.25rem}.identity__meta+.identity__meta:not(.identity__meta--chip):before{content:\"\\b7\";margin-inline-end:.25rem;color:var(--md-sys-color-outline)}.identity__meta--chip{padding:.0625rem .5rem;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.identity__meta-label{color:var(--md-sys-color-on-surface-variant);font-weight:500}.identity--compact{gap:.25rem}.identity--compact .identity__key{min-height:1.5rem;padding-inline:.5rem}.identity--compact .identity__title{font-size:1rem}@media(max-width:600px){.identity__primary{align-items:flex-start;gap:.375rem .5rem}.identity__title{flex:1 1 12rem;white-space:normal;overflow:visible}.identity__metadata{gap:.25rem .375rem}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
32231
32234
  }
32232
32235
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisResourceIdentityComponent, decorators: [{
32233
32236
  type: Component,
@@ -32266,7 +32269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32266
32269
  </div>
32267
32270
  }
32268
32271
  </div>
32269
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;min-width:0}.identity{display:grid;gap:var(--pdx-resource-identity-gap, .375rem);min-width:0}.identity__primary{display:flex;align-items:center;gap:var(--pdx-resource-identity-primary-gap, .625rem);min-width:0;flex-wrap:wrap}.identity__key{display:inline-flex;align-items:center;min-height:1.75rem;padding:.125rem .625rem;border-radius:var(--pdx-resource-identity-key-radius, .5rem);background:var(--pdx-resource-identity-key-bg, var(--md-sys-color-primary));color:var(--pdx-resource-identity-key-fg, var(--md-sys-color-on-primary));font:var(--pdx-resource-identity-key-font, 600 .8125rem/1.25rem var(--md-sys-typescale-label-large-font-family, inherit));letter-spacing:.02em;white-space:nowrap}.identity__key-label{font-weight:500;opacity:.84;margin-inline-end:.25rem}.identity__title{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--pdx-resource-identity-title-color, var(--md-sys-color-on-surface));font:var(--pdx-resource-identity-title-font, 600 1.125rem/1.4 var(--md-sys-typescale-title-medium-font-family, inherit))}.identity__metadata{display:flex;align-items:center;gap:.375rem .5rem;flex-wrap:wrap;color:var(--md-sys-color-on-surface-variant)}.identity__meta{display:inline-flex;align-items:center;gap:.25rem;min-width:0;font-size:.8125rem;line-height:1.25rem}.identity__meta+.identity__meta:not(.identity__meta--chip):before{content:\"\\b7\";margin-inline-end:.25rem;color:var(--md-sys-color-outline)}.identity__meta--chip{padding:.0625rem .5rem;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.identity__meta-label{color:var(--md-sys-color-outline)}.identity--compact{gap:.25rem}.identity--compact .identity__key{min-height:1.5rem;padding-inline:.5rem}.identity--compact .identity__title{font-size:1rem}@media(max-width:600px){.identity__primary{align-items:flex-start;gap:.375rem .5rem}.identity__title{flex:1 1 12rem;white-space:normal;overflow:visible}.identity__metadata{gap:.25rem .375rem}}\n"] }]
32272
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;min-width:0}.identity{display:grid;gap:var(--pdx-resource-identity-gap, .375rem);min-width:0}.identity__primary{display:flex;align-items:center;gap:var(--pdx-resource-identity-primary-gap, .625rem);min-width:0;flex-wrap:wrap}.identity__key{display:inline-flex;align-items:center;min-height:1.75rem;padding:.125rem .625rem;border-radius:var(--pdx-resource-identity-key-radius, .5rem);background:var(--pdx-resource-identity-key-bg, var(--md-sys-color-primary));color:var(--pdx-resource-identity-key-fg, var(--md-sys-color-on-primary));font:var(--pdx-resource-identity-key-font, 600 .8125rem/1.25rem var(--md-sys-typescale-label-large-font-family, inherit));letter-spacing:.02em;white-space:nowrap}.identity__key-label{font-weight:500;opacity:.84;margin-inline-end:.25rem}.identity__title{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--pdx-resource-identity-title-color, var(--md-sys-color-on-surface));font:var(--pdx-resource-identity-title-font, 600 1.125rem/1.4 var(--md-sys-typescale-title-medium-font-family, inherit))}.identity__metadata{display:flex;align-items:center;gap:.375rem .5rem;flex-wrap:wrap;color:var(--md-sys-color-on-surface-variant)}.identity__meta{display:inline-flex;align-items:center;gap:.25rem;min-width:0;font-size:.8125rem;line-height:1.25rem}.identity__meta+.identity__meta:not(.identity__meta--chip):before{content:\"\\b7\";margin-inline-end:.25rem;color:var(--md-sys-color-outline)}.identity__meta--chip{padding:.0625rem .5rem;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.identity__meta-label{color:var(--md-sys-color-on-surface-variant);font-weight:500}.identity--compact{gap:.25rem}.identity--compact .identity__key{min-height:1.5rem;padding-inline:.5rem}.identity--compact .identity__title{font-size:1rem}@media(max-width:600px){.identity__primary{align-items:flex-start;gap:.375rem .5rem}.identity__title{flex:1 1 12rem;white-space:normal;overflow:visible}.identity__metadata{gap:.25rem .375rem}}\n"] }]
32270
32273
  }], propDecorators: { identity: [{
32271
32274
  type: Input
32272
32275
  }], emptyTitle: [{
@@ -40921,6 +40924,10 @@ class PraxisSurfaceHostComponent {
40921
40924
  beforeWidgetKey = 'surface.before';
40922
40925
  mainWidgetKey = 'surface.main';
40923
40926
  afterWidgetKey = 'surface.after';
40927
+ operationIdentity() {
40928
+ const operation = normalizeSurfaceOperationContext(this.context?.['operation']);
40929
+ return operation?.subject?.identity ?? operation?.taskScope?.identity ?? null;
40930
+ }
40924
40931
  ngAfterViewInit() {
40925
40932
  this.scheduleWidgetRender();
40926
40933
  }
@@ -41188,6 +41195,16 @@ class PraxisSurfaceHostComponent {
41188
41195
  }
41189
41196
 
41190
41197
  <section class="pdx-surface-host__body">
41198
+ @if (operationIdentity(); as identity) {
41199
+ <div class="pdx-surface-host__operation-context" data-testid="surface-operation-identity">
41200
+ <praxis-resource-identity
41201
+ [identity]="identity"
41202
+ density="compact"
41203
+ [showMetadataLabels]="true"
41204
+ ></praxis-resource-identity>
41205
+ </div>
41206
+ }
41207
+
41191
41208
  @if (beforeWidget) {
41192
41209
  <div class="pdx-surface-host__slot pdx-surface-host__slot--before">
41193
41210
  <ng-container
@@ -41229,11 +41246,11 @@ class PraxisSurfaceHostComponent {
41229
41246
  }
41230
41247
  </section>
41231
41248
  </div>
41232
- `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__slot{min-width:0}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }] });
41249
+ `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__operation-context{min-width:0;padding:12px 14px;border-inline-start:3px solid var(--md-sys-color-primary, currentColor);border-radius:0 10px 10px 0;background:var(--md-sys-color-surface-container-low, transparent)}.pdx-surface-host__slot{min-width:0}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisResourceIdentityComponent, selector: "praxis-resource-identity", inputs: ["identity", "emptyTitle", "density", "showMetadataLabels", "showKeyLabel", "ariaLabel"] }] });
41233
41250
  }
41234
41251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, decorators: [{
41235
41252
  type: Component,
41236
- args: [{ selector: 'praxis-surface-host', standalone: true, imports: [DynamicWidgetLoaderDirective], template: `
41253
+ args: [{ selector: 'praxis-surface-host', standalone: true, imports: [DynamicWidgetLoaderDirective, PraxisResourceIdentityComponent], template: `
41237
41254
  <div class="pdx-surface-host">
41238
41255
  @if (subtitle || (title && renderTitleInsideBody)) {
41239
41256
  <header class="pdx-surface-host__header">
@@ -41252,6 +41269,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41252
41269
  }
41253
41270
 
41254
41271
  <section class="pdx-surface-host__body">
41272
+ @if (operationIdentity(); as identity) {
41273
+ <div class="pdx-surface-host__operation-context" data-testid="surface-operation-identity">
41274
+ <praxis-resource-identity
41275
+ [identity]="identity"
41276
+ density="compact"
41277
+ [showMetadataLabels]="true"
41278
+ ></praxis-resource-identity>
41279
+ </div>
41280
+ }
41281
+
41255
41282
  @if (beforeWidget) {
41256
41283
  <div class="pdx-surface-host__slot pdx-surface-host__slot--before">
41257
41284
  <ng-container
@@ -41293,7 +41320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41293
41320
  }
41294
41321
  </section>
41295
41322
  </div>
41296
- `, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__slot{min-width:0}\n"] }]
41323
+ `, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__operation-context{min-width:0;padding:12px 14px;border-inline-start:3px solid var(--md-sys-color-primary, currentColor);border-radius:0 10px 10px 0;background:var(--md-sys-color-surface-container-low, transparent)}.pdx-surface-host__slot{min-width:0}\n"] }]
41297
41324
  }], propDecorators: { title: [{
41298
41325
  type: Input
41299
41326
  }], subtitle: [{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/core",
3
- "version": "9.0.4-rc.40",
3
+ "version": "9.0.4-rc.42",
4
4
  "description": "Core library for Praxis UI Workspace: types, tokens, services and utilities shared across @praxisui/* packages.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -1599,6 +1599,128 @@ interface ResourceCapabilityDigest {
1599
1599
  filterExpressionSupported: boolean;
1600
1600
  }
1601
1601
 
1602
+ type FieldPresentationTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
1603
+ type FieldPresentationAppearance = 'plain' | 'soft' | 'outlined' | 'filled';
1604
+ type FieldPresenterKind = 'text' | 'badge' | 'chip' | 'status' | 'iconValue' | 'progress' | 'rating' | 'microVisualization';
1605
+ interface FieldPresentationInteractions {
1606
+ /** Allows readonly surfaces to expose a copy affordance without changing the field value. */
1607
+ copy?: boolean;
1608
+ /** Allows readonly surfaces to expose contextual detail expansion. */
1609
+ details?: boolean;
1610
+ /** Allows readonly surfaces to expose inline expansion for long values. */
1611
+ expand?: boolean;
1612
+ /** Allows readonly surfaces to expose a link affordance when the value is navigable. */
1613
+ link?: boolean;
1614
+ }
1615
+ interface FieldPresentationConfig {
1616
+ /** Semantic display strategy for readonly/presentation surfaces. */
1617
+ presenter?: FieldPresenterKind;
1618
+ /** Alias accepted for schema authors that describe the semantic display as a variant. */
1619
+ variant?: FieldPresenterKind;
1620
+ /** Semantic tone mapped by consumers to theme tokens. */
1621
+ tone?: FieldPresentationTone;
1622
+ /** Material Symbols icon name, without arbitrary HTML. */
1623
+ icon?: string;
1624
+ /** Optional semantic label for status/chip/badge presentations. */
1625
+ label?: string;
1626
+ /** Optional secondary marker rendered by presentation-capable consumers. */
1627
+ badge?: string;
1628
+ /** Optional tooltip text for the presentation wrapper. */
1629
+ tooltip?: string;
1630
+ /** Optional readonly prefix rendered next to the displayed value without changing the raw value. */
1631
+ prefix?: string;
1632
+ /** Optional readonly suffix rendered next to the displayed value without changing the raw value. */
1633
+ suffix?: string;
1634
+ /** Visual density/emphasis strategy mapped by consumers to theme tokens. */
1635
+ appearance?: FieldPresentationAppearance;
1636
+ /** Optional formatter override for the presentation surface only. */
1637
+ valuePresentation?: ValuePresentationConfig;
1638
+ /** Renderer-neutral micro visualization metadata for compact presentation surfaces. */
1639
+ visualization?: PraxisPresentationVisualizationConfig;
1640
+ /** Safe readonly affordances. No commands or mutations are executed from this contract. */
1641
+ interactions?: FieldPresentationInteractions;
1642
+ }
1643
+ interface FieldPresentationRule {
1644
+ /** Json Logic guard evaluated against the presentation context. */
1645
+ when: JsonLogicExpression;
1646
+ /** Semantic presentation state merged when the guard is truthy. */
1647
+ set?: FieldPresentationConfig;
1648
+ /** Alias for `set`, useful for rule-builder terminology. */
1649
+ effect?: FieldPresentationConfig;
1650
+ }
1651
+ interface ResolvedFieldPresentation extends FieldPresentationConfig {
1652
+ /** Indicates at least one conditional rule matched the current context. */
1653
+ matchedRule?: boolean;
1654
+ }
1655
+ interface FieldPresentationJsonLogicEvaluator {
1656
+ evaluate(expression: JsonLogicExpression, data: JsonLogicDataRecord): unknown;
1657
+ truthy?(value: unknown): boolean;
1658
+ }
1659
+ interface ResolveFieldPresentationOptions {
1660
+ jsonLogic?: FieldPresentationJsonLogicEvaluator | null;
1661
+ }
1662
+ /**
1663
+ * Resolves readonly field presentation from a base semantic config plus ordered
1664
+ * Json Logic rules. Later matching rules override earlier presentation values.
1665
+ */
1666
+ declare function resolveFieldPresentation(base: FieldPresentationConfig | null | undefined, rules: readonly FieldPresentationRule[] | null | undefined, context?: JsonLogicDataRecord, options?: ResolveFieldPresentationOptions): ResolvedFieldPresentation;
1667
+ declare function normalizeFieldPresentation(value: FieldPresentationConfig | null | undefined): ResolvedFieldPresentation;
1668
+
1669
+ interface ResourceIdentityFieldMetadata {
1670
+ name: string;
1671
+ label?: string;
1672
+ presentation?: FieldPresentationConfig;
1673
+ }
1674
+ type ResourceIdentitySource = 'explicit' | 'resource-id-field' | 'host-id-field';
1675
+ interface ResourceIdentityDiagnostic {
1676
+ code: 'resource-identity.explicit-invalid' | 'resource-identity.id-field-contract-invalid' | 'resource-identity.id-field-invalid' | 'resource-identity.id-field-missing-from-schema' | 'resource-identity.fallback-used' | 'resource-identity.value-missing';
1677
+ severity: 'info' | 'warning';
1678
+ message: string;
1679
+ source?: ResourceIdentitySource;
1680
+ field?: string;
1681
+ invalidFields?: string[];
1682
+ }
1683
+ interface ResourceIdentityContract {
1684
+ keyField?: string;
1685
+ titleField?: string;
1686
+ metadataFields?: string[];
1687
+ displayLabelField?: string;
1688
+ valid: boolean;
1689
+ invalidFields?: string[];
1690
+ message?: string;
1691
+ source?: ResourceIdentitySource;
1692
+ diagnostics?: ResourceIdentityDiagnostic[];
1693
+ }
1694
+ interface ResourceIdentityPart {
1695
+ field: string;
1696
+ label?: string;
1697
+ value: unknown;
1698
+ presentation?: FieldPresentationConfig;
1699
+ }
1700
+ interface MaterializedResourceIdentity {
1701
+ key?: ResourceIdentityPart;
1702
+ title?: ResourceIdentityPart;
1703
+ metadata: ResourceIdentityPart[];
1704
+ displayLabel?: string;
1705
+ source?: ResourceIdentitySource;
1706
+ diagnostics?: ResourceIdentityDiagnostic[];
1707
+ }
1708
+ interface ResolveResourceIdentityOptions {
1709
+ explicitIdentity?: unknown;
1710
+ resourceIdField?: unknown;
1711
+ resourceIdFieldValid?: unknown;
1712
+ resourceIdFieldMessage?: unknown;
1713
+ effectiveIdField?: unknown;
1714
+ availableFields?: readonly ResourceIdentityFieldMetadata[] | readonly string[];
1715
+ }
1716
+ interface ResolvedResourceIdentityContract {
1717
+ contract: ResourceIdentityContract | null;
1718
+ diagnostics: ResourceIdentityDiagnostic[];
1719
+ }
1720
+ declare function normalizeResourceIdentityContract(value: unknown): ResourceIdentityContract | null;
1721
+ declare function resolveResourceIdentityContract(options: ResolveResourceIdentityOptions): ResolvedResourceIdentityContract;
1722
+ declare function materializeResourceIdentity(contract: ResourceIdentityContract | null | undefined, record: Record<string, unknown> | null | undefined, fields?: readonly ResourceIdentityFieldMetadata[]): MaterializedResourceIdentity | null;
1723
+
1602
1724
  interface TableTooltipConfig {
1603
1725
  text?: string;
1604
1726
  position?: 'top' | 'right' | 'bottom' | 'left' | 'above' | 'below' | 'before' | 'after';
@@ -2329,6 +2451,12 @@ interface FilteringConfig {
2329
2451
  showAdvanced?: boolean;
2330
2452
  /** Permitir salvar tags/atalhos de filtro */
2331
2453
  allowSaveTags?: boolean;
2454
+ /** Atalhos governados, somente leitura, aplicados como patch do DTO de filtro */
2455
+ tags?: Array<{
2456
+ id: string;
2457
+ label: string;
2458
+ patch: Record<string, any>;
2459
+ }>;
2332
2460
  /** Debounce de alterações para auto-aplicar filtros (ms) */
2333
2461
  changeDebounceMs?: number;
2334
2462
  /** Modo de exibição do componente de filtro (modo único) */
@@ -2755,6 +2883,12 @@ interface ToolbarActionTarget {
2755
2883
  interface ToolbarActionEvent<TRecord = Record<string, unknown>> {
2756
2884
  action: string;
2757
2885
  actionConfig?: ToolbarAction;
2886
+ /**
2887
+ * Canonical identity of the single selected record, when the toolbar action
2888
+ * targets exactly one entity. This is runtime evidence and must not be
2889
+ * persisted back into table configuration.
2890
+ */
2891
+ resourceIdentity?: MaterializedResourceIdentity | null;
2758
2892
  /**
2759
2893
  * Ephemeral DOM origin for restoring focus after an overlay launched by the
2760
2894
  * action closes. Runtime-only: consumers must not serialize it into table
@@ -3972,73 +4106,6 @@ interface FormHelpPresentationConfig {
3972
4106
  preferPopoverForControls?: string[];
3973
4107
  }
3974
4108
 
3975
- type FieldPresentationTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
3976
- type FieldPresentationAppearance = 'plain' | 'soft' | 'outlined' | 'filled';
3977
- type FieldPresenterKind = 'text' | 'badge' | 'chip' | 'status' | 'iconValue' | 'progress' | 'rating' | 'microVisualization';
3978
- interface FieldPresentationInteractions {
3979
- /** Allows readonly surfaces to expose a copy affordance without changing the field value. */
3980
- copy?: boolean;
3981
- /** Allows readonly surfaces to expose contextual detail expansion. */
3982
- details?: boolean;
3983
- /** Allows readonly surfaces to expose inline expansion for long values. */
3984
- expand?: boolean;
3985
- /** Allows readonly surfaces to expose a link affordance when the value is navigable. */
3986
- link?: boolean;
3987
- }
3988
- interface FieldPresentationConfig {
3989
- /** Semantic display strategy for readonly/presentation surfaces. */
3990
- presenter?: FieldPresenterKind;
3991
- /** Alias accepted for schema authors that describe the semantic display as a variant. */
3992
- variant?: FieldPresenterKind;
3993
- /** Semantic tone mapped by consumers to theme tokens. */
3994
- tone?: FieldPresentationTone;
3995
- /** Material Symbols icon name, without arbitrary HTML. */
3996
- icon?: string;
3997
- /** Optional semantic label for status/chip/badge presentations. */
3998
- label?: string;
3999
- /** Optional secondary marker rendered by presentation-capable consumers. */
4000
- badge?: string;
4001
- /** Optional tooltip text for the presentation wrapper. */
4002
- tooltip?: string;
4003
- /** Optional readonly prefix rendered next to the displayed value without changing the raw value. */
4004
- prefix?: string;
4005
- /** Optional readonly suffix rendered next to the displayed value without changing the raw value. */
4006
- suffix?: string;
4007
- /** Visual density/emphasis strategy mapped by consumers to theme tokens. */
4008
- appearance?: FieldPresentationAppearance;
4009
- /** Optional formatter override for the presentation surface only. */
4010
- valuePresentation?: ValuePresentationConfig;
4011
- /** Renderer-neutral micro visualization metadata for compact presentation surfaces. */
4012
- visualization?: PraxisPresentationVisualizationConfig;
4013
- /** Safe readonly affordances. No commands or mutations are executed from this contract. */
4014
- interactions?: FieldPresentationInteractions;
4015
- }
4016
- interface FieldPresentationRule {
4017
- /** Json Logic guard evaluated against the presentation context. */
4018
- when: JsonLogicExpression;
4019
- /** Semantic presentation state merged when the guard is truthy. */
4020
- set?: FieldPresentationConfig;
4021
- /** Alias for `set`, useful for rule-builder terminology. */
4022
- effect?: FieldPresentationConfig;
4023
- }
4024
- interface ResolvedFieldPresentation extends FieldPresentationConfig {
4025
- /** Indicates at least one conditional rule matched the current context. */
4026
- matchedRule?: boolean;
4027
- }
4028
- interface FieldPresentationJsonLogicEvaluator {
4029
- evaluate(expression: JsonLogicExpression, data: JsonLogicDataRecord): unknown;
4030
- truthy?(value: unknown): boolean;
4031
- }
4032
- interface ResolveFieldPresentationOptions {
4033
- jsonLogic?: FieldPresentationJsonLogicEvaluator | null;
4034
- }
4035
- /**
4036
- * Resolves readonly field presentation from a base semantic config plus ordered
4037
- * Json Logic rules. Later matching rules override earlier presentation values.
4038
- */
4039
- declare function resolveFieldPresentation(base: FieldPresentationConfig | null | undefined, rules: readonly FieldPresentationRule[] | null | undefined, context?: JsonLogicDataRecord, options?: ResolveFieldPresentationOptions): ResolvedFieldPresentation;
4040
- declare function normalizeFieldPresentation(value: FieldPresentationConfig | null | undefined): ResolvedFieldPresentation;
4041
-
4042
4109
  /**
4043
4110
  * @fileoverview Base metadata interfaces for dynamic Angular Material components
4044
4111
  *
@@ -5296,61 +5363,6 @@ declare class GlobalConfigService {
5296
5363
  static ɵprov: i0.ɵɵInjectableDeclaration<GlobalConfigService>;
5297
5364
  }
5298
5365
 
5299
- interface ResourceIdentityFieldMetadata {
5300
- name: string;
5301
- label?: string;
5302
- presentation?: FieldPresentationConfig;
5303
- }
5304
- type ResourceIdentitySource = 'explicit' | 'resource-id-field' | 'host-id-field';
5305
- interface ResourceIdentityDiagnostic {
5306
- code: 'resource-identity.explicit-invalid' | 'resource-identity.id-field-contract-invalid' | 'resource-identity.id-field-invalid' | 'resource-identity.id-field-missing-from-schema' | 'resource-identity.fallback-used' | 'resource-identity.value-missing';
5307
- severity: 'info' | 'warning';
5308
- message: string;
5309
- source?: ResourceIdentitySource;
5310
- field?: string;
5311
- invalidFields?: string[];
5312
- }
5313
- interface ResourceIdentityContract {
5314
- keyField?: string;
5315
- titleField?: string;
5316
- metadataFields?: string[];
5317
- displayLabelField?: string;
5318
- valid: boolean;
5319
- invalidFields?: string[];
5320
- message?: string;
5321
- source?: ResourceIdentitySource;
5322
- diagnostics?: ResourceIdentityDiagnostic[];
5323
- }
5324
- interface ResourceIdentityPart {
5325
- field: string;
5326
- label?: string;
5327
- value: unknown;
5328
- presentation?: FieldPresentationConfig;
5329
- }
5330
- interface MaterializedResourceIdentity {
5331
- key?: ResourceIdentityPart;
5332
- title?: ResourceIdentityPart;
5333
- metadata: ResourceIdentityPart[];
5334
- displayLabel?: string;
5335
- source?: ResourceIdentitySource;
5336
- diagnostics?: ResourceIdentityDiagnostic[];
5337
- }
5338
- interface ResolveResourceIdentityOptions {
5339
- explicitIdentity?: unknown;
5340
- resourceIdField?: unknown;
5341
- resourceIdFieldValid?: unknown;
5342
- resourceIdFieldMessage?: unknown;
5343
- effectiveIdField?: unknown;
5344
- availableFields?: readonly ResourceIdentityFieldMetadata[] | readonly string[];
5345
- }
5346
- interface ResolvedResourceIdentityContract {
5347
- contract: ResourceIdentityContract | null;
5348
- diagnostics: ResourceIdentityDiagnostic[];
5349
- }
5350
- declare function normalizeResourceIdentityContract(value: unknown): ResourceIdentityContract | null;
5351
- declare function resolveResourceIdentityContract(options: ResolveResourceIdentityOptions): ResolvedResourceIdentityContract;
5352
- declare function materializeResourceIdentity(contract: ResourceIdentityContract | null | undefined, record: Record<string, unknown> | null | undefined, fields?: readonly ResourceIdentityFieldMetadata[]): MaterializedResourceIdentity | null;
5353
-
5354
5366
  /**
5355
5367
  * Interface para configuração de endpoints personalizados.
5356
5368
  *
@@ -15894,6 +15906,7 @@ declare class PraxisSurfaceHostComponent implements AfterViewInit, OnChanges {
15894
15906
  readonly beforeWidgetKey = "surface.before";
15895
15907
  readonly mainWidgetKey = "surface.main";
15896
15908
  readonly afterWidgetKey = "surface.after";
15909
+ protected operationIdentity(): MaterializedResourceIdentity | null;
15897
15910
  ngAfterViewInit(): void;
15898
15911
  ngOnChanges(changes: SimpleChanges): void;
15899
15912
  private scheduleWidgetRender;